Go to the documentation of this file.
49 for (label celli = 0; celli < mesh_.nCells(); ++celli)
51 if (ignoreCells.
test(celli))
57 if (!(
cut & isoSurfaceBase::ANYCUT))
59 ignoreCells.
set(celli);
75 bitSet blockedFaces(mesh_.nFaces());
77 const labelList& faceOwn = mesh_.faceOwner();
78 const labelList& faceNei = mesh_.faceNeighbour();
81 for (label facei = 0; facei < mesh_.nInternalFaces(); ++facei)
88 ignoreCells.
test(faceOwn[facei])
89 != ignoreCells.
test(faceNei[facei])
92 blockedFaces.
set(facei);
105 const label facei =
patch.start() + patchFacei;
106 if (ignoreCells.
test(faceOwn[facei]))
108 blockedFaces.set(facei);
125 bitSet blockedFaces(filterPrepareRegionSplit(ignoreCells));
137 forAll(regionColour, celli)
139 if (!ignoreCells.
test(celli))
141 ++nCutsPerRegion[regionColour[celli]];
152 if (Pstream::master())
154 const label largest =
findMax(nCutsPerRegion);
163 keepRegion[largest] =
true;
168 Info<<
"Had " <<
sum(nCutsPerRegion) <<
" cuts, in "
169 << nCutsPerRegion.size() <<
" regions, largest is "
174 Pstream::scatter(keepRegion);
176 forAll(regionColour, celli)
178 if (!keepRegion.test(regionColour[celli]))
180 ignoreCells.
set(celli);
191 if (nearestPoints_.empty())
194 <<
"Ignoring nearestPoints - no points provided" <<
nl
200 bitSet blockedFaces(filterPrepareRegionSplit(ignoreCells));
221 if (ignoreCells.
test(celli))
226 const point& pt = cc[celli];
227 const label regioni = regionColour[celli];
229 ++nCutsPerRegion[regioni];
232 for (nearInfo& near : nearest)
234 const scalar distSqr =
magSqr(nearPts[pointi] - pt);
237 if (distSqr < near.first())
239 near.first() = distSqr;
240 near.second() = regioni;
256 if (Pstream::master())
258 const label largest =
findMax(nCutsPerRegion);
260 for (
const nearInfo& near : nearest)
262 const scalar distSqr = near.first();
263 const label regioni = near.second();
265 if (regioni != -1 && distSqr < maxDistanceSqr_)
267 keepRegion[regioni] =
true;
273 Info<<
"Had " <<
sum(nCutsPerRegion) <<
" cuts, in "
274 << nCutsPerRegion.size() <<
" regions, largest is "
277 Info<<
"nearestPoints (max distance = "
278 <<
sqrt(maxDistanceSqr_) <<
")" <<
nl;
282 const scalar dist =
sqrt(nearest[pointi].first());
283 const label regioni = nearest[pointi].second();
285 Info<<
" " << nearPts[pointi] <<
" region "
286 << regioni <<
" distance "
289 if (!keepRegion.test(regioni))
298 Pstream::scatter(keepRegion);
300 forAll(regionColour, celli)
302 if (!keepRegion.test(regionColour[celli]))
304 ignoreCells.
set(celli);
318 const pointField& fc = surface_.faceCentres();
321 bitSet blockedFaces(filterPrepareRegionSplit(ignoreCells));
341 calcAbsoluteDistance(faceDistance, fc, nearest);
350 const label celli = meshCells_[facei];
351 const label regioni = regionColour[celli];
353 const scalar faceArea = surface_[facei].mag(surface_.points());
354 distRegion[regioni] += (faceDistance[facei] * faceArea);
355 areaRegion[regioni] += (faceArea);
361 if (Pstream::master())
363 forAll(distRegion, regioni)
365 distRegion[regioni] /= (areaRegion[regioni] + VSMALL);
369 Pstream::listCombineScatter(distRegion);
374 bitSet acceptFaces(fc.size());
379 const label celli = meshCells_[facei];
380 const label regioni = regionColour[celli];
386 if (absProximity_ < distRegion[regioni])
392 acceptFaces.
set(facei);
415 ListOps::create<label>
418 [&](
const label celli){
return regionColour[celli]; }
426 ListOps::createWithValue<label>(surface_.size(), acceptFaces, 1, 0)
440 forAll(faceDistance, facei)
442 if (absProximity_ < faceDistance[facei])
448 acceptFaces.set(facei);
458 surface_.subsetMesh(acceptFaces, pointMap,
faceMap)
472 const pointField& fc = surface_.faceCentres();
486 calcAbsoluteDistance(faceDistance, fc, nearest);
494 faceNormalDistance.resize(fc.size());
513 bitSet acceptFaces(fc.size());
517 forAll(faceDistance, facei)
519 if (absProximity_ < faceDistance[facei])
524 Pout<<
"trim reject: "
525 << faceDistance[facei] <<
nl;
530 acceptFaces.set(facei);
550 writer.
write(
"normal-distance", faceNormalDistance);
555 ListOps::createWithValue<label>(surface_.
size(), acceptFaces, 1, 0)
int debug
Static debugging option.
Pair< int > faceMap(const label facePi, const face &faceP, const label faceNi, const face &faceN)
Low-level components common to various iso-surface algorithms.
A class for handling file names.
T returnReduce(const T &Value, const BinaryOp &bop, const int tag=Pstream::msgType(), const label comm=UPstream::worldComm)
A bitSet stores bits (elements with only two states) in packed internal format and supports a variety...
virtual void getNormal(const List< pointIndexHit > &, vectorField &normal) const =0
From a set of points and indices get the normal.
static constexpr const zero Zero
Global zero (0)
void filterRegionProximity(bitSet &ignoreCells) const
Remove region(s) that have far faces.
cutType getCellCutType(const label celli) const
virtual void write(const coordSet &, const wordList &, const List< const Field< Type > * > &, Ostream &) const =0
General entry point for writing.
void set(const bitSet &bitset)
Set specified bits from another bitset.
Ostream & endl(Ostream &os)
Add newline and flush stream.
void filterKeepNearestRegions(bitSet &ignoreCells) const
Keep region(s) closest to the nearest points.
prefixOSstream Pout
OSstream wrapped stdout (std::cout) with parallel prefix.
bool test(const label pos) const
Test value at specified position, never auto-vivify entries.
#define forAll(list, i)
Loop across all elements in list.
dimensioned< typename typeOfMag< Type >::type > magSqr(const dimensioned< Type > &dt)
bool refineBlockedCells(bitSet &ignoreCells, const isoSurfaceBase &isoContext) const
Re-filter the blocked cells based on the anticipated cuts.
scalar diff(const triad &A, const triad &B)
Return a quantity of the difference between two triads.
word outputName("finiteArea-edges.obj")
A surfaceWriter for VTK legacy (.vtk) or XML (.vtp) format.
void transfer(pointField &pointLst, List< Face > &faceLst)
Transfer the components.
messageStream Info
Information stream (stdout output on master, null elsewhere)
A patch is a list of labels that address the faces in the global face list.
Base class of (analytical or triangulated) surface. Encapsulates all the search routines....
Assign tuple-like container to use the one with the smaller value of first.
void filterFaceProximity()
Adjust extracted iso-surface to remove far faces.
This class separates the mesh into distinct unconnected regions, each of which is then given a label ...
label nRegions() const
Return total number of regions.
const word & surfaceName() const
The name of the underlying searchableSurface.
Patchify triangles based on orientation w.r.t other (triangulated or triangulatable) surfaces.
Base class for graphics format writing. Entry points are.
virtual void findNearest(const pointField &sample, const scalarField &nearestDistSqr, List< pointIndexHit > &) const =0
FlatOutput::OutputAdaptor< Container, Delimiters > flatOutput(const Container &obj, Delimiters delim)
Global flatOutput() function with specified output delimiters.
const std::string patch
OpenFOAM patch number as a std::string.
label findMax(const ListType &input, label start=0)
dimensionedScalar sqrt(const dimensionedScalar &ds)
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh > &df)
std::enable_if< std::is_same< bool, TypeT >::value, bool >::type set(const label i, bool val=true)
A bitSet::set() method for a list of bool.
void clearStorage()
Clear the list and delete storage.
void filterKeepLargestRegion(bitSet &ignoreCells) const
Keep region with the most cuts (after region split)
A List with indirect addressing.
Various functions to operate on Lists.
bitSet filterPrepareRegionSplit(const bitSet &ignoreCells) const
Prepare blockedFaces for region split.
A 2-tuple for storing two objects of dissimilar types. The container is similar in purpose to std::pa...
vector point
Point is a vector.
vtk::internalMeshWriter writer(topoMesh, topoCells, vtk::formatType::INLINE_ASCII, runTime.path()/"blockTopology")
label size() const
The surface size is the number of faces.
#define WarningInFunction
Report a warning using Foam::Warning.
MeshedSurface subsetMesh(const UList< bool > &include, labelList &pointMap, labelList &faceMap) const
Return a new surface subsetted on the selected faces.