69 if (u[faceI] < l[faceI])
72 <<
"Reversed face. Problem at face " << faceI
73 <<
" l:" << l[faceI] <<
" u:" << u[faceI]
76 if (l[faceI] < 0 || u[faceI] < 0 || u[faceI] >= size)
79 <<
"Illegal cell label. Problem at face " << faceI
80 <<
" l:" << l[faceI] <<
" u:" << u[faceI]
85 for (
label faceI=1; faceI < l.
size(); faceI++)
87 if (l[faceI-1] > l[faceI])
90 <<
"Lower not in incremental cell order."
91 <<
" Problem at face " << faceI
92 <<
" l:" << l[faceI] <<
" u:" << u[faceI]
93 <<
" previous l:" << l[faceI-1]
96 else if (l[faceI-1] == l[faceI])
99 if (u[faceI-1] > u[faceI])
102 <<
"Upper not in incremental cell order."
103 <<
" Problem at face " << faceI
104 <<
" l:" << l[faceI] <<
" u:" << u[faceI]
105 <<
" previous u:" << u[faceI-1]
122 size += meshes[i].lduAddr().
size();
140 if (upper[faceI] < lower[faceI])
143 <<
"Problem at face:" << faceI
144 <<
" lower:" << lower[faceI]
145 <<
" upper:" << upper[faceI]
148 nNbrs[lower[faceI]]++;
156 offsets[cellI+1] = offsets[cellI]+nNbrs[cellI];
164 label cellI = lower[faceI];
165 cellToFaces[nNbrs[cellI]++] = faceI;
177 for (
label cellI = 0; cellI < nCells; cellI++)
179 label startOfCell = offsets[cellI];
180 label nNbr = offsets[cellI+1] - startOfCell;
186 nbr[i] = upper[cellToFaces[offsets[cellI]+i]];
192 label index = order[i];
193 oldToNew[cellToFaces[startOfCell + index]] = newFaceI++;
213 lowerAddr_(l, reUse),
214 upperAddr_(u, reUse),
225 interfaces_ = interfaces;
229 primitiveInterfaces_.
setSize(interfaces_.size());
232 if (interfaces_.set(i))
234 primitiveInterfaces_.set(i, &interfaces_[i]);
253 primitiveInterfaces_(0),
257 primitiveInterfaces_.transfer(primitiveInterfaces);
260 interfaces_.setSize(primitiveInterfaces_.size());
261 forAll(primitiveInterfaces_, i)
263 if (primitiveInterfaces_.set(i))
265 interfaces_.set(i, &primitiveInterfaces_[i]);
298 if (otherMeshes[i].comm() != currentComm)
301 <<
"Communicator " << otherMeshes[i].comm()
303 <<
" differs from that of predecessor "
309 const label nMeshes = otherMeshes.
size()+1;
311 const label myAgglom = procAgglomMap[UPstream::myProcNo(currentComm)];
313 if (lduPrimitiveMesh::debug)
315 Pout<<
"I am " << UPstream::myProcNo(currentComm)
316 <<
" agglomerating into " << myAgglom
317 <<
" as are " <<
findIndices(procAgglomMap, myAgglom)
324 if (procAgglomMap[procIDs[i]] != procAgglomMap[procIDs[0]])
327 <<
"Processor " << procIDs[i]
328 <<
" agglomerates to " << procAgglomMap[procIDs[i]]
329 <<
" whereas other processors " << procIDs
330 <<
" agglomerate to "
338 cellOffsets.
setSize(nMeshes+1);
340 for (
label procMeshI = 0; procMeshI < nMeshes; procMeshI++)
342 const lduMesh& procMesh =
mesh(myMesh, otherMeshes, procMeshI);
344 cellOffsets[procMeshI+1] =
345 cellOffsets[procMeshI]
351 labelList internalFaceOffsets(nMeshes+1);
352 internalFaceOffsets[0] = 0;
353 for (
label procMeshI = 0; procMeshI < nMeshes; procMeshI++)
355 const lduMesh& procMesh =
mesh(myMesh, otherMeshes, procMeshI);
357 internalFaceOffsets[procMeshI+1] =
358 internalFaceOffsets[procMeshI]
376 boundaryFaceMap.
setSize(nMeshes);
379 label nOtherInterfaces = 0;
382 for (
label procMeshI = 0; procMeshI < nMeshes; procMeshI++)
385 mesh(myMesh, otherMeshes, procMeshI).interfaces();
388 boundaryMap[procMeshI].
setSize(interfaces.
size(), -1);
389 boundaryFaceMap[procMeshI].
setSize(interfaces.
size());
394 if (interfaces.
set(intI))
398 if (isA<processorLduInterface>(ldui))
401 refCast<const processorLduInterface>(ldui);
406 const edge procEdge(agglom0, agglom1);
408 if (agglom0 != myAgglom && agglom1 != myAgglom)
411 <<
"At mesh from processor " << procIDs[procMeshI]
412 <<
" have interface " << intI
413 <<
" with myProcNo:" << pldui.
myProcNo()
417 else if (agglom0 == myAgglom && agglom1 == myAgglom)
422 Pout<<
"merged interface: myProcNo:"
435 if (procMeshI < nbrProcMeshI)
442 mergedMap.
find(procEdge);
444 if (iter != mergedMap.end())
446 iter().append(
labelPair(procMeshI, intI));
461 Pout<<
"external interface: myProcNo:"
469 unmergedMap.
find(procEdge);
471 if (iter != unmergedMap.end())
473 iter().append(
labelPair(procMeshI, intI));
489 <<
"At mesh from processor " << procIDs[procMeshI]
490 <<
" have interface " << intI
491 <<
" of unhandled type " << interfaces[intI].type()
504 Pout<<
"Remaining interfaces:" <<
endl;
507 Pout<<
" agglom procEdge:" << iter.key() <<
endl;
511 label procMeshI = elems[i][0];
512 label interfaceI = elems[i][1];
514 mesh(myMesh, otherMeshes, procMeshI).interfaces();
517 refCast<const processorLduInterface>
519 interfaces[interfaceI]
522 Pout<<
" proc:" << procIDs[procMeshI]
523 <<
" interfaceI:" << interfaceI
533 Pout<<
"Merged interfaces:" <<
endl;
536 Pout<<
" agglom procEdge:" << iter.key() <<
endl;
541 label procMeshI = elems[i][0];
542 label interfaceI = elems[i][1];
544 mesh(myMesh, otherMeshes, procMeshI).interfaces();
546 refCast<const processorLduInterface>
548 interfaces[interfaceI]
551 Pout<<
" proc:" << procIDs[procMeshI]
552 <<
" interfaceI:" << interfaceI
563 faceOffsets.
setSize(nMeshes+1);
566 for (
label procMeshI = 0; procMeshI < nMeshes; procMeshI++)
568 const lduMesh& procMesh =
mesh(myMesh, otherMeshes, procMeshI);
571 faceOffsets[procMeshI+1] =
572 faceOffsets[procMeshI]
574 + nCoupledFaces[procMeshI];
580 map[i] = faceOffsets[procMeshI] + i;
586 lowerAddr_.
setSize(faceOffsets.last(), -1);
587 upperAddr_.setSize(lowerAddr_.size(), -1);
593 for (
label procMeshI = 0; procMeshI < nMeshes; procMeshI++)
595 const lduMesh& procMesh =
mesh(myMesh, otherMeshes, procMeshI);
601 label allFaceI = faceOffsets[procMeshI];
605 lowerAddr_[allFaceI] = cellOffsets[procMeshI]+l[faceI];
606 upperAddr_[allFaceI] = cellOffsets[procMeshI]+u[faceI];
616 if (interfaces.
set(intI))
620 if (isA<processorLduInterface>(ldui))
623 refCast<const processorLduInterface>(ldui);
630 if (procMeshI < nbrProcMeshI)
635 label agglom0 = procAgglomMap[myP];
636 label agglom1 = procAgglomMap[nbrP];
639 mergedMap.
find(
edge(agglom0, agglom1));
641 if (fnd != mergedMap.end())
649 label procI = elems[i][0];
650 label interfaceI = elems[i][1];
659 refCast<const processorLduInterface>
661 interfaces[interfaceI]
666 elems[i][0] == nbrProcMeshI
670 nbrIntI = elems[i][1];
694 nbrInterfaces[nbrIntI].faceCells();
696 if (faceCells.
size() != nbrFaceCells.
size())
699 <<
"faceCells:" << faceCells
700 <<
" nbrFaceCells:" << nbrFaceCells
706 boundaryFaceMap[procMeshI][intI];
708 boundaryFaceMap[nbrProcMeshI][nbrIntI];
715 lowerAddr_[allFaceI] =
716 cellOffsets[procMeshI]+faceCells[pfI];
717 bfMap[pfI] = allFaceI;
718 upperAddr_[allFaceI] =
719 cellOffsets[nbrProcMeshI]+nbrFaceCells[pfI];
720 nbrBfMap[pfI] = (-allFaceI-1);
750 map[i] = oldToNew[map[i]];
754 label allFaceI = -map[i]-1;
755 map[i] = -oldToNew[allFaceI]-1;
764 forAll(boundaryFaceMap, procI)
766 const labelList& bMap = boundaryMap[procI];
769 if (bMap[intI] == -1)
772 labelList& bfMap = boundaryFaceMap[procI][intI];
778 bfMap[i] = oldToNew[bfMap[i]];
782 label allFaceI = -bfMap[i]-1;
783 bfMap[i] = (-oldToNew[allFaceI]-1);
795 interfaces_.
setSize(unmergedMap.
size() + nOtherInterfaces);
796 primitiveInterfaces_.setSize(interfaces_.size());
798 label allInterfaceI = 0;
810 label procMeshI = elem[0];
811 label interfaceI = elem[1];
820 refCast<const processorLduInterface>
822 interfaces[interfaceI]
828 min(myProcNo, nbrProcNo),
829 max(myProcNo, nbrProcNo)
842 label procMeshI = elem[0];
843 label interfaceI = elem[1];
851 n += interfaces[interfaceI].faceCells().
size();
863 label procMeshI = elem[0];
864 label interfaceI = elem[1];
872 boundaryMap[procMeshI][interfaceI] = allInterfaceI;
873 labelList& bfMap = boundaryFaceMap[procMeshI][interfaceI];
875 const labelUList& l = interfaces[interfaceI].faceCells();
880 allFaceCells[
n] = cellOffsets[procMeshI]+l[faceI];
881 allFaceRestrictAddressing[
n] =
n;
890 label neighbProcNo = -1;
894 if (iter.key()[0] == myAgglom)
896 if (iter.key()[1] == myAgglom)
899 <<
"problem procEdge:" << iter.key()
903 neighbProcNo = iter.key()[1];
907 if (iter.key()[1] != myAgglom)
910 <<
"problem procEdge:" << iter.key()
914 neighbProcNo = iter.key()[0];
917 primitiveInterfaces_.set
925 allFaceRestrictAddressing,
933 interfaces_.set(allInterfaceI, &primitiveInterfaces_[allInterfaceI]);
937 Pout<<
"Created " << interfaces_[allInterfaceI].type()
938 <<
" interface at " << allInterfaceI
940 <<
" myProcNo:" << myAgglom
941 <<
" neighbProcNo:" << neighbProcNo
942 <<
" nFaces:" << allFaceCells.size()
951 patchSchedule_ = nonBlockingSchedule<processorGAMGInterface>(interfaces_);
969 return (meshI == 0 ? myMesh : otherMeshes[meshI-1]);
982 (void)
mesh.lduAddr().patchSchedule();
984 if (Pstream::myProcNo(comm) == procIDs[0])
989 for (
label i = 1; i < procIDs.
size(); i++)
1006 boolList validInterface(fromSlave);
1025 forAll(validInterface, intI)
1027 if (validInterface[intI])
1029 word coupleType(fromSlave);
1038 otherMeshes[i-1].rawInterfaces(),
1045 otherMeshes[i-1].addInterfaces
1048 nonBlockingSchedule<processorGAMGInterface>
1055 else if (
findIndex(procIDs, Pstream::myProcNo(comm)) != -1)
1064 validInterface[intI] = interfaces.
set(intI);
1077 << addressing.
size()
1084 if (interfaces.
set(intI))