52 if ((src.nCells() > 0) || (tgt.nCells() > 0))
64 label nHaveCells =
sum(cellsPresentOnProc);
72 <<
"Meshes split across multiple processors" <<
endl;
75 else if (nHaveCells == 1)
77 proci = cellsPresentOnProc.find(1);
81 <<
"Meshes local to processor" << proci <<
endl;
92 const List<treeBoundBoxList>& procBb,
105 for (
const treeBoundBox&
b : bbp)
109 overlaps[proci] =
true;
126 switch (procMapMethod_)
128 case procMapMethod::pmLOD:
130 Info<<
"meshToMesh: Using processorLOD method" <<
endl;
135 const label nGlobalSrcCells = src.globalData().nTotalCells();
136 const label cellsPerBox =
max(1, 0.001*nGlobalSrcCells);
137 typename processorLODs::cellBox boxLOD
154 Info<<
"meshToMesh: Using AABBTree method" <<
endl;
159 if (src.nCells() > 0)
181 <<
"Determining extent of src mesh per processor:" <<
nl
182 <<
"\tproc\tbb" <<
endl;
185 Info<<
'\t' << proci <<
'\t' << procBb[proci] <<
endl;
192 const faceList& faces = tgt.faces();
204 dynSendMap[proci].setCapacity(iniSize);
212 const cell&
c =
cells[celli];
218 const face&
f = faces[
c[facei]];
226 (void)calcOverlappingProcs(procBb, cellBb, procBbOverlaps);
228 forAll(procBbOverlaps, proci)
230 if (procBbOverlaps[proci])
232 dynSendMap[proci].append(celli);
241 sendMap[proci].transfer(dynSendMap[proci]);
249 <<
" target cells I need to send to:" <<
nl
250 <<
"\tproc\tcells" <<
endl;
253 Pout<<
'\t' << proci <<
'\t' << sendMap[proci].size()
275 forAll(constructMap, proci)
280 constructMap[proci].setSize(nRecv);
282 for (
label i = 0; i < nRecv; i++)
284 constructMap[proci][i] = segmentI++;
292 std::move(constructMap)
301 void Foam::meshToMesh::distributeCells
303 const mapDistribute& map,
304 const polyMesh& tgtMesh,
305 const globalIndex& globalI,
307 List<label>& nInternalFaces,
308 List<faceList>& faces,
309 List<labelList>& faceOwner,
310 List<labelList>& faceNeighbour,
311 List<labelList>& cellIDs,
312 List<labelList>& nbrProcIDs,
313 List<labelList>& procLocalFaceIDs
331 const labelList& sendElems = map.subMap()[domain];
333 if (sendElems.size())
336 labelList reverseCellMap(tgtMesh.nCells(), -1);
337 forAll(sendElems, subCelli)
339 reverseCellMap[sendElems[subCelli]] = subCelli;
342 DynamicList<face> subFaces(tgtMesh.nFaces());
343 DynamicList<label> subFaceOwner(tgtMesh.nFaces());
344 DynamicList<label> subFaceNeighbour(tgtMesh.nFaces());
346 DynamicList<label> subNbrProcIDs(tgtMesh.nFaces());
347 DynamicList<label> subProcLocalFaceIDs(tgtMesh.nFaces());
352 forAll(tgtMesh.faceNeighbour(), facei)
354 label own = tgtMesh.faceOwner()[facei];
355 label nbr = tgtMesh.faceNeighbour()[facei];
356 label subOwn = reverseCellMap[own];
357 label subNbr = reverseCellMap[nbr];
359 if (subOwn != -1 && subNbr != -1)
365 subFaces.append(tgtMesh.faces()[facei]);
366 subFaceOwner.append(subOwn);
367 subFaceNeighbour.append(subNbr);
368 subNbrProcIDs.append(-1);
369 subProcLocalFaceIDs.append(-1);
373 subFaces.append(tgtMesh.faces()[facei].reverseFace());
374 subFaceOwner.append(subNbr);
375 subFaceNeighbour.append(subOwn);
376 subNbrProcIDs.append(-1);
377 subProcLocalFaceIDs.append(-1);
383 forAll(tgtMesh.faceNeighbour(), facei)
385 label own = tgtMesh.faceOwner()[facei];
386 label nbr = tgtMesh.faceNeighbour()[facei];
387 label subOwn = reverseCellMap[own];
388 label subNbr = reverseCellMap[nbr];
390 if (subOwn != -1 && subNbr == -1)
392 subFaces.append(tgtMesh.faces()[facei]);
393 subFaceOwner.append(subOwn);
394 subFaceNeighbour.append(subNbr);
395 subNbrProcIDs.append(-1);
396 subProcLocalFaceIDs.append(-1);
398 else if (subOwn == -1 && subNbr != -1)
400 subFaces.append(tgtMesh.faces()[facei].reverseFace());
401 subFaceOwner.append(subNbr);
402 subFaceNeighbour.append(subOwn);
403 subNbrProcIDs.append(-1);
404 subProcLocalFaceIDs.append(-1);
409 forAll(tgtMesh.boundaryMesh(), patchi)
411 const polyPatch& pp = tgtMesh.boundaryMesh()[patchi];
416 if (isA<processorPolyPatch>(pp))
418 const processorPolyPatch& ppp =
419 dynamic_cast<const processorPolyPatch&
>(pp);
421 nbrProci = ppp.neighbProcNo();
426 label facei = pp.start() + i;
427 label own = tgtMesh.faceOwner()[facei];
429 if (reverseCellMap[own] != -1)
431 subFaces.append(tgtMesh.faces()[facei]);
432 subFaceOwner.append(reverseCellMap[own]);
433 subFaceNeighbour.append(-1);
434 subNbrProcIDs.append(nbrProci);
435 subProcLocalFaceIDs.append(i);
441 labelList reversePointMap(tgtMesh.nPoints(), -1);
442 DynamicList<point> subPoints(tgtMesh.nPoints());
443 forAll(subFaces, subFacei)
445 face&
f = subFaces[subFacei];
449 if (reversePointMap[pointi] == -1)
451 reversePointMap[pointi] = subPoints.size();
452 subPoints.
append(tgtMesh.points()[pointi]);
455 f[fp] = reversePointMap[pointi];
460 labelList globalElems(globalI.toGlobal(sendElems));
467 <<
" sending tgt cell " << sendElems[i]
468 <<
"[" << globalElems[i] <<
"]"
469 <<
" to srcProc " << domain <<
endl;
489 UOPstream toDomain(domain, pBufs);
499 << subProcLocalFaceIDs;
505 pBufs.finishedSends();
510 const labelList& recvElems = map.constructMap()[domain];
514 UIPstream str(domain, pBufs);
517 >> nInternalFaces[domain]
520 >> faceNeighbour[domain]
522 >> nbrProcIDs[domain]
523 >> procLocalFaceIDs[domain];
528 Pout<<
"Target mesh send sizes[" << domain <<
"]"
529 <<
": points="<<
points[domain].size()
530 <<
", faces=" << faces[domain].size()
531 <<
", nInternalFaces=" << nInternalFaces[domain]
532 <<
", faceOwn=" << faceOwner[domain].size()
533 <<
", faceNbr=" << faceNeighbour[domain].size()
534 <<
", cellIDs=" << cellIDs[domain].size() <<
endl;
540 void Foam::meshToMesh::distributeAndMergeCells
542 const mapDistribute& map,
544 const globalIndex& globalI,
554 List<label> allNInternalFaces;
555 List<faceList> allFaces;
556 List<labelList> allFaceOwners;
557 List<labelList> allFaceNeighbours;
558 List<labelList> allTgtCellIDs;
562 List<labelList> allNbrProcIDs;
563 List<labelList> allProcLocalFaceIDs;
602 labelList allNIntCoupledFaces(allNInternalFaces);
616 forAll(allTgtCellIDs, proci)
618 cellOffset[proci] = nCells;
619 nCells += allTgtCellIDs[proci].size();
623 typedef FixedList<label, 3> label3;
624 typedef HashTable<label, label3, label3::Hash<>> procCoupleInfo;
625 procCoupleInfo procFaceToGlobalCell;
627 forAll(allNbrProcIDs, proci)
629 const labelList& nbrProci = allNbrProcIDs[proci];
630 const labelList& localFacei = allProcLocalFaceIDs[proci];
634 if (nbrProci[i] != -1 && localFacei[i] != -1)
637 key[0] =
min(proci, nbrProci[i]);
638 key[1] =
max(proci, nbrProci[i]);
639 key[2] = localFacei[i];
641 const auto fnd = procFaceToGlobalCell.cfind(key);
645 procFaceToGlobalCell.insert(key, -1);
651 Pout<<
"Additional internal face between procs:"
652 << key[0] <<
" and " << key[1]
653 <<
" across local face " << key[2] <<
endl;
656 allNIntCoupledFaces[proci]++;
665 label nFacesTotal = 0;
667 forAll(allNIntCoupledFaces, proci)
669 label nCoupledFaces =
670 allNIntCoupledFaces[proci] - allNInternalFaces[proci];
672 internalFaceOffset[proci] = nIntFaces;
673 nIntFaces += allNIntCoupledFaces[proci];
674 nFacesTotal += allFaceOwners[proci].size() - nCoupledFaces;
678 tgtFaces.setSize(nFacesTotal);
679 tgtFaceOwners.setSize(nFacesTotal);
680 tgtFaceNeighbours.setSize(nFacesTotal);
681 tgtCellIDs.setSize(nCells);
687 SubList<point>(tgtPoints, pts.size(), pointOffset[proci]) = pts;
691 forAll(allTgtCellIDs, proci)
693 const labelList& cellIDs = allTgtCellIDs[proci];
694 SubList<label>(tgtCellIDs, cellIDs.size(), cellOffset[proci]) = cellIDs;
701 const faceList& fcs = allFaces[proci];
702 const labelList& faceOs = allFaceOwners[proci];
703 const labelList& faceNs = allFaceNeighbours[proci];
708 allNInternalFaces[proci],
709 internalFaceOffset[proci]
711 slice = SubList<face>(fcs, allNInternalFaces[proci]);
714 add(slice[i], pointOffset[proci]);
717 SubField<label> ownSlice
720 allNInternalFaces[proci],
721 internalFaceOffset[proci]
723 ownSlice = SubField<label>(faceOs, allNInternalFaces[proci]);
724 add(ownSlice, cellOffset[proci]);
726 SubField<label> nbrSlice
729 allNInternalFaces[proci],
730 internalFaceOffset[proci]
732 nbrSlice = SubField<label>(faceNs, allNInternalFaces[proci]);
733 add(nbrSlice, cellOffset[proci]);
735 internalFaceOffset[proci] += allNInternalFaces[proci];
740 forAll(allNbrProcIDs, proci)
742 const labelList& nbrProci = allNbrProcIDs[proci];
743 const labelList& localFacei = allProcLocalFaceIDs[proci];
744 const labelList& faceOs = allFaceOwners[proci];
745 const faceList& fcs = allFaces[proci];
749 if (nbrProci[i] != -1 && localFacei[i] != -1)
752 key[0] =
min(proci, nbrProci[i]);
753 key[1] =
max(proci, nbrProci[i]);
754 key[2] = localFacei[i];
756 auto fnd = procFaceToGlobalCell.find(key);
760 label tgtFacei = fnd();
764 fnd() = cellOffset[proci] + faceOs[i];
769 label newOwn = cellOffset[proci] + faceOs[i];
770 label newNbr = fnd();
771 label tgtFacei = internalFaceOffset[proci]++;
775 Pout<<
" proc " << proci
776 <<
"\tinserting face:" << tgtFacei
777 <<
" connection between owner " << newOwn
778 <<
" and neighbour " << newNbr
785 tgtFaces[tgtFacei] = fcs[i];
786 tgtFaceOwners[tgtFacei] = newOwn;
787 tgtFaceNeighbours[tgtFacei] = newNbr;
792 tgtFaces[tgtFacei] = fcs[i].reverseFace();
793 tgtFaceOwners[tgtFacei] = newNbr;
794 tgtFaceNeighbours[tgtFacei] = newOwn;
797 add(tgtFaces[tgtFacei], pointOffset[proci]);
808 forAll(allNbrProcIDs, proci)
810 const labelList& nbrProci = allNbrProcIDs[proci];
811 const labelList& localFacei = allProcLocalFaceIDs[proci];
812 const labelList& faceOs = allFaceOwners[proci];
813 const labelList& faceNs = allFaceNeighbours[proci];
814 const faceList& fcs = allFaces[proci];
819 if (nbrProci[i] != -1 && localFacei[i] != -1)
822 key[0] =
min(proci, nbrProci[i]);
823 key[1] =
max(proci, nbrProci[i]);
824 key[2] = localFacei[i];
826 label tgtFacei = procFaceToGlobalCell[key];
831 <<
"Unvisited " << key
834 else if (tgtFacei != -2)
836 label newOwn = cellOffset[proci] + faceOs[i];
837 label tgtFacei = nIntFaces++;
841 Pout<<
" proc " << proci
842 <<
"\tinserting boundary face:" << tgtFacei
843 <<
" from coupled face " << key
847 tgtFaces[tgtFacei] = fcs[i];
848 add(tgtFaces[tgtFacei], pointOffset[proci]);
850 tgtFaceOwners[tgtFacei] = newOwn;
851 tgtFaceNeighbours[tgtFacei] = -1;
857 label own = faceOs[i];
858 label nbr = faceNs[i];
859 if ((own != -1) && (nbr == -1))
861 label newOwn = cellOffset[proci] + faceOs[i];
862 label tgtFacei = nIntFaces++;
864 tgtFaces[tgtFacei] = fcs[i];
865 add(tgtFaces[tgtFacei], pointOffset[proci]);
867 tgtFaceOwners[tgtFacei] = newOwn;
868 tgtFaceNeighbours[tgtFacei] = -1;
894 Pout<<
"Merged from " << tgtPoints.size()
895 <<
" down to " << newTgtPoints.size() <<
" points" <<
endl;
898 tgtPoints.transfer(newTgtPoints);