From 56b5234fbc5f95df9c037fe25d5322838b2d2bcb Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Mon, 7 Dec 2020 15:33:33 +0100 Subject: [PATCH] ENH: store concrete sampled isoSurface faces/points as member data - was previously via inheritance, but using member data instead supports a more flexible internal switching of the storage. It also ensures that data access remains safe, even in the absence of an isoSurface. --- .../distanceSurface/sampledDistanceSurface.H | 7 + .../sampledDistanceSurfaceTemplates.C | 31 ++- .../isoSurface/sampledIsoSurface.C | 39 ++- .../isoSurface/sampledIsoSurface.H | 59 +++- .../isoSurface/sampledIsoSurfaceCell.C | 27 +- .../isoSurface/sampledIsoSurfaceCell.H | 60 +++- .../sampledIsoSurfaceCellTemplates.C | 52 +++- .../isoSurface/sampledIsoSurfaceTemplates.C | 33 ++- .../isoSurface/sampledIsoSurfaceTopo.C | 34 ++- .../isoSurface/sampledIsoSurfaceTopo.H | 59 +++- .../sampledIsoSurfaceTopoTemplates.C | 50 +++- .../sampledCuttingPlane/sampledCuttingPlane.C | 257 ++++++++++-------- .../sampledCuttingPlane/sampledCuttingPlane.H | 115 ++++---- .../sampledCuttingPlaneTemplates.C | 36 ++- .../surface/distanceSurface/distanceSurface.C | 66 ++--- .../surface/distanceSurface/distanceSurface.H | 102 ++++--- .../distanceSurfaceTemplates.C | 53 +--- 17 files changed, 686 insertions(+), 394 deletions(-) diff --git a/src/sampling/sampledSurface/distanceSurface/sampledDistanceSurface.H b/src/sampling/sampledSurface/distanceSurface/sampledDistanceSurface.H index d74756adaf..e3d5df2509 100644 --- a/src/sampling/sampledSurface/distanceSurface/sampledDistanceSurface.H +++ b/src/sampling/sampledSurface/distanceSurface/sampledDistanceSurface.H @@ -108,6 +108,13 @@ class sampledDistanceSurface const interpolation& interpolation ) const; + //- Use distance surface isoSurfacePtr_ for point interpolation + template + tmp> sampleOnIsoSurfacePoints + ( + const interpolation& interpolator + ) const; + public: diff --git a/src/sampling/sampledSurface/distanceSurface/sampledDistanceSurfaceTemplates.C b/src/sampling/sampledSurface/distanceSurface/sampledDistanceSurfaceTemplates.C index 7189975b46..c9280890a7 100644 --- a/src/sampling/sampledSurface/distanceSurface/sampledDistanceSurfaceTemplates.C +++ b/src/sampling/sampledSurface/distanceSurface/sampledDistanceSurfaceTemplates.C @@ -57,6 +57,35 @@ Foam::sampledDistanceSurface::sampleOnPoints const interpolation& interpolator ) const { + if (this->hasIsoSurface()) + { + return this->sampleOnIsoSurfacePoints(interpolator); + } + + return sampledSurface::sampleOnPoints + ( + interpolator, + meshCells(), + faces(), + points() + ); +} + + +template +Foam::tmp> +Foam::sampledDistanceSurface::sampleOnIsoSurfacePoints +( + const interpolation& interpolator +) const +{ + if (!this->hasIsoSurface()) + { + FatalErrorInFunction + << "cannot call without an iso-surface" << nl + << exit(FatalError); + } + // Assume volPointInterpolation for the point field! const auto& volFld = interpolator.psi(); @@ -74,7 +103,7 @@ Foam::sampledDistanceSurface::sampleOnPoints tvolFld.reset(pointAverage(tpointFld())); } - return distanceSurface::interpolate(tvolFld(), tpointFld()); + return this->isoSurfaceInterpolate(tvolFld(), tpointFld()); } diff --git a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C index aae983344a..19479bd0fb 100644 --- a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C +++ b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C @@ -320,6 +320,17 @@ bool Foam::sampledIsoSurface::updateGeometry() const return false; } + prevTimeIndex_ = fvm.time().timeIndex(); + + // Clear any previously stored topologies + surface_.clear(); + meshCells_.clear(); + isoSurfacePtr_.reset(nullptr); + + // Clear derived data + sampledSurface::clearGeom(); + + // Get sub-mesh if any if ( @@ -347,16 +358,8 @@ bool Foam::sampledIsoSurface::updateGeometry() const ); } - - prevTimeIndex_ = fvm.time().timeIndex(); getIsoFields(); - // Clear any stored topo - isoSurfacePtr_.clear(); - - // Clear derived data - clearGeom(); - refPtr tvolFld(*volFieldPtr_); refPtr tpointFld(*pointFieldPtr_); @@ -394,7 +397,7 @@ bool Foam::sampledIsoSurface::updateGeometry() const } Pout<< " points : " << points().size() << nl << " faces : " << surface().size() << nl - << " cut cells : " << surface().meshCells().size() + << " cut cells : " << meshCells().size() << endl; } @@ -418,11 +421,17 @@ Foam::sampledIsoSurface::sampledIsoSurface average_(dict.getOrDefault("average", false)), zoneNames_(), exposedPatchName_(), - isoSurfacePtr_(nullptr), prevTimeIndex_(-1), + surface_(), + meshCells_(), + isoSurfacePtr_(nullptr), storedVolFieldPtr_(nullptr), volFieldPtr_(nullptr), - pointFieldPtr_(nullptr) + pointFieldPtr_(nullptr), + subMeshPtr_(nullptr), + storedVolSubFieldPtr_(nullptr), + volSubFieldPtr_(nullptr), + pointSubFieldPtr_(nullptr) { isoParams_.algorithm(isoSurfaceParams::ALGO_POINT); // Force @@ -470,11 +479,13 @@ bool Foam::sampledIsoSurface::needsUpdate() const bool Foam::sampledIsoSurface::expire() { - isoSurfacePtr_.clear(); - subMeshPtr_.clear(); + surface_.clear(); + meshCells_.clear(); + isoSurfacePtr_.reset(nullptr); + subMeshPtr_.reset(nullptr); // Clear derived data - clearGeom(); + sampledSurface::clearGeom(); // Already marked as expired if (prevTimeIndex_ == -1) diff --git a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H index e16154716a..2499081469 100644 --- a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H +++ b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H @@ -108,14 +108,24 @@ class sampledIsoSurface //- For zones: patch to put exposed faces into mutable word exposedPatchName_; - mutable autoPtr isoSurfacePtr_; - - // Recreated for every isoSurface + // Sampling geometry. Directly stored or via an iso-surface (ALGO_POINT) //- Time at last call, also track if surface needs an update mutable label prevTimeIndex_; + //- The extracted surface (direct storage) + mutable meshedSurface surface_; + + //- For every face the original cell in mesh (direct storage) + mutable labelList meshCells_; + + //- Extracted iso-surface, for interpolators + mutable autoPtr isoSurfacePtr_; + + + // Fields + //- Cached volfield mutable autoPtr storedVolFieldPtr_; mutable const volScalarField* volFieldPtr_; @@ -123,7 +133,6 @@ class sampledIsoSurface //- Cached pointfield mutable const pointScalarField* pointFieldPtr_; - // And on subsetted mesh //- Cached submesh @@ -160,6 +169,24 @@ class sampledIsoSurface const interpolation& interpolator ) const; + //- Use isoSurfacePtr_ for point interpolation + template + tmp> sampleOnIsoSurfacePoints + ( + const interpolation& interpolator + ) const; + + +protected: + + // Protected Member Functions + + //- Is currently backed by an isoSurfacePtr_ + bool hasIsoSurface() const + { + return bool(isoSurfacePtr_); + } + public: @@ -184,11 +211,6 @@ public: // Member Functions - const isoSurfacePoint& surface() const - { - return *isoSurfacePtr_; - } - //- Does the surface need an update? virtual bool needsUpdate() const; @@ -201,6 +223,25 @@ public: // Do nothing (and return false) if no update was needed virtual bool update(); + //- The currently created surface geometry + const meshedSurface& surface() const + { + if (isoSurfacePtr_) + { + return *isoSurfacePtr_; + } + return surface_; + } + + //- For each face, the original cell in mesh + const labelList& meshCells() const + { + if (isoSurfacePtr_) + { + return isoSurfacePtr_->meshCells(); + } + return meshCells_; + } //- Points of surface virtual const pointField& points() const diff --git a/src/sampling/sampledSurface/isoSurface/sampledIsoSurfaceCell.C b/src/sampling/sampledSurface/isoSurface/sampledIsoSurfaceCell.C index 02e01186a6..cc83106d31 100644 --- a/src/sampling/sampledSurface/isoSurface/sampledIsoSurfaceCell.C +++ b/src/sampling/sampledSurface/isoSurface/sampledIsoSurfaceCell.C @@ -63,6 +63,11 @@ bool Foam::sampledIsoSurfaceCell::updateGeometry() const prevTimeIndex_ = fvm.time().timeIndex(); + // Clear any previously stored topologies + surface_.clear(); + meshCells_.clear(); + isoSurfacePtr_.reset(nullptr); + // Clear derived data sampledSurface::clearGeom(); @@ -160,7 +165,6 @@ bool Foam::sampledIsoSurfaceCell::updateGeometry() const } } - meshedSurface& mySurface = const_cast(*this); { isoSurfaceCell surf ( @@ -172,10 +176,17 @@ bool Foam::sampledIsoSurfaceCell::updateGeometry() const *ignoreCellsPtr_ ); - mySurface.transfer(static_cast(surf)); + surface_.transfer(static_cast(surf)); meshCells_.transfer(surf.meshCells()); } + // if (subMeshPtr_ && meshCells_.size()) + // { + // // With the correct addressing into the full mesh + // meshCells_ = + // UIndirectList