35 template<
class SourcePatch,
class TargetPatch>
38 const SourcePatch& srcPatch,
39 const TargetPatch& tgtPatch
44 if (Pstream::parRun())
47 if ((srcPatch.size() > 0) || (tgtPatch.size() > 0))
49 facesPresentOnProc[Pstream::myProcNo()] = 1;
53 facesPresentOnProc[Pstream::myProcNo()] = 0;
56 Pstream::gatherList(facesPresentOnProc);
57 Pstream::scatterList(facesPresentOnProc);
59 label nHaveFaces =
sum(facesPresentOnProc);
67 <<
"AMI split across multiple processors" <<
endl;
70 else if (nHaveFaces == 1)
72 proci = facesPresentOnProc.find(1);
76 <<
"AMI local to processor" << proci <<
endl;
87 template<
class SourcePatch,
class TargetPatch>
91 const List<treeBoundBoxList>& procBb,
92 const treeBoundBox& bb,
96 overlaps.setSize(procBb.size());
105 for (
const treeBoundBox& tbb: bbp)
107 if (tbb.overlaps(bb))
109 overlaps[proci] =
true;
120 template<
class SourcePatch,
class TargetPatch>
123 const mapDistribute& map,
124 const TargetPatch& pp,
125 const globalIndex& gi,
126 List<faceList>& faces,
128 List<labelList>& faceIDs
131 PstreamBuffers pBufs(Pstream::commsTypes::nonBlocking);
133 for (
label domain = 0; domain < Pstream::nProcs(); ++domain)
135 const labelList& sendElems = map.subMap()[domain];
137 if (domain != Pstream::myProcNo() && sendElems.size())
139 faceList subFaces(UIndirectList<face>(pp, sendElems));
142 SubList<face>(subFaces, subFaces.size()),
148 Pout<<
"distributePatches: to processor " << domain
149 <<
" sending faces " << subPatch.faceCentres() <<
endl;
152 UOPstream toDomain(domain, pBufs);
154 << subPatch.localFaces() << subPatch.localPoints()
155 << gi.toGlobal(sendElems);
160 pBufs.finishedSends();
162 faces.setSize(Pstream::nProcs());
163 points.setSize(Pstream::nProcs());
164 faceIDs.setSize(Pstream::nProcs());
168 const labelList& sendElems = map.subMap()[Pstream::myProcNo()];
169 faceList subFaces(UIndirectList<face>(pp, sendElems));
172 SubList<face>(subFaces, subFaces.size()),
179 Pout<<
"distributePatches: to processor " << Pstream::myProcNo()
180 <<
" sending faces " << subPatch.faceCentres() <<
endl;
183 faces[Pstream::myProcNo()] = subPatch.localFaces();
184 points[Pstream::myProcNo()] = subPatch.localPoints();
185 faceIDs[Pstream::myProcNo()] = gi.toGlobal(sendElems);
189 for (
label domain = 0; domain < Pstream::nProcs(); ++domain)
191 const labelList& recvElems = map.constructMap()[domain];
193 if (domain != Pstream::myProcNo() && recvElems.size())
195 UIPstream str(domain, pBufs);
205 template<
class SourcePatch,
class TargetPatch>
209 const mapDistribute& map,
210 const TargetPatch& tgtPatch,
211 const globalIndex& gi,
218 List<faceList> allFaces;
220 List<labelList> allTgtFaceIDs;
221 distributePatches(map, tgtPatch, gi, allFaces,
allPoints, allTgtFaceIDs);
228 nFaces += allFaces[proci].size();
232 tgtFaces.setSize(nFaces);
234 tgtFaceIDs.setSize(nFaces);
241 const labelList& faceIDs = allTgtFaceIDs[Pstream::myProcNo()];
242 SubList<label>(tgtFaceIDs, faceIDs.size()) = faceIDs;
244 const faceList& fcs = allFaces[Pstream::myProcNo()];
245 for (
const face&
f : fcs)
247 face& newF = tgtFaces[nFaces++];
256 for (
const point& pt: pts)
266 if (proci != Pstream::myProcNo())
268 const labelList& faceIDs = allTgtFaceIDs[proci];
269 SubList<label>(tgtFaceIDs, faceIDs.size(), nFaces) = faceIDs;
271 const faceList& fcs = allFaces[proci];
272 for (
const face&
f : fcs)
274 face& newF = tgtFaces[nFaces++];
283 for (
const point& pt: pts)
306 Pout<<
"Merged from " << tgtPoints.size()
307 <<
" down to " << newTgtPoints.size() <<
" points" <<
endl;
310 tgtPoints.transfer(newTgtPoints);
311 for (face&
f : tgtFaces)
319 template<
class SourcePatch,
class TargetPatch>
323 const SourcePatch& srcPatch,
324 const TargetPatch& tgtPatch
328 List<treeBoundBoxList> procBb(Pstream::nProcs());
332 procBb[Pstream::myProcNo()] =
335 srcPatch.localFaces(),
336 srcPatch.localPoints(),
345 Pstream::gatherList(procBb);
346 Pstream::scatterList(procBb);
350 Info<<
"Determining extent of srcPatch per processor:" <<
nl
351 <<
"\tproc\tbb" <<
endl;
354 Info<<
'\t' << proci <<
'\t' << procBb[proci] <<
endl;
359 const faceList& faces = tgtPatch.localFaces();
366 List<DynamicList<label>> dynSendMap(Pstream::nProcs());
369 boolList procBbOverlaps(Pstream::nProcs());
373 if (faces[facei].size())
375 treeBoundBox faceBb(
points, faces[facei]);
378 calcOverlappingProcs(procBb, faceBb, procBbOverlaps);
380 forAll(procBbOverlaps, proci)
382 if (procBbOverlaps[proci])
384 dynSendMap[proci].append(facei);
391 sendMap.setSize(Pstream::nProcs());
394 sendMap[proci].transfer(dynSendMap[proci]);
401 Pout<<
"Of my " << faces.size() <<
" I need to send to:" <<
nl
402 <<
"\tproc\tfaces" <<
endl;
405 Pout<<
'\t' << proci <<
'\t' << sendMap[proci].size() <<
endl;
412 sendSizes[Pstream::myProcNo()].setSize(Pstream::nProcs());
415 sendSizes[Pstream::myProcNo()][proci] = sendMap[proci].size();
417 Pstream::gatherList(sendSizes);
418 Pstream::scatterList(sendSizes);
425 constructMap[Pstream::myProcNo()] =
identity
427 sendMap[Pstream::myProcNo()].size()
430 label segmentI = constructMap[Pstream::myProcNo()].size();
431 forAll(constructMap, proci)
433 if (proci != Pstream::myProcNo())
436 label nRecv = sendSizes[proci][Pstream::myProcNo()];
437 constructMap[proci].setSize(nRecv);
439 for (
label i = 0; i < nRecv; ++i)
441 constructMap[proci][i] = segmentI++;
450 std::move(constructMap)