41 Foam::label Foam::meshToMesh::calcDistribution
52 if ((src.nCells() > 0) || (tgt.nCells() > 0))
64 label nHaveCells =
sum(cellsPresentOnProc);
71 <<
"Meshes split across multiple processors" <<
endl;
73 else if (nHaveCells == 1)
75 proci = cellsPresentOnProc.find(1);
78 <<
"Meshes local to processor" << proci <<
endl;
86 Foam::label Foam::meshToMesh::calcOverlappingProcs
88 const List<treeBoundBoxList>& procBb,
101 for (
const treeBoundBox&
b : bbp)
105 overlaps[proci] =
true;
122 switch (procMapMethod_)
124 case procMapMethod::pmLOD:
126 Info<<
"meshToMesh: Using processorLOD method" <<
endl;
131 const label nGlobalSrcCells = src.globalData().nTotalCells();
132 const label cellsPerBox =
max(1, 0.001*nGlobalSrcCells);
133 typename processorLODs::cellBox boxLOD
150 Info<<
"meshToMesh: Using AABBTree method" <<
endl;
155 if (src.nCells() > 0)
177 <<
"Determining extent of src mesh per processor:" <<
nl
178 <<
"\tproc\tbb" <<
endl;
181 Info<<
'\t' << proci <<
'\t' << procBb[proci] <<
endl;
188 const faceList& faces = tgt.faces();
200 dynSendMap[proci].setCapacity(iniSize);
208 const cell&
c =
cells[celli];
214 const face&
f = faces[
c[facei]];
222 (void)calcOverlappingProcs(procBb, cellBb, procBbOverlaps);
224 forAll(procBbOverlaps, proci)
226 if (procBbOverlaps[proci])
228 dynSendMap[proci].append(celli);
237 sendMap[proci].transfer(dynSendMap[proci]);
245 <<
" target cells I need to send to:" <<
nl
246 <<
"\tproc\tcells" <<
endl;
249 Pout<<
'\t' << proci <<
'\t' << sendMap[proci].size()
271 forAll(constructMap, proci)
276 constructMap[proci].setSize(nRecv);
278 for (label i = 0; i < nRecv; i++)
280 constructMap[proci][i] = segmentI++;
288 std::move(constructMap)
297 void Foam::meshToMesh::distributeCells
299 const mapDistribute& map,
300 const polyMesh& tgtMesh,
301 const globalIndex& globalI,
303 List<label>& nInternalFaces,
304 List<faceList>& faces,
305 List<labelList>& faceOwner,
306 List<labelList>& faceNeighbour,
307 List<labelList>& cellIDs,
308 List<labelList>& nbrProcIDs,
309 List<labelList>& procLocalFaceIDs
327 const labelList& sendElems = map.subMap()[domain];
329 if (sendElems.size())
332 labelList reverseCellMap(tgtMesh.nCells(), -1);
333 forAll(sendElems, subCelli)
335 reverseCellMap[sendElems[subCelli]] = subCelli;
338 DynamicList<face> subFaces(tgtMesh.nFaces());
339 DynamicList<label> subFaceOwner(tgtMesh.nFaces());
340 DynamicList<label> subFaceNeighbour(tgtMesh.nFaces());
342 DynamicList<label> subNbrProcIDs(tgtMesh.nFaces());
343 DynamicList<label> subProcLocalFaceIDs(tgtMesh.nFaces());
348 forAll(tgtMesh.faceNeighbour(), facei)
350 label own = tgtMesh.faceOwner()[facei];
351 label nbr = tgtMesh.faceNeighbour()[facei];
352 label subOwn = reverseCellMap[own];
353 label subNbr = reverseCellMap[nbr];
355 if (subOwn != -1 && subNbr != -1)
361 subFaces.append(tgtMesh.faces()[facei]);
362 subFaceOwner.append(subOwn);
363 subFaceNeighbour.append(subNbr);
364 subNbrProcIDs.append(-1);
365 subProcLocalFaceIDs.append(-1);
369 subFaces.append(tgtMesh.faces()[facei].reverseFace());
370 subFaceOwner.append(subNbr);
371 subFaceNeighbour.append(subOwn);
372 subNbrProcIDs.append(-1);
373 subProcLocalFaceIDs.append(-1);
379 forAll(tgtMesh.faceNeighbour(), facei)
381 label own = tgtMesh.faceOwner()[facei];
382 label nbr = tgtMesh.faceNeighbour()[facei];
383 label subOwn = reverseCellMap[own];
384 label subNbr = reverseCellMap[nbr];
386 if (subOwn != -1 && subNbr == -1)
388 subFaces.append(tgtMesh.faces()[facei]);
389 subFaceOwner.append(subOwn);
390 subFaceNeighbour.append(subNbr);
391 subNbrProcIDs.append(-1);
392 subProcLocalFaceIDs.append(-1);
394 else if (subOwn == -1 && subNbr != -1)
396 subFaces.append(tgtMesh.faces()[facei].reverseFace());
397 subFaceOwner.append(subNbr);
398 subFaceNeighbour.append(subOwn);
399 subNbrProcIDs.append(-1);
400 subProcLocalFaceIDs.append(-1);
405 forAll(tgtMesh.boundaryMesh(), patchi)
407 const polyPatch& pp = tgtMesh.boundaryMesh()[patchi];
412 if (isA<processorPolyPatch>(pp))
414 const processorPolyPatch& ppp =
415 dynamic_cast<const processorPolyPatch&
>(pp);
417 nbrProci = ppp.neighbProcNo();
422 label facei = pp.start() + i;
423 label own = tgtMesh.faceOwner()[facei];
425 if (reverseCellMap[own] != -1)
427 subFaces.append(tgtMesh.faces()[facei]);
428 subFaceOwner.append(reverseCellMap[own]);
429 subFaceNeighbour.append(-1);
430 subNbrProcIDs.append(nbrProci);
431 subProcLocalFaceIDs.append(i);
437 labelList reversePointMap(tgtMesh.nPoints(), -1);
438 DynamicList<point> subPoints(tgtMesh.nPoints());
439 forAll(subFaces, subFacei)
441 face&
f = subFaces[subFacei];
444 label pointi =
f[fp];
445 if (reversePointMap[pointi] == -1)
447 reversePointMap[pointi] = subPoints.size();
448 subPoints.
append(tgtMesh.points()[pointi]);
451 f[fp] = reversePointMap[pointi];
456 labelList globalElems(globalI.toGlobal(sendElems));
463 <<
" sending tgt cell " << sendElems[i]
464 <<
"[" << globalElems[i] <<
"]"
465 <<
" to srcProc " << domain <<
endl;
485 UOPstream toDomain(domain, pBufs);
495 << subProcLocalFaceIDs;
501 pBufs.finishedSends();
506 const labelList& recvElems = map.constructMap()[domain];
510 UIPstream str(domain, pBufs);
513 >> nInternalFaces[domain]
516 >> faceNeighbour[domain]
518 >> nbrProcIDs[domain]
519 >> procLocalFaceIDs[domain];
524 Pout<<
"Target mesh send sizes[" << domain <<
"]"
525 <<
": points="<<
points[domain].size()
526 <<
", faces=" << faces[domain].size()
527 <<
", nInternalFaces=" << nInternalFaces[domain]
528 <<
", faceOwn=" << faceOwner[domain].size()
529 <<
", faceNbr=" << faceNeighbour[domain].size()
530 <<
", cellIDs=" << cellIDs[domain].size() <<
endl;
536 void Foam::meshToMesh::distributeAndMergeCells
538 const mapDistribute& map,
540 const globalIndex& globalI,
550 List<label> allNInternalFaces;
551 List<faceList> allFaces;
552 List<labelList> allFaceOwners;
553 List<labelList> allFaceNeighbours;
554 List<labelList> allTgtCellIDs;
558 List<labelList> allNbrProcIDs;
559 List<labelList> allProcLocalFaceIDs;
598 labelList allNIntCoupledFaces(allNInternalFaces);
612 forAll(allTgtCellIDs, proci)
614 cellOffset[proci] = nCells;
615 nCells += allTgtCellIDs[proci].size();
619 typedef FixedList<label, 3> label3;
620 typedef HashTable<label, label3, label3::Hash<>> procCoupleInfo;
621 procCoupleInfo procFaceToGlobalCell;
623 forAll(allNbrProcIDs, proci)
625 const labelList& nbrProci = allNbrProcIDs[proci];
626 const labelList& localFacei = allProcLocalFaceIDs[proci];
630 if (nbrProci[i] != -1 && localFacei[i] != -1)
633 key[0] =
min(proci, nbrProci[i]);
634 key[1] =
max(proci, nbrProci[i]);
635 key[2] = localFacei[i];
637 const auto fnd = procFaceToGlobalCell.cfind(key);
641 procFaceToGlobalCell.insert(key, -1);
647 Pout<<
"Additional internal face between procs:"
648 << key[0] <<
" and " << key[1]
649 <<
" across local face " << key[2] <<
endl;
652 allNIntCoupledFaces[proci]++;
661 label nFacesTotal = 0;
663 forAll(allNIntCoupledFaces, proci)
665 label nCoupledFaces =
666 allNIntCoupledFaces[proci] - allNInternalFaces[proci];
668 internalFaceOffset[proci] = nIntFaces;
669 nIntFaces += allNIntCoupledFaces[proci];
670 nFacesTotal += allFaceOwners[proci].size() - nCoupledFaces;
674 tgtFaces.setSize(nFacesTotal);
675 tgtFaceOwners.setSize(nFacesTotal);
676 tgtFaceNeighbours.setSize(nFacesTotal);
677 tgtCellIDs.setSize(nCells);
683 SubList<point>(tgtPoints, pts.size(), pointOffset[proci]) = pts;
687 forAll(allTgtCellIDs, proci)
689 const labelList& cellIDs = allTgtCellIDs[proci];
690 SubList<label>(tgtCellIDs, cellIDs.size(), cellOffset[proci]) = cellIDs;
697 const faceList& fcs = allFaces[proci];
698 const labelList& faceOs = allFaceOwners[proci];
699 const labelList& faceNs = allFaceNeighbours[proci];
704 allNInternalFaces[proci],
705 internalFaceOffset[proci]
707 slice = SubList<face>(fcs, allNInternalFaces[proci]);
710 add(slice[i], pointOffset[proci]);
713 SubField<label> ownSlice
716 allNInternalFaces[proci],
717 internalFaceOffset[proci]
719 ownSlice = SubField<label>(faceOs, allNInternalFaces[proci]);
720 add(ownSlice, cellOffset[proci]);
722 SubField<label> nbrSlice
725 allNInternalFaces[proci],
726 internalFaceOffset[proci]
728 nbrSlice = SubField<label>(faceNs, allNInternalFaces[proci]);
729 add(nbrSlice, cellOffset[proci]);
731 internalFaceOffset[proci] += allNInternalFaces[proci];
736 forAll(allNbrProcIDs, proci)
738 const labelList& nbrProci = allNbrProcIDs[proci];
739 const labelList& localFacei = allProcLocalFaceIDs[proci];
740 const labelList& faceOs = allFaceOwners[proci];
741 const faceList& fcs = allFaces[proci];
745 if (nbrProci[i] != -1 && localFacei[i] != -1)
748 key[0] =
min(proci, nbrProci[i]);
749 key[1] =
max(proci, nbrProci[i]);
750 key[2] = localFacei[i];
752 auto fnd = procFaceToGlobalCell.find(key);
756 label tgtFacei = fnd();
760 fnd() = cellOffset[proci] + faceOs[i];
765 label newOwn = cellOffset[proci] + faceOs[i];
766 label newNbr = fnd();
767 label tgtFacei = internalFaceOffset[proci]++;
771 Pout<<
" proc " << proci
772 <<
"\tinserting face:" << tgtFacei
773 <<
" connection between owner " << newOwn
774 <<
" and neighbour " << newNbr
781 tgtFaces[tgtFacei] = fcs[i];
782 tgtFaceOwners[tgtFacei] = newOwn;
783 tgtFaceNeighbours[tgtFacei] = newNbr;
788 tgtFaces[tgtFacei] = fcs[i].reverseFace();
789 tgtFaceOwners[tgtFacei] = newNbr;
790 tgtFaceNeighbours[tgtFacei] = newOwn;
793 add(tgtFaces[tgtFacei], pointOffset[proci]);
804 forAll(allNbrProcIDs, proci)
806 const labelList& nbrProci = allNbrProcIDs[proci];
807 const labelList& localFacei = allProcLocalFaceIDs[proci];
808 const labelList& faceOs = allFaceOwners[proci];
809 const labelList& faceNs = allFaceNeighbours[proci];
810 const faceList& fcs = allFaces[proci];
815 if (nbrProci[i] != -1 && localFacei[i] != -1)
818 key[0] =
min(proci, nbrProci[i]);
819 key[1] =
max(proci, nbrProci[i]);
820 key[2] = localFacei[i];
822 label tgtFacei = procFaceToGlobalCell[key];
827 <<
"Unvisited " << key
830 else if (tgtFacei != -2)
832 label newOwn = cellOffset[proci] + faceOs[i];
833 label tgtFacei = nIntFaces++;
837 Pout<<
" proc " << proci
838 <<
"\tinserting boundary face:" << tgtFacei
839 <<
" from coupled face " << key
843 tgtFaces[tgtFacei] = fcs[i];
844 add(tgtFaces[tgtFacei], pointOffset[proci]);
846 tgtFaceOwners[tgtFacei] = newOwn;
847 tgtFaceNeighbours[tgtFacei] = -1;
853 label own = faceOs[i];
854 label nbr = faceNs[i];
855 if ((own != -1) && (nbr == -1))
857 label newOwn = cellOffset[proci] + faceOs[i];
858 label tgtFacei = nIntFaces++;
860 tgtFaces[tgtFacei] = fcs[i];
861 add(tgtFaces[tgtFacei], pointOffset[proci]);
863 tgtFaceOwners[tgtFacei] = newOwn;
864 tgtFaceNeighbours[tgtFacei] = -1;
888 Pout<<
"Merged from " << tgtPoints.size()
889 <<
" down to " << newTgtPoints.size() <<
" points" <<
endl;
891 tgtPoints.transfer(newTgtPoints);