46 Foam::polyBoundaryMesh::polyBoundaryMesh
65 <<
"Specified IOobject::MUST_READ_IF_MODIFIED but class" 66 <<
" does not support automatic rereading." 74 Istream& is = readStream(typeName);
86 patchEntries[
patchi].keyword(),
97 "polyBoundaryMesh::polyBoundaryMesh" 98 "(const IOobject&, const polyMesh&)" 106 Foam::polyBoundaryMesh::polyBoundaryMesh
119 Foam::polyBoundaryMesh::polyBoundaryMesh
141 <<
"Specified IOobject::MUST_READ_IF_MODIFIED but class" 142 <<
" does not support automatic rereading." 149 Istream& is = readStream(typeName);
161 patchEntries[
patchi].keyword(),
172 "polyBoundaryMesh::polyBoundaryMesh" 173 "(const IOobject&, const polyMesh&, const polyPatchList&)" 202 operator[](
patchi).clearGeom();
210 nbrEdgesPtr_.clear();
212 groupPatchIDsPtr_.clear();
218 operator[](
patchi).clearAddressing();
226 void Foam::polyBoundaryMesh::calcGeometry()
238 operator[](
patchi).initCalcGeometry(pBufs);
245 operator[](
patchi).calcGeometry(pBufs);
255 forAll(patchSchedule, patchEvali)
257 const label patchi = patchSchedule[patchEvali].patch;
259 if (patchSchedule[patchEvali].init)
261 operator[](patchi).initCalcGeometry(pBufs);
265 operator[](patchi).calcGeometry(pBufs);
278 <<
"Neighbour edge addressing not correct across parallel" 279 <<
" boundaries." <<
endl;
282 if (!nbrEdgesPtr_.valid())
288 label nEdgePairs = 0;
319 edgei < edges.
size();
324 const edge&
e = edges[edgei];
330 pointsToEdge.
find(meshEdge);
332 if (fnd == pointsToEdge.
end())
354 nbrEdges[edgeInfo[0]][edgeInfo[1]]
360 pointsToEdge.
erase(meshEdge);
365 if (pointsToEdge.
size())
368 <<
"Not all boundary edges of patches match up." <<
nl 369 <<
"Is the outside of your mesh multiply connected?" 381 const labelPair& edgeInfo = nbrEdgesp[i];
383 if (edgeInfo[0] == -1 || edgeInfo[1] == -1)
389 <<
"Not all boundary edges of patches match up." <<
nl 390 <<
"Edge " << edgeI <<
" on patch " << pp.
name()
392 << pp.
localPoints()[e[1]] <<
" is not matched to an" 393 <<
" edge on any other patch." <<
nl 394 <<
"Is the outside of your mesh multiply connected?" 401 return nbrEdgesPtr_();
407 if (!patchIDPtr_.valid())
414 - mesh_.nInternalFaces()
423 label bFacei = bm[
patchi].start() - mesh_.nInternalFaces();
426 patchID[bFacei++] =
patchi;
430 return patchIDPtr_();
437 if (!groupPatchIDsPtr_.valid())
457 if (iter != groupPatchIDs.
end())
474 <<
"Removing patchGroup '" << bm[
patchi].
name()
475 <<
"' which clashes with patch " <<
patchi 476 <<
" of the same name." 482 return groupPatchIDsPtr_();
488 const word& groupName,
492 groupPatchIDsPtr_.clear();
525 if (groups[i] != groupName)
527 groups[newI++] = groups[i];
585 const bool usePatchGroups
596 if (usePatchGroups && groupPatchIDs().size())
600 const wordList allGroupNames = groupPatchIDs().toc();
604 const word& grpName = allGroupNames[groupIDs[i]];
605 const labelList& patchIDs = groupPatchIDs()[grpName];
608 if (indexSet.
insert(patchIDs[j]))
610 indices.
append(patchIDs[j]);
624 if (key ==
operator[](i).
name())
631 if (usePatchGroups && groupPatchIDs().size())
634 groupPatchIDs().find(key);
636 if (iter != groupPatchIDs().end())
643 if (indexSet.
insert(patchIDs[j]))
645 indices.
append(patchIDs[j]);
653 return move(indices);
666 if (!indices.
empty())
675 if (key ==
operator[](i).
name())
703 Pout<<
"label polyBoundaryMesh::findPatchID(const word&) const" 704 <<
"Patch named " << patchName <<
" not found. " 705 <<
"List of available patch names: " << names() <<
endl;
719 if (faceIndex <
mesh().nInternalFaces())
723 else if (faceIndex >=
mesh().nFaces())
726 <<
"given label " << faceIndex
727 <<
" greater than the number of geometric faces " <<
mesh().
nFaces()
738 faceIndex >= bp.
start()
739 && faceIndex < bp.
start() + bp.size()
748 <<
"Cannot find face " << faceIndex <<
" in any of the patches " 750 <<
"It seems your patches are not consistent with the mesh :" 752 <<
" total number of faces:" <<
mesh().
nFaces()
762 const bool warnNotFound,
763 const bool usePatchGroups
766 const wordList allPatchNames(this->names());
771 const wordRe& patchName = patchNames[i];
782 if (patchIDs.
empty())
786 const wordList allGroupNames = groupPatchIDs().toc();
793 const word&
name = allGroupNames[groupIDs[i]];
796 forAll(extraPatchIDs, extraI)
798 ids.
insert(extraPatchIDs[extraI]);
802 if (groupIDs.
empty() && warnNotFound)
805 <<
"Cannot find any patch or group names matching " 810 else if (warnNotFound)
813 <<
"Cannot find any patch names matching " << patchName
840 groupPatchIDs.
begin();
841 iter != groupPatchIDs.
end();
852 label nMatch = nonGroupPatches.
erase(groupPatchSet);
854 if (nMatch == groupPatchSet.
size())
856 matchedGroups.
append(iter.key());
858 else if (nMatch != 0)
861 nonGroupPatches.
transfer(oldNonGroupPatches);
879 bool hasError =
false;
889 if (!isA<processorPolyPatch>(bm[
patchi]))
891 if (nonProci != patchi)
898 Pout<<
" ***Problem with boundary patch " << patchi
900 <<
" of type " << bm[
patchi].type()
901 <<
". The patch seems to be preceded by processor" 902 <<
" patches. This is can give problems." 909 types[nonProci] = bm[
patchi].type();
915 types.setSize(nonProci);
929 for (
label proci = 1; proci < allNames.
size(); ++proci)
933 (allNames[proci] != allNames[0])
934 || (allTypes[proci] != allTypes[0])
941 Info<<
" ***Inconsistent patches across processors, " 942 "processor 0 has patch names:" << allNames[0]
943 <<
" patch types:" << allTypes[0]
944 <<
" processor " << proci <<
" has patch names:" 946 <<
" patch types:" << allTypes[proci]
961 bool hasError =
false;
967 if (bm[
patchi].start() != nextPatchStart && !hasError)
971 Info<<
" ****Problem with boundary patch " <<
patchi 973 <<
" of type " << bm[
patchi].type()
974 <<
". The patch should start on face no " << nextPatchStart
975 <<
" and the patch specifies " << bm[
patchi].start()
977 <<
"Possibly consecutive patches have this same problem." 978 <<
" Suppressing future warnings." <<
endl;
985 Info<<
" ****Duplicate boundary patch " <<
patchi 987 <<
" of type " << bm[
patchi].type()
989 <<
"Suppressing future warnings." <<
endl;
1001 Pout<<
" ***Boundary definition is in error." <<
endl;
1005 Info<<
" Boundary definition OK." <<
endl;
1025 operator[](
patchi).initMovePoints(pBufs, p);
1032 operator[](
patchi).movePoints(pBufs, p);
1042 forAll(patchSchedule, patchEvali)
1044 const label patchi = patchSchedule[patchEvali].patch;
1046 if (patchSchedule[patchEvali].init)
1048 operator[](patchi).initMovePoints(pBufs, p);
1052 operator[](patchi).movePoints(pBufs, p);
1061 nbrEdgesPtr_.clear();
1062 patchIDPtr_.clear();
1063 groupPatchIDsPtr_.clear();
1075 operator[](
patchi).initUpdateMesh(pBufs);
1082 operator[](
patchi).updateMesh(pBufs);
1092 forAll(patchSchedule, patchEvali)
1094 const label patchi = patchSchedule[patchEvali].patch;
1096 if (patchSchedule[patchEvali].init)
1098 operator[](patchi).initUpdateMesh(pBufs);
1102 operator[](patchi).updateMesh(pBufs);
1112 const bool validBoundary
1120 patches[
patchi].rename(newNames);
1134 const bool validBoundary
1174 os.
check(
"polyBoundaryMesh::writeData(Ostream& os) const");
1196 const word& patchName
1204 <<
"Patch named " << patchName <<
" not found." <<
nl 1205 <<
"Available patch names: " << names() <<
endl 1209 return operator[](patchi);
1215 const word& patchName
1223 <<
"Patch named " << patchName <<
" not found." <<
nl 1224 <<
"Available patch names: " << names() <<
endl 1228 return operator[](patchi);
PtrList< polyPatch > polyPatchList
container classes for polyPatch
void reorder(const labelUList &oldToNew)
Reorders elements. Ordering does not have to be done in.
static void scatterList(const List< commsStruct > &comms, List< T > &Values, const int tag, const label comm)
Scatter data. Reverse of gatherList.
#define forAll(list, i)
Loop across all elements in list.
bool empty() const
Return true if the UList is empty (ie, size() is zero)
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
bool writeData(Ostream &) const
writeData member function required by regIOobject
const word & name() const
Return name.
const word & name() const
Return name.
Ostream & indent(Ostream &os)
Indent stream.
bool set(const label) const
Is element set.
void finishedSends(const bool block=true)
Mark all sends as having been done. This will start receives.
An STL-conforming const_iterator.
static iteratorEnd end()
iteratorEnd set to beyond the end of any HashTable
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
virtual bool check(const char *operation) const
Check IOstream status for given operation.
label nInternalFaces() const
bool writeObject(IOstream::streamFormat fmt, IOstream::versionNumber ver, IOstream::compressionType cmp, const bool write=true) const
Write using given format, version and form uncompression.
void renamePatches(const wordUList &newNames, const bool validBoundary)
Rename the patches. If validBoundary is set this calls updateMesh()
const lduSchedule & patchSchedule() const
Order in which the patches should be initialised/evaluated.
bool inGroup(const word &) const
Test if in group.
An Istream is an abstract base class for all input systems (streams, files, token lists etc)...
void size(const label)
Override size to be inconsistent with allocated storage.
static int myProcNo(const label communicator=0)
Number of this process (starting from masterNo() = 0)
Ostream & endl(Ostream &os)
Add newline and flush stream.
const labelList & patchID() const
Per boundary face label the patch index.
static bool master(const label communicator=0)
Am I the master process.
void reorderPatches(const labelUList &newToOld, const bool validBoundary)
Reorders the patches. Ordering does not have to be done in.
label findPatchID(const word &patchName) const
Find patch index given a name.
label nInternalEdges() const
Number of internal edges.
void clearGeom()
Clear geometry at this level and at patches.
const wordList & inGroups() const
Return the optional groups patch belongs to.
Operations on lists of strings.
void transfer(HashTable< T, Key, Hash > &)
Transfer the contents of the argument table into this table.
const Field< PointType > & localPoints() const
Return pointField of points in patch.
wordList types() const
Return a list of patch types.
labelList findIndices(const ListType &, typename ListType::const_reference, const label start=0)
Find all occurrences of given element. Linear search.
bool insert(const Key &key)
Insert a new entry.
labelHashSet patchSet(const UList< wordRe > &patchNames, const bool warnNotFound=true, const bool usePatchGroups=true) const
Return the set of patch IDs corresponding to the given names.
bool good() const
Return true if next operation might succeed.
label size() const
Return number of elements in table.
const labelList & meshPoints() const
Return labelList of mesh points in patch. They are constructed.
bool erase(const iterator &)
Erase a hashedEntry specified by given iterator.
bool findStrings(const wordReListMatcher &matcher, const std::string &str)
Return true if string matches one of the regular expressions.
friend Ostream & operator(Ostream &, const UPtrList< T > &)
Write UPtrList to Ostream.
bool insert(const Key &, const T &newElmt)
Insert a new hashedEntry.
iterator find(const Key &)
Find and return an iterator set at the hashedEntry.
HashSet< label, Hash< label > > labelHashSet
A HashSet with label keys.
An STL-conforming iterator.
void matchGroups(const labelUList &patchIDs, wordList &groups, labelHashSet &nonGroupPatches) const
Match the patches to groups. Returns all the (fully matched) groups.
An ordered pair of two objects of type <T> with first() and second() elements.
~polyBoundaryMesh()
Destructor.
void movePoints(const pointField &)
Correct polyBoundaryMesh after moving points.
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.
static bool isPattern(const string &)
Test string for regular expression meta characters.
bool checkDefinition(const bool report=false) const
Check boundary definition. Return true if in error.
wordList names() const
Return a list of patch names.
void append(const T &)
Append an element at the end of the list.
void setCapacity(const label)
Alter the size of the underlying storage.
wordList patchNames(nPatches)
streamFormat
Enumeration for the format of data in the stream.
DynamicList< T, SizeInc, SizeMult, SizeDiv > & append(const T &)
Append an element at the end of the list.
Pair< label > labelPair
Label pair.
const globalMeshData & globalData() const
Return parallel info.
const edgeList & edges() const
Return list of edges, address into LOCAL point list.
List< label > labelList
A List of labels.
wordList physicalTypes() const
Return a list of physical types.
iterator begin()
Iterator set to the beginning of the HashTable.
An STL-conforming hash table.
errorManip< error > abort(error &err)
const List< labelPairList > & nbrEdges() const
Per patch the edges on the neighbouring patch. Is for every external.
A wordRe is a word, but can also have a regular expression for matching words.
A 1D vector of objects of type <T>, where the size of the vector is known and can be used for subscri...
void setSize(const label)
Reset size of PtrList. If extending the PtrList, new entries are.
compressionType
Enumeration for the format of data in the stream.
An Ostream is an abstract base class for all output systems (streams, files, token lists...
bool checkParallelSync(const bool report=false) const
Check whether all procs have all patches and in same order. Return.
label nEdges() const
Return number of edges in patch.
void updateMesh()
Correct polyBoundaryMesh after topology update.
defineTypeNameAndDebug(combustionModel, 0)
Ostream & decrIndent(Ostream &os)
Decrement the indent level.
Buffers for inter-processor communications streams (UOPstream, UIPstream).
void reduce(const List< UPstream::commsStruct > &comms, T &Value, const BinaryOp &bop, const int tag, const label comm)
word name(const complex &)
Return a string representation of a complex.
label size() const
Return the number of elements in the UPtrList.
static commsTypes defaultCommsType
Default commsType.
void setSize(const label)
Reset size of List.
static bool & parRun()
Is this a parallel run?
static label nProcs(const label communicator=0)
Number of processes in parallel run.
#define WarningInFunction
Report a warning using Foam::Warning.
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
void clearAddressing()
Clear addressing at this level and at patches.
prefixOSstream Pout(cout, "Pout")
label start() const
Return start label of this patch in the polyMesh face list.
Ostream & operator<<(Ostream &, const ensightPart &)
regIOobject is an abstract class derived from IOobject to handle automatic object registration with t...
virtual bool writeObject(IOstream::streamFormat, IOstream::versionNumber, IOstream::compressionType, const bool write) const
Write using given format, version and compression.
label findIndex(const wordRe &) const
Return patch index for the first match, return -1 if not found.
static autoPtr< polyPatch > New(const word &patchType, const word &name, const label size, const label start, const label index, const polyBoundaryMesh &bm)
Return a pointer to a new patch created on freestore from.
void shuffle(const labelUList &newToOld)
Reorders elements. Ordering does not have to be done in.
const doubleScalar e
Elementary charge.
Mesh consisting of general polyhedral cells.
A patch is a list of labels that address the faces in the global face list.
Ostream & incrIndent(Ostream &os)
Increment the indent level.
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
static void gatherList(const List< commsStruct > &comms, List< T > &Values, const int tag, const label comm)
Gather data but keep individual values separate.
label whichPatch(const label faceIndex) const
Return patch index for a given face label.
void transfer(List< T > &)
Transfer the contents of the argument List into this list.
labelList findIndices(const wordRe &, const bool usePatchGroups=true) const
Return patch indices for all matches. Optionally matches patchGroups.
void setGroup(const word &groupName, const labelList &patchIDs)
Set/add group with patches.
const HashTable< labelList, word > & groupPatchIDs() const
Per patch group the patch indices.