53 void Foam::sampledIsoSurface::getIsoFields()
const
55 const fvMesh& fvm =
static_cast<const fvMesh&
>(
mesh());
65 <<
"Lookup volField " << isoField_ <<
endl;
67 storedVolFieldPtr_.clear();
74 <<
"Checking " << isoField_
75 <<
" for same time " << fvm.time().timeName() <<
endl;
80 || (fvm.time().timeName() != storedVolFieldPtr_().instance())
84 <<
"Reading volField " << isoField_
85 <<
" from time " << fvm.time().timeName() <<
endl;
90 fvm.time().timeName(),
99 storedVolFieldPtr_.reset
107 volFieldPtr_ = storedVolFieldPtr_.get();
112 <<
"Cannot find isosurface field " << isoField_
113 <<
" in database or directory " << vfHeader.path()
133 const word pointFldName =
134 "volPointInterpolate_"
146 <<
"lookup pointField " << pointFldName <<
endl;
148 if (!pointFieldPtr_->upToDate(*volFieldPtr_))
151 <<
"updating pointField " << pointFldName <<
endl;
166 <<
"creating pointField " << pointFldName <<
endl;
187 storedVolFieldPtr_.reset
191 volFieldPtr_ = storedVolFieldPtr_.get();
196 <<
"volField " << volFieldPtr_->name()
197 <<
" min:" <<
min(*volFieldPtr_).value()
198 <<
" max:" <<
max(*volFieldPtr_).value() <<
nl
199 <<
"pointField " << pointFieldPtr_->name()
206 const fvMesh& subFvm = subMeshPtr_().subMesh();
215 <<
"Sub-mesh lookup volField " << isoField_ <<
endl;
217 storedVolSubFieldPtr_.clear();
222 <<
"Sub-setting volField " << isoField_ <<
endl;
224 storedVolSubFieldPtr_.reset
226 subMeshPtr_().interpolate
231 storedVolSubFieldPtr_->checkOut();
232 volSubFieldPtr_ = storedVolSubFieldPtr_.get();
238 const word pointFldName =
239 "volPointInterpolate_"
242 + volSubFieldPtr_->name()
251 <<
"Sub-mesh lookup pointField " << pointFldName <<
endl;
253 if (!pointFieldPtr_->upToDate(*volSubFieldPtr_))
256 <<
"Updating submesh pointField " << pointFldName <<
endl;
269 <<
"Interpolating submesh volField "
270 << volSubFieldPtr_->name()
271 <<
" to get submesh pointField " << pointFldName <<
endl;
287 storedVolSubFieldPtr_.reset
291 volSubFieldPtr_ = storedVolSubFieldPtr_.get();
297 << volSubFieldPtr_->name()
298 <<
" min:" <<
min(*volSubFieldPtr_).value()
299 <<
" max:" <<
max(*volSubFieldPtr_).value() <<
nl
301 << pointSubFieldPtr_->name()
308 void Foam::sampledIsoSurface::combineSurfaces
310 PtrList<isoSurfaceBase>& isoSurfPtrs
313 isoSurfacePtr_.reset(
nullptr);
321 && isoSurfPtrs.size() == 1
325 isoSurfacePtr_.reset(isoSurfPtrs.release(0));
327 else if (isoSurfPtrs.size() == 1)
329 autoPtr<isoSurfaceBase> ptr(isoSurfPtrs.release(0));
333 meshCells_.transfer(surf.meshCells());
344 for (
const auto& surf : isoSurfPtrs)
346 nFaces += surf.size();
347 nPoints += surf.points().size();
352 meshCells_.resize(nFaces);
358 forAll(isoSurfPtrs, surfi)
360 autoPtr<isoSurfaceBase> ptr(isoSurfPtrs.release(surfi));
363 SubList<face> subFaces(newFaces, surf.size(), nFaces);
364 SubList<point> subPoints(newPoints, surf.points().size(),
nPoints);
365 SubList<label> subCells(meshCells_, surf.size(), nFaces);
367 newZones[surfi] = surfZone
375 subFaces = surf.surfFaces();
376 subPoints = surf.points();
377 subCells = surf.meshCells();
381 for (face&
f : subFaces)
383 for (label& pointi :
f)
390 nFaces += subFaces.size();
396 std::move(newPoints),
401 surface_.transfer(combined);
405 if (subMeshPtr_ && meshCells_.size())
408 UIndirectList<label>(subMeshPtr_->cellMap(), meshCells_);
413 bool Foam::sampledIsoSurface::updateGeometry()
const
415 const fvMesh& fvm =
static_cast<const fvMesh&
>(
mesh());
418 if (fvm.time().timeIndex() == prevTimeIndex_)
423 prevTimeIndex_ = fvm.time().timeIndex();
428 isoSurfacePtr_.reset(
nullptr);
433 const bool hasCellZones =
443 subMeshPtr_.reset(
nullptr);
446 if (!ignoreCellsPtr_)
448 ignoreCellsPtr_.reset(
new bitSet);
452 bitSet select(
mesh().cellZones().selection(zoneNames_));
454 if (select.any() && !select.all())
459 *ignoreCellsPtr_ = std::move(select);
470 ignoreCellsPtr_->clearStorage();
474 ignoreCellsPtr_.reset(
new bitSet);
478 if (!subMeshPtr_ && hasCellZones)
480 const label exposedPatchi =
484 <<
"Allocating subset of size "
486 <<
" with exposed faces into patch "
487 << exposedPatchi <<
endl;
494 mesh().cellZones().selection(zoneNames_),
505 refPtr<volScalarField> tvolFld(*volFieldPtr_);
506 refPtr<pointScalarField> tpointFld(*pointFieldPtr_);
510 tvolFld.cref(*volSubFieldPtr_);
511 tpointFld.cref(*pointSubFieldPtr_);
517 PtrList<isoSurfaceBase> isoSurfPtrs(isoValues_.size());
528 tpointFld().primitiveField(),
536 const_cast<sampledIsoSurface&
>(*this)
537 .combineSurfaces(isoSurfPtrs);
553 meshCells_ = UIndirectList<label>(meshCells_,
faceMap)();
558 Pout<<
"isoSurface::updateGeometry() : constructed iso:" <<
nl
559 <<
" field : " << isoField_ <<
nl
561 <<
" average : " << Switch(average_) <<
nl
563 << Switch(
bool(isoParams_.filter())) <<
nl
564 <<
" bounds : " << isoParams_.getClipBounds() <<
nl;
567 Pout<<
" zone size : "
568 << subMeshPtr_->subMesh().nCells() <<
nl;
571 <<
" faces : " << surface().size() <<
nl
572 <<
" cut cells : " << meshCells().size()
593 isoParams_(
dict, params),
594 average_(
dict.getOrDefault(
"average", false)),
595 triangulate_(
dict.getOrDefault(
"triangulate", false)),
596 simpleSubMesh_(
dict.getOrDefault(
"simpleSubMesh", false)),
603 isoSurfacePtr_(nullptr),
605 subMeshPtr_(nullptr),
606 ignoreCellsPtr_(nullptr),
608 storedVolFieldPtr_(nullptr),
609 volFieldPtr_(nullptr),
610 pointFieldPtr_(nullptr),
612 storedVolSubFieldPtr_(nullptr),
613 volSubFieldPtr_(nullptr),
614 pointSubFieldPtr_(nullptr)
624 if (!
dict.readIfPresent(
"isoValues", isoValues_))
627 dict.readEntry(
"isoValue", isoValues_.first());
630 if (isoValues_.empty())
633 <<
"No isoValue or isoValues specified." <<
nl
637 if (isoValues_.size() > 1)
639 const label nOrig = isoValues_.size();
643 if (nOrig != isoValues_.size())
646 <<
"Removed non-unique isoValues" <<
nl;
653 simpleSubMesh_ =
false;
659 if (isoValues_.size() > 1)
662 <<
"Multiple values on iso-surface (point) not supported"
663 <<
" since needs original interpolators." <<
nl
677 <<
"Cannot triangulate without a regularise filter" <<
nl
685 if (!
dict.readIfPresent(
"zones", zoneNames_) &&
dict.found(
"zone"))
688 dict.readEntry(
"zone", zoneNames_.first());
693 dict.readIfPresent(
"exposedPatchName", exposedPatchName_);
696 <<
"Restricting to cellZone(s) " <<
flatOutput(zoneNames_)
697 <<
" with exposed internal faces into patch "
706 const polyMesh&
mesh,
707 const dictionary&
dict
734 isoSurfacePtr_.reset(
nullptr);
735 subMeshPtr_.reset(
nullptr);
741 if (prevTimeIndex_ == -1)
754 return updateGeometry();
764 return sampleOnFaces(sampler);
774 return sampleOnFaces(sampler);
784 return sampleOnFaces(sampler);
794 return sampleOnFaces(sampler);
804 return sampleOnFaces(sampler);
814 return sampleOnPoints(interpolator);
824 return sampleOnPoints(interpolator);
833 return sampleOnPoints(interpolator);
843 return sampleOnPoints(interpolator);
853 return sampleOnPoints(interpolator);
859 os <<
"isoSurface: " <<
name() <<
" :";
860 isoParams_.print(
os);
861 os <<
" field:" << isoField_