36 const label constructSize,
42 if (commsType == Pstream::blocking)
48 for (label domain = 0; domain < Pstream::nProcs(); domain++)
52 if (domain != Pstream::myProcNo() && map.
size())
54 OPstream toNbr(Pstream::blocking, domain);
55 toNbr << UIndirectList<T>(field, map);
60 const labelList& mySubMap = subMap[Pstream::myProcNo()];
65 subField[i] = field[mySubMap[i]];
69 const labelList& map = constructMap[Pstream::myProcNo()];
75 field[map[i]] = subField[i];
79 for (label domain = 0; domain < Pstream::nProcs(); domain++)
81 const labelList& map = constructMap[domain];
83 if (domain != Pstream::myProcNo() && map.
size())
85 IPstream fromNbr(Pstream::blocking, domain);
93 "void mapDistribute::distribute\n"
95 " const Pstream::commsTypes commsType,\n"
96 " const List<labelPair>& schedule,\n"
97 " const label constructSize,\n"
98 " const labelListList& subMap,\n"
99 " const labelListList& constructMap,\n"
102 ) <<
"Expected from processor " << domain
103 <<
" " << map.
size() <<
" but received "
104 << subField.
size() <<
" elements."
110 field[map[i]] = subField[i];
115 else if (commsType == Pstream::scheduled)
120 List<T> newField(constructSize);
126 const labelList& map = constructMap[Pstream::myProcNo()];
130 newField[map[i]] = subField[i];
137 label sendProc = twoProcs[0];
138 label recvProc = twoProcs[1];
140 if (Pstream::myProcNo() == sendProc)
143 OPstream toNbr(Pstream::scheduled, recvProc);
144 toNbr << UIndirectList<T>(field, subMap[recvProc]);
149 IPstream fromNbr(Pstream::scheduled, sendProc);
152 const labelList& map = constructMap[sendProc];
158 "template<class T>\n"
159 "void mapDistribute::distribute\n"
161 " const Pstream::commsTypes commsType,\n"
162 " const List<labelPair>& schedule,\n"
163 " const label constructSize,\n"
164 " const labelListList& subMap,\n"
165 " const labelListList& constructMap,\n"
168 ) <<
"Expected from processor " << sendProc
169 <<
" " << map.
size() <<
" but received "
170 << subField.
size() <<
" elements."
176 newField[map[i]] = subField[i];
182 else if (commsType == Pstream::nonBlocking)
184 if (!contiguous<T>())
188 "template<class T>\n"
189 "void mapDistribute::distribute\n"
191 " const Pstream::commsTypes commsType,\n"
192 " const List<labelPair>& schedule,\n"
193 " const label constructSize,\n"
194 " const labelListList& subMap,\n"
195 " const labelListList& constructMap,\n"
198 ) <<
"Non-blocking only supported for contiguous data."
206 for (label domain = 0; domain < Pstream::nProcs(); domain++)
210 if (domain != Pstream::myProcNo() && map.
size())
212 List<T>& subField = sendFields[domain];
216 subField[i] = field[map[i]];
221 Pstream::nonBlocking,
223 reinterpret_cast<const char*>(subField.
begin()),
224 subField.
size()*
sizeof(
T)
233 for (label domain = 0; domain < Pstream::nProcs(); domain++)
235 const labelList& map = constructMap[domain];
237 if (domain != Pstream::myProcNo() && map.
size())
242 Pstream::nonBlocking,
244 reinterpret_cast<char*>(recvFields[domain].begin()),
245 recvFields[domain].size()*
sizeof(
T)
254 const labelList& map = subMap[Pstream::myProcNo()];
256 List<T>& subField = sendFields[Pstream::myProcNo()];
260 subField[i] = field[map[i]];
272 const labelList& map = constructMap[Pstream::myProcNo()];
273 const List<T>& subField = sendFields[Pstream::myProcNo()];
277 field[map[i]] = subField[i];
284 OPstream::waitRequests();
285 IPstream::waitRequests();
289 for (label domain = 0; domain < Pstream::nProcs(); domain++)
291 const labelList& map = constructMap[domain];
293 if (domain != Pstream::myProcNo() && map.
size())
295 if (recvFields[domain].size() != map.
size())
299 "template<class T>\n"
300 "void mapDistribute::distribute\n"
302 " const Pstream::commsTypes commsType,\n"
303 " const List<labelPair>& schedule,\n"
304 " const label constructSize,\n"
305 " const labelListList& subMap,\n"
306 " const labelListList& constructMap,\n"
309 ) <<
"Expected from processor " << domain
310 <<
" " << map.
size() <<
" but received "
311 << recvFields[domain].
size() <<
" elements."
317 field[map[i]] = recvFields[domain][i];
325 <<
"Unknown communication schedule " << commsType
332 template<
class T,
class CombineOp>
337 const label constructSize,
341 const CombineOp& cop,
345 if (commsType == Pstream::blocking)
351 for (label domain = 0; domain < Pstream::nProcs(); domain++)
355 if (domain != Pstream::myProcNo() && map.
size())
357 OPstream toNbr(Pstream::blocking, domain);
358 toNbr << UIndirectList<T>(field, map);
363 const labelList& mySubMap = subMap[Pstream::myProcNo()];
368 subField[i] = field[mySubMap[i]];
372 const labelList& map = constructMap[Pstream::myProcNo()];
379 cop(field[map[i]], subField[i]);
383 for (label domain = 0; domain < Pstream::nProcs(); domain++)
385 const labelList& map = constructMap[domain];
387 if (domain != Pstream::myProcNo() && map.
size())
389 IPstream fromNbr(Pstream::blocking, domain);
396 "template<class T>\n"
397 "void mapDistribute::distribute\n"
399 " const Pstream::commsTypes commsType,\n"
400 " const List<labelPair>& schedule,\n"
401 " const label constructSize,\n"
402 " const labelListList& subMap,\n"
403 " const labelListList& constructMap,\n"
406 ) <<
"Expected from processor " << domain
407 <<
" " << map.
size() <<
" but received "
408 << subField.
size() <<
" elements."
414 cop(field[map[i]], subField[i]);
419 else if (commsType == Pstream::scheduled)
424 List<T> newField(constructSize, nullValue);
430 const labelList& map = constructMap[Pstream::myProcNo()];
434 cop(newField[map[i]], subField[i]);
441 label sendProc = twoProcs[0];
442 label recvProc = twoProcs[1];
444 if (Pstream::myProcNo() == sendProc)
447 OPstream toNbr(Pstream::scheduled, recvProc);
448 toNbr << UIndirectList<T>(field, subMap[recvProc]);
453 IPstream fromNbr(Pstream::scheduled, sendProc);
456 const labelList& map = constructMap[sendProc];
462 "template<class T>\n"
463 "void mapDistribute::distribute\n"
465 " const Pstream::commsTypes commsType,\n"
466 " const List<labelPair>& schedule,\n"
467 " const label constructSize,\n"
468 " const labelListList& subMap,\n"
469 " const labelListList& constructMap,\n"
472 ) <<
"Expected from processor " << sendProc
473 <<
" " << map.
size() <<
" but received "
474 << subField.
size() <<
" elements."
480 cop(newField[map[i]], subField[i]);
486 else if (commsType == Pstream::nonBlocking)
488 if (!contiguous<T>())
492 "template<class T>\n"
493 "void mapDistribute::distribute\n"
495 " const Pstream::commsTypes commsType,\n"
496 " const List<labelPair>& schedule,\n"
497 " const label constructSize,\n"
498 " const labelListList& subMap,\n"
499 " const labelListList& constructMap,\n"
502 ) <<
"Non-blocking only supported for contiguous data."
510 for (label domain = 0; domain < Pstream::nProcs(); domain++)
514 if (domain != Pstream::myProcNo() && map.
size())
516 List<T>& subField = sendFields[domain];
520 subField[i] = field[map[i]];
525 Pstream::nonBlocking,
527 reinterpret_cast<const char*>(subField.
begin()),
528 subField.
size()*
sizeof(
T)
537 for (label domain = 0; domain < Pstream::nProcs(); domain++)
539 const labelList& map = constructMap[domain];
541 if (domain != Pstream::myProcNo() && map.
size())
546 Pstream::nonBlocking,
548 reinterpret_cast<char*>(recvFields[domain].begin()),
549 recvFields[domain].size()*
sizeof(
T)
557 const labelList& map = subMap[Pstream::myProcNo()];
559 List<T>& subField = sendFields[Pstream::myProcNo()];
563 subField[i] = field[map[i]];
575 const labelList& map = constructMap[Pstream::myProcNo()];
576 const List<T>& subField = sendFields[Pstream::myProcNo()];
580 cop(field[map[i]], subField[i]);
587 OPstream::waitRequests();
588 IPstream::waitRequests();
592 for (label domain = 0; domain < Pstream::nProcs(); domain++)
594 const labelList& map = constructMap[domain];
596 if (domain != Pstream::myProcNo() && map.
size())
598 if (recvFields[domain].size() != map.
size())
602 "template<class T>\n"
603 "void mapDistribute::distribute\n"
605 " const Pstream::commsTypes commsType,\n"
606 " const List<labelPair>& schedule,\n"
607 " const label constructSize,\n"
608 " const labelListList& subMap,\n"
609 " const labelListList& constructMap,\n"
612 ) <<
"Expected from processor " << domain
613 <<
" " << map.
size() <<
" but received "
614 << recvFields[domain].
size() <<
" elements."
620 cop(field[map[i]], recvFields[domain][i]);
628 <<
"Unknown communication schedule " << commsType