38 template<
class T,
class CombineOp>
39 void Foam::syncTools::combine
47 auto iter = pointValues.find(index);
55 pointValues.insert(index, val);
60 template<
class T,
class CombineOp>
61 void Foam::syncTools::combine
63 EdgeMap<T>& edgeValues,
69 auto iter = edgeValues.find(index);
77 edgeValues.insert(index, val);
84 template<
class T,
class CombineOp,
class TransformOp>
90 const TransformOp& top
114 const auto fnd = pointValues.
cfind(sharedPtLabels[i]);
135 PstreamBuffers pBufs;
143 pBufs.initRegisterSend();
150 const auto* ppp = isA<processorPolyPatch>(
pp);
154 const auto& procPatch = *ppp;
155 const label nbrProci = procPatch.neighbProcNo();
158 const labelList& meshPts = procPatch.meshPoints();
159 const labelList& nbrPts = procPatch.neighbPoints();
163 Map<T> patchInfo(meshPts.size() / 20);
167 const auto iter = pointValues.
cfind(meshPts[i]);
171 patchInfo.insert(nbrPts[i], iter.val());
176 neighbProcs.push_uniq(nbrProci);
180 UOPstream toNbr(nbrProci, pBufs);
184 pBufs.registerSend(nbrProci, !patchInfo.empty());
191 pBufs.finishedNeighbourSends(neighbProcs);
197 const auto* ppp = isA<processorPolyPatch>(
pp);
201 const auto& procPatch = *ppp;
202 const label nbrProci = procPatch.neighbProcNo();
204 if (!pBufs.recvDataCount(nbrProci))
212 UIPstream fromNbr(nbrProci, pBufs);
213 fromNbr >> nbrPatchInfo;
217 top(procPatch, nbrPatchInfo);
219 const labelList& meshPts = procPatch.meshPoints();
228 meshPts[nbrIter.key()],
239 const cyclicPolyPatch* cpp = isA<cyclicPolyPatch>(
pp);
241 if (cpp && cpp->owner())
245 const cyclicPolyPatch& cycPatch = *cpp;
246 const cyclicPolyPatch& nbrPatch = cycPatch.neighbPatch();
248 const edgeList& coupledPoints = cycPatch.coupledPoints();
249 const labelList& meshPtsA = cycPatch.meshPoints();
250 const labelList& meshPtsB = nbrPatch.meshPoints();
253 Map<T> half0Values(meshPtsA.size() / 20);
254 Map<T> half1Values(half0Values.size());
258 const edge&
e = coupledPoints[i];
260 const auto point0Fnd = pointValues.
cfind(meshPtsA[
e[0]]);
262 if (point0Fnd.good())
264 half0Values.insert(i, *point0Fnd);
267 const auto point1Fnd = pointValues.
cfind(meshPtsB[
e[1]]);
269 if (point1Fnd.good())
271 half1Values.insert(i, *point1Fnd);
276 top(cycPatch, half1Values);
277 top(nbrPatch, half0Values);
281 const edge&
e = coupledPoints[i];
283 const auto half0Fnd = half0Values.cfind(i);
296 const auto half1Fnd = half1Values.cfind(i);
359 Map<label> sharedToMeshPoint(sharedPtAddr, sharedPtLabels);
364 const auto sharedFnd = sharedPointValues.
cfind(iter.key());
366 if (sharedFnd.good())
368 pointValues.
set(iter.val(), sharedFnd.val());
375 template<
class T,
class CombineOp,
class TransformOp>
378 const polyMesh&
mesh,
379 EdgeMap<T>& edgeValues,
380 const CombineOp& cop,
381 const TransformOp& top
399 PstreamBuffers pBufs;
407 pBufs.initRegisterSend();
414 const auto* ppp = isA<processorPolyPatch>(
pp);
418 const auto& procPatch = *ppp;
419 const label nbrProci = procPatch.neighbProcNo();
422 const edgeList& edges = procPatch.edges();
423 const labelList& meshPts = procPatch.meshPoints();
424 const labelList& nbrPts = procPatch.neighbPoints();
426 EdgeMap<T> patchInfo(edges.size() / 20);
428 for (
const edge&
e : edges)
430 const edge meshEdge(meshPts,
e);
432 const auto iter = edgeValues.cfind(meshEdge);
436 const edge nbrEdge(nbrPts,
e);
437 patchInfo.insert(nbrEdge, iter.val());
443 neighbProcs.push_uniq(nbrProci);
447 UOPstream toNbr(nbrProci, pBufs);
451 pBufs.registerSend(nbrProci, !patchInfo.empty());
458 pBufs.finishedNeighbourSends(neighbProcs);
464 const auto* ppp = isA<processorPolyPatch>(
pp);
468 const auto& procPatch = *ppp;
469 const label nbrProci = procPatch.neighbProcNo();
471 if (!pBufs.recvDataCount(nbrProci))
477 EdgeMap<T> nbrPatchInfo;
479 UIPstream fromNbr(nbrProci, pBufs);
480 fromNbr >> nbrPatchInfo;
484 top(procPatch, nbrPatchInfo);
488 const labelList& meshPts = procPatch.meshPoints();
492 const edge&
e = nbrIter.key();
493 const edge meshEdge(meshPts,
e);
513 const cyclicPolyPatch* cpp = isA<cyclicPolyPatch>(
pp);
515 if (cpp && cpp->owner())
519 const cyclicPolyPatch& cycPatch = *cpp;
520 const cyclicPolyPatch& nbrPatch = cycPatch.neighbPatch();
522 const edgeList& coupledEdges = cycPatch.coupledEdges();
524 const labelList& meshPtsA = cycPatch.meshPoints();
525 const edgeList& edgesA = cycPatch.edges();
527 const labelList& meshPtsB = nbrPatch.meshPoints();
528 const edgeList& edgesB = nbrPatch.edges();
531 Map<T> half0Values(edgesA.size() / 20);
532 Map<T> half1Values(half0Values.size());
534 forAll(coupledEdges, edgei)
536 const edge& twoEdges = coupledEdges[edgei];
539 const edge& e0 = edgesA[twoEdges[0]];
540 const edge meshEdge0(meshPtsA, e0);
542 const auto iter = edgeValues.cfind(meshEdge0);
546 half0Values.insert(edgei, iter.val());
550 const edge& e1 = edgesB[twoEdges[1]];
551 const edge meshEdge1(meshPtsB, e1);
553 const auto iter = edgeValues.cfind(meshEdge1);
557 half1Values.insert(edgei, iter.val());
563 top(cycPatch, half1Values);
564 top(nbrPatch, half0Values);
569 forAll(coupledEdges, edgei)
571 const edge& twoEdges = coupledEdges[edgei];
573 const auto half1Fnd = half1Values.cfind(edgei);
577 const edge& e0 = edgesA[twoEdges[0]];
578 const edge meshEdge0(meshPtsA, e0);
589 const auto half0Fnd = half0Values.cfind(edgei);
593 const edge& e1 = edgesB[twoEdges[1]];
594 const edge meshEdge1(meshPtsB, e1);
614 const labelList& sharedPtAddr = pd.sharedPointAddr();
615 const labelList& sharedPtLabels = pd.sharedPointLabels();
618 Map<label> meshToShared(sharedPtLabels, sharedPtAddr);
621 EdgeMap<T> sharedEdgeValues(meshToShared.size());
624 EdgeMap<edge> potentialSharedEdge(meshToShared.size());
636 const label v0 =
f[fp];
639 const auto v0Fnd = meshToShared.cfind(v0);
643 const auto v1Fnd = meshToShared.cfind(v1);
647 const edge meshEdge(v0, v1);
650 const edge sharedEdge(*v0Fnd, *v1Fnd);
653 potentialSharedEdge.insert(sharedEdge, meshEdge);
655 const auto edgeFnd = edgeValues.cfind(meshEdge);
687 EdgeMap<T> nbrValues;
720 const edge& sharedEdge = iter.key();
721 const edge& meshEdge = iter.val();
724 const auto sharedFnd = sharedEdgeValues.cfind(sharedEdge);
726 if (sharedFnd.good())
740 template<
class T,
class CombineOp,
class TransformOp>
743 const polyMesh&
mesh,
744 List<T>& pointValues,
745 const CombineOp& cop,
747 const TransformOp& top
753 <<
"Number of values " << pointValues.size()
762 template<
class T,
class CombineOp,
class TransformOp>
768 const CombineOp& cop,
770 const TransformOp& top
773 if (pointValues.
size() != meshPoints.
size())
776 <<
"Number of values " << pointValues.
size()
777 <<
" != number of meshPoints " << meshPoints.
size() <<
nl 782 const Map<label>& mpm = cpp.meshPointMap();
784 List<T> cppFld(cpp.nPoints(), nullValue);
788 const auto iter = mpm.cfind(meshPoints[i]);
792 cppFld[iter.val()] = pointValues[i];
799 gd.globalPointSlaves(),
800 gd.globalPointTransformedSlaves(),
801 gd.globalPointSlavesMap(),
802 gd.globalTransforms(),
809 const auto iter = mpm.cfind(meshPoints[i]);
813 pointValues[i] = cppFld[iter.val()];
819 template<
class T,
class CombineOp,
class TransformOp,
class FlipOp>
822 const polyMesh&
mesh,
824 const CombineOp& cop,
826 const TransformOp& top,
833 <<
"Number of values " << edgeValues.size()
840 const labelList& meshEdges = gd.coupledPatchMeshEdges();
842 const edgeList& cppEdges = cpp.edges();
844 const globalIndexAndTransform& git = gd.globalTransforms();
845 const mapDistribute& edgeMap = gd.globalEdgeSlavesMap();
846 const bitSet& orientation = gd.globalEdgeOrientation();
848 List<T> cppFld(meshEdges.size());
851 const edge& cppE = cppEdges[i];
852 const label meshEdgei = meshEdges[i];
853 const edge& meshE = edges[meshEdgei];
863 <<
" coupled edge:" << cppE.line(cpp.localPoints())
867 const bool sameOrientation = ((dir == 1) == orientation[i]);
871 cppFld[i] = edgeValues[meshEdgei];
875 cppFld[i] = fop(edgeValues[meshEdgei]);
883 gd.globalEdgeSlaves(),
884 gd.globalEdgeTransformedSlaves(),
894 const edge& cppE = cppEdges[i];
895 const label meshEdgei = meshEdges[i];
896 const edge& meshE = edges[meshEdgei];
902 const bool sameOrientation = ((dir == 1) == orientation[i]);
906 edgeValues[meshEdges[i]] = cppFld[i];
910 edgeValues[meshEdges[i]] = fop(cppFld[i]);
916 template<
class T,
class CombineOp,
class TransformOp,
class FlipOp>
919 const polyMesh&
mesh,
922 const CombineOp& cop,
924 const TransformOp& top,
928 if (edgeValues.size() != meshEdges.size())
931 <<
"Number of values " << edgeValues.size()
932 <<
" != number of meshEdges " << meshEdges.size() <<
nl 938 const edgeList& cppEdges = cpp.edges();
940 const Map<label>& mpm = gd.coupledPatchMeshEdgeMap();
941 const bitSet& orientation = gd.globalEdgeOrientation();
943 List<T> cppFld(cpp.nEdges(), nullValue);
947 const label meshEdgei = meshEdges[i];
948 const auto iter = mpm.cfind(meshEdgei);
951 const label cppEdgei = iter.val();
952 const edge& cppE = cppEdges[cppEdgei];
953 const edge& meshE = edges[meshEdgei];
963 <<
" coupled edge:" << cppE.line(cpp.localPoints())
967 const bool sameOrientation = ((dir == 1) == orientation[i]);
971 cppFld[cppEdgei] = edgeValues[i];
975 cppFld[cppEdgei] = fop(edgeValues[i]);
983 gd.globalEdgeSlaves(),
984 gd.globalEdgeTransformedSlaves(),
985 gd.globalEdgeSlavesMap(),
986 gd.globalTransforms(),
993 label meshEdgei = meshEdges[i];
994 const auto iter = mpm.cfind(meshEdgei);
997 label cppEdgei = iter.val();
998 const edge& cppE = cppEdges[cppEdgei];
999 const edge& meshE = edges[meshEdgei];
1002 const bool sameOrientation = ((dir == 1) == orientation[i]);
1004 if (sameOrientation)
1006 edgeValues[i] = cppFld[cppEdgei];
1010 edgeValues[i] = fop(cppFld[cppEdgei]);
1017 template<
class T,
class CombineOp,
class TransformOp>
1020 const polyMesh&
mesh,
1021 UList<T>& faceValues,
1022 const CombineOp& cop,
1023 const TransformOp& top,
1033 <<
"Number of values " << faceValues.size()
1046 is_contiguous<T>::value
1058 const auto* ppp = isA<processorPolyPatch>(
pp);
1060 if (ppp &&
pp.size())
1062 const auto& procPatch = *ppp;
1068 pp.start()-boundaryOffset
1074 procPatch.neighbProcNo(),
1084 const auto* ppp = isA<processorPolyPatch>(
pp);
1086 if (ppp &&
pp.size())
1088 const auto& procPatch = *ppp;
1090 const SubList<T>
fld 1094 pp.start()-boundaryOffset
1100 procPatch.neighbProcNo(),
1113 const auto* ppp = isA<processorPolyPatch>(
pp);
1115 if (ppp &&
pp.size())
1117 const auto& procPatch = *ppp;
1123 pp.start()-boundaryOffset
1125 const List<T>& fakeList = recvFld;
1126 top(procPatch,
const_cast<List<T>&
>(fakeList));
1128 SubList<T> patchValues
1132 pp.start()-boundaryOffset
1137 cop(patchValues[i], recvFld[i]);
1144 DynamicList<label> neighbProcs;
1145 PstreamBuffers pBufs;
1150 const auto* ppp = isA<processorPolyPatch>(
pp);
1152 if (ppp &&
pp.size())
1154 const auto& procPatch = *ppp;
1155 const label nbrProci = procPatch.neighbProcNo();
1158 neighbProcs.push_uniq(nbrProci);
1160 const SubList<T>
fld 1164 pp.start()-boundaryOffset
1167 UOPstream toNbr(nbrProci, pBufs);
1173 pBufs.finishedNeighbourSends(neighbProcs);
1179 const auto* ppp = isA<processorPolyPatch>(
pp);
1181 if (ppp &&
pp.size())
1183 const auto& procPatch = *ppp;
1184 const label nbrProci = procPatch.neighbProcNo();
1188 UIPstream fromNbr(nbrProci, pBufs);
1192 top(procPatch, recvFld);
1194 SubList<T> patchValues
1198 pp.start()-boundaryOffset
1203 cop(patchValues[i], recvFld[i]);
1213 const cyclicPolyPatch* cpp = isA<cyclicPolyPatch>(
pp);
1215 if (cpp && cpp->owner())
1219 const cyclicPolyPatch& cycPatch = *cpp;
1220 const cyclicPolyPatch& nbrPatch = cycPatch.neighbPatch();
1221 const label patchSize = cycPatch.size();
1223 SubList<T> ownPatchValues
1227 cycPatch.start()-boundaryOffset
1230 SubList<T> nbrPatchValues
1234 nbrPatch.start()-boundaryOffset
1238 List<T> ownVals(ownPatchValues);
1239 top(nbrPatch, ownVals);
1241 List<T> nbrVals(nbrPatchValues);
1242 top(cycPatch, nbrVals);
1244 forAll(ownPatchValues, i)
1246 cop(ownPatchValues[i], nbrVals[i]);
1249 forAll(nbrPatchValues, i)
1251 cop(nbrPatchValues[i], ownVals[i]);
1260 template<
unsigned W
idth,
class CombineOp>
1264 const bool isBoundaryOnly,
1266 const CombineOp& cop,
1277 <<
"Number of values " << faceValues.
size()
1279 << (isBoundaryOnly ?
"boundary" :
"mesh") <<
" faces " 1291 PtrList<PackedList<Width>> recvBufs(
patches.
size());
1296 const auto* ppp = isA<processorPolyPatch>(
pp);
1298 if (ppp &&
pp.size())
1300 const auto& procPatch = *ppp;
1301 const label patchi =
pp.index();
1303 auto& recvbuf = recvBufs.emplace_set(patchi,
pp.size());
1308 procPatch.neighbProcNo(),
1309 recvbuf.data_bytes(),
1310 recvbuf.size_bytes()
1316 PtrList<PackedList<Width>> sendBufs(
patches.
size());
1321 const auto* ppp = isA<processorPolyPatch>(
pp);
1323 if (ppp &&
pp.size())
1325 const auto& procPatch = *ppp;
1326 const label patchi =
pp.index();
1328 const labelRange
range(
pp.start()-boundaryOffset,
pp.size());
1330 auto& sendbuf = sendBufs.emplace_set(patchi, faceValues,
range);
1335 procPatch.neighbProcNo(),
1336 sendbuf.cdata_bytes(),
1337 sendbuf.size_bytes()
1348 const auto* ppp = isA<processorPolyPatch>(
pp);
1350 if (ppp &&
pp.size())
1352 const label patchi =
pp.index();
1353 const label patchSize =
pp.size();
1355 const auto& recvbuf = recvBufs[patchi];
1358 label bFacei =
pp.start()-boundaryOffset;
1359 for (label i = 0; i < patchSize; ++i)
1361 unsigned int recvVal = recvbuf[i];
1362 unsigned int faceVal = faceValues[bFacei];
1364 cop(faceVal, recvVal);
1365 faceValues.
set(bFacei, faceVal);
1377 const cyclicPolyPatch* cpp = isA<cyclicPolyPatch>(
pp);
1379 if (cpp && cpp->owner())
1383 const cyclicPolyPatch& cycPatch = *cpp;
1384 const cyclicPolyPatch& nbrPatch = cycPatch.neighbPatch();
1385 const label patchSize = cycPatch.size();
1387 label face0 = cycPatch.start()-boundaryOffset;
1388 label face1 = nbrPatch.start()-boundaryOffset;
1389 for (label i = 0; i < patchSize; ++i)
1391 unsigned int val0 = faceValues[face0];
1392 unsigned int val1 = faceValues[face1];
1394 unsigned int t = val0;
1396 faceValues[face0] = t;
1399 faceValues[face1] = val1;
1412 const polyMesh&
mesh,
1413 const UList<T>& cellData,
1414 List<T>& neighbourCellData,
1421 <<
"Number of cell values " << cellData.size()
1432 const auto& faceCells =
pp.faceCells();
1440 ) = UIndirectList<T>(cellData, faceCells);
1447 template<
unsigned W
idth,
class CombineOp>
1452 const CombineOp& cop,
1456 syncFaceList(
mesh,
false, faceValues, cop, parRun);
1460 template<
unsigned W
idth,
class CombineOp>
1465 const CombineOp& cop,
1469 syncFaceList(
mesh,
true, faceValues, cop, parRun);
1473 template<
unsigned W
idth>
1491 template<
unsigned W
idth>
1499 syncBoundaryFaceList
1509 template<
unsigned W
idth,
class CombineOp>
1514 const CombineOp& cop,
1515 const unsigned int nullValue
1521 <<
"Number of values " << pointValues.
size()
1527 const labelList& meshPoints = gd.coupledPatch().meshPoints();
1529 List<unsigned int> cppFld(gd.globalPointSlavesMap().constructSize());
1532 cppFld[i] = pointValues[meshPoints[i]];
1538 gd.globalPointSlaves(),
1539 gd.globalPointTransformedSlaves(),
1540 gd.globalPointSlavesMap(),
1547 pointValues[meshPoints[i]] = cppFld[i];
1552 template<
unsigned W
idth,
class CombineOp>
1555 const polyMesh&
mesh,
1556 PackedList<Width>& edgeValues,
1557 const CombineOp& cop,
1558 const unsigned int nullValue
1564 <<
"Number of values " << edgeValues.size()
1570 const labelList& meshEdges = gd.coupledPatchMeshEdges();
1572 List<unsigned int> cppFld(gd.globalEdgeSlavesMap().constructSize());
1575 cppFld[i] = edgeValues[meshEdges[i]];
1581 gd.globalEdgeSlaves(),
1582 gd.globalEdgeTransformedSlaves(),
1583 gd.globalEdgeSlavesMap(),
1590 edgeValues[meshEdges[i]] = cppFld[i];
const labelList & sharedPointLabels() const
Return indices of local points that are globally shared.
label nPoints() const
Number of points supporting patch faces.
void size(const label n)
Older name for setAddressableSize.
errorManipArg< error, int > exit(error &err, const int errNo=1)
label nPoints() const noexcept
Number of mesh points.
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
List< edge > edgeList
List of edge.
Various mesh related information for a parallel run. Upon construction, constructs all info using par...
static label nRequests() noexcept
Number of outstanding requests (on the internal list of requests)
constexpr char nl
The newline '\n' character (0x0a)
static bool & parRun() noexcept
Test if this a parallel run.
label nFaces() const noexcept
Number of mesh faces.
PrimitivePatch< IndirectList< face >, const pointField & > indirectPrimitivePatch
A PrimitivePatch with an IndirectList for the faces, const reference for the point field...
static void waitRequests()
Wait for all requests to finish.
UList< label > labelUList
A UList of labels.
static void broadcast(Type &value, const label comm=UPstream::worldComm)
Broadcast content (contiguous or non-contiguous) to all communicator ranks. Does nothing in non-paral...
label nProcessorPatches() const
The number of processorPolyPatch patches.
virtual const pointField & points() const
Return raw points.
#define forAll(list, i)
Loop across all elements in list.
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.
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...
AccessType combine(const UList< T > &lists, AccessOp aop=accessOp< T >())
Combines sub-lists into a single list.
label nGlobalPoints() const
Return number of globally shared points.
static void recv(Type &value, const int fromProcNo, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm, IOstreamOption::streamFormat fmt=IOstreamOption::BINARY)
Receive and deserialize a value. Uses operator>> for de-serialization.
const dimensionedScalar e
Elementary charge.
A dynamic list of packed unsigned integers, with the number of bits per item specified by the <Width>...
const_iterator cfind(const label &key) const
Find and return an const_iterator set at the hashed entry.
const polyBoundaryMesh & boundaryMesh() const noexcept
Return boundary mesh.
static constexpr int masterNo() noexcept
Relative rank for the master process - is always 0.
label size() const noexcept
The number of entries in the list.
const globalMeshData & globalData() const
Return parallel info (demand-driven)
label nInternalFaces() const noexcept
Number of internal faces.
virtual const faceList & faces() const
Return raw faces.
bool set(const label i, unsigned int val=~0u)
Set value at index i, default value set is the max_value.
errorManip< error > abort(error &err)
label nEdges() const
Number of mesh edges.
A polyBoundaryMesh is a polyPatch list with additional search methods and registered IO...
label nEdges() const
Number of edges in patch.
void T(FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
void resize(const label newLen)
Adjust size of PtrList.
gmvFile<< "tracers "<< particles.size()<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().x()<< ' ';}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().y()<< ' ';}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().z()<< ' ';}gmvFile<< nl;for(const word &name :lagrangianScalarNames){ IOField< scalar > fld(IOobject(name, runTime.timeName(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
const edgeList & edges() const
Return mesh edges. Uses calcEdges.
static commsTypes defaultCommsType
Default commsType.
label nCells() const noexcept
Number of mesh cells.
void reserve(label numEntries)
Reserve space for at least the specified number of elements (not the number of buckets) and regenerat...
static bool master(const label communicator=worldComm)
True if process corresponds to the master rank in the communicator.
const polyBoundaryMesh & patches
static bool write(const UPstream::commsTypes commsType, const int toProcNo, const char *buf, const std::streamsize bufSize, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm, UPstream::Request *req=nullptr, const UPstream::sendModes sendMode=UPstream::sendModes::normal)
Write buffer contents to given processor.
"nonBlocking" (immediate) : (MPI_Isend, MPI_Irecv)
Mesh consisting of general polyhedral cells.
static rangeType subProcs(const label communicator=worldComm)
Range of process indices for sub-processes.
List< label > labelList
A List of labels.
label nBoundaryFaces() const noexcept
Number of boundary faces (== nFaces - nInternalFaces)
const labelList & sharedPointAddr() const
Return addressing into the complete globally shared points list.
bool send()
Send buffer contents now and not in destructor [advanced usage]. Returns true on success.
label size() const noexcept
Number of entries.
const dimensionedScalar mp
Proton mass.
bool set(const label &key, const T &obj)
Copy assign a new entry, overwriting existing entries.
uindirectPrimitivePatch pp(UIndirectList< face >(mesh.faces(), faceLabels), mesh.points())
forAllConstIters(mixture.phases(), phase)
static std::streamsize read(const UPstream::commsTypes commsType, const int fromProcNo, char *buf, const std::streamsize bufSize, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm, UPstream::Request *req=nullptr)
Read buffer contents from given processor.
A HashTable to objects of type <T> with a label key.
static int compare(const edge &a, const edge &b)
Compare edges.
void syncPointData(List< Type > &pointData, const CombineOp &cop, const TransformOp &top) const
Helper to synchronise coupled patch point data.