33 template<
class T,
class CombineOp,
class negateOp>
40 const negateOp& negOp,
50 label index = map[i]-1;
51 cop(lhs[index], rhs[i]);
55 label index = -map[i]-1;
56 cop(lhs[index], negOp(rhs[i]));
61 <<
"At index " << i <<
" out of " << map.
size()
62 <<
" have illegal index " << map[i]
63 <<
" for field " << rhs.
size() <<
" with flipMap"
72 cop(lhs[map[i]], rhs[i]);
78 template<
class T,
class negateOp>
96 t = negOp(
fld[-index-1]);
101 <<
"Illegal index " << index
102 <<
" into field of size " <<
fld.size()
103 <<
" with face-flipping"
117 template<
class T,
class negateOp>
122 const label constructSize,
124 const bool subHasFlip,
126 const bool constructHasFlip,
128 const negateOp& negOp,
132 if (!Pstream::parRun())
136 const labelList& mySubMap = subMap[Pstream::myProcNo()];
141 subField[i] = accessAndFlip(field, mySubMap[i], subHasFlip, negOp);
145 const labelList& map = constructMap[Pstream::myProcNo()];
162 if (commsType == Pstream::blocking)
168 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
172 if (domain != Pstream::myProcNo() && map.
size())
174 OPstream toNbr(Pstream::blocking, domain, 0, tag);
179 subField[i] = accessAndFlip
192 const labelList& mySubMap = subMap[Pstream::myProcNo()];
197 subField[i] = accessAndFlip(field, mySubMap[i], subHasFlip, negOp);
201 const labelList& map = constructMap[Pstream::myProcNo()];
216 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
218 const labelList& map = constructMap[domain];
220 if (domain != Pstream::myProcNo() && map.
size())
222 IPstream fromNbr(Pstream::blocking, domain, 0, tag);
225 checkReceivedSize(domain, map.
size(), subField.
size());
239 else if (commsType == Pstream::scheduled)
244 List<T> newField(constructSize);
248 const labelList& mySubMap = subMap[Pstream::myProcNo()];
253 subField[i] = accessAndFlip
265 constructMap[Pstream::myProcNo()],
281 label sendProc = twoProcs[0];
282 label recvProc = twoProcs[1];
284 if (Pstream::myProcNo() == sendProc)
288 OPstream toNbr(Pstream::scheduled, recvProc, 0, tag);
294 subField[i] = accessAndFlip
305 IPstream fromNbr(Pstream::scheduled, recvProc, 0, tag);
308 const labelList& map = constructMap[recvProc];
310 checkReceivedSize(recvProc, map.
size(), subField.
size());
327 IPstream fromNbr(Pstream::scheduled, sendProc, 0, tag);
330 const labelList& map = constructMap[sendProc];
332 checkReceivedSize(sendProc, map.
size(), subField.
size());
345 OPstream toNbr(Pstream::scheduled, sendProc, 0, tag);
351 subField[i] = accessAndFlip
365 else if (commsType == Pstream::nonBlocking)
367 label nOutstanding = Pstream::nRequests();
369 if (!contiguous<T>())
374 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
378 if (domain != Pstream::myProcNo() && map.
size())
386 subField[i] = accessAndFlip
394 toDomain << subField;
403 const labelList& mySub = subMap[Pstream::myProcNo()];
407 mySubField[i] = accessAndFlip
419 const labelList& map = constructMap[Pstream::myProcNo()];
434 Pstream::waitRequests(nOutstanding);
437 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
439 const labelList& map = constructMap[domain];
441 if (domain != Pstream::myProcNo() && map.
size())
446 checkReceivedSize(domain, map.
size(), recvField.
size());
466 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
470 if (domain != Pstream::myProcNo() && map.
size())
472 List<T>& subField = sendFields[domain];
476 subField[i] = accessAndFlip
487 Pstream::nonBlocking,
489 reinterpret_cast<const char*
>(subField.begin()),
500 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
502 const labelList& map = constructMap[domain];
504 if (domain != Pstream::myProcNo() && map.
size())
509 Pstream::nonBlocking,
511 reinterpret_cast<char*
>(recvFields[domain].begin()),
512 recvFields[domain].byteSize(),
522 const labelList& map = subMap[Pstream::myProcNo()];
524 List<T>& subField = sendFields[Pstream::myProcNo()];
528 subField[i] = accessAndFlip
546 const labelList& map = constructMap[Pstream::myProcNo()];
547 const List<T>& subField = sendFields[Pstream::myProcNo()];
563 Pstream::waitRequests(nOutstanding);
568 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
570 const labelList& map = constructMap[domain];
572 if (domain != Pstream::myProcNo() && map.
size())
574 const List<T>& subField = recvFields[domain];
576 checkReceivedSize(domain, map.
size(), subField.
size());
594 <<
"Unknown communication schedule " << commsType
601 template<
class T,
class CombineOp,
class negateOp>
606 const label constructSize,
608 const bool subHasFlip,
610 const bool constructHasFlip,
612 const CombineOp& cop,
613 const negateOp& negOp,
618 if (!Pstream::parRun())
622 const labelList& mySubMap = subMap[Pstream::myProcNo()];
627 subField[i] = accessAndFlip(field, mySubMap[i], subHasFlip, negOp);
631 const labelList& map = constructMap[Pstream::myProcNo()];
636 flipAndCombine(map, constructHasFlip, subField, cop, negOp, field);
641 if (commsType == Pstream::blocking)
647 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
651 if (domain != Pstream::myProcNo() && map.
size())
653 OPstream toNbr(Pstream::blocking, domain, 0, tag);
657 subField[i] = accessAndFlip
670 const labelList& mySubMap = subMap[Pstream::myProcNo()];
675 subField[i] = accessAndFlip(field, mySubMap[i], subHasFlip, negOp);
679 const labelList& map = constructMap[Pstream::myProcNo()];
684 flipAndCombine(map, constructHasFlip, subField, cop, negOp, field);
687 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
689 const labelList& map = constructMap[domain];
691 if (domain != Pstream::myProcNo() && map.
size())
693 IPstream fromNbr(Pstream::blocking, domain, 0, tag);
696 checkReceivedSize(domain, map.
size(), subField.
size());
710 else if (commsType == Pstream::scheduled)
715 List<T> newField(constructSize, nullValue);
718 const labelList& mySubMap = subMap[Pstream::myProcNo()];
724 subField[i] = accessAndFlip
734 const labelList& map = constructMap[Pstream::myProcNo()];
755 label sendProc = twoProcs[0];
756 label recvProc = twoProcs[1];
758 if (Pstream::myProcNo() == sendProc)
762 OPstream toNbr(Pstream::scheduled, recvProc, 0, tag);
769 subField[i] = accessAndFlip
780 IPstream fromNbr(Pstream::scheduled, recvProc, 0, tag);
782 const labelList& map = constructMap[recvProc];
784 checkReceivedSize(recvProc, map.
size(), subField.
size());
801 IPstream fromNbr(Pstream::scheduled, sendProc, 0, tag);
803 const labelList& map = constructMap[sendProc];
805 checkReceivedSize(sendProc, map.
size(), subField.
size());
818 OPstream toNbr(Pstream::scheduled, sendProc, 0, tag);
825 subField[i] = accessAndFlip
839 else if (commsType == Pstream::nonBlocking)
841 label nOutstanding = Pstream::nRequests();
843 if (!contiguous<T>())
848 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
852 if (domain != Pstream::myProcNo() && map.
size())
860 subField[i] = accessAndFlip
868 toDomain << subField;
877 const labelList& myMap = subMap[Pstream::myProcNo()];
882 mySubField[i] = accessAndFlip
896 const labelList& map = constructMap[Pstream::myProcNo()];
911 Pstream::waitRequests(nOutstanding);
914 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
916 const labelList& map = constructMap[domain];
918 if (domain != Pstream::myProcNo() && map.
size())
923 checkReceivedSize(domain, map.
size(), recvField.
size());
943 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
947 if (domain != Pstream::myProcNo() && map.
size())
949 List<T>& subField = sendFields[domain];
953 subField[i] = accessAndFlip
964 Pstream::nonBlocking,
966 reinterpret_cast<const char*
>(subField.begin()),
967 subField.
size()*
sizeof(
T),
977 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
979 const labelList& map = constructMap[domain];
981 if (domain != Pstream::myProcNo() && map.
size())
986 Pstream::nonBlocking,
988 reinterpret_cast<char*
>(recvFields[domain].begin()),
989 recvFields[domain].size()*
sizeof(
T),
998 const labelList& map = subMap[Pstream::myProcNo()];
1000 List<T>& subField = sendFields[Pstream::myProcNo()];
1004 subField[i] = accessAndFlip
1022 const labelList& map = constructMap[Pstream::myProcNo()];
1023 const List<T>& subField = sendFields[Pstream::myProcNo()];
1039 Pstream::waitRequests(nOutstanding);
1044 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
1046 const labelList& map = constructMap[domain];
1048 if (domain != Pstream::myProcNo() && map.
size())
1050 const List<T>& subField = recvFields[domain];
1052 checkReceivedSize(domain, map.
size(), subField.
size());
1070 <<
"Unknown communication schedule " << commsType
1101 toDomain << subField;
1115 field.
setSize(constructSize_);
1119 const labelList& map = constructMap_[domain];
1126 if (recvField.
size() != map.
size())
1129 <<
"Expected from processor " << domain
1130 <<
" " << map.
size() <<
" but received "
1131 << recvField.
size() <<
" elements."
1150 template<
class T,
class negateOp>
1154 const negateOp& negOp,
1233 distribute(fldList, tag);
1235 fld.setCapacity(fldList.
size());
1243 const label constructSize,
1305 const label constructSize,