45 bool Foam::searchableSurfaces::connected
52 const triFace& localFace =
s.localFaces()[hit.index()];
53 const edge&
e =
s.edges()[edgeI];
57 if (
e.otherVertex(localFace[i]) != -1)
174 const bool singleRegionName
178 names_(topDict.size()),
179 regionNames_(topDict.size()),
185 const word& key = iter().keyword();
190 <<
"Found non-dictionary entry " << iter()
191 <<
" in top-level dictionary " << topDict
198 dict.readIfPresent(
"name", names_[surfI]);
207 namedIO().rename(key);
224 const wordList& localNames =
s.regions();
226 wordList& rNames = regionNames_[surfI];
229 if (singleRegionName && localNames.
size() == 1)
231 rNames[0] = names_[surfI];
235 forAll(localNames, regionI)
237 rNames[regionI] = names_[surfI] +
'_' + localNames[regionI];
242 if (
dict.found(
"regions"))
248 const word& key = iter().keyword();
250 if (regionsDict.
isDict(key))
260 <<
"Unknown region name " << key
261 <<
" for surface " <<
s.name() <<
endl
262 <<
"Valid region names are " << localNames
266 rNames[index] =
word(regionDict.
lookup(
"name"));
277 regionNames_.setSize(surfI);
286 const word& wantedName
295 const word& surfaceName,
299 label surfaceIndex = findSurfaceID(surfaceName);
427 Info<<
"Checking for closedness." <<
endl;
430 bool hasError =
false;
434 if (!
operator[](surfI).hasVolumeType())
440 Info<<
" " << names()[surfI]
441 <<
" : not closed" <<
endl;
444 if (isA<triSurface>(
operator[](surfI)))
452 label nSingleEdges = 0;
455 if (edgeFaces[edgeI].size() == 1)
461 label nMultEdges = 0;
464 if (edgeFaces[edgeI].size() > 2)
470 if (report && (nSingleEdges != 0 || nMultEdges != 0))
472 Info<<
" connected to one face : "
473 << nSingleEdges <<
nl
474 <<
" connected to >2 faces : "
475 << nMultEdges <<
endl;
494 Info<<
"Checking for normal orientation." <<
endl;
497 bool hasError =
false;
501 if (isA<triSurface>(
operator[](surfI)))
519 Info<<
" " << names()[surfI]
520 <<
" : has multiple orientation zones ("
521 << nZones <<
")" <<
endl;
538 const scalar maxRatio,
544 Info<<
"Checking for size." <<
endl;
547 bool hasError =
false;
551 const boundBox& bb = operator[](i).bounds();
553 for (
label j = i+1; j < size(); j++)
555 scalar ratio = bb.
mag()/operator[](j).bounds().mag();
557 if (ratio > maxRatio || ratio < 1.0/maxRatio)
563 Info<<
" " << names()[i]
564 <<
" bounds differ from " << names()[j]
565 <<
" by more than a factor 100:" <<
nl
566 <<
" bounding box : " << bb <<
nl
567 <<
" bounding box : " << operator[](j).bounds()
586 const scalar tolerance,
592 Info<<
"Checking for intersection." <<
endl;
597 bool hasError =
false;
601 if (isA<triSurfaceMesh>(
operator[](i)))
615 const edge&
e = edges0[edgeI];
616 start[edgeI] = localPoints0[
e[0]];
617 end[edgeI] = localPoints0[
e[1]];
640 operator[](j).findLineAny(start, end, hits);
651 && (i != j || !connected(s0, edgeI, hits[edgeI]))
654 intersections.
append(hits[edgeI].hitPoint());
655 intersectionEdge.
append(1.0*edgeI);
664 Info<<
" " << names()[i]
665 <<
" intersects " << names()[j]
672 names()[i] +
'_' + names()[j] +
"_edgeIndex.vtk"
675 Info<<
" Writing intersection locations to "
681 names()[i] +
'_' + names()[j],
711 const scalar minQuality,
717 Info<<
"Checking for triangle quality." <<
endl;
720 bool hasError =
false;
724 if (isA<triSurface>(
operator[](surfI)))
755 Info<<
" " << names()[surfI]
756 <<
" : has " << nBadTris <<
" bad quality triangles "
757 <<
" (quality < " << minQuality <<
")" <<
endl;
779 label noFailedChecks = 0;
781 if (checkClosed(report))
786 if (checkNormalOrientation(report))
790 return noFailedChecks;
796 const scalar maxRatio,
798 const scalar minQuality,
802 label noFailedChecks = 0;
804 if (maxRatio > 0 && checkSizes(maxRatio, report))
809 if (checkIntersection(tol, report))
814 if (checkQuality(minQuality, report))
819 return noFailedChecks;
832 Info<<
" " << names()[surfI] <<
':' <<
endl;
836 Info<<
" type : " <<
s.type() <<
nl
837 <<
" size : " <<
s.globalSize() <<
nl;
838 if (isA<triSurfaceMesh>(
s))
842 <<
" points : " << ts.
points()().size() <<
nl;
844 Info<<
" bounds : " <<
s.bounds() <<
nl
845 <<
" closed : " <<
Switch(
s.hasVolumeType()) <<
endl;
850 Info<<
" patches : ";
854 if (i < unique.size()-1)
873 const label surfI = findSurfaceID(surfName);
878 <<
"Surface named " << surfName <<
" not found." <<
nl
879 <<
"Available surface names: " << names_ <<
endl
883 return operator[](surfI);
892 const label surfI = findSurfaceID(surfName);
897 <<
"Surface named " << surfName <<
" not found." <<
nl
898 <<
"Available surface names: " << names_ <<
endl
902 return operator[](surfI);
Various functions to operate on Lists.
#define forAll(list, i)
Loop across all elements in list.
#define forAllConstIter(Container, container, iter)
Iterate across all elements in the container object of type.
DynamicField< T, SizeInc, SizeMult, SizeDiv > & append(const T &)
Append an element at the end of the list.
label capacity() const
Size of the underlying storage.
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
autoPtr< IOobject > clone() const
Clone.
void size(const label)
Override size to be inconsistent with allocated storage.
void setSize(const label)
Reset size of List.
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
label nEdges() const
Return number of edges in patch.
const edgeList & edges() const
Return list of edges, address into LOCAL point list.
const Field< PointType > & localPoints() const
Return pointField of points in patch.
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
bool set(const label) const
Is element set.
void setSize(const label)
Reset size of PtrList. If extending the PtrList, new entries are.
A simple wrapper around bool so that it can be read as a word: true/false, on/off,...
friend Ostream & operator(Ostream &, const UPtrList< T > &)
Write UPtrList to Ostream.
An auto-pointer similar to the STL auto_ptr but with automatic casting to a reference to the type and...
A bounding box defined in terms of the points at its extremities.
scalar mag() const
The magnitude of the bounding box span.
A list of keyword definitions, which are a keyword followed by any number of values (e....
ITstream & lookup(const word &, bool recursive=false, bool patternMatch=true) const
Find and return an entry data stream.
bool isDict(const word &) const
Check if entry is a sub-dictionary.
const dictionary & subDict(const word &) const
Find and return a sub-dictionary.
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
A class for handling file names.
Triangle with additional region number.
Base class of (analytical or triangulated) surface. Encapsulates all the search routines....
static autoPtr< searchableSurface > New(const word &surfaceType, const IOobject &io, const dictionary &dict)
Return a reference to the selected searchableSurface.
static boundBox bounds(const PtrList< searchableSurface > &allSurfaces, const labelList &surfacesToTest)
Find the boundBox of the selected surfaces.
static void findNearestIntersection(const PtrList< searchableSurface > &allSurfaces, const labelList &surfacesToTest, const pointField &start, const pointField &end, labelList &surface1, List< pointIndexHit > &hit1, labelList &surface2, List< pointIndexHit > &hit2)
Find intersections of edge nearest to both endpoints.
static void findAnyIntersection(const PtrList< searchableSurface > &, const labelList &surfacesToTest, const pointField &start, const pointField &end, labelList &surfaces, List< pointIndexHit > &)
Find any intersection. Return hit point information and.
static void findAllIntersections(const PtrList< searchableSurface > &, const labelList &surfacesToTest, const pointField &start, const pointField &end, labelListList &surfaces, List< List< pointIndexHit >> &surfaceHits)
Find all intersections in order from start to end. Returns for.
static void findNearest(const PtrList< searchableSurface > &, const labelList &surfacesToTest, const pointField &, const scalarField &nearestDistSqr, labelList &surfaces, List< pointIndexHit > &)
Find nearest. Return -1 (and a miss()) or surface and nearest.
Container for searchableSurfaces.
bool checkQuality(const scalar minQuality, const bool report) const
Check triangle quality.
label checkGeometry(const scalar maxRatio, const scalar tolerance, const scalar minQuality, const bool report) const
All geometric checks. Return number of failed checks.
boundBox bounds() const
Calculate bounding box.
label findSurfaceRegionID(const word &surfaceName, const word ®ionName) const
bool checkClosed(const bool report) const
Are all surfaces closed and manifold.
bool checkSizes(const scalar maxRatio, const bool report) const
Are all bounding boxes of similar size.
const searchableSurface & operator[](const word &) const
Return const reference to searchableSurface by name.
void findAllIntersections(const pointField &start, const pointField &end, labelListList &surfaces, List< List< pointIndexHit >> &) const
Find all intersections in order from start to end. Returns for.
label checkTopology(const bool report) const
All topological checks. Return number of failed checks.
void findAnyIntersection(const pointField &start, const pointField &end, labelList &surfaces, List< pointIndexHit > &) const
Find any intersection. Return hit point information and.
void writeStats(const List< wordList > &, Ostream &) const
Write some stats.
bool checkNormalOrientation(const bool report) const
Are all (triangulated) surfaces consistent normal orientation.
bool checkIntersection(const scalar tol, const bool report) const
Do surfaces self-intersect or intersect others.
searchableSurfaces(const label)
Construct with length specified. Fill later.
void findNearest(const pointField &, const scalarField &nearestDistSqr, labelList &surfaces, List< pointIndexHit > &) const
Find nearest. Return -1 (and a miss()) or surface and nearest.
label findSurfaceID(const word &name) const
Find index of surface. Return -1 if not found.
void findNearestIntersection(const pointField &start, const pointField &end, labelList &surface1, List< pointIndexHit > &hit1, labelList &surface2, List< pointIndexHit > &hit2) const
A surface geometry formed of discrete facets, e.g. triangles and/or quadrilaterals,...
virtual tmp< pointField > points() const
Get the points that define the surface.
scalar tolerance() const
Return tolerance to use in searches.
Triangulated surface description with patch information.
A class for handling words, derived from string.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
gmvFile<< "tracers "<< particles.size()<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().x()<< " ";}gmvFile<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().y()<< " ";}gmvFile<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().z()<< " ";}gmvFile<< nl;forAll(lagrangianScalarNames, i){ word name=lagrangianScalarNames[i];IOField< scalar > s(IOobject(name, runTime.name(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
void write(const fileName &file, const word &title, const bool binary, const PointField &points, const VertexList &vertices, const LineList &lines, const FaceList &faces, const wordList &fieldNames, const boolList &fieldIsPointValues, const UPtrList< const Field< label >> &fieldLabelValues #define FieldTypeValuesConstArg(Type, nullArg))
Write VTK polygonal data to a file. Takes a PtrList of fields of labels and.
errorManipArg< error, int > exit(error &err, const int errNo=1)
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
PointIndexHit< point > pointIndexHit
Ostream & endl(Ostream &os)
Add newline and flush stream.
errorManip< error > abort(error &err)
T returnReduce(const T &Value, const BinaryOp &bop, const int tag=Pstream::msgType(), const label comm=UPstream::worldComm)
defineTypeNameAndDebug(combustionModel, 0)
layerAndWeight max(const layerAndWeight &a, const layerAndWeight &b)
triangle< point, const point & > triPointRef
label findIndex(const ListType &, typename ListType::const_reference, const label start=0)
Find first occurrence of given element and return index,.
labelList identityMap(const label len)
Create identity map (map[i] == i) of given length.
wordList patchTypes(nPatches)
scalarField samples(nIntervals, 0)