diff --git a/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.C b/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.C index 1fe48b0fc1310e52e7f29c3e2bb022d414deb028..d69d656f9a2a8ddee0ca49cbf989564d4c738a7f 100644 --- a/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.C +++ b/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.C @@ -47,6 +47,7 @@ License #include "ListOps.H" #include "globalIndex.H" #include "cyclicACMIPolyPatch.H" +#include "mappedPatchBase.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -335,7 +336,12 @@ Foam::label Foam::fvMeshDistribute::findNonEmptyPatch() const { const polyPatch& pp = patches[patchi]; - if (!isA<emptyPolyPatch>(pp) && !isCoupledPatch(patchi)) + if + ( + !isA<emptyPolyPatch>(pp) + && !isCoupledPatch(patchi) + && !isA<mappedPatchBase>(pp) + ) { nonEmptyPatchi = patchi; break; diff --git a/src/dynamicMesh/fvMeshSubset/fvMeshSubset.C b/src/dynamicMesh/fvMeshSubset/fvMeshSubset.C index aa62bf48f3c8ae3579cce020407233b5d84b4477..98a5fac060874ae99bd58a821c1a36f0d513c550 100644 --- a/src/dynamicMesh/fvMeshSubset/fvMeshSubset.C +++ b/src/dynamicMesh/fvMeshSubset/fvMeshSubset.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2017 OpenFOAM Foundation - Copyright (C) 2015-2018 OpenCFD Ltd. + Copyright (C) 2015-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -1055,14 +1055,37 @@ void Foam::fvMeshSubset::setCellSubset { const label newSize = boundaryPatchSizes[globalPatchMap[oldPatchi]]; - // Clone (even if 0 size) - newBoundary[nNewPatches] = oldPatches[oldPatchi].clone - ( - fvMeshSubsetPtr_().boundaryMesh(), - nNewPatches, - newSize, - patchStart - ).ptr(); + if (oldInternalPatchID != oldPatchi) + { + // Pure subset of patch faces (no internal faces added to this + // patch). Can use mapping. + labelList map(newSize); + for (label patchFacei = 0; patchFacei < newSize; patchFacei++) + { + const label facei = patchStart+patchFacei; + const label oldFacei = faceMap_[facei]; + map[patchFacei] = oldPatches[oldPatchi].whichFace(oldFacei); + } + + newBoundary[nNewPatches] = oldPatches[oldPatchi].clone + ( + fvMeshSubsetPtr_().boundaryMesh(), + nNewPatches, + map, + patchStart + ).ptr(); + } + else + { + // Clone (even if 0 size) + newBoundary[nNewPatches] = oldPatches[oldPatchi].clone + ( + fvMeshSubsetPtr_().boundaryMesh(), + nNewPatches, + newSize, + patchStart + ).ptr(); + } patchStart += newSize; patchMap_[nNewPatches] = oldPatchi; // compact patchMap @@ -1115,14 +1138,37 @@ void Foam::fvMeshSubset::setCellSubset { const label newSize = boundaryPatchSizes[globalPatchMap[oldPatchi]]; - // Patch still exists. Add it - newBoundary[nNewPatches] = oldPatches[oldPatchi].clone - ( - fvMeshSubsetPtr_().boundaryMesh(), - nNewPatches, - newSize, - patchStart - ).ptr(); + if (oldInternalPatchID != oldPatchi) + { + // Pure subset of patch faces (no internal faces added to this + // patch). Can use mapping. + labelList map(newSize); + for (label patchFacei = 0; patchFacei < newSize; patchFacei++) + { + const label facei = patchStart+patchFacei; + const label oldFacei = faceMap_[facei]; + map[patchFacei] = oldPatches[oldPatchi].whichFace(oldFacei); + } + + newBoundary[nNewPatches] = oldPatches[oldPatchi].clone + ( + fvMeshSubsetPtr_().boundaryMesh(), + nNewPatches, + map, + patchStart + ).ptr(); + } + else + { + // Patch still exists. Add it + newBoundary[nNewPatches] = oldPatches[oldPatchi].clone + ( + fvMeshSubsetPtr_().boundaryMesh(), + nNewPatches, + newSize, + patchStart + ).ptr(); + } //Pout<< " " << oldPatches[oldPatchi].name() << " : " // << newSize << endl;