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()),
180 allSurfaces_(
identity(topDict.size()))
185 const word& key = iter().keyword();
190 <<
"Found non-dictionary entry " << iter()
191 <<
" in top-level dictionary " << topDict
207 namedIO().rename(key);
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,
296 const word& regionName
301 return findIndex(this->
operator[](surfaceIndex).regions(), regionName);
427 Info<<
"Checking for closedness." <<
endl;
430 bool hasError =
false;
434 if (!
operator[](surfI).hasVolumeType())
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)))
520 <<
" : has multiple orientation zones (" 521 << nZones <<
")" <<
endl;
538 const scalar maxRatio,
544 Info<<
"Checking for size." <<
endl;
547 bool hasError =
false;
557 if (ratio > maxRatio || ratio < 1.0/maxRatio)
564 <<
" bounds differ from " <<
names()[j]
565 <<
" by more than a factor 100:" <<
nl 566 <<
" bounding box : " << bb <<
nl 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]];
651 && (i != j || !connected(s0, edgeI, hits[edgeI]))
654 intersections.append(hits[edgeI].hitPoint());
655 intersectionEdge.append(1.0*edgeI);
665 <<
" intersects " <<
names()[j]
672 names()[i] +
'_' +
names()[j] +
"_edgeIndex.vtk" 675 Info<<
" Writing intersection locations to " 711 const scalar minQuality,
717 Info<<
"Checking for triangle quality." <<
endl;
720 bool hasError =
false;
724 if (isA<triSurface>(
operator[](surfI)))
756 <<
" : has " << nBadTris <<
" bad quality triangles " 757 <<
" (quality < " << minQuality <<
")" <<
endl;
779 label noFailedChecks = 0;
790 return noFailedChecks;
796 const scalar maxRatio,
798 const scalar minQuality,
802 label noFailedChecks = 0;
804 if (maxRatio > 0 &&
checkSizes(maxRatio, report))
819 return noFailedChecks;
836 Info<<
" type : " << s.type() <<
nl 838 if (isA<triSurfaceMesh>(s))
847 if (patchTypes.
size() && patchTypes[surfI].
size() >= 1)
850 Info<<
" patches : ";
854 if (i < unique.size()-1)
878 <<
"Surface named " << surfName <<
" not found." <<
nl 879 <<
"Available surface names: " << names_ <<
endl 897 <<
"Surface named " << surfName <<
" not found." <<
nl 898 <<
"Available surface names: " << names_ <<
endl
autoPtr< IOobject > clone() const
Clone.
bool found(const word &, bool recursive=false, bool patternMatch=true) const
Search dictionary for given keyword.
#define forAll(list, i)
Loop across all elements in list.
label checkGeometry(const scalar maxRatio, const scalar tolerance, const scalar minQuality, const bool report) const
All geometric checks. Return number of failed checks.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
const word & name() const
Return name.
A class for handling file names.
virtual const wordList & regions() const =0
Names of regions.
label checkTopology(const bool report) const
All topological checks. Return number of failed checks.
errorManipArg< error, int > exit(error &err, const int errNo=1)
edgeList edges() const
Return edges in face point ordering,.
A list of keyword definitions, which are a keyword followed by any number of values (e...
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
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.
void findAnyIntersection(const pointField &start, const pointField &end, labelList &surfaces, List< pointIndexHit > &) const
Find any intersection. Return hit point information and.
virtual tmp< pointField > points() const
Get the points that define the surface.
void size(const label)
Override size to be inconsistent with allocated storage.
Ostream & endl(Ostream &os)
Add newline and flush stream.
label findSurfaceID(const word &name) const
Find index of surface. Return -1 if not found.
A simple wrapper around bool so that it can be read as a word: true/false, on/off, yes/no, y/n, t/f, or none/any.
labelList identity(const label len)
Create identity map (map[i] == i) of given length.
A bounding box defined in terms of the points at its extremities.
PointIndexHit< point > pointIndexHit
iterator end()
Return an iterator to end traversing the UPtrList.
Base class of (analytical or triangulated) surface. Encapsulates all the search routines. WIP.
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.
const Field< PointType > & localPoints() const
Return pointField of points in patch.
virtual void findLineAny(const pointField &start, const pointField &end, List< pointIndexHit > &) const =0
Return any intersection on segment from start to end.
boundBox bounds() const
Calculate bounding box.
void findNearestIntersection(const pointField &start, const pointField &end, labelList &surface1, List< pointIndexHit > &hit1, labelList &surface2, List< pointIndexHit > &hit2) const
label findSurfaceRegionID(const word &surfaceName, const word ®ionName) const
bool isDict(const word &) const
Check if entry is a sub-dictionary.
bool checkNormalOrientation(const bool report) const
Are all (triangulated) surfaces consistent normal orientation.
Various functions to operate on Lists.
const dictionary & subDict(const word &) const
Find and return a sub-dictionary.
IOoject and searching on triSurface.
friend Ostream & operator(Ostream &, const UPtrList< T > &)
Write UPtrList to Ostream.
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.timeName(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
void findNearest(const pointField &, const scalarField &nearestDistSqr, labelList &surfaces, List< pointIndexHit > &) const
Find nearest. Return -1 (and a miss()) or surface and nearest.
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.
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
A class for handling words, derived from string.
scalar mag() const
The magnitude of the bounding box span.
bool checkIntersection(const scalar tol, const bool report) const
Do surfaces self-intersect or intersect others.
bool readIfPresent(const word &, T &, bool recursive=false, bool patternMatch=true) const
Find an entry if present, and assign to T.
const Field< PointType > & points() const
Return reference to global points.
const labelListList & edgeFaces() const
Return edge-face addressing.
const edgeList & edges() const
Return list of edges, address into LOCAL point list.
searchableSurfaces(const label)
Construct with length specified. Fill later.
virtual label globalSize() const
Range of global indices that can be returned.
Triangle with additional region number.
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.
forAllConstIter(PtrDictionary< phaseModel >, mixture.phases(), phase)
errorManip< error > abort(error &err)
void setSize(const label)
Reset size of PtrList. If extending the PtrList, new entries are.
An Ostream is an abstract base class for all output systems (streams, files, token lists...
label nEdges() const
Return number of edges in patch.
defineTypeNameAndDebug(combustionModel, 0)
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.
label findIndex(const ListType &, typename ListType::const_reference, const label start=0)
Find first occurrence of given element and return index,.
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 size() const
Return the number of elements in the UPtrList.
void setSize(const label)
Reset size of List.
const searchableSurface & operator[](const word &) const
Return const reference to searchableSurface by name.
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
const wordList & names() const
static autoPtr< searchableSurface > New(const word &surfaceType, const IOobject &io, const dictionary &dict)
Return a reference to the selected searchableSurface.
scalar tolerance() const
Return tolerance to use in searches.
triangle< point, const point & > triPointRef
bool checkQuality(const scalar minQuality, const bool report) const
Check triangle quality.
T returnReduce(const T &Value, const BinaryOp &bop, const int tag=Pstream::msgType(), const label comm=UPstream::worldComm)
const boundBox & bounds() const
Return const reference to boundBox.
An auto-pointer similar to the STL auto_ptr but with automatic casting to a reference to the type and...
bool checkClosed(const bool report) const
Are all surfaces closed and manifold.
Triangulated surface description with patch information.
void writeStats(const List< wordList > &, Ostream &) const
Write some stats.
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
bool checkSizes(const scalar maxRatio, const bool report) const
Are all bounding boxes of similar size.
virtual bool hasVolumeType() const =0
Whether supports volume type below.
static boundBox bounds(const PtrList< searchableSurface > &allSurfaces, const labelList &surfacesToTest)
Find the boundBox of the selected surfaces.
ITstream & lookup(const word &, bool recursive=false, bool patternMatch=true) const
Find and return an entry data stream.