diff --git a/src/sampling/Make/files b/src/sampling/Make/files index 71007d65bd..22c32f0eeb 100644 --- a/src/sampling/Make/files +++ b/src/sampling/Make/files @@ -28,7 +28,9 @@ surface/cutting/cuttingSurfaceCuts.C surface/cutting/cuttingSurfaceBase.C surface/cutting/cuttingSurfaceBaseSelection.C surface/distanceSurface/distanceSurface.C +surface/distanceSurface/distanceSurfaceFilter.C surface/isoSurface/isoSurfaceBase.C +surface/isoSurface/isoSurfaceBaseNew.C surface/isoSurface/isoSurfaceParams.C surface/isoSurface/isoSurfaceCell.C surface/isoSurface/isoSurfacePoint.C @@ -42,6 +44,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/distanceSurface/sampledDistanceSurface.H b/src/sampling/sampledSurface/distanceSurface/sampledDistanceSurface.H index e3d5df2509..ce208cb259 100644 --- a/src/sampling/sampledSurface/distanceSurface/sampledDistanceSurface.H +++ b/src/sampling/sampledSurface/distanceSurface/sampledDistanceSurface.H @@ -40,6 +40,9 @@ Usage surface1 { type distanceSurface; + surfaceType triSurfaceMesh; + surfaceName something.obj; + topology proximity; } } \endverbatim @@ -48,18 +51,23 @@ Usage \table Property | Description | Required | Default type | distanceSurface | yes | - distance | Distance from surface | yes | - signed | Use sign when distance is positive | partly | - isoMethod | Iso-algorithm (cell/topo/point) | no | topo - regularise | Point snapping for iso-surface | no | true + distance | distance from surface | no | 0 + signed | Use sign when distance is positive | no | true + isoMethod | Iso-algorithm (cell/topo/point) | no | default + regularise | Face simplification (enum or bool) | no | true average | Cell values from averaged point values | no | false bounds | Limit with bounding box | no | surfaceType | Type of surface | yes | surfaceName | Name of surface in \c triSurface/ | no | dict name + topology | Topology filter (none/largestRegion/nearestPoints/proximity) | no | none + nearestPoints | Points for point-based segmentation | no | + maxDistance | Max search distance for nearestPoints | no | GREAT + relProximity | Max limit of absolute vs normal distance | no | 1e3 \endtable SourceFiles sampledDistanceSurface.C + sampledDistanceSurfaceTemplates.C \*---------------------------------------------------------------------------*/ diff --git a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C index 19479bd0fb..bd12eed92c 100644 --- a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C +++ b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C @@ -28,9 +28,11 @@ License #include "sampledIsoSurface.H" #include "dictionary.H" +#include "fvMesh.H" #include "volFields.H" #include "volPointInterpolation.H" #include "addToRunTimeSelectionTable.H" +#include "PtrList.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -44,13 +46,6 @@ namespace Foam word, isoSurface ); - addNamedToRunTimeSelectionTable - ( - sampledSurface, - sampledIsoSurface, - word, - isoSurfacePoint - ); } // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // @@ -310,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