36 template<
class Container,
class ProcPatch>
45 label nNeighbours = 0;
49 boolList isNeighbourProc(nProcs,
false);
53 const typename Container::const_reference
patch =
patches[patchi];
55 if (isA<ProcPatch>(
patch))
57 const ProcPatch& procPatch =
58 refCast<const ProcPatch>(
patch);
60 label pNeighbProcNo = procPatch.neighbProcNo();
62 if (!isNeighbourProc[pNeighbProcNo])
66 maxNb =
max(maxNb, procPatch.neighbProcNo());
68 isNeighbourProc[pNeighbProcNo] =
true;
77 forAll(isNeighbourProc, proci)
79 if (isNeighbourProc[proci])
81 neighbours[nNeighbours++] = proci;
85 procPatchMap_.setSize(maxNb + 1);
90 const typename Container::const_reference
patch =
patches[patchi];
92 if (isA<ProcPatch>(
patch))
94 const ProcPatch& procPatch =
95 refCast<const ProcPatch>(
patch);
98 procPatchMap_[procPatch.neighbProcNo()] = patchi;
108 template<
class Container,
class ProcPatch>
116 patchSchedule_(2*
patches.size())
118 if (Pstream::parRun())
121 operator[](Pstream::myProcNo(comm)) =
122 procNeighbours(this->size(),
patches);
125 Pstream::gatherList(*
this, Pstream::msgType(), comm);
126 Pstream::scatterList(*
this, Pstream::msgType(), comm);
132 && Pstream::defaultCommsType == Pstream::commsTypes::scheduled
135 label patchEvali = 0;
142 if (!isA<ProcPatch>(
patches[patchi]))
144 patchSchedule_[patchEvali].patch = patchi;
145 patchSchedule_[patchEvali++].init =
true;
146 patchSchedule_[patchEvali].patch = patchi;
147 patchSchedule_[patchEvali++].init =
false;
160 nComms += operator[](proci).size();
166 const labelList& nbrs = operator[](proci);
183 Pstream::nProcs(comm),
185 ).procSchedule()[Pstream::myProcNo(comm)]
190 label commI = mySchedule[iter];
193 label nb = comms[commI][0];
194 if (nb == Pstream::myProcNo(comm))
196 nb = comms[commI][1];
198 label patchi = procPatchMap_[nb];
200 if (Pstream::myProcNo(comm) > nb)
202 patchSchedule_[patchEvali].patch = patchi;
203 patchSchedule_[patchEvali++].init =
true;
204 patchSchedule_[patchEvali].patch = patchi;
205 patchSchedule_[patchEvali++].init =
false;
209 patchSchedule_[patchEvali].patch = patchi;
210 patchSchedule_[patchEvali++].init =
false;
211 patchSchedule_[patchEvali].patch = patchi;
212 patchSchedule_[patchEvali++].init =
true;
218 patchSchedule_ = nonBlockingSchedule(
patches);
225 template<
class Container,
class ProcPatch>
234 label patchEvali = 0;
246 if (!isA<ProcPatch>(
patches[patchi]))
248 patchSchedule[patchEvali].patch = patchi;
249 patchSchedule[patchEvali++].init =
true;
250 patchSchedule[patchEvali].patch = patchi;
251 patchSchedule[patchEvali++].init =
false;
261 if (isA<ProcPatch>(
patches[patchi]))
263 patchSchedule[patchEvali].patch = patchi;
264 patchSchedule[patchEvali++].init =
true;
271 if (isA<ProcPatch>(
patches[patchi]))
273 patchSchedule[patchEvali].patch = patchi;
274 patchSchedule[patchEvali++].init =
false;
278 return patchSchedule;