diff --git a/src/finiteVolume/fvMesh/fvMesh.C b/src/finiteVolume/fvMesh/fvMesh.C index 8f99d1f61782495b830bfb8bd3f98ce0a0041f4e..156f38b979dba78653debab1483090929c49bfd9 100644 --- a/src/finiteVolume/fvMesh/fvMesh.C +++ b/src/finiteVolume/fvMesh/fvMesh.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 @@ -829,6 +829,9 @@ void Foam::fvMesh::updateMesh(const mapPolyMesh& mpm) } + // Clear mesh motion flux (note: could instead save & map like volumes) + deleteDemandDrivenData(phiPtr_); + // Clear the sliced fields clearGeomNotOldVol(); diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H index 57114bd7404e6358535df9f598a2de00f01fe84f..3855caef186e83ba05b01dfb9e210eb1f90ee167 100644 --- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H +++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H @@ -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 @@ -377,14 +377,6 @@ private: labelList& neiPatch ) const; - //- Determine patch for baffle using some heuristic (and not - // surface) - label getBafflePatch - ( - const labelList& facePatch, - const label faceI - ) const; - //- Repatches external face or creates baffle for internal face // with user specified patches (might be different for both sides). // Returns label of added face. @@ -450,6 +442,11 @@ private: const labelList& globalToMasterPatch ) const; + //- Returns list with for every face the label of the nearest + // patch. Any unreached face (disconnected mesh?) becomes + // adaptPatchIDs[0] + labelList nearestPatch(const labelList& adaptPatchIDs) const; + //- Returns list with for every internal face -1 or the patch // they should be baffled into. labelList markFacesOnProblemCellsGeometric diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C index 3296d8e08dc3dae7195cb45ec3a9bfd9a6a00a46..e2f03c4fe2b277dcc7458e88e7f4ad685e3a40f1 100644 --- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C +++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.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 @@ -131,96 +131,6 @@ Foam::label Foam::meshRefinement::createBaffle } -// Get an estimate for the patch the internal face should get. Bit heuristic. -Foam::label Foam::meshRefinement::getBafflePatch -( - const labelList& facePatch, - const label faceI -) const -{ - const polyBoundaryMesh& patches = mesh_.boundaryMesh(); - - // Loop over face points - // for each point check all faces patch IDs - // as soon as an ID >= 0 is found, break and assign that ID - // to the current face. - // Check first for real patch (so proper surface intersection and then - // in facePatch array for patches to block off faces - - forAll(mesh_.faces()[faceI], fp) - { - label pointI = mesh_.faces()[faceI][fp]; - - forAll(mesh_.pointFaces()[pointI], pf) - { - label pFaceI = mesh_.pointFaces()[pointI][pf]; - - label patchI = patches.whichPatch(pFaceI); - - if (patchI != -1 && !patches[patchI].coupled()) - { - return patchI; - } - else if (facePatch[pFaceI] != -1) - { - return facePatch[pFaceI]; - } - } - } - - // Loop over owner and neighbour cells, looking for the first face with a - // valid patch number - const cell& ownFaces = mesh_.cells()[mesh_.faceOwner()[faceI]]; - - forAll(ownFaces, i) - { - label cFaceI = ownFaces[i]; - - label patchI = patches.whichPatch(cFaceI); - - if (patchI != -1 && !patches[patchI].coupled()) - { - return patchI; - } - else if (facePatch[cFaceI] != -1) - { - return facePatch[cFaceI]; - } - } - - if (mesh_.isInternalFace(faceI)) - { - const cell& neiFaces = mesh_.cells()[mesh_.faceNeighbour()[faceI]]; - - forAll(neiFaces, i) - { - label cFaceI = neiFaces[i]; - - label patchI = patches.whichPatch(cFaceI); - - if (patchI != -1 && !patches[patchI].coupled()) - { - return patchI; - } - else if (facePatch[cFaceI] != -1) - { - return facePatch[cFaceI]; - } - } - } - - WarningIn - ( - "meshRefinement::getBafflePatch(const labelList&, const label)" - ) << "Could not find boundary face neighbouring internal face " - << faceI << " with face centre " << mesh_.faceCentres()[faceI] - << nl - << "Using arbitrary patch " << 0 << " instead." << endl; - - return 0; -} - - //// Check if we are a boundary face and normal of surface does //// not align with test vector. In this case there'd probably be //// a freestanding 'baffle' so we might as well not create it. diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementProblemCells.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementProblemCells.C index f49ad65a32c335f272c8ffb9d3d2937220e1c40b..4c9f81432fc4d0956c8f87f1ba18ca90f6889d1a 100644 --- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementProblemCells.C +++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementProblemCells.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 @@ -40,6 +40,8 @@ License #include "snapParameters.H" #include "motionSmoother.H" +#include "topoDistanceData.H" +#include "FaceCellWave.H" // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // @@ -372,6 +374,82 @@ bool Foam::meshRefinement::isCollapsedCell } +Foam::labelList Foam::meshRefinement::nearestPatch +( + const labelList& adaptPatchIDs +) const +{ + const polyBoundaryMesh& patches = mesh_.boundaryMesh(); + + // Count number of faces in adaptPatchIDs + label nFaces = 0; + forAll(adaptPatchIDs, i) + { + const polyPatch& pp = patches[adaptPatchIDs[i]]; + nFaces += pp.size(); + } + + // Field on cells and faces. + List<topoDistanceData> cellData(mesh_.nCells()); + List<topoDistanceData> faceData(mesh_.nFaces()); + + // Start of changes + labelList patchFaces(nFaces); + List<topoDistanceData> patchData(nFaces); + nFaces = 0; + forAll(adaptPatchIDs, i) + { + label patchI = adaptPatchIDs[i]; + const polyPatch& pp = patches[patchI]; + + forAll(pp, i) + { + patchFaces[nFaces] = pp.start()+i; + patchData[nFaces] = topoDistanceData(patchI, 0); + nFaces++; + } + } + + // Propagate information inwards + FaceCellWave<topoDistanceData> deltaCalc + ( + mesh_, + patchFaces, + patchData, + faceData, + cellData, + mesh_.globalData().nTotalCells()+1 + ); + + // And extract + labelList nearestAdaptPatch(mesh_.nFaces(), adaptPatchIDs[0]); + + bool haveWarned = false; + forAll(faceData, faceI) + { + if (!faceData[faceI].valid(deltaCalc.data())) + { + if (!haveWarned) + { + WarningIn("meshRefinement::nearestPatch(..)") + << "Did not visit some faces, e.g. face " << faceI + << " at " << mesh_.faceCentres()[faceI] << endl + << "Assigning these cells to patch " + << adaptPatchIDs[0] + << endl; + haveWarned = true; + } + } + else + { + nearestAdaptPatch[faceI] = faceData[faceI].data(); + } + } + + return nearestAdaptPatch; +} + + // Returns list with for every internal face -1 or the patch they should // be baffled into. Gets run after createBaffles so all the unzoned surface // intersections have already been turned into baffles. (Note: zoned surfaces @@ -390,9 +468,6 @@ Foam::labelList Foam::meshRefinement::markFacesOnProblemCells const labelList& pointLevel = meshCutter_.pointLevel(); const polyBoundaryMesh& patches = mesh_.boundaryMesh(); - // Per internal face (boundary faces not used) the patch that the - // baffle should get (or -1) - labelList facePatch(mesh_.nFaces(), -1); // Mark all points and edges on baffle patches (so not on any inlets, // outlets etc.) @@ -406,9 +481,7 @@ Foam::labelList Foam::meshRefinement::markFacesOnProblemCells forAll(adaptPatchIDs, i) { - label patchI = adaptPatchIDs[i]; - - const polyPatch& pp = patches[patchI]; + const polyPatch& pp = patches[adaptPatchIDs[i]]; label faceI = pp.start(); @@ -426,6 +499,15 @@ Foam::labelList Foam::meshRefinement::markFacesOnProblemCells } } + + // Per face the nearest adaptPatch + const labelList nearestAdaptPatch(nearestPatch(adaptPatchIDs)); + + + // Per internal face (boundary faces not used) the patch that the + // baffle should get (or -1) + labelList facePatch(mesh_.nFaces(), -1); + // Swap neighbouring cell centres and cell level labelList neiLevel(mesh_.nFaces()-mesh_.nInternalFaces()); pointField neiCc(mesh_.nFaces()-mesh_.nInternalFaces()); @@ -467,7 +549,7 @@ Foam::labelList Foam::meshRefinement::markFacesOnProblemCells if (facePatch[faceI] == -1 && mesh_.isInternalFace(faceI)) { - facePatch[faceI] = getBafflePatch(facePatch, faceI); + facePatch[faceI] = nearestAdaptPatch[faceI]; nBaffleFaces++; // Mark face as a 'boundary' @@ -708,7 +790,7 @@ Foam::labelList Foam::meshRefinement::markFacesOnProblemCells && mesh_.isInternalFace(faceI) ) { - facePatch[faceI] = getBafflePatch(facePatch, faceI); + facePatch[faceI] = nearestAdaptPatch[faceI]; nBaffleFaces++; // Mark face as a 'boundary' @@ -795,11 +877,7 @@ Foam::labelList Foam::meshRefinement::markFacesOnProblemCells && mesh_.isInternalFace(faceI) ) { - facePatch[faceI] = getBafflePatch - ( - facePatch, - faceI - ); + facePatch[faceI] = nearestAdaptPatch[faceI]; nBaffleFaces++; // Mark face as a 'boundary' @@ -886,7 +964,7 @@ Foam::labelList Foam::meshRefinement::markFacesOnProblemCells } else { - facePatch[faceI] = getBafflePatch(facePatch, faceI); + facePatch[faceI] = nearestAdaptPatch[faceI]; nBaffleFaces++; // Do NOT update boundary data since this would grow blocked @@ -943,7 +1021,7 @@ Foam::labelList Foam::meshRefinement::markFacesOnProblemCells } else { - facePatch[faceI] = getBafflePatch(facePatch, faceI); + facePatch[faceI] = nearestAdaptPatch[faceI]; if (isMasterFace[faceI]) { nBaffleFaces++; @@ -1091,6 +1169,9 @@ Foam::labelList Foam::meshRefinement::markFacesOnProblemCellsGeometric } + // Per face the nearest adaptPatch + const labelList nearestAdaptPatch(nearestPatch(meshedPatches())); + // Per face (internal or coupled!) the patch that the // baffle should get (or -1). labelList facePatch(mesh_.nFaces(), -1); @@ -1199,7 +1280,7 @@ Foam::labelList Foam::meshRefinement::markFacesOnProblemCellsGeometric if (patchI == -1 || mesh_.boundaryMesh()[patchI].coupled()) { - facePatch[iter.key()] = getBafflePatch(facePatch, iter.key()); + facePatch[iter.key()] = nearestAdaptPatch[iter.key()]; nBaffleFaces++; //Pout<< " " << iter.key()