diff --git a/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/extrudeToRegionMesh.C b/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/extrudeToRegionMesh.C index c8f6b887..e9444d0e 100644 --- a/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/extrudeToRegionMesh.C +++ b/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/extrudeToRegionMesh.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -2430,10 +2430,9 @@ int main(int argc, char *argv[]) // Add the new patches forAll(regionPatches, patchI) { - regionPatches[patchI] = regionPatches[patchI]->clone - ( - regionMesh.boundaryMesh() - ).ptr(); + polyPatch* ppPtr = regionPatches[patchI]; + regionPatches[patchI] = ppPtr->clone(regionMesh.boundaryMesh()).ptr(); + delete ppPtr; } regionMesh.clearOut(); regionMesh.removeFvBoundary(); diff --git a/applications/utilities/mesh/manipulation/createPatch/createPatch.C b/applications/utilities/mesh/manipulation/createPatch/createPatch.C index 6f283d47..deefbaef 100644 --- a/applications/utilities/mesh/manipulation/createPatch/createPatch.C +++ b/applications/utilities/mesh/manipulation/createPatch/createPatch.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -186,6 +186,10 @@ void filterPatches(polyMesh& mesh, const HashSet& addedPatchNames) else { Info<< "No patches removed." << endl; + forAll(allPatches, i) + { + delete allPatches[i]; + } } } diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C index 48fcdbbb..8c63239f 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C @@ -1248,6 +1248,12 @@ void Foam::autoRefineDriver::doRefine decomposer_, distributor_ ); + + + if (debug) + { + meshRefiner_.checkZoneFaces(); + } } } diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H index 78b7d9a1..770b5025 100644 --- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H +++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H @@ -870,6 +870,9 @@ public: const labelList& neiPatch ); + //- Debug helper: check faceZones are not on processor patches + void checkZoneFaces() const; + //- Create baffles for faces straddling zoned surfaces. Return // baffles. autoPtr createZoneBaffles diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C index 76bb6150..6dc77b39 100644 --- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C +++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C @@ -531,6 +531,36 @@ Foam::autoPtr Foam::meshRefinement::createBaffles } +void Foam::meshRefinement::checkZoneFaces() const +{ + const faceZoneMesh& fZones = mesh_.faceZones(); + + const polyBoundaryMesh& pbm = mesh_.boundaryMesh(); + + forAll(pbm, patchI) + { + const polyPatch& pp = pbm[patchI]; + + if (isA(pp)) + { + forAll(pp, i) + { + label faceI = pp.start()+i; + label zoneI = fZones.whichZone(faceI); + + if (zoneI != -1) + { + FatalErrorIn("meshRefinement::checkZoneFaces") + << "face:" << faceI << " on patch " << pp.name() + << " is in zone " << fZones[zoneI].name() + << exit(FatalError); + } + } + } + } +} + + Foam::autoPtr Foam::meshRefinement::createZoneBaffles ( const labelList& globalToMasterPatch, diff --git a/src/meshTools/searchableSurface/searchableCylinder.C b/src/meshTools/searchableSurface/searchableCylinder.C index 7657e883..496cd04a 100644 --- a/src/meshTools/searchableSurface/searchableCylinder.C +++ b/src/meshTools/searchableSurface/searchableCylinder.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -662,21 +662,61 @@ void Foam::searchableCylinder::getNormal vector v(info[i].hitPoint() - point1_); // Decompose sample-point1 into normal and parallel component - scalar parallel = v & unitDir_; + scalar parallel = (v & unitDir_); - if (parallel < 0) + // Remove the parallel component and normalise + v -= parallel*unitDir_; + scalar magV = mag(v); + + if (parallel <= 0) { - normal[i] = -unitDir_; + if ((magV-radius_) < mag(parallel)) + { + // either above endcap (magV magDir_) + else if (parallel <= 0.5*magDir_) { - normal[i] = -unitDir_; + // See if endcap closer or sidewall + if (magV >= radius_ || (radius_-magV) < parallel) + { + normal[i] = v/magV; + } + else + { + // closer to endcap + normal[i] = -unitDir_; + } } - else + else if (parallel <= magDir_) { - // Remove the parallel component - v -= parallel*unitDir_; - normal[i] = v/mag(v); + // See if endcap closer or sidewall + if (magV >= radius_ || (radius_-magV) < (magDir_-parallel)) + { + normal[i] = v/magV; + } + else + { + // closer to endcap + normal[i] = unitDir_; + } + } + else // beyond cylinder + { + if ((magV-radius_) < (parallel-magDir_)) + { + // above endcap + normal[i] = unitDir_; + } + else + { + normal[i] = v/magV; + } } } } diff --git a/src/parallel/decompose/decompositionMethods/decompositionMethod/decompositionMethod.C b/src/parallel/decompose/decompositionMethods/decompositionMethod/decompositionMethod.C index c098db09..ff2f3d68 100644 --- a/src/parallel/decompose/decompositionMethods/decompositionMethod/decompositionMethod.C +++ b/src/parallel/decompose/decompositionMethods/decompositionMethod/decompositionMethod.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -33,6 +33,8 @@ InClass #include "faceSet.H" #include "regionSplit.H" #include "localPointRegion.H" +#include "minData.H" +#include "FaceCellWave.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -956,6 +958,72 @@ Foam::labelList Foam::decompositionMethod::decompose } + // blockedFaces corresponding to processor faces need to be handled + // separately since not handled by local regionSplit. We need to + // walk now across coupled faces and make sure to move a whole + // global region across + if (Pstream::parRun()) + { + // Re-do regionSplit + + // Field on cells and faces. + List cellData(mesh.nCells()); + List faceData(mesh.nFaces()); + + // Take over blockedFaces by seeding a negative number + // (so is always less than the decomposition) + label nUnblocked = 0; + forAll(blockedFace, faceI) + { + if (blockedFace[faceI]) + { + faceData[faceI] = minData(-123); + } + else + { + nUnblocked++; + } + } + + // Seed unblocked faces with destination processor + labelList seedFaces(nUnblocked); + List seedData(nUnblocked); + nUnblocked = 0; + + forAll(blockedFace, faceI) + { + if (!blockedFace[faceI]) + { + label own = mesh.faceOwner()[faceI]; + seedFaces[nUnblocked] = faceI; + seedData[nUnblocked] = minData(finalDecomp[own]); + nUnblocked++; + } + } + + + // Propagate information inwards + FaceCellWave deltaCalc + ( + mesh, + seedFaces, + seedData, + faceData, + cellData, + mesh.globalData().nTotalCells()+1 + ); + + // And extract + forAll(finalDecomp, cellI) + { + if (cellData[cellI].valid(deltaCalc.data())) + { + finalDecomp[cellI] = cellData[cellI].data(); + } + } + } + + // For specifiedProcessorFaces rework the cellToProc to enforce // all on one processor since we can't guarantee that the input // to regionSplit was a single region. @@ -1000,6 +1068,44 @@ Foam::labelList Foam::decompositionMethod::decompose } } } + + + if (debug && Pstream::parRun()) + { + labelList nbrDecomp; + syncTools::swapBoundaryCellList(mesh, finalDecomp, nbrDecomp); + + const polyBoundaryMesh& patches = mesh.boundaryMesh(); + forAll(patches, patchI) + { + const polyPatch& pp = patches[patchI]; + if (pp.coupled()) + { + forAll(pp, i) + { + label faceI = pp.start()+i; + label own = mesh.faceOwner()[faceI]; + label bFaceI = faceI-mesh.nInternalFaces(); + + if (!blockedFace[faceI]) + { + label ownProc = finalDecomp[own]; + label nbrProc = nbrDecomp[bFaceI]; + if (ownProc != nbrProc) + { + FatalErrorIn("decompositionMethod::decompose()") + << "patch:" << pp.name() + << " face:" << faceI + << " at:" << mesh.faceCentres()[faceI] + << " ownProc:" << ownProc + << " nbrProc:" << nbrProc + << exit(FatalError); + } + } + } + } + } + } } return finalDecomp; diff --git a/src/parallel/decompose/decompositionMethods/decompositionMethod/minData.H b/src/parallel/decompose/decompositionMethods/decompositionMethod/minData.H new file mode 100644 index 00000000..ad3fb947 --- /dev/null +++ b/src/parallel/decompose/decompositionMethods/decompositionMethod/minData.H @@ -0,0 +1,205 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2014 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +Class + Foam::minData + +Description + For use with FaceCellWave. Transports minimum passive data + +SourceFiles + minDataI.H + +\*---------------------------------------------------------------------------*/ + +#ifndef minData_H +#define minData_H + +#include "point.H" +#include "tensor.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class polyPatch; +class polyMesh; + +/*---------------------------------------------------------------------------*\ + Class minData Declaration +\*---------------------------------------------------------------------------*/ + +class minData +{ + // Private data + + //- Starting data + label data_; + + +public: + + // Constructors + + //- Construct null + inline minData(); + + //- Construct from count + inline minData(const label data); + + + // Member Functions + + // Access + + inline label data() const + { + return data_; + } + + + // Needed by FaceCellWave + + //- Check whether origin has been changed at all or + // still contains original (invalid) value. + template + inline bool valid(TrackingData& td) const; + + //- Check for identical geometrical data. Used for cyclics checking. + template + inline bool sameGeometry + ( + const polyMesh&, + const minData&, + const scalar, + TrackingData& td + ) const; + + //- Convert any absolute coordinates into relative to (patch)face + // centre + template + inline void leaveDomain + ( + const polyMesh&, + const polyPatch&, + const label patchFaceI, + const point& faceCentre, + TrackingData& td + ); + + //- Reverse of leaveDomain + template + inline void enterDomain + ( + const polyMesh&, + const polyPatch&, + const label patchFaceI, + const point& faceCentre, + TrackingData& td + ); + + //- Apply rotation matrix to any coordinates + template + inline void transform + ( + const polyMesh&, + const tensor&, + TrackingData& td + ); + + //- Influence of neighbouring face. + template + inline bool updateCell + ( + const polyMesh&, + const label thisCellI, + const label neighbourFaceI, + const minData& neighbourInfo, + const scalar tol, + TrackingData& td + ); + + //- Influence of neighbouring cell. + template + inline bool updateFace + ( + const polyMesh&, + const label thisFaceI, + const label neighbourCellI, + const minData& neighbourInfo, + const scalar tol, + TrackingData& td + ); + + //- Influence of different value on same face. + template + inline bool updateFace + ( + const polyMesh&, + const label thisFaceI, + const minData& neighbourInfo, + const scalar tol, + TrackingData& td + ); + + //- Same (like operator==) + template + inline bool equal(const minData&, TrackingData& td) const; + + // Member Operators + + // Needed for List IO + inline bool operator==(const minData&) const; + + inline bool operator!=(const minData&) const; + + + // IOstream Operators + + friend Ostream& operator<<(Ostream&, const minData&); + friend Istream& operator>>(Istream&, minData&); +}; + + +//- Data associated with minData type are contiguous +template<> +inline bool contiguous() +{ + return true; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "minDataI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/parallel/decompose/decompositionMethods/decompositionMethod/minDataI.H b/src/parallel/decompose/decompositionMethods/decompositionMethod/minDataI.H new file mode 100644 index 00000000..a079524c --- /dev/null +++ b/src/parallel/decompose/decompositionMethods/decompositionMethod/minDataI.H @@ -0,0 +1,222 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2014 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + +#include "polyMesh.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +inline Foam::minData::minData() +: + data_(labelMax) +{} + + +inline Foam::minData::minData(const label data) +: + data_(data) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template +inline bool Foam::minData::valid(TrackingData& td) const +{ + return data_ != labelMax; +} + + +template +inline bool Foam::minData::sameGeometry +( + const polyMesh&, + const minData&, + const scalar, + TrackingData& +) const +{ + return true; +} + + +template +inline void Foam::minData::leaveDomain +( + const polyMesh&, + const polyPatch& patch, + const label patchFaceI, + const point& faceCentre, + TrackingData& +) +{} + + +template +inline void Foam::minData::transform +( + const polyMesh&, + const tensor& rotTensor, + TrackingData& +) +{} + + +template +inline void Foam::minData::enterDomain +( + const polyMesh&, + const polyPatch& patch, + const label patchFaceI, + const point& faceCentre, + TrackingData& +) +{} + + +template +inline bool Foam::minData::updateCell +( + const polyMesh&, + const label thisCellI, + const label neighbourFaceI, + const minData& neighbourInfo, + const scalar tol, + TrackingData& +) +{ + if (neighbourInfo.data_ < data_) + { + operator=(neighbourInfo); + return true; + } + else + { + return false; + } +} + + +template +inline bool Foam::minData::updateFace +( + const polyMesh& mesh, + const label thisFaceI, + const label neighbourCellI, + const minData& neighbourInfo, + const scalar tol, + TrackingData& +) +{ + // From cell to its faces. + + if (neighbourInfo.data_ < data_) + { + operator=(neighbourInfo); + return true; + } + else + { + return false; + } +} + + +template +inline bool Foam::minData::updateFace +( + const polyMesh&, + const label thisFaceI, + const minData& neighbourInfo, + const scalar tol, + TrackingData& +) +{ + // From face to face (e.g. coupled faces) + if (neighbourInfo.data_ < data_) + { + operator=(neighbourInfo); + return true; + } + else + { + return false; + } +} + + +template +inline bool Foam::minData::equal +( + const minData& rhs, + TrackingData& td +) const +{ + return operator==(rhs); +} + + +// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // + +inline bool Foam::minData::operator== +( + const Foam::minData& rhs +) const +{ + return data() == rhs.data(); +} + + +inline bool Foam::minData::operator!= +( + const Foam::minData& rhs +) const +{ + return !(*this == rhs); +} + + +// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * // + +Foam::Ostream& Foam::operator<< +( + Foam::Ostream& os, + const Foam::minData& wDist +) +{ + return os << wDist.data_; +} + + +Foam::Istream& Foam::operator>> +( + Foam::Istream& is, + Foam::minData& wDist +) +{ + return is >> wDist.data_; +} + + +// ************************************************************************* // diff --git a/tutorials/multiphase/interDyMFoam/ras/mixerVesselAMI/system/fvSolution b/tutorials/multiphase/interDyMFoam/ras/mixerVesselAMI/system/fvSolution index d09e6aac..e6b5f31c 100644 --- a/tutorials/multiphase/interDyMFoam/ras/mixerVesselAMI/system/fvSolution +++ b/tutorials/multiphase/interDyMFoam/ras/mixerVesselAMI/system/fvSolution @@ -1,7 +1,7 @@ /*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | -| \\ / O peration | Version: 2.3.0 | +| \\ / O peration | Version: 2.3.x | | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ @@ -74,9 +74,6 @@ PIMPLE nOuterCorrectors 2; nCorrectors 1; nNonOrthogonalCorrectors 0; - nAlphaCorr 1; - nAlphaSubCycles 2; - cAlpha 1; } relaxationFactors