38template<
class T,
class CombineOp>
39void Foam::syncTools::combine
47 auto iter = pointValues.find(index);
55 pointValues.insert(index, val);
60template<
class T,
class CombineOp>
61void Foam::syncTools::combine
69 auto iter = edgeValues.find(index);
77 edgeValues.insert(index, val);
84template<
class T,
class CombineOp,
class TransformOp>
90 const TransformOp& top
93 const polyBoundaryMesh&
patches =
mesh.boundaryMesh();
99 const globalMeshData& pd =
mesh.globalData();
102 Map<T> sharedPointValues;
104 if (pd.nGlobalPoints() > 0)
107 const labelList& sharedPtLabels = pd.sharedPointLabels();
110 const labelList& sharedPtAddr = pd.sharedPointAddr();
112 sharedPointValues.reserve(sharedPtAddr.size());
117 const auto fnd = pointValues.cfind(sharedPtLabels[i]);
157 const auto& procPatch = *ppp;
158 const label nbrProci = procPatch.neighbProcNo();
161 const labelList& meshPts = procPatch.meshPoints();
162 const labelList& nbrPts = procPatch.neighbPoints();
166 Map<T> patchInfo(meshPts.size() / 20);
170 const auto iter = pointValues.cfind(meshPts[i]);
174 patchInfo.insert(nbrPts[i], iter.val());
179 neighbProcs.push_uniq(nbrProci);
187 pBufs.registerSend(nbrProci, !patchInfo.empty());
194 pBufs.finishedNeighbourSends(neighbProcs);
204 const auto& procPatch = *ppp;
205 const label nbrProci = procPatch.neighbProcNo();
207 if (!pBufs.recvDataCount(nbrProci))
216 fromNbr >> nbrPatchInfo;
220 top(procPatch, nbrPatchInfo);
222 const labelList& meshPts = procPatch.meshPoints();
231 meshPts[nbrIter.key()],
244 if (cpp && cpp->owner())
251 const edgeList& coupledPoints = cycPatch.coupledPoints();
252 const labelList& meshPtsA = cycPatch.meshPoints();
253 const labelList& meshPtsB = nbrPatch.meshPoints();
256 Map<T> half0Values(meshPtsA.size() / 20);
257 Map<T> half1Values(half0Values.size());
261 const edge&
e = coupledPoints[i];
263 const auto point0Fnd = pointValues.cfind(meshPtsA[
e[0]]);
265 if (point0Fnd.good())
267 half0Values.insert(i, *point0Fnd);
270 const auto point1Fnd = pointValues.cfind(meshPtsB[
e[1]]);
272 if (point1Fnd.good())
274 half1Values.insert(i, *point1Fnd);
279 top(cycPatch, half1Values);
280 top(nbrPatch, half0Values);
284 const edge&
e = coupledPoints[i];
286 const auto half0Fnd = half0Values.cfind(i);
299 const auto half1Fnd = half1Values.cfind(i);
316 if (pd.nGlobalPoints() > 0)
319 const labelList& sharedPtLabels = pd.sharedPointLabels();
321 const labelList& sharedPtAddr = pd.sharedPointAddr();
362 Map<label> sharedToMeshPoint(sharedPtAddr, sharedPtLabels);
367 const auto sharedFnd = sharedPointValues.cfind(iter.key());
369 if (sharedFnd.good())
371 pointValues.set(iter.val(), sharedFnd.val());
381template<
class T,
class CombineOp,
class TransformOp>
386 const CombineOp& cop,
387 const TransformOp& top
424 if (ppp &&
pp.nEdges())
426 const auto& procPatch = *ppp;
427 const label nbrProci = procPatch.neighbProcNo();
430 const edgeList& edges = procPatch.edges();
431 const labelList& meshPts = procPatch.meshPoints();
432 const labelList& nbrPts = procPatch.neighbPoints();
436 for (
const edge&
e : edges)
438 const edge meshEdge(meshPts,
e);
440 const auto iter = edgeValues.
cfind(meshEdge);
444 const edge nbrEdge(nbrPts,
e);
445 patchInfo.insert(nbrEdge, iter.val());
451 neighbProcs.push_uniq(nbrProci);
476 const auto& procPatch = *ppp;
477 const label nbrProci = procPatch.neighbProcNo();
488 fromNbr >> nbrPatchInfo;
492 top(procPatch, nbrPatchInfo);
496 const labelList& meshPts = procPatch.meshPoints();
500 const edge&
e = nbrIter.key();
501 const edge meshEdge(meshPts,
e);
523 if (cpp && cpp->owner())
530 const edgeList& coupledEdges = cycPatch.coupledEdges();
532 const labelList& meshPtsA = cycPatch.meshPoints();
533 const edgeList& edgesA = cycPatch.edges();
535 const labelList& meshPtsB = nbrPatch.meshPoints();
536 const edgeList& edgesB = nbrPatch.edges();
539 Map<T> half0Values(edgesA.size() / 20);
540 Map<T> half1Values(half0Values.size());
542 forAll(coupledEdges, edgei)
544 const edge& twoEdges = coupledEdges[edgei];
547 const edge& e0 = edgesA[twoEdges[0]];
548 const edge meshEdge0(meshPtsA, e0);
550 const auto iter = edgeValues.
cfind(meshEdge0);
554 half0Values.insert(edgei, iter.val());
558 const edge& e1 = edgesB[twoEdges[1]];
559 const edge meshEdge1(meshPtsB, e1);
561 const auto iter = edgeValues.
cfind(meshEdge1);
565 half1Values.insert(edgei, iter.val());
571 top(cycPatch, half1Values);
572 top(nbrPatch, half0Values);
577 forAll(coupledEdges, edgei)
579 const edge& twoEdges = coupledEdges[edgei];
581 const auto half1Fnd = half1Values.cfind(edgei);
585 const edge& e0 = edgesA[twoEdges[0]];
586 const edge meshEdge0(meshPtsA, e0);
597 const auto half0Fnd = half0Values.cfind(edgei);
601 const edge& e1 = edgesB[twoEdges[1]];
602 const edge meshEdge1(meshPtsB, e1);
622 const labelList& sharedPtAddr = pd.sharedPointAddr();
623 const labelList& sharedPtLabels = pd.sharedPointLabels();
626 Map<label> meshToShared(sharedPtLabels, sharedPtAddr);
629 EdgeMap<T> sharedEdgeValues(meshToShared.size());
644 const label v0 =
f[fp];
647 const auto v0Fnd = meshToShared.cfind(v0);
651 const auto v1Fnd = meshToShared.cfind(v1);
655 const edge meshEdge(v0, v1);
658 const edge sharedEdge(*v0Fnd, *v1Fnd);
661 potentialSharedEdge.insert(sharedEdge, meshEdge);
663 const auto edgeFnd = edgeValues.
cfind(meshEdge);
728 const edge& sharedEdge = iter.key();
729 const edge& meshEdge = iter.val();
732 const auto sharedFnd = sharedEdgeValues.cfind(sharedEdge);
734 if (sharedFnd.good())
751template<
class T,
class CombineOp,
class TransformOp>
756 const CombineOp& cop,
758 const TransformOp& top
761 if (pointValues.
size() !=
mesh.nPoints())
764 <<
"Number of values " << pointValues.
size()
765 <<
" != number of points " <<
mesh.nPoints() <<
nl
769 mesh.globalData().syncPointData(pointValues, cop, top);
773template<
class T,
class CombineOp,
class TransformOp>
776 const polyMesh&
mesh,
778 List<T>& pointValues,
779 const CombineOp& cop,
781 const TransformOp& top
784 if (pointValues.size() != meshPoints.size())
787 <<
"Number of values " << pointValues.size()
788 <<
" != number of meshPoints " << meshPoints.size() <<
nl
795 List<T> cppFld(cpp.nPoints(), nullValue);
799 const auto iter = mpm.cfind(meshPoints[i]);
803 cppFld[iter.val()] = pointValues[i];
810 gd.globalPointSlaves(),
811 gd.globalPointTransformedSlaves(),
812 gd.globalPointSlavesMap(),
813 gd.globalTransforms(),
820 const auto iter = mpm.cfind(meshPoints[i]);
824 pointValues[i] = cppFld[iter.val()];
830template<
class T,
class CombineOp,
class TransformOp,
class FlipOp>
835 const CombineOp& cop,
837 const TransformOp& top,
844 <<
"Number of values " << edgeValues.size()
851 const labelList& meshEdges = gd.coupledPatchMeshEdges();
853 const edgeList& cppEdges = cpp.edges();
857 const bitSet& orientation = gd.globalEdgeOrientation();
859 List<T> cppFld(meshEdges.size());
862 const edge& cppE = cppEdges[i];
863 const label meshEdgei = meshEdges[i];
864 const edge& meshE = edges[meshEdgei];
874 <<
" coupled edge:" << cppE.line(cpp.localPoints())
878 const bool sameOrientation = ((dir == 1) == orientation[i]);
882 cppFld[i] = edgeValues[meshEdgei];
886 cppFld[i] = fop(edgeValues[meshEdgei]);
894 gd.globalEdgeSlaves(),
895 gd.globalEdgeTransformedSlaves(),
905 const edge& cppE = cppEdges[i];
906 const label meshEdgei = meshEdges[i];
907 const edge& meshE = edges[meshEdgei];
913 const bool sameOrientation = ((dir == 1) == orientation[i]);
917 edgeValues[meshEdges[i]] = cppFld[i];
921 edgeValues[meshEdges[i]] = fop(cppFld[i]);
927template<
class T,
class CombineOp,
class TransformOp,
class FlipOp>
933 const CombineOp& cop,
935 const TransformOp& top,
939 if (edgeValues.size() != meshEdges.size())
942 <<
"Number of values " << edgeValues.size()
943 <<
" != number of meshEdges " << meshEdges.size() <<
nl
949 const edgeList& cppEdges = cpp.edges();
951 const Map<label>& mpm = gd.coupledPatchMeshEdgeMap();
952 const bitSet& orientation = gd.globalEdgeOrientation();
954 List<T> cppFld(cpp.nEdges(), nullValue);
958 const label meshEdgei = meshEdges[i];
959 const auto iter = mpm.cfind(meshEdgei);
962 const label cppEdgei = iter.val();
963 const edge& cppE = cppEdges[cppEdgei];
964 const edge& meshE = edges[meshEdgei];
974 <<
" coupled edge:" << cppE.line(cpp.localPoints())
978 const bool sameOrientation = ((dir == 1) == orientation[i]);
982 cppFld[cppEdgei] = edgeValues[i];
986 cppFld[cppEdgei] = fop(edgeValues[i]);
994 gd.globalEdgeSlaves(),
995 gd.globalEdgeTransformedSlaves(),
996 gd.globalEdgeSlavesMap(),
997 gd.globalTransforms(),
1004 label meshEdgei = meshEdges[i];
1005 const auto iter = mpm.cfind(meshEdgei);
1008 label cppEdgei = iter.val();
1009 const edge& cppE = cppEdges[cppEdgei];
1010 const edge& meshE = edges[meshEdgei];
1013 const bool sameOrientation = ((dir == 1) == orientation[i]);
1015 if (sameOrientation)
1017 edgeValues[i] = cppFld[cppEdgei];
1021 edgeValues[i] = fop(cppFld[cppEdgei]);
1028template<
class T,
class CombineOp,
class TransformOp>
1033 const CombineOp& cop,
1034 const TransformOp& top,
1044 <<
"Number of values " << faceValues.size()
1076 const auto& procPatch = *ppp;
1082 pp.start()-boundaryOffset
1088 procPatch.neighbProcNo(),
1101 const auto& procPatch = *ppp;
1107 pp.start()-boundaryOffset
1113 procPatch.neighbProcNo(),
1129 const auto& procPatch = *ppp;
1135 pp.start()-boundaryOffset
1138 top(procPatch, recvFld);
1144 pp.start()-boundaryOffset
1149 cop(patchValues[i], recvFld[i]);
1166 const auto& procPatch = *ppp;
1167 const label nbrProci = procPatch.neighbProcNo();
1170 neighbProcs.push_uniq(nbrProci);
1176 pp.start()-boundaryOffset
1195 const auto& procPatch = *ppp;
1196 const label nbrProci = procPatch.neighbProcNo();
1204 top(procPatch, recvFld);
1210 pp.start()-boundaryOffset
1215 cop(patchValues[i], recvFld[i]);
1227 if (cpp && cpp->owner())
1233 const label patchSize = cycPatch.
size();
1239 cycPatch.start()-boundaryOffset
1246 nbrPatch.start()-boundaryOffset
1250 List<T> ownVals(ownPatchValues);
1251 top(nbrPatch, ownVals);
1253 List<T> nbrVals(nbrPatchValues);
1254 top(cycPatch, nbrVals);
1256 forAll(ownPatchValues, i)
1258 cop(ownPatchValues[i], nbrVals[i]);
1261 forAll(nbrPatchValues, i)
1263 cop(nbrPatchValues[i], ownVals[i]);
1275template<
unsigned W
idth,
class CombineOp>
1279 const bool isBoundaryOnly,
1281 const CombineOp& cop,
1286 const label boundaryOffset = (isBoundaryOnly ?
mesh.nInternalFaces() : 0);
1289 if (faceValues.
size() != (
mesh.nFaces() - boundaryOffset))
1292 <<
"Number of values " << faceValues.
size()
1294 << (isBoundaryOnly ?
"boundary" :
"mesh") <<
" faces "
1295 << (
mesh.nFaces() - boundaryOffset) <<
nl
1299 const polyBoundaryMesh&
patches =
mesh.boundaryMesh();
1309 PtrList<PackedList<Width>> recvBufs(
patches.size());
1316 if (ppp &&
pp.size())
1318 const auto& procPatch = *ppp;
1319 const label patchi =
pp.index();
1321 auto& recvbuf = recvBufs.emplace_set(patchi,
pp.size());
1326 procPatch.neighbProcNo(),
1327 recvbuf.data_bytes(),
1328 recvbuf.size_bytes()
1343 const auto& procPatch = *ppp;
1344 const label patchi =
pp.index();
1348 auto& sendbuf = sendBufs.emplace_set(patchi, faceValues,
range);
1353 procPatch.neighbProcNo(),
1354 sendbuf.cdata_bytes(),
1355 sendbuf.size_bytes()
1370 const label patchi =
pp.index();
1371 const label patchSize =
pp.
size();
1373 const auto& recvbuf = recvBufs[patchi];
1376 label bFacei =
pp.start()-boundaryOffset;
1377 for (label i = 0; i < patchSize; ++i)
1379 unsigned int recvVal = recvbuf[i];
1380 unsigned int faceVal = faceValues[bFacei];
1382 cop(faceVal, recvVal);
1383 faceValues.
set(bFacei, faceVal);
1397 if (cpp && cpp->owner())
1403 const label patchSize = cycPatch.
size();
1405 label face0 = cycPatch.start()-boundaryOffset;
1406 label face1 = nbrPatch.start()-boundaryOffset;
1407 for (label i = 0; i < patchSize; ++i)
1409 unsigned int val0 = faceValues[face0];
1410 unsigned int val1 = faceValues[face1];
1412 unsigned int t = val0;
1414 faceValues[face0] = t;
1417 faceValues[face1] = val1;
1439 if (cellData.
size() !=
mesh.nCells())
1442 <<
"Number of cell values " << cellData.
size()
1443 <<
" != number of cells " <<
mesh.nCells() <<
nl
1447 const polyBoundaryMesh&
patches =
mesh.boundaryMesh();
1449 neighbourCellData.
resize(
mesh.nBoundaryFaces());
1453 const auto& faceCells =
pp.faceCells();
1461 ) = UIndirectList<T>(cellData, faceCells);
1468template<
unsigned W
idth,
class CombineOp>
1471 const polyMesh&
mesh,
1472 PackedList<Width>& faceValues,
1473 const CombineOp& cop,
1481template<
unsigned W
idth,
class CombineOp>
1486 const CombineOp& cop,
1494template<
unsigned W
idth>
1512template<
unsigned W
idth>
1520 syncBoundaryFaceList
1530template<
unsigned W
idth,
class CombineOp>
1535 const CombineOp& cop,
1536 const unsigned int nullValue
1539 if (pointValues.
size() !=
mesh.nPoints())
1542 <<
"Number of values " << pointValues.
size()
1543 <<
" != number of points " <<
mesh.nPoints() <<
nl
1547 const globalMeshData& gd =
mesh.globalData();
1548 const labelList& meshPoints = gd.coupledPatch().meshPoints();
1550 List<unsigned int> cppFld(gd.globalPointSlavesMap().constructSize());
1553 cppFld[i] = pointValues[meshPoints[i]];
1559 gd.globalPointSlaves(),
1560 gd.globalPointTransformedSlaves(),
1561 gd.globalPointSlavesMap(),
1568 pointValues[meshPoints[i]] = cppFld[i];
1573template<
unsigned W
idth,
class CombineOp>
1576 const polyMesh&
mesh,
1577 PackedList<Width>& edgeValues,
1578 const CombineOp& cop,
1579 const unsigned int nullValue
1582 if (edgeValues.size() !=
mesh.nEdges())
1585 <<
"Number of values " << edgeValues.size()
1586 <<
" != number of edges " <<
mesh.nEdges() <<
nl
1591 const labelList& meshEdges = gd.coupledPatchMeshEdges();
1596 cppFld[i] = edgeValues[meshEdges[i]];
1602 gd.globalEdgeSlaves(),
1603 gd.globalEdgeTransformedSlaves(),
1604 gd.globalEdgeSlavesMap(),
1611 edgeValues[meshEdges[i]] = cppFld[i];
Info<< nl;Info<< "Write faMesh in vtk format:"<< nl;{ vtk::uindirectPatchWriter writer(aMesh.patch(), fileName(aMesh.time().globalPath()/vtkBaseFileName));writer.writeGeometry();globalIndex procAddr(aMesh.nFaces());labelList cellIDs;if(UPstream::master()) { cellIDs.resize(procAddr.totalSize());for(const labelRange &range :procAddr.ranges()) { auto slice=cellIDs.slice(range);slice=identity(range);} } writer.beginCellData(4);writer.writeProcIDs();writer.write("cellID", cellIDs);writer.write("area", aMesh.S().field());writer.write("normal", aMesh.faceAreaNormals());writer.beginPointData(1);writer.write("normal", aMesh.pointAreaNormals());Info<< " "<< writer.output().name()<< nl;}{ vtk::lineWriter writer(aMesh.points(), aMesh.edges(), fileName(aMesh.time().globalPath()/(vtkBaseFileName+"-edges")));writer.writeGeometry();writer.beginCellData(4);writer.writeProcIDs();{ Field< scalar > fld(faMeshTools::flattenEdgeField(aMesh.magLe(), true))
uindirectPrimitivePatch pp(UIndirectList< face >(mesh.faces(), faceLabels), mesh.points())
A 1D vector of objects of type <T> that resizes itself as necessary to accept the new objects.
label push_uniq(const T &val)
Append an element if not already in the list.
Map from edge (expressed as its endpoints) to value. Hashing (and ==) on an edge is symmetric.
bool set(const Key &key, const T &obj)
Copy assign a new entry, overwriting existing entries.
const_iterator cfind(const Key &key) const
Find and return an const_iterator set at the hashed entry.
void reserve(label numEntries)
Reserve space for at least the specified number of elements (not the number of buckets) and regenerat...
bool insert(const Key &key, const T &obj)
Copy insert a new entry, not overwriting existing entries.
label size() const noexcept
The number of elements in table.
static void recv(Type &value, const int fromProcNo, const int tag=UPstream::msgType(), const int communicator=UPstream::worldComm, IOstreamOption::streamFormat fmt=IOstreamOption::BINARY)
Receive and deserialize a value. Uses operator>> for de-serialization.
label size() const noexcept
The number of elements in the list.
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
void resize(const label len)
Adjust allocated size of list.
A HashTable to objects of type <T> with a label key.
A dynamic list of packed unsigned integers, with the number of bits per item specified by the <Width>...
bool set(const label i, unsigned int val=~0u)
Set value at index i, default value set is the max_value.
label size() const noexcept
Number of entries.
label nEdges() const
Number of edges in patch.
label nPoints() const
Number of points supporting patch faces.
const edgeList & edges() const
Return list of edges, address into LOCAL point list.
const Map< label > & meshPointMap() const
Mesh point map.
const labelList & meshPoints() const
Return labelList of mesh points in patch.
const Field< point_type > & localPoints() const
Return pointField of points in patch.
Buffers for inter-processor communications streams (UOPstream, UIPstream).
void registerSend(const label proci, const bool toggleOn=true)
Toggle an individual send buffer as 'registered'. The setting is sticky (does not turn off).
void initRegisterSend()
Initialise registerSend() bookkeeping by mark all send buffers as 'unregistered'.
label recvDataCount(const label proci) const
Number of unconsumed receive bytes for the specified processor. Must call finishedSends() or other fi...
void finishedNeighbourSends(const labelUList &neighProcs, const bool wait=true)
Mark the send phase as being finished, with communication being limited to a known subset of send/rec...
A list of pointers to objects of type <T>, with allocation/deallocation management of the pointers....
T & emplace_set(const label i, Args &&... args)
Construct and set a new element at given position, (discard old element at that location).
A non-owning sub-view of a List (allocated or unallocated storage).
Input inter-processor communications stream using MPI send/recv etc. - operating on external buffer.
static std::streamsize read(const UPstream::commsTypes commsType, const int fromProcNo, Type *buffer, std::streamsize count, const int tag=UPstream::msgType(), const int communicator=UPstream::worldComm, UPstream::Request *req=nullptr)
Receive buffer contents (contiguous types) from given processor.
A List with indirect addressing. Like IndirectList but does not store addressing.
A 1D vector of objects of type <T>, where the size of the vector is known and can be used for subscri...
void size(const label n)
Older name for setAddressableSize.
label fcIndex(const label i) const noexcept
The forward circular index. The next index in the list which returns to the first at the end of the l...
Output inter-processor communications stream using MPI send/recv etc. - operating on external buffer.
static bool write(const UPstream::commsTypes commsType, const int toProcNo, const Type *buffer, std::streamsize count, const int tag=UPstream::msgType(), const int communicator=UPstream::worldComm, UPstream::Request *req=nullptr, const UPstream::sendModes sendMode=UPstream::sendModes::normal)
Write buffer contents (contiguous types only) to given processor.
bool send()
Send buffer contents now and not in destructor [advanced usage]. Returns true on success.
static label nRequests() noexcept
Number of outstanding requests (on the internal list of requests).
@ nonBlocking
"nonBlocking" (immediate) : (MPI_Isend, MPI_Irecv)
static bool parRun(const bool on) noexcept
Set as parallel run on/off.
static int & msgType() noexcept
Message tag of standard messages.
static constexpr int masterNo() noexcept
Relative rank for the master process - is always 0.
static bool master(const label communicator=worldComm)
True if process corresponds to the master rank in the communicator.
static rangeType subProcs(const label communicator=worldComm)
Range of process indices for sub-processes.
static int incrMsgType(int val=1) noexcept
Increment the message tag for standard messages.
static void waitRequests()
Wait for all requests to finish.
@ broadcast
broadcast [MPI]
static commsTypes defaultCommsType
Default commsType.
static bool & parRun() noexcept
Test if this a parallel run.
label size() const noexcept
The number of entries in the list.
A bitSet stores bits (elements with only two states) in packed internal format and supports a variety...
virtual bool owner() const
Does this side own the patch ?
const edgeList & coupledEdges() const
Return connected edges (from patch local to neighbour patch local).
const edgeList & coupledPoints() const
Return connected points (from patch local to neighbour patch local).
const cyclicPolyPatch & neighbPatch() const
An edge is a list of two vertex labels. This can correspond to a directed graph edge or an edge on a ...
static int compare(const edge &a, const edge &b)
Compare edges.
linePointRef line(const UList< point > &pts) const
Return edge line.
Smooth ATC in cells next to a set of patches supplied by type.
A face is a list of labels corresponding to mesh vertices.
Various mesh related information for a parallel run. Upon construction, constructs all info using par...
const labelList & sharedPointAddr() const
Return addressing into the complete globally shared points list.
const bitSet & globalEdgeOrientation() const
Is my edge same orientation as master edge.
const labelListList & globalEdgeTransformedSlaves() const
const Map< label > & coupledPatchMeshEdgeMap() const
Return map from mesh edges to coupledPatch edges.
label nGlobalPoints() const
Return number of globally shared points.
const mapDistribute & globalPointSlavesMap() const
const labelList & sharedPointLabels() const
Return indices of local points that are globally shared.
const mapDistribute & globalEdgeSlavesMap() const
static void syncData(List< Type > &elems, const labelListList &slaves, const labelListList &transformedSlaves, const mapDistribute &slavesMap, const globalIndexAndTransform &, const CombineOp &cop, const TransformOp &top)
Helper: synchronise data with transforms.
const labelList & coupledPatchMeshEdges() const
Return map from coupledPatch edges to mesh edges.
const labelListList & globalPointSlaves() const
const globalIndexAndTransform & globalTransforms() const
Global transforms numbering.
const labelListList & globalPointTransformedSlaves() const
const indirectPrimitivePatch & coupledPatch() const
Return patch of all coupled faces.
const labelListList & globalEdgeSlaves() const
A range or interval of labels defined by a start and a size.
label constructSize() const noexcept
Constructed data size.
Class containing processor-to-processor mapping information.
A polyBoundaryMesh is a polyPatch list with registered IO, a reference to the associated polyMesh,...
label nProcessorPatches() const
The number of processorPolyPatch patches.
Mesh consisting of general polyhedral cells.
const polyBoundaryMesh & boundaryMesh() const noexcept
Return boundary mesh.
virtual const faceList & faces() const
Return raw faces.
const globalMeshData & globalData() const
Return parallel info (demand-driven).
virtual const pointField & points() const
Return raw points.
A patch is a list of labels that address the faces in the global face list.
label start() const noexcept
Return start label of this patch in the polyMesh face list.
label nBoundaryFaces() const noexcept
Number of boundary faces (== nFaces - nInternalFaces).
const edgeList & edges() const
Return mesh edges. Uses calcEdges.
label nInternalFaces() const noexcept
Number of internal faces.
label nFaces() const noexcept
Number of mesh faces.
label nEdges() const
Number of mesh edges.
const polyBoundaryMesh & patches
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
const dimensionedScalar mp
Proton mass.
List< edge > edgeList
List of edge.
List< label > labelList
A List of labels.
const Type * isA(const U &obj)
Attempt dynamic_cast to Type.
PrimitivePatch< IndirectList< face >, const pointField & > indirectPrimitivePatch
A PrimitivePatch with an IndirectList for the faces, const reference for the point field.
errorManip< error > abort(error &err)
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
constexpr bool is_contiguous_v
The is_contiguous value of Type (after stripping of qualifiers).
errorManipArg< error, int > exit(error &err, const int errNo=1)
UList< label > labelUList
A UList of labels.
void T(FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
constexpr char nl
The newline '\n' character (0x0a).
#define forAll(list, i)
Loop across all elements in list.
#define forAllConstIters(container, iter)
Iterate across all elements of the container object with const access.