55 if (u[facei] < l[facei])
58 <<
"Reversed face. Problem at face " << facei
59 <<
" l:" << l[facei] <<
" u:" << u[facei]
62 if (l[facei] < 0 || u[facei] < 0 || u[facei] >=
size)
65 <<
"Illegal cell label. Problem at face " << facei
66 <<
" l:" << l[facei] <<
" u:" << u[facei]
71 for (label facei=1; facei < l.
size(); ++facei)
73 if (l[facei-1] > l[facei])
76 <<
"Lower not in incremental cell order." 77 <<
" Problem at face " << facei
78 <<
" l:" << l[facei] <<
" u:" << u[facei]
79 <<
" previous l:" << l[facei-1]
82 else if (l[facei-1] == l[facei])
85 if (u[facei-1] > u[facei])
88 <<
"Upper not in incremental cell order." 89 <<
" Problem at face " << facei
90 <<
" l:" << l[facei] <<
" u:" << u[facei]
91 <<
" previous u:" << u[facei-1]
102 const globalIndex& globalNumbering
118 PtrList<labelList> nbrGlobalCells(interfaces.size());
125 if (interfaces.set(inti))
127 interfaces[inti].initInternalFieldTransfer
139 if (interfaces.set(inti))
146 interfaces[inti].internalFieldTransfer
175 if (interfaces.set(inti))
177 for (
const label celli : interfaces[inti].faceCells())
191 cellCells[celli].setSize(nNbrs[celli], -1);
200 const label c0 = own[facei];
201 const label
c1 = nbr[facei];
203 cellCells[c0][nNbrs[c0]++] = globalIndices[
c1];
204 cellCells[
c1][nNbrs[
c1]++] = globalIndices[c0];
208 if (interfaces.set(inti))
210 const labelUList& faceCells = interfaces[inti].faceCells();
214 const label c0 = faceCells[facei];
215 cellCells[c0][nNbrs[c0]++] = nbrGlobalCells[inti][facei];
224 Foam::label Foam::lduPrimitiveMesh::totalSize
226 const PtrList<lduPrimitiveMesh>&
meshes 231 for (
const lduPrimitiveMesh& msh :
meshes)
233 size += msh.lduAddr().size();
254 <<
"Problem at face:" << facei
255 <<
" lower:" <<
lower[facei]
256 <<
" upper:" <<
upper[facei]
259 nNbrs[
lower[facei]]++;
267 offsets[celli+1] = offsets[celli]+nNbrs[celli];
275 const label celli =
lower[facei];
276 cellToFaces[nNbrs[celli]++] = facei;
283 DynamicList<label> order;
284 DynamicList<label> nbr;
288 for (label celli = 0; celli < nCells; ++celli)
290 const label startOfCell = offsets[celli];
291 const label nNbr = offsets[celli+1] - startOfCell;
298 nbr[i] =
upper[cellToFaces[offsets[celli]+i]];
302 for (
const label index : order)
304 oldToNew[cellToFaces[startOfCell + index]] = newFacei++;
312 Foam::label Foam::lduPrimitiveMesh::findConnectedInterface
314 const lduMesh& myMesh,
315 const PtrList<lduPrimitiveMesh>& otherMeshes,
318 const label nbrProci,
324 for (
const auto& procAndInterface : procAndInterfaces)
326 const label proci = procAndInterface[0];
328 if (proci == nbrProci)
330 const label interfacei = procAndInterface[1];
338 const processorLduInterface& pldui =
339 refCast<const processorLduInterface>
341 interfaces[interfacei]
344 if (pldui.neighbProcNo() == myRank)
346 nbrInti = procAndInterface[1];
364 Foam::lduPrimitiveMesh::lduPrimitiveMesh
374 lowerAddr_(l, reuse),
375 upperAddr_(u, reuse),
380 if (
max(lowerAddr_) >= nCells ||
min(lowerAddr_) < 0)
383 <<
" nCells:" << nCells
384 <<
" max(lower):" <<
max(lowerAddr_)
385 <<
" min(lower):" <<
min(lowerAddr_)
391 if (
max(upperAddr_) >= nCells ||
min(upperAddr_) < 0)
394 <<
" nCells:" << nCells
395 <<
" max(upper):" <<
max(upperAddr_)
396 <<
" min(upper):" <<
min(upperAddr_)
409 interfaces_ = interfaces;
413 primitiveInterfaces_.setSize(interfaces_.size());
416 if (interfaces_.set(i))
418 primitiveInterfaces_.set(i, &interfaces_[i]);
424 Foam::lduPrimitiveMesh::lduPrimitiveMesh
434 Foam::lduPrimitiveMesh::lduPrimitiveMesh
447 primitiveInterfaces_(),
453 if (
max(lowerAddr_) >= nCells ||
min(lowerAddr_) < 0)
456 <<
" nCells:" << nCells
457 <<
" max(lower):" <<
max(lowerAddr_)
458 <<
" min(lower):" <<
min(lowerAddr_)
464 if (
max(upperAddr_) >= nCells ||
min(upperAddr_) < 0)
467 <<
" nCells:" << nCells
468 <<
" max(upper):" <<
max(upperAddr_)
469 <<
" min(upper):" <<
min(upperAddr_)
478 interfaces_.
setSize(primitiveInterfaces_.size());
479 forAll(primitiveInterfaces_, i)
481 if (primitiveInterfaces_.set(i))
483 interfaces_.
set(i, &primitiveInterfaces_[i]);
489 Foam::lduPrimitiveMesh::lduPrimitiveMesh
495 const lduMesh& myMesh,
496 const PtrList<lduPrimitiveMesh>& otherMeshes,
505 lduAddressing(myMesh.lduAddr().size() + totalSize(otherMeshes)),
508 const label currentComm = myMesh.comm();
512 if (otherMeshes[i].
comm() != currentComm)
515 <<
"Communicator " << otherMeshes[i].comm()
517 <<
" differs from that of predecessor " 523 const label nMeshes = otherMeshes.size()+1;
529 <<
" agglomerating into " << myAgglom
530 <<
" as are " <<
findIndices(procAgglomMap, myAgglom)
538 if (procAgglomMap[procIDs[i]] != procAgglomMap[procIDs[0]])
541 <<
"Processor " << procIDs[i]
542 <<
" agglomerates to " << procAgglomMap[procIDs[i]]
543 <<
" whereas other processors " << procIDs
544 <<
" agglomerate to " 552 cellOffsets.setSize(nMeshes+1);
554 for (label procMeshI = 0; procMeshI < nMeshes; ++procMeshI)
556 const lduMesh& procMesh =
mesh(myMesh, otherMeshes, procMeshI);
558 cellOffsets[procMeshI+1] =
559 cellOffsets[procMeshI]
560 + procMesh.lduAddr().size();
565 labelList internalFaceOffsets(nMeshes+1);
566 internalFaceOffsets[0] = 0;
567 for (label procMeshI = 0; procMeshI < nMeshes; ++procMeshI)
569 const lduMesh& procMesh =
mesh(myMesh, otherMeshes, procMeshI);
571 internalFaceOffsets[procMeshI+1] =
572 internalFaceOffsets[procMeshI]
573 + procMesh.lduAddr().lowerAddr().size();
582 EdgeMap<labelPairList> mergedMap(2*myInterfaces.size());
587 EdgeMap<labelPairList> unmergedMap(mergedMap.size());
591 List<DynamicList<label>> procToGlobal(nMeshes);
594 boundaryMap.setSize(nMeshes);
595 boundaryFaceMap.setSize(nMeshes);
600 for (label procMeshI = 0; procMeshI < nMeshes; ++procMeshI)
616 if (isA<processorLduInterface>(ldui))
618 if (isA<processorCyclicGAMGInterface>(ldui))
621 <<
"At mesh from processor " << procIDs[procMeshI]
622 <<
" have interface " << intI
623 <<
" of unhandled type " << ldui.type()
624 <<
". Adapt decomposition to avoid these" 628 const processorLduInterface& pldui =
629 refCast<const processorLduInterface>(ldui);
631 label agglom0 = procAgglomMap[pldui.myProcNo()];
632 label agglom1 = procAgglomMap[pldui.neighbProcNo()];
634 const edge procEdge(agglom0, agglom1);
636 if (agglom0 != myAgglom && agglom1 != myAgglom)
639 <<
"At mesh from processor " << procIDs[procMeshI]
640 <<
" have interface " << intI
641 <<
" with myProcNo:" << pldui.myProcNo()
642 <<
" with neighbProcNo:" << pldui.neighbProcNo()
645 else if (agglom0 == myAgglom && agglom1 == myAgglom)
650 Pout<<
"merged proc interface: myProcNo:" 652 <<
" nbr:" << pldui.neighbProcNo()
653 <<
" size:" << ldui.faceCells().size()
657 const label nbrProcMeshI =
658 procIDs.find(pldui.neighbProcNo());
660 if (procMeshI < nbrProcMeshI)
663 nCoupledFaces[procMeshI] += ldui.faceCells().size();
666 mergedMap(procEdge).append
675 Pout<<
"external proc interface: myProcNo:" 677 <<
" nbr:" << pldui.neighbProcNo()
678 <<
" size:" << ldui.faceCells().size()
682 unmergedMap(procEdge).append
691 procToGlobal[procMeshI].append(intI);
701 const auto& global0 = procToGlobal[0];
702 for (label procMeshI = 1; procMeshI < nMeshes; ++procMeshI)
704 const auto& global = procToGlobal[procMeshI];
705 if (global != global0)
708 <<
"At mesh from processor " << procIDs[procMeshI]
709 <<
" have global interfaces " << global
710 <<
" which differ from those on processor " 711 << procIDs[procMeshI]
721 Pout<<
"Global interfaces:" <<
endl;
722 const auto& global0 = procToGlobal[0];
723 for (
const label intI : global0)
725 Pout<<
" interfacei:" << intI
726 <<
" type:" << myInterfaces[intI].type()
732 Pout<<
"Remaining interfaces:" <<
endl;
733 for (
const auto& iter : unmergedMap.csorted())
735 Pout<<
" agglom procEdge:" << iter.key() <<
endl;
739 label procMeshI = elems[i][0];
740 label interfacei = elems[i][1];
744 const processorLduInterface& pldui =
745 refCast<const processorLduInterface>
750 Pout<<
" proc:" << procIDs[procMeshI]
751 <<
" interfacei:" << interfacei
752 <<
" between:" << pldui.myProcNo()
753 <<
" and:" << pldui.neighbProcNo()
762 Pout<<
"Merged interfaces:" <<
endl;
764 for (
const auto& iter : mergedMap.csorted())
766 Pout<<
" agglom procEdge:" << iter.key() <<
endl;
771 label procMeshI = elems[i][0];
772 label interfacei = elems[i][1];
775 const processorLduInterface& pldui =
776 refCast<const processorLduInterface>
781 Pout<<
" proc:" << procIDs[procMeshI]
782 <<
" interfacei:" << interfacei
783 <<
" between:" << pldui.myProcNo()
784 <<
" and:" << pldui.neighbProcNo()
796 faceOffsets.setSize(nMeshes+1);
799 for (label procMeshI = 0; procMeshI < nMeshes; ++procMeshI)
801 const lduMesh& procMesh =
mesh(myMesh, otherMeshes, procMeshI);
802 label nInternal = procMesh.lduAddr().lowerAddr().size();
804 faceOffsets[procMeshI+1] =
805 faceOffsets[procMeshI]
807 + nCoupledFaces[procMeshI];
810 map.setSize(nInternal);
813 map[i] = faceOffsets[procMeshI] + i;
819 lowerAddr_.
setSize(faceOffsets.last(), -1);
826 for (label procMeshI = 0; procMeshI < nMeshes; ++procMeshI)
828 const lduMesh& procMesh =
mesh(myMesh, otherMeshes, procMeshI);
830 const labelUList& l = procMesh.lduAddr().lowerAddr();
831 const labelUList& u = procMesh.lduAddr().upperAddr();
834 label allFacei = faceOffsets[procMeshI];
838 lowerAddr_[allFacei] = cellOffsets[procMeshI]+l[facei];
839 upperAddr_[allFacei] = cellOffsets[procMeshI]+u[facei];
853 if (isA<processorLduInterface>(ldui))
855 const processorLduInterface& pldui =
856 refCast<const processorLduInterface>(ldui);
859 label myP = pldui.myProcNo();
860 label nbrP = pldui.neighbProcNo();
861 label nbrProcMeshI = procIDs.find(nbrP);
863 if (procMeshI < nbrProcMeshI)
868 const label agglom0 = procAgglomMap[myP];
869 const label agglom1 = procAgglomMap[nbrP];
872 mergedMap.cfind(edge(agglom0, agglom1));
878 const label nbrIntI = findConnectedInterface
898 nbrInterfaces[nbrIntI].faceCells();
900 if (faceCells.size() != nbrFaceCells.size())
903 <<
"faceCells:" << faceCells
904 <<
" nbrFaceCells:" << nbrFaceCells
910 boundaryFaceMap[procMeshI][intI];
912 boundaryFaceMap[nbrProcMeshI][nbrIntI];
914 bfMap.
setSize(faceCells.size());
915 nbrBfMap.setSize(faceCells.size());
919 lowerAddr_[allFacei] =
920 cellOffsets[procMeshI]+faceCells[pfI];
921 bfMap[pfI] = allFacei;
922 upperAddr_[allFacei] =
923 cellOffsets[nbrProcMeshI]+nbrFaceCells[pfI];
924 nbrBfMap[pfI] = (-allFacei-1);
954 map[i] = oldToNew[map[i]];
958 label allFacei = -map[i]-1;
959 map[i] = -oldToNew[allFacei]-1;
968 forAll(boundaryFaceMap, proci)
970 const labelList& bMap = boundaryMap[proci];
973 if (bMap[intI] == -1)
976 labelList& bfMap = boundaryFaceMap[proci][intI];
982 bfMap[i] = oldToNew[bfMap[i]];
986 label allFacei = -bfMap[i]-1;
987 bfMap[i] = (-oldToNew[allFacei]-1);
999 interfaces_.
setSize(unmergedMap.size() + procToGlobal[0].size());
1000 primitiveInterfaces_.setSize(interfaces_.
size());
1002 label allInterfacei = 0;
1010 const auto& global0 = procToGlobal[0];
1012 for (
const label interfacei : global0)
1022 for (label procMeshI = 0; procMeshI < nMeshes; ++procMeshI)
1024 const auto& procMesh =
mesh(myMesh, otherMeshes, procMeshI);
1025 n += procMesh.interfaces()[interfacei].faceCells().size();
1036 for (label procMeshI = 0; procMeshI < nMeshes; ++procMeshI)
1038 faceOffsets[procMeshI] =
n;
1040 const auto& procMesh =
mesh(myMesh, otherMeshes, procMeshI);
1044 boundaryMap[procMeshI][interfacei] = allInterfacei;
1045 labelList& bfMap = boundaryFaceMap[procMeshI][interfacei];
1052 allFaceCells[
n] = cellOffsets[procMeshI]+l[facei];
1053 allFaceRestrictAddressing[
n] =
n;
1060 faceOffsets.last() =
n;
1063 const auto& myFineInterface =
1064 refCast<const GAMGInterface>(myInterfaces[interfacei]);
1066 autoPtr<GAMGInterface> ppPtr
1068 myFineInterface.clone
1074 allFaceRestrictAddressing,
1083 primitiveInterfaces_.set
1089 interfaces_.
set(allInterfacei, &primitiveInterfaces_[allInterfacei]);
1093 Pout<<
"Created " << interfaces_[allInterfacei].type()
1094 <<
" interface at " << allInterfacei
1095 <<
" comm:" << comm_
1096 <<
" myProcNo:" << myAgglom
1097 <<
" nFaces:" << allFaceCells.size()
1110 for (
const auto& iter : unmergedMap.csorted())
1120 label procMeshI = elem[0];
1121 label interfacei = elem[1];
1129 const processorLduInterface& pldui =
1130 refCast<const processorLduInterface>
1134 label myProcNo = pldui.myProcNo();
1135 label nbrProcNo = pldui.neighbProcNo();
1138 min(myProcNo, nbrProcNo),
1139 max(myProcNo, nbrProcNo)
1150 const labelPair& elem = elems[order[i]];
1151 label procMeshI = elem[0];
1152 label interfacei = elem[1];
1171 const labelPair& elem = elems[order[i]];
1172 label procMeshI = elem[0];
1173 label interfacei = elem[1];
1181 boundaryMap[procMeshI][interfacei] = allInterfacei;
1182 labelList& bfMap = boundaryFaceMap[procMeshI][interfacei];
1189 allFaceCells[
n] = cellOffsets[procMeshI]+l[facei];
1190 allFaceRestrictAddressing[
n] =
n;
1199 label neighbProcNo = -1;
1203 if (iter.key()[0] == myAgglom)
1205 if (iter.key()[1] == myAgglom)
1208 <<
"problem procEdge:" << iter.key()
1212 neighbProcNo = iter.key()[1];
1216 if (iter.key()[1] != myAgglom)
1219 <<
"problem procEdge:" << iter.key()
1223 neighbProcNo = iter.key()[0];
1226 primitiveInterfaces_.set
1229 new processorGAMGInterface
1234 allFaceRestrictAddressing,
1242 interfaces_.
set(allInterfacei, &primitiveInterfaces_[allInterfacei]);
1246 Pout<<
"Created " << interfaces_[allInterfacei].type()
1247 <<
" interface at " << allInterfacei
1248 <<
" comm:" << comm_
1249 <<
" myProcNo:" << myAgglom
1250 <<
" neighbProcNo:" << neighbProcNo
1251 <<
" nFaces:" << allFaceCells.size()
1260 if (allInterfacei != interfaces_.
size())
1270 <<
"Created new lduPrimitiveMesh:" <<
nl 1272 <<
" internal face lower:" 1274 <<
" internal faces upper:" 1279 if (interfaces_.
set(i))
1281 Pout<<
" interface:" << i <<
" type:" << interfaces_[i].type()
1283 <<
" faceCells:" <<
flatOutput(interfaces_[i].faceCells())
1289 Pout<<
"Original input meshes:" <<
endl;
1290 forAll(boundaryMap, procMeshI)
1292 const auto& procMesh =
mesh(myMesh, otherMeshes, procMeshI);
1295 Pout<<
" proc:" << procMeshI
1301 Pout<<
" int:" << inti
1304 <<
" maps to:" << boundaryMap[procMeshI][inti]
1312 patchSchedule_ = nonBlockingSchedule<processorGAMGInterface>(interfaces_);
1325 const lduMesh& myMesh,
1326 const PtrList<lduPrimitiveMesh>& otherMeshes,
1330 return (meshI == 0 ? myMesh : otherMeshes[meshI-1]);
1358 boolList validInterface(interfaces.size());
1361 validInterface[intI] = interfaces.set(intI);
1367 << addressing.
size()
1374 if (interfaces.set(intI))
1376 const GAMGInterface&
interface =
refCast<const GAMGInterface>
1388 pBufs.finishedGathers();
1396 otherMeshes.
setSize(nProcs-1);
1400 UIPstream fromProc(proci, pBufs);
1402 const label nCells =
readLabel(fromProc);
1405 const boolList validInterface(fromProc);
1412 new lduPrimitiveMesh
1424 forAll(validInterface, intI)
1426 if (validInterface[intI])
1428 word coupleType(fromProc);
1437 otherMeshes[proci-1].rawInterfaces(),
1444 otherMeshes[proci-1].addInterfaces
1447 nonBlockingSchedule<processorGAMGInterface>
virtual lduInterfacePtrsList interfaces() const =0
Return a list of pointers for each patch with only those pointing to interfaces being set...
Field< label > labelField
Specialisation of Field<T> for label.
void size(const label n)
Older name for setAddressableSize.
static autoPtr< GAMGInterface > New(const label index, const lduInterfacePtrsList &coarseInterfaces, const lduInterface &fineInterface, const labelField &localRestrictAddressing, const labelField &neighbourRestrictAddressing, const label fineLevelIndex, const label coarseComm)
Return a pointer to a new interface created on freestore given.
errorManipArg< error, int > exit(error &err, const int errNo=1)
void addInterfaces(lduInterfacePtrsList &interfaces, const lduSchedule &ps)
Add interfaces to a mesh constructed without.
void resize(const label len)
Adjust allocated size of list.
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.
labelList sortedOrder(const UList< T > &input)
Return the (stable) sort order for the list.
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
static label nRequests() noexcept
Number of outstanding requests (on the internal list of requests)
constexpr char nl
The newline '\n' character (0x0a)
Type & refCast(U &obj)
A dynamic_cast (for references). Generates a FatalError on failed casts and uses the virtual type() m...
void inplaceReorder(const labelUList &oldToNew, ListType &input, const bool prune=false)
Inplace reorder the elements of a list.
UIndirectList< label > labelUIndList
UIndirectList of labels.
Ostream & endl(Ostream &os)
Add newline and flush stream.
Abstract base class for meshes which provide LDU addressing for the construction of lduMatrix and LDU...
label readLabel(const char *buf)
Parse entire buffer as a label, skipping leading/trailing whitespace.
string upper(const std::string &s)
Return string copy transformed with std::toupper on each character.
PtrList< const lduInterface > & primitiveInterfaces()
Return a non-const list of primitive interfaces.
labelList findIndices(const ListType &input, typename ListType::const_reference val, label start=0)
Linear search to find all occurrences of given element.
static int & msgType() noexcept
Message tag of standard messages.
interfaceProperties interface(alpha1, U, thermo->transportPropertiesDict())
List< lduScheduleEntry > lduSchedule
A List of lduSchedule entries.
List< labelPair > labelPairList
List of labelPair.
static int myProcNo(const label communicator=worldComm)
Rank of this process in the communicator (starting from masterNo()). Can be negative if the process i...
List< labelList > labelListList
List of labelList.
virtual const labelUList & lowerAddr() const =0
Return lower addressing.
static void waitRequests()
Wait for all requests to finish.
UList< label > labelUList
A UList of labels.
Pair< int > faceMap(const label facePi, const face &faceP, const label faceNi, const face &faceN)
#define forAll(list, i)
Loop across all elements in list.
static label nProcs(const label communicator=worldComm)
Number of ranks in parallel run (for given communicator). It is 1 for serial run. ...
virtual label comm() const
Return communicator used for parallel communication.
void setSize(const label n)
Alias for resize()
labelList identity(const label len, label start=0)
Return an identity map of the given length with (map[i] == i), works like std::iota() but returning a...
virtual const labelUList & upperAddr() const =0
Return upper addressing.
virtual const lduAddressing & lduAddr() const
Return ldu addressing.
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.
virtual label comm() const
Return communicator used for parallel communication.
virtual const lduAddressing & lduAddr() const
Return ldu addressing.
UPtrList< const lduInterface > lduInterfacePtrsList
Store lists of lduInterface as a UPtrList.
Foam::PtrList< Foam::fvMesh > meshes(regionNames.size())
Simplest concrete lduMesh that stores the addressing needed by lduMatrix.
List< labelListList > labelListListList
List of labelListList.
static const lduMesh & mesh(const lduMesh &mesh0, const PtrList< lduPrimitiveMesh > &otherMeshes, const label meshI)
Select either mesh0 (meshI is 0) or otherMeshes[meshI-1].
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
errorManip< error > abort(error &err)
const T * set(const label i) const
Return const pointer to element (can be nullptr), or nullptr for out-of-range access (ie...
static void gather(const label agglomComm, const lduMesh &mesh, PtrList< lduPrimitiveMesh > &otherMeshes)
Gather meshes from other processors using agglomComm.
int debug
Static debugging option.
Pair< label > labelPair
A pair of labels.
defineTypeNameAndDebug(combustionModel, 0)
Buffers for inter-processor communications streams (UOPstream, UIPstream).
void setSize(const label newLen)
Same as resize()
Field< tensor > tensorField
Specialisation of Field<T> for tensor.
string lower(const std::string &s)
Return string copy transformed with std::tolower on each character.
#define WarningInFunction
Report a warning using Foam::Warning.
virtual lduInterfacePtrsList interfaces() const
Return a list of pointers for each patch.
static void checkUpperTriangular(const label size, const labelUList &l, const labelUList &u)
Check if in upper-triangular ordering.
A list of pointers to objects of type <T>, with allocation/deallocation management of the pointers...
static labelListList globalCellCells(const lduMesh &mesh, const globalIndex &globalNumbering)
Calculate global cell-cells.
static bool master(const label communicator=worldComm)
True if process corresponds to the master rank in the communicator.
const dimensionedScalar c1
First radiation constant: default SI units: [W/m2].
"nonBlocking" : (MPI_Isend, MPI_Irecv)
The class contains the addressing required by the lduMatrix: upper, lower and losort.
static rangeType subProcs(const label communicator=worldComm)
Range of process indices for sub-processes.
List< label > labelList
A List of labels.
void setSize(const label n)
Alias for resize()
virtual lduInterfacePtrsList interfaces() const
Return a list of pointers for each patch with only those pointing to interfaces being set...
List< bool > boolList
A List of bools.
prefixOSstream Pout
OSstream wrapped stdout (std::cout) with parallel prefix.
static labelList upperTriOrder(const label nCells, const labelUList &lower, const labelUList &upper)
Calculate upper-triangular order.
label size() const
Return number of equations.
virtual const lduSchedule & patchSchedule() const =0
Return patch field evaluation schedule.
const T * set(const label i) const
Return const pointer to element (can be nullptr), or nullptr for out-of-range access (ie...
FlatOutput::OutputAdaptor< Container, Delimiters > flatOutput(const Container &obj, Delimiters delim)
Global flatOutput() function with specified output delimiters.
static constexpr const zero Zero
Global zero (0)