55 return lst_[a].first() < lst_[
b].first();
72 if (u[facei] < l[facei])
75 <<
"Reversed face. Problem at face " << facei
76 <<
" l:" << l[facei] <<
" u:" << u[facei]
79 if (l[facei] < 0 || u[facei] < 0 || u[facei] >= size)
82 <<
"Illegal cell label. Problem at face " << facei
83 <<
" l:" << l[facei] <<
" u:" << u[facei]
88 for (label facei=1; facei < l.
size(); facei++)
90 if (l[facei-1] > l[facei])
93 <<
"Lower not in incremental cell order."
94 <<
" Problem at face " << facei
95 <<
" l:" << l[facei] <<
" u:" << u[facei]
96 <<
" previous l:" << l[facei-1]
99 else if (l[facei-1] == l[facei])
102 if (u[facei-1] > u[facei])
105 <<
"Upper not in incremental cell order."
106 <<
" Problem at face " << facei
107 <<
" l:" << l[facei] <<
" u:" << u[facei]
108 <<
" previous u:" << u[facei-1]
116 Foam::label Foam::lduPrimitiveMesh::totalSize
125 size += msh.lduAddr().size();
146 <<
"Problem at face:" << facei
147 <<
" lower:" <<
lower[facei]
148 <<
" upper:" <<
upper[facei]
151 nNbrs[
lower[facei]]++;
159 offsets[celli+1] = offsets[celli]+nNbrs[celli];
167 label celli =
lower[facei];
168 cellToFaces[nNbrs[celli]++] = facei;
180 for (label celli = 0; celli < nCells; celli++)
182 label startOfCell = offsets[celli];
183 label nNbr = offsets[celli+1] - startOfCell;
188 nbr[i] =
upper[cellToFaces[offsets[celli]+i]];
192 for (
const label index : order)
194 oldToNew[cellToFaces[startOfCell + index]] = newFacei++;
204 Foam::lduPrimitiveMesh::lduPrimitiveMesh
214 lowerAddr_(l, reuse),
215 upperAddr_(u, reuse),
226 interfaces_ = interfaces;
230 primitiveInterfaces_.
setSize(interfaces_.size());
233 if (interfaces_.set(i))
235 primitiveInterfaces_.set(i, &interfaces_[i]);
241 Foam::lduPrimitiveMesh::lduPrimitiveMesh
254 primitiveInterfaces_(0),
258 primitiveInterfaces_.transfer(primitiveInterfaces);
261 interfaces_.setSize(primitiveInterfaces_.size());
262 forAll(primitiveInterfaces_, i)
264 if (primitiveInterfaces_.set(i))
266 interfaces_.set(i, &primitiveInterfaces_[i]);
272 Foam::lduPrimitiveMesh::lduPrimitiveMesh
295 const label currentComm = myMesh.
comm();
299 if (otherMeshes[i].comm() != currentComm)
302 <<
"Communicator " << otherMeshes[i].comm()
304 <<
" differs from that of predecessor "
310 const label nMeshes = otherMeshes.size()+1;
317 <<
" agglomerating into " << myAgglom
318 <<
" as are " <<
findIndices(procAgglomMap, myAgglom)
325 if (procAgglomMap[procIDs[i]] != procAgglomMap[procIDs[0]])
328 <<
"Processor " << procIDs[i]
329 <<
" agglomerates to " << procAgglomMap[procIDs[i]]
330 <<
" whereas other processors " << procIDs
331 <<
" agglomerate to "
339 cellOffsets.
setSize(nMeshes+1);
341 for (label procMeshI = 0; procMeshI < nMeshes; procMeshI++)
343 const lduMesh& procMesh =
mesh(myMesh, otherMeshes, procMeshI);
345 cellOffsets[procMeshI+1] =
346 cellOffsets[procMeshI]
352 labelList internalFaceOffsets(nMeshes+1);
353 internalFaceOffsets[0] = 0;
354 for (label procMeshI = 0; procMeshI < nMeshes; procMeshI++)
356 const lduMesh& procMesh =
mesh(myMesh, otherMeshes, procMeshI);
358 internalFaceOffsets[procMeshI+1] =
359 internalFaceOffsets[procMeshI]
377 boundaryFaceMap.
setSize(nMeshes);
380 label nOtherInterfaces = 0;
383 for (label procMeshI = 0; procMeshI < nMeshes; procMeshI++)
389 boundaryMap[procMeshI].
setSize(interfaces.
size(), -1);
390 boundaryFaceMap[procMeshI].
setSize(interfaces.
size());
395 if (interfaces.
set(intI))
399 if (isA<processorLduInterface>(ldui))
402 refCast<const processorLduInterface>(ldui);
404 label agglom0 = procAgglomMap[pldui.
myProcNo()];
407 const edge procEdge(agglom0, agglom1);
409 if (agglom0 != myAgglom && agglom1 != myAgglom)
412 <<
"At mesh from processor " << procIDs[procMeshI]
413 <<
" have interface " << intI
414 <<
" with myProcNo:" << pldui.
myProcNo()
418 else if (agglom0 == myAgglom && agglom1 == myAgglom)
423 Pout<<
"merged interface: myProcNo:"
430 const label nbrProcMeshI =
433 if (procMeshI < nbrProcMeshI)
439 mergedMap(procEdge).append
448 Pout<<
"external interface: myProcNo:"
455 unmergedMap(procEdge).append
465 <<
"At mesh from processor " << procIDs[procMeshI]
466 <<
" have interface " << intI
467 <<
" of unhandled type " << interfaces[intI].type()
480 Pout<<
"Remaining interfaces:" <<
endl;
483 Pout<<
" agglom procEdge:" << iter.key() <<
endl;
487 label procMeshI = elems[i][0];
488 label interfacei = elems[i][1];
493 refCast<const processorLduInterface>
495 interfaces[interfacei]
498 Pout<<
" proc:" << procIDs[procMeshI]
499 <<
" interfacei:" << interfacei
509 Pout<<
"Merged interfaces:" <<
endl;
512 Pout<<
" agglom procEdge:" << iter.key() <<
endl;
517 label procMeshI = elems[i][0];
518 label interfacei = elems[i][1];
522 refCast<const processorLduInterface>
524 interfaces[interfacei]
527 Pout<<
" proc:" << procIDs[procMeshI]
528 <<
" interfacei:" << interfacei
539 faceOffsets.
setSize(nMeshes+1);
542 for (label procMeshI = 0; procMeshI < nMeshes; procMeshI++)
544 const lduMesh& procMesh =
mesh(myMesh, otherMeshes, procMeshI);
547 faceOffsets[procMeshI+1] =
548 faceOffsets[procMeshI]
550 + nCoupledFaces[procMeshI];
556 map[i] = faceOffsets[procMeshI] + i;
562 lowerAddr_.
setSize(faceOffsets.last(), -1);
563 upperAddr_.setSize(lowerAddr_.size(), -1);
569 for (label procMeshI = 0; procMeshI < nMeshes; procMeshI++)
571 const lduMesh& procMesh =
mesh(myMesh, otherMeshes, procMeshI);
577 label allFacei = faceOffsets[procMeshI];
581 lowerAddr_[allFacei] = cellOffsets[procMeshI]+l[facei];
582 upperAddr_[allFacei] = cellOffsets[procMeshI]+u[facei];
592 if (interfaces.
set(intI))
596 if (isA<processorLduInterface>(ldui))
599 refCast<const processorLduInterface>(ldui);
604 label nbrProcMeshI = procIDs.find(nbrP);
606 if (procMeshI < nbrProcMeshI)
611 const label agglom0 = procAgglomMap[myP];
612 const label agglom1 = procAgglomMap[nbrP];
615 mergedMap.cfind(
edge(agglom0, agglom1));
625 label proci = elems[i][0];
626 label interfacei = elems[i][1];
635 refCast<const processorLduInterface>
637 interfaces[interfacei]
642 elems[i][0] == nbrProcMeshI
646 nbrIntI = elems[i][1];
670 nbrInterfaces[nbrIntI].faceCells();
676 <<
" nbrFaceCells:" << nbrFaceCells
682 boundaryFaceMap[procMeshI][intI];
684 boundaryFaceMap[nbrProcMeshI][nbrIntI];
691 lowerAddr_[allFacei] =
693 bfMap[pfI] = allFacei;
694 upperAddr_[allFacei] =
695 cellOffsets[nbrProcMeshI]+nbrFaceCells[pfI];
696 nbrBfMap[pfI] = (-allFacei-1);
726 map[i] = oldToNew[map[i]];
730 label allFacei = -map[i]-1;
731 map[i] = -oldToNew[allFacei]-1;
740 forAll(boundaryFaceMap, proci)
742 const labelList& bMap = boundaryMap[proci];
745 if (bMap[intI] == -1)
748 labelList& bfMap = boundaryFaceMap[proci][intI];
754 bfMap[i] = oldToNew[bfMap[i]];
758 label allFacei = -bfMap[i]-1;
759 bfMap[i] = (-oldToNew[allFacei]-1);
771 interfaces_.
setSize(unmergedMap.size() + nOtherInterfaces);
772 primitiveInterfaces_.setSize(interfaces_.size());
774 label allInterfacei = 0;
786 label procMeshI = elem[0];
787 label interfacei = elem[1];
796 refCast<const processorLduInterface>
798 interfaces[interfacei]
804 min(myProcNo, nbrProcNo),
805 max(myProcNo, nbrProcNo)
817 label procMeshI = elem[0];
818 label interfacei = elem[1];
826 n += interfaces[interfacei].faceCells().
size();
838 label procMeshI = elem[0];
839 label interfacei = elem[1];
847 boundaryMap[procMeshI][interfacei] = allInterfacei;
848 labelList& bfMap = boundaryFaceMap[procMeshI][interfacei];
850 const labelUList& l = interfaces[interfacei].faceCells();
855 allFaceCells[
n] = cellOffsets[procMeshI]+l[facei];
856 allFaceRestrictAddressing[
n] =
n;
865 label neighbProcNo = -1;
869 if (iter.key()[0] == myAgglom)
871 if (iter.key()[1] == myAgglom)
874 <<
"problem procEdge:" << iter.key()
878 neighbProcNo = iter.key()[1];
882 if (iter.key()[1] != myAgglom)
885 <<
"problem procEdge:" << iter.key()
889 neighbProcNo = iter.key()[0];
892 primitiveInterfaces_.set
900 allFaceRestrictAddressing,
908 interfaces_.set(allInterfacei, &primitiveInterfaces_[allInterfacei]);
912 Pout<<
"Created " << interfaces_[allInterfacei].type()
913 <<
" interface at " << allInterfacei
915 <<
" myProcNo:" << myAgglom
916 <<
" neighbProcNo:" << neighbProcNo
917 <<
" nFaces:" << allFaceCells.size()
926 patchSchedule_ = nonBlockingSchedule<processorGAMGInterface>(interfaces_);
930 checkUpperTriangular(cellOffsets.last(), lowerAddr_, upperAddr_);
944 return (meshI == 0 ? myMesh : otherMeshes[meshI-1]);
961 otherMeshes.
setSize(procIDs.size()-1);
964 for (label i = 1; i < procIDs.size(); i++)
1000 forAll(validInterface, intI)
1002 if (validInterface[intI])
1004 word coupleType(fromSlave);
1013 otherMeshes[i-1].rawInterfaces(),
1020 otherMeshes[i-1].addInterfaces
1023 nonBlockingSchedule<processorGAMGInterface>
1039 validInterface[intI] = interfaces.
set(intI);
1052 << addressing.
size()
1059 if (interfaces.
set(intI))