diff --git a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C index 6b6343091872e0e1dc15997225e917f1a7146516..2406cb667c45098ebd0ae54dfbf61f325e48d68c 100644 --- a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C +++ b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C @@ -369,7 +369,10 @@ int main(int argc, char *argv[]) // Add all the surface regions as patches // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - labelList globalToPatch; + //- Global surface region to patch (non faceZone surface) or patches + // (faceZone surfaces) + labelList globalToMasterPatch; + labelList globalToSlavePatch; { Info<< nl << "Adding patches for surface regions" << nl @@ -377,7 +380,8 @@ int main(int argc, char *argv[]) << endl; // From global region number to mesh patch. - globalToPatch.setSize(surfaces.nRegions(), -1); + globalToMasterPatch.setSize(surfaces.nRegions(), -1); + globalToSlavePatch.setSize(surfaces.nRegions(), -1); Info<< "Patch\tType\tRegion" << nl << "-----\t----\t------" @@ -394,36 +398,111 @@ int main(int argc, char *argv[]) Info<< surfaces.names()[surfI] << ':' << nl << nl; - forAll(regNames, i) + if (surfaces.faceZoneNames()[surfI].empty()) { - label globalRegionI = surfaces.globalRegion(surfI, i); - - label patchI; - - if (surfacePatchInfo.set(globalRegionI)) + // 'Normal' surface + forAll(regNames, i) { - patchI = meshRefiner.addMeshedPatch - ( - regNames[i], - surfacePatchInfo[globalRegionI] - ); + label globalRegionI = surfaces.globalRegion(surfI, i); + + label patchI; + + if (surfacePatchInfo.set(globalRegionI)) + { + patchI = meshRefiner.addMeshedPatch + ( + regNames[i], + surfacePatchInfo[globalRegionI] + ); + } + else + { + dictionary patchInfo; + patchInfo.set("type", wallPolyPatch::typeName); + + patchI = meshRefiner.addMeshedPatch + ( + regNames[i], + patchInfo + ); + } + + Info<< patchI << '\t' << mesh.boundaryMesh()[patchI].type() + << '\t' << regNames[i] << nl; + + globalToMasterPatch[globalRegionI] = patchI; + globalToSlavePatch[globalRegionI] = patchI; } - else + } + else + { + // Zoned surface + forAll(regNames, i) { - dictionary patchInfo; - patchInfo.set("type", wallPolyPatch::typeName); - - patchI = meshRefiner.addMeshedPatch - ( - regNames[i], - patchInfo - ); + label globalRegionI = surfaces.globalRegion(surfI, i); + + // Add master side patch + { + label patchI; + + if (surfacePatchInfo.set(globalRegionI)) + { + patchI = meshRefiner.addMeshedPatch + ( + regNames[i], + surfacePatchInfo[globalRegionI] + ); + } + else + { + dictionary patchInfo; + patchInfo.set("type", wallPolyPatch::typeName); + + patchI = meshRefiner.addMeshedPatch + ( + regNames[i], + patchInfo + ); + } + + Info<< patchI << '\t' + << mesh.boundaryMesh()[patchI].type() + << '\t' << regNames[i] << nl; + + globalToMasterPatch[globalRegionI] = patchI; + } + // Add slave side patch + { + const word slaveName = regNames[i] + "_slave"; + label patchI; + + if (surfacePatchInfo.set(globalRegionI)) + { + patchI = meshRefiner.addMeshedPatch + ( + slaveName, + surfacePatchInfo[globalRegionI] + ); + } + else + { + dictionary patchInfo; + patchInfo.set("type", wallPolyPatch::typeName); + + patchI = meshRefiner.addMeshedPatch + ( + slaveName, + patchInfo + ); + } + + Info<< patchI << '\t' + << mesh.boundaryMesh()[patchI].type() + << '\t' << slaveName << nl; + + globalToSlavePatch[globalRegionI] = patchI; + } } - - Info<< patchI << '\t' << mesh.boundaryMesh()[patchI].type() - << '\t' << regNames[i] << nl; - - globalToPatch[globalRegionI] = patchI; } Info<< nl; @@ -479,7 +558,8 @@ int main(int argc, char *argv[]) meshRefiner, decomposer, distributor, - globalToPatch + globalToMasterPatch, + globalToSlavePatch ); // Refinement parameters @@ -510,7 +590,8 @@ int main(int argc, char *argv[]) autoSnapDriver snapDriver ( meshRefiner, - globalToPatch + globalToMasterPatch, + globalToSlavePatch ); // Snap parameters @@ -544,7 +625,12 @@ int main(int argc, char *argv[]) { cpuTime timer; - autoLayerDriver layerDriver(meshRefiner, globalToPatch); + autoLayerDriver layerDriver + ( + meshRefiner, + globalToMasterPatch, + globalToSlavePatch + ); // Layer addition parameters layerParameters layerParams(layerDict, mesh.boundaryMesh()); diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C index b08cccbb85c77cc5ccded24f6617f607d82946fc..7dff414859ad2bcc67ebac9a01653bc7ed17f0b5 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C @@ -2372,11 +2372,13 @@ void Foam::autoLayerDriver::getLayerCellsFaces Foam::autoLayerDriver::autoLayerDriver ( meshRefinement& meshRefiner, - const labelList& globalToPatch + const labelList& globalToMasterPatch, + const labelList& globalToSlavePatch ) : meshRefiner_(meshRefiner), - globalToPatch_(globalToPatch) + globalToMasterPatch_(globalToMasterPatch), + globalToSlavePatch_(globalToSlavePatch) {} @@ -2435,7 +2437,12 @@ void Foam::autoLayerDriver::addLayers // Create baffles (pairs of faces that share the same points) // Baffles stored as owner and neighbour face that have been created. List<labelPair> baffles; - meshRefiner_.createZoneBaffles(globalToPatch_, baffles); + meshRefiner_.createZoneBaffles + ( + globalToMasterPatch_, + globalToSlavePatch_, + baffles + ); if (debug&meshRefinement::MESH) { diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.H b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.H index 272f1af09e8fd06083b641412c5fd356377991af..416544a7199de145d4400e14b2d71c58b8d1d9a0 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.H +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.H @@ -99,7 +99,10 @@ class autoLayerDriver meshRefinement& meshRefiner_; //- From surface region to patch - const labelList globalToPatch_; + const labelList globalToMasterPatch_; + + //- From surface region to patch + const labelList globalToSlavePatch_; @@ -518,7 +521,8 @@ public: autoLayerDriver ( meshRefinement& meshRefiner, - const labelList& globalToPatch + const labelList& globalToMasterPatch, + const labelList& globalToSlavePatch ); diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriverShrink.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriverShrink.C index 73d09f449ffbbf6980326229cf30b4e6da480b97..8ffcaa5f57874ef0ee7eb702dbf18cf8f35e801f 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriverShrink.C +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriverShrink.C @@ -1135,6 +1135,12 @@ void Foam::autoLayerDriver::medialAxisSmoothingInfo << " " << medialRatio.name() << " : ratio of medial distance to wall distance" << nl << endl; + meshRefiner_.mesh().setInstance(meshRefiner_.timeName()); + meshRefiner_.write + ( + debug, + mesh.time().path()/meshRefiner_.timeName() + ); dispVec.write(); medialDist.write(); medialVec.write(); @@ -1409,6 +1415,94 @@ void Foam::autoLayerDriver::shrinkMeshMedialDistance *dispVec[pointI]; } + + +//XXXXX +// // Smear displacement away from fixed values (medialRatio=0 or 1) +// { +// const edgeList& edges = mesh.edges(); +// scalarField edgeWeight(edges.size(), 0.0); +// forAll(edges, edgeI) +// { +// if (isMasterEdge[edgeI]) +// { +// scalar eMag = edges[edgeI].mag(mesh.points()); +// if (eMag > VSMALL) +// { +// edgeWeight[edgeI] = 1.0/eMag; +// } +// else +// { +// edgeWeight[edgeI] = GREAT; +// } +// } +// } +// scalarField invSumWeight(mesh.nPoints()); +// sumWeights(isMasterEdge, edgeWeight, invSumWeight); +// +// +// // Get smoothly varying patch field. +// Info<< "shrinkMeshDistance : Smoothing displacement ..." << endl; +// +// const scalar lambda = 0.33; +// const scalar mu = -0.34; +// +// pointField average(mesh.nPoints()); +// for (label iter = 0; iter < 90; iter++) +// { +// // Calculate average of field +// averageNeighbours +// ( +// mesh, +// edgeWeight, +// invSumWeight, +// displacement, +// average +// ); +// +// forAll(displacement, i) +// { +// if (medialRatio[i] > SMALL && medialRatio[i] < 1-SMALL) +// { +// displacement[i] = +// (1-lambda)*displacement[i] +// +lambda*average[i]; +// } +// } +// +// +// // Calculate average of field +// averageNeighbours +// ( +// mesh, +// edgeWeight, +// invSumWeight, +// displacement, +// average +// ); +// +// forAll(displacement, i) +// { +// if (medialRatio[i] > SMALL && medialRatio[i] < 1-SMALL) +// { +// displacement[i] = (1-mu)*displacement[i]+mu*average[i]; +// } +// } +// +// +// // Do residual calculation every so often. +// if ((iter % 10) == 0) +// { +// Info<< " Iteration " << iter << " residual " +// << gSum(mag(displacement-average)) +// /returnReduce(average.size(), sumOp<label>()) +// << endl; +// } +// } +// } +//XXXXX + + if (debug&meshRefinement::MESH || debug&meshRefinement::LAYERINFO) { const_cast<Time&>(mesh.time())++; diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C index dfd769fd15002f3474084f4c40bcf11733593c88..d1cb523361e99d17b4a3ddc474eec20096c01196 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C @@ -57,13 +57,15 @@ Foam::autoRefineDriver::autoRefineDriver meshRefinement& meshRefiner, decompositionMethod& decomposer, fvMeshDistribute& distributor, - const labelList& globalToPatch + const labelList& globalToMasterPatch, + const labelList& globalToSlavePatch ) : meshRefiner_(meshRefiner), decomposer_(decomposer), distributor_(distributor), - globalToPatch_(globalToPatch) + globalToMasterPatch_(globalToMasterPatch), + globalToSlavePatch_(globalToSlavePatch) {} @@ -313,7 +315,8 @@ void Foam::autoRefineDriver::removeInsideCells meshRefiner_.splitMesh ( nBufferLayers, // nBufferLayers - globalToPatch_, + globalToMasterPatch_, + globalToSlavePatch_, refineParams.keepPoints()[0] ); @@ -521,7 +524,8 @@ void Foam::autoRefineDriver::baffleAndSplitMesh !handleSnapProblems, // merge free standing baffles? motionDict, const_cast<Time&>(mesh.time()), - globalToPatch_, + globalToMasterPatch_, + globalToSlavePatch_, refineParams.keepPoints()[0] ); } @@ -606,7 +610,8 @@ void Foam::autoRefineDriver::splitAndMergeBaffles //true, // merge free standing baffles? motionDict, const_cast<Time&>(mesh.time()), - globalToPatch_, + globalToMasterPatch_, + globalToSlavePatch_, refineParams.keepPoints()[0] ); diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.H b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.H index d75dd5daf5f840c5b22d6af6553465a72ba05422..37a0f6b10258fd7ed7a1d54b6a66c447720ee678 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.H +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -65,7 +65,10 @@ class autoRefineDriver fvMeshDistribute& distributor_; //- From surface region to patch - const labelList globalToPatch_; + const labelList globalToMasterPatch_; + + //- From surface region to patch + const labelList globalToSlavePatch_; // Private Member Functions @@ -146,7 +149,8 @@ public: meshRefinement& meshRefiner, decompositionMethod& decomposer, fvMeshDistribute& distributor, - const labelList& globalToPatch + const labelList& globalToMasterPatch, + const labelList& globalToSlavePatch ); diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C index 54a78f477c6a5e7170572da5c8867654c564c543..b7b79d715e3e71cd3ca2656d511ff86b46ac3282 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C @@ -573,11 +573,13 @@ bool Foam::autoSnapDriver::outwardsDisplacement Foam::autoSnapDriver::autoSnapDriver ( meshRefinement& meshRefiner, - const labelList& globalToPatch + const labelList& globalToMasterPatch, + const labelList& globalToSlavePatch ) : meshRefiner_(meshRefiner), - globalToPatch_(globalToPatch) + globalToMasterPatch_(globalToMasterPatch), + globalToSlavePatch_(globalToSlavePatch) {} @@ -1191,7 +1193,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::autoSnapDriver::repatchToSurface if (hitSurface[i] != -1 && !isZonedFace.get(faceI)) { - closestPatch[i] = globalToPatch_ + closestPatch[i] = globalToMasterPatch_ [ surfaces.globalRegion ( @@ -1265,7 +1267,12 @@ void Foam::autoSnapDriver::doSnap // Create baffles (pairs of faces that share the same points) // Baffles stored as owner and neighbour face that have been created. List<labelPair> baffles; - meshRefiner_.createZoneBaffles(globalToPatch_, baffles); + meshRefiner_.createZoneBaffles + ( + globalToMasterPatch_, + globalToSlavePatch_, + baffles + ); // Selectively 'forget' about the baffles, i.e. not check across them diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.H b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.H index e4cea95be28ea6efe80a06f044f96a678ef3b0a2..e6763bc084850a9150d726e7a880544093755f59 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.H +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.H @@ -59,8 +59,11 @@ class autoSnapDriver //- Mesh+surface meshRefinement& meshRefiner_; - //- From surface region to patch - const labelList globalToPatch_; + //- From global surface region to master side patch + const labelList globalToMasterPatch_; + + //- From global surface region to slave side patch + const labelList globalToSlavePatch_; // Private Member Functions @@ -390,7 +393,8 @@ public: autoSnapDriver ( meshRefinement& meshRefiner, - const labelList& globalToPatch + const labelList& globalToMasterPatch, + const labelList& globalToSlavePatch ); diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriverFeature.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriverFeature.C index b9990cb078b09ab7c927276aacec3a8fa9195dc1..7285c1ed003b3a3de61b1c54c38bed4f8acc6b54 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriverFeature.C +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriverFeature.C @@ -573,7 +573,7 @@ void Foam::autoSnapDriver::calcNearestFacePointProperties pFc[i] = pp.faceCentres()[faceI]; //label meshFaceI = pp.addressing()[faceI]; //pFid[i] = mesh.boundaryMesh().whichPatch(meshFaceI); - pFid[i] = globalToPatch_[faceSurfaceGlobalRegion[faceI]]; + pFid[i] = globalToMasterPatch_[faceSurfaceGlobalRegion[faceI]]; } } diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C index 26a40327d6f610118c88c560b43419e7b8c86587..69cdf234cdb41828140af5bc4553d348a05f2de9 100644 --- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C +++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C @@ -55,6 +55,7 @@ License #include "searchableSurfaces.H" #include "treeBoundBox.H" #include "zeroGradientFvPatchFields.H" +#include "fvMeshTools.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -1700,7 +1701,7 @@ Foam::label Foam::meshRefinement::addPatch oldToNew[addedPatchI] = insertPatchI; // Shuffle into place - polyPatches.reorder(oldToNew); + polyPatches.reorder(oldToNew, true); fvPatches.reorder(oldToNew); reorderPatchFields<volScalarField>(mesh, oldToNew); @@ -1736,6 +1737,28 @@ Foam::label Foam::meshRefinement::addMeshedPatch // Add patch label patchI = addPatch(mesh_, name, patchInfo); +// dictionary patchDict(patchInfo); +// patchDict.set("nFaces", 0); +// patchDict.set("startFace", 0); +// autoPtr<polyPatch> ppPtr +// ( +// polyPatch::New +// ( +// name, +// patchDict, +// 0, +// mesh_.boundaryMesh() +// ) +// ); +// label patchI = fvMeshTools::addPatch +// ( +// mesh_, +// ppPtr(), +// dictionary(), // optional field values +// calculatedFvPatchField<scalar>::typeName, +// true +// ); + // Store label sz = meshedPatches_.size(); meshedPatches_.setSize(sz+1); diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H index b98230e4122c925527c9158dbcc57b8bc8c8abc4..c265f05257568c8444f9562991ec6e6cf11c9c3a 100644 --- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H +++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.H @@ -330,10 +330,11 @@ private: // Baffle handling //- Get faces to repatch. Returns map from face to patch. - Map<label> getZoneBafflePatches + Map<labelPair> getZoneBafflePatches ( const bool allowBoundary, - const labelList& globalToPatch + const labelList& globalToMasterPatch, + const labelList& globalToSlavePatch ) const; //- Geometric test on see whether face needs to be baffled: @@ -349,7 +350,7 @@ private: //- Determine patches for baffles void getBafflePatches ( - const labelList& globalToPatch, + const labelList& globalToMasterPatch, const labelList& neiLevel, const pointField& neiCc, labelList& ownPatch, @@ -426,7 +427,7 @@ private: const dictionary& motionDict, const bool removeEdgeConnectedCells, const scalarField& perpendicularAngle, - const labelList& globalToPatch + const labelList& globalToMasterPatch ) const; @@ -707,7 +708,8 @@ public: const bool mergeFreeStanding, const dictionary& motionDict, Time& runTime, - const labelList& globalToPatch, + const labelList& globalToMasterPatch, + const labelList& globalToSlavePatch, const point& keepPoint ); @@ -716,7 +718,8 @@ public: autoPtr<mapPolyMesh> splitMesh ( const label nBufferLayers, - const labelList& globalToPatch, + const labelList& globalToMasterPatch, + const labelList& globalToSlavePatch, const point& keepPoint ); @@ -741,7 +744,8 @@ public: // baffles. autoPtr<mapPolyMesh> createZoneBaffles ( - const labelList& globalToPatch, + const labelList& globalToMasterPatch, + const labelList& globalToSlavePatch, List<labelPair>& ); diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C index aeaa5ac4cb61387d684a2af31c148b4b975c161a..350bda61c865c2716be98639dc5df9dcd9feb436 100644 --- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C +++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinementBaffles.C @@ -259,7 +259,7 @@ bool Foam::meshRefinement::validBaffleTopology // Determine patches for baffles on all intersected unnamed faces void Foam::meshRefinement::getBafflePatches ( - const labelList& globalToPatch, + const labelList& globalToMasterPatch, const labelList& neiLevel, const pointField& neiCc, @@ -376,11 +376,11 @@ void Foam::meshRefinement::getBafflePatches } // Pick up the patches - ownPatch[faceI] = globalToPatch + ownPatch[faceI] = globalToMasterPatch [ surfaces_.globalRegion(surface1[i], region1[i]) ]; - neiPatch[faceI] = globalToPatch + neiPatch[faceI] = globalToMasterPatch [ surfaces_.globalRegion(surface2[i], region2[i]) ]; @@ -406,14 +406,14 @@ void Foam::meshRefinement::getBafflePatches } -// Get faces to repatch. Returns map from face to patch. -Foam::Map<Foam::label> Foam::meshRefinement::getZoneBafflePatches +Foam::Map<Foam::labelPair> Foam::meshRefinement::getZoneBafflePatches ( const bool allowBoundary, - const labelList& globalToPatch + const labelList& globalToMasterPatch, + const labelList& globalToSlavePatch ) const { - Map<label> bafflePatch(mesh_.nFaces()/1000); + Map<labelPair> bafflePatch(mesh_.nFaces()/1000); const wordList& faceZoneNames = surfaces_.faceZoneNames(); const faceZoneMesh& fZones = mesh_.faceZones(); @@ -427,40 +427,39 @@ Foam::Map<Foam::label> Foam::meshRefinement::getZoneBafflePatches const faceZone& fZone = fZones[zoneI]; - //// Get patch allocated for zone - //label patchI = surfaceToCyclicPatch_[surfI]; - // Get patch of (first region) of surface - label patchI = globalToPatch[surfaces_.globalRegion(surfI, 0)]; + // Get patch allocated for zone + label globalRegionI = surfaces_.globalRegion(surfI, 0); + labelPair zPatches + ( + globalToMasterPatch[globalRegionI], + globalToSlavePatch[globalRegionI] + ); - Info<< "For surface " - << surfaces_.names()[surfI] - << " found faceZone " << fZone.name() - << " and patch " << mesh_.boundaryMesh()[patchI].name() + Info<< "For zone " << fZone.name() << " found patches " + << mesh_.boundaryMesh()[zPatches[0]].name() << " and " + << mesh_.boundaryMesh()[zPatches[1]].name() << endl; - forAll(fZone, i) { label faceI = fZone[i]; if (allowBoundary || mesh_.isInternalFace(faceI)) { - if (!bafflePatch.insert(faceI, patchI)) + labelPair patches = zPatches; + if (fZone.flipMap()[i]) { - label oldPatchI = bafflePatch[faceI]; + patches = patches.reversePair(); + } - if (oldPatchI != patchI) - { - FatalErrorIn("getZoneBafflePatches(const bool)") - << "Face " << faceI - << " fc:" << mesh_.faceCentres()[faceI] - << " in zone " << fZone.name() - << " is in patch " - << mesh_.boundaryMesh()[oldPatchI].name() - << " and in patch " - << mesh_.boundaryMesh()[patchI].name() - << abort(FatalError); - } + if (!bafflePatch.insert(faceI, patches)) + { + FatalErrorIn("getZoneBafflePatches(..)") + << "Face " << faceI + << " fc:" << mesh_.faceCentres()[faceI] + << " in zone " << fZone.name() + << " is in multiple zones!" + << abort(FatalError); } } } @@ -698,7 +697,8 @@ Foam::List<Foam::labelPair> Foam::meshRefinement::getDuplicateFaces Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::createZoneBaffles ( - const labelList& globalToPatch, + const labelList& globalToMasterPatch, + const labelList& globalToSlavePatch, List<labelPair>& baffles ) { @@ -714,20 +714,30 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::createZoneBaffles // Get faces (internal only) to be baffled. Map from face to patch // label. - Map<label> faceToPatch(getZoneBafflePatches(false, globalToPatch)); + Map<labelPair> faceToPatch + ( + getZoneBafflePatches + ( + false, + globalToMasterPatch, + globalToSlavePatch + ) + ); label nZoneFaces = returnReduce(faceToPatch.size(), sumOp<label>()); if (nZoneFaces > 0) { // Convert into labelLists labelList ownPatch(mesh_.nFaces(), -1); - forAllConstIter(Map<label>, faceToPatch, iter) + labelList neiPatch(mesh_.nFaces(), -1); + forAllConstIter(Map<labelPair>, faceToPatch, iter) { - ownPatch[iter.key()] = iter(); + ownPatch[iter.key()] = iter().first(); + neiPatch[iter.key()] = iter().second(); } // Create baffles. both sides same patch. - map = createBaffles(ownPatch, ownPatch); + map = createBaffles(ownPatch, neiPatch); // Get pairs of faces created. // Just loop over faceMap and store baffle if we encounter a slave @@ -744,7 +754,10 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::createZoneBaffles label oldFaceI = faceMap[faceI]; // Does face originate from face-to-patch - Map<label>::const_iterator iter = faceToPatch.find(oldFaceI); + Map<labelPair>::const_iterator iter = faceToPatch.find + ( + oldFaceI + ); if (iter != faceToPatch.end()) { @@ -1344,7 +1357,8 @@ void Foam::meshRefinement::findCellZoneGeometric // Sync syncTools::syncFaceList(mesh_, namedSurfaceIndex, maxEqOp<label>()); } -//XXXXXXXXX + + void Foam::meshRefinement::findCellZoneInsideWalk ( const labelList& locationSurfaces, // indices of surfaces with inside point @@ -1446,7 +1460,6 @@ void Foam::meshRefinement::findCellZoneInsideWalk } } } -//XXXXXXXXX bool Foam::meshRefinement::calcRegionToZone @@ -1827,7 +1840,8 @@ void Foam::meshRefinement::baffleAndSplitMesh const bool mergeFreeStanding, const dictionary& motionDict, Time& runTime, - const labelList& globalToPatch, + const labelList& globalToMasterPatch, + const labelList& globalToSlavePatch, const point& keepPoint ) { @@ -1849,7 +1863,7 @@ void Foam::meshRefinement::baffleAndSplitMesh labelList ownPatch, neiPatch; getBafflePatches ( - globalToPatch, + globalToMasterPatch, neiLevel, neiCc, @@ -1899,7 +1913,7 @@ void Foam::meshRefinement::baffleAndSplitMesh motionDict, removeEdgeConnectedCells, perpendicularAngle, - globalToPatch + globalToMasterPatch ) //markFacesOnProblemCellsGeometric(motionDict) ); @@ -1917,7 +1931,7 @@ void Foam::meshRefinement::baffleAndSplitMesh motionDict, removeEdgeConnectedCells, perpendicularAngle, - globalToPatch + globalToMasterPatch ) ); forAll(facePatchTopo, faceI) @@ -2051,7 +2065,8 @@ void Foam::meshRefinement::baffleAndSplitMesh Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::splitMesh ( const label nBufferLayers, - const labelList& globalToPatch, + const labelList& globalToMasterPatch, + const labelList& globalToSlavePatch, const point& keepPoint ) { @@ -2066,7 +2081,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::splitMesh labelList ownPatch, neiPatch; getBafflePatches ( - globalToPatch, + globalToMasterPatch, neiLevel, neiCc, @@ -2129,9 +2144,9 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::splitMesh // Patch for exposed faces for lack of anything sensible. label defaultPatch = 0; - if (globalToPatch.size()) + if (globalToMasterPatch.size()) { - defaultPatch = globalToPatch[0]; + defaultPatch = globalToMasterPatch[0]; } for (label i = 0; i < nBufferLayers; i++)