diff --git a/src/sampling/Make/files b/src/sampling/Make/files index 72b78a4656..f7d9f7d4b4 100644 --- a/src/sampling/Make/files +++ b/src/sampling/Make/files @@ -43,6 +43,7 @@ sampledSurface/sampledPatchInternalField/sampledPatchInternalField.C sampledSurface/sampledPlane/sampledPlane.C sampledSurface/isoSurface/sampledIsoSurface.C sampledSurface/isoSurface/sampledIsoSurfaceCell.C +sampledSurface/isoSurface/sampledIsoSurfacePoint.C sampledSurface/isoSurface/sampledIsoSurfaceTopo.C sampledSurface/distanceSurface/sampledDistanceSurface.C sampledSurface/sampledCuttingPlane/sampledCuttingPlane.C diff --git a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C index 37a7618967..bd12eed92c 100644 --- a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C +++ b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C @@ -27,12 +27,12 @@ License \*---------------------------------------------------------------------------*/ #include "sampledIsoSurface.H" -#include "isoSurfacePoint.H" #include "dictionary.H" #include "fvMesh.H" #include "volFields.H" #include "volPointInterpolation.H" #include "addToRunTimeSelectionTable.H" +#include "PtrList.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -46,13 +46,6 @@ namespace Foam word, isoSurface ); - addNamedToRunTimeSelectionTable - ( - sampledSurface, - sampledIsoSurface, - word, - isoSurfacePoint - ); } // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // @@ -312,6 +305,111 @@ void Foam::sampledIsoSurface::getIsoFields() const } +void Foam::sampledIsoSurface::combineSurfaces +( + PtrList& isoSurfPtrs +) +{ + isoSurfacePtr_.reset(nullptr); + + // Already checked previously for ALGO_POINT, but do it again + // - ALGO_POINT still needs fields (for interpolate) + // The others can do straight transfer + if + ( + isoParams_.algorithm() == isoSurfaceParams::ALGO_POINT + && isoSurfPtrs.size() == 1 + ) + { + // Shift from list to autoPtr + isoSurfacePtr_.reset(isoSurfPtrs.release(0)); + } + else if (isoSurfPtrs.size() == 1) + { + autoPtr ptr(isoSurfPtrs.release(0)); + auto& surf = *ptr; + + surface_.transfer(static_cast(surf)); + meshCells_.transfer(surf.meshCells()); + } + else + { + // Combine faces with point offsets + // + // Note: use points().size() from surface, not nPoints() + // since there may be uncompacted dangling nodes + + label nFaces = 0, nPoints = 0; + + for (const auto& surf : isoSurfPtrs) + { + nFaces += surf.size(); + nPoints += surf.points().size(); + } + + faceList newFaces(nFaces); + pointField newPoints(nPoints); + meshCells_.resize(nFaces); + + surfZoneList newZones(isoSurfPtrs.size()); + + nFaces = 0; + nPoints = 0; + forAll(isoSurfPtrs, surfi) + { + autoPtr ptr(isoSurfPtrs.release(surfi)); + auto& surf = *ptr; + + SubList subFaces(newFaces, surf.size(), nFaces); + SubList subPoints(newPoints, surf.points().size(), nPoints); + SubList