36 template<
class T,
class CombineOp,
class negateOp>
43 const negateOp& negOp,
53 label index = map[i]-1;
54 cop(lhs[index], rhs[i]);
58 label index = -map[i]-1;
59 cop(lhs[index], negOp(rhs[i]));
64 <<
"At index " << i <<
" out of " << map.
size()
65 <<
" have illegal index " << map[i]
66 <<
" for field " << rhs.
size() <<
" with flipMap"
75 cop(lhs[map[i]], rhs[i]);
81 template<
class T,
class negateOp>
99 t = negOp(
fld[-index-1]);
104 <<
"Illegal index " << index
105 <<
" into field of size " <<
fld.size()
106 <<
" with face-flipping"
120 template<
class T,
class negateOp>
125 const label constructSize,
127 const bool subHasFlip,
129 const bool constructHasFlip,
131 const negateOp& negOp,
135 if (!Pstream::parRun())
139 const labelList& mySubMap = subMap[Pstream::myProcNo()];
141 List<T> subField(mySubMap.size());
144 subField[i] = accessAndFlip(
field, mySubMap[i], subHasFlip, negOp);
148 const labelList& map = constructMap[Pstream::myProcNo()];
150 field.setSize(constructSize);
165 if (commsType == Pstream::commsTypes::blocking)
171 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
175 if (domain != Pstream::myProcNo() && map.size())
177 OPstream toNbr(Pstream::commsTypes::blocking, domain, 0, tag);
182 subField[i] = accessAndFlip
195 const labelList& mySubMap = subMap[Pstream::myProcNo()];
197 List<T> subField(mySubMap.size());
200 subField[i] = accessAndFlip(
field, mySubMap[i], subHasFlip, negOp);
204 const labelList& map = constructMap[Pstream::myProcNo()];
206 field.setSize(constructSize);
219 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
221 const labelList& map = constructMap[domain];
223 if (domain != Pstream::myProcNo() && map.size())
225 IPstream fromNbr(Pstream::commsTypes::blocking, domain, 0, tag);
228 checkReceivedSize(domain, map.size(), subField.size());
242 else if (commsType == Pstream::commsTypes::scheduled)
247 List<T> newField(constructSize);
251 const labelList& mySubMap = subMap[Pstream::myProcNo()];
253 List<T> subField(mySubMap.size());
256 subField[i] = accessAndFlip
268 constructMap[Pstream::myProcNo()],
284 label sendProc = twoProcs[0];
285 label recvProc = twoProcs[1];
287 if (Pstream::myProcNo() == sendProc)
293 Pstream::commsTypes::scheduled,
303 subField[i] = accessAndFlip
316 Pstream::commsTypes::scheduled,
323 const labelList& map = constructMap[recvProc];
325 checkReceivedSize(recvProc, map.size(), subField.size());
344 Pstream::commsTypes::scheduled,
351 const labelList& map = constructMap[sendProc];
353 checkReceivedSize(sendProc, map.size(), subField.size());
368 Pstream::commsTypes::scheduled,
378 subField[i] = accessAndFlip
390 field.transfer(newField);
392 else if (commsType == Pstream::commsTypes::nonBlocking)
394 label nOutstanding = Pstream::nRequests();
401 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
405 if (domain != Pstream::myProcNo() && map.size())
413 subField[i] = accessAndFlip
421 toDomain << subField;
430 const labelList& mySub = subMap[Pstream::myProcNo()];
431 List<T> mySubField(mySub.size());
434 mySubField[i] = accessAndFlip
443 field.setSize(constructSize);
446 const labelList& map = constructMap[Pstream::myProcNo()];
461 Pstream::waitRequests(nOutstanding);
464 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
466 const labelList& map = constructMap[domain];
468 if (domain != Pstream::myProcNo() && map.size())
473 checkReceivedSize(domain, map.size(), recvField.size());
493 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
497 if (domain != Pstream::myProcNo() && map.size())
499 List<T>& subField = sendFields[domain];
503 subField[i] = accessAndFlip
514 Pstream::commsTypes::nonBlocking,
516 reinterpret_cast<const char*
>(subField.begin()),
527 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
529 const labelList& map = constructMap[domain];
531 if (domain != Pstream::myProcNo() && map.size())
533 recvFields[domain].
setSize(map.size());
536 Pstream::commsTypes::nonBlocking,
538 reinterpret_cast<char*
>(recvFields[domain].
begin()),
539 recvFields[domain].byteSize(),
549 const labelList& map = subMap[Pstream::myProcNo()];
551 List<T>& subField = sendFields[Pstream::myProcNo()];
555 subField[i] = accessAndFlip
568 field.setSize(constructSize);
573 const labelList& map = constructMap[Pstream::myProcNo()];
574 const List<T>& subField = sendFields[Pstream::myProcNo()];
590 Pstream::waitRequests(nOutstanding);
595 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
597 const labelList& map = constructMap[domain];
599 if (domain != Pstream::myProcNo() && map.size())
601 const List<T>& subField = recvFields[domain];
603 checkReceivedSize(domain, map.size(), subField.size());
621 <<
"Unknown communication schedule " << int(commsType)
628 template<
class T,
class CombineOp,
class negateOp>
633 const label constructSize,
635 const bool subHasFlip,
637 const bool constructHasFlip,
639 const CombineOp& cop,
640 const negateOp& negOp,
645 if (!Pstream::parRun())
649 const labelList& mySubMap = subMap[Pstream::myProcNo()];
651 List<T> subField(mySubMap.size());
654 subField[i] = accessAndFlip(
field, mySubMap[i], subHasFlip, negOp);
658 const labelList& map = constructMap[Pstream::myProcNo()];
660 field.setSize(constructSize);
663 flipAndCombine(map, constructHasFlip, subField, cop, negOp,
field);
668 if (commsType == Pstream::commsTypes::blocking)
674 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
678 if (domain != Pstream::myProcNo() && map.size())
680 OPstream toNbr(Pstream::commsTypes::blocking, domain, 0, tag);
684 subField[i] = accessAndFlip
697 const labelList& mySubMap = subMap[Pstream::myProcNo()];
699 List<T> subField(mySubMap.size());
702 subField[i] = accessAndFlip(
field, mySubMap[i], subHasFlip, negOp);
706 const labelList& map = constructMap[Pstream::myProcNo()];
708 field.setSize(constructSize);
711 flipAndCombine(map, constructHasFlip, subField, cop, negOp,
field);
714 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
716 const labelList& map = constructMap[domain];
718 if (domain != Pstream::myProcNo() && map.size())
720 IPstream fromNbr(Pstream::commsTypes::blocking, domain, 0, tag);
723 checkReceivedSize(domain, map.size(), subField.size());
737 else if (commsType == Pstream::commsTypes::scheduled)
742 List<T> newField(constructSize, nullValue);
745 const labelList& mySubMap = subMap[Pstream::myProcNo()];
748 List<T> subField(mySubMap.size());
751 subField[i] = accessAndFlip
761 const labelList& map = constructMap[Pstream::myProcNo()];
782 label sendProc = twoProcs[0];
783 label recvProc = twoProcs[1];
785 if (Pstream::myProcNo() == sendProc)
791 Pstream::commsTypes::scheduled,
802 subField[i] = accessAndFlip
815 Pstream::commsTypes::scheduled,
821 const labelList& map = constructMap[recvProc];
823 checkReceivedSize(recvProc, map.size(), subField.size());
842 Pstream::commsTypes::scheduled,
848 const labelList& map = constructMap[sendProc];
850 checkReceivedSize(sendProc, map.size(), subField.size());
865 Pstream::commsTypes::scheduled,
876 subField[i] = accessAndFlip
888 field.transfer(newField);
890 else if (commsType == Pstream::commsTypes::nonBlocking)
892 label nOutstanding = Pstream::nRequests();
899 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
903 if (domain != Pstream::myProcNo() && map.size())
911 subField[i] = accessAndFlip
919 toDomain << subField;
928 const labelList& myMap = subMap[Pstream::myProcNo()];
930 List<T> mySubField(myMap.size());
933 mySubField[i] = accessAndFlip
943 field.setSize(constructSize);
947 const labelList& map = constructMap[Pstream::myProcNo()];
962 Pstream::waitRequests(nOutstanding);
965 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
967 const labelList& map = constructMap[domain];
969 if (domain != Pstream::myProcNo() && map.size())
974 checkReceivedSize(domain, map.size(), recvField.size());
994 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
998 if (domain != Pstream::myProcNo() && map.size())
1000 List<T>& subField = sendFields[domain];
1004 subField[i] = accessAndFlip
1015 Pstream::commsTypes::nonBlocking,
1017 reinterpret_cast<const char*
>(subField.begin()),
1018 subField.size()*
sizeof(
T),
1028 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
1030 const labelList& map = constructMap[domain];
1032 if (domain != Pstream::myProcNo() && map.size())
1034 recvFields[domain].
setSize(map.size());
1037 Pstream::commsTypes::nonBlocking,
1039 reinterpret_cast<char*
>(recvFields[domain].
begin()),
1040 recvFields[domain].size()*
sizeof(
T),
1049 const labelList& map = subMap[Pstream::myProcNo()];
1051 List<T>& subField = sendFields[Pstream::myProcNo()];
1055 subField[i] = accessAndFlip
1068 field.setSize(constructSize);
1073 const labelList& map = constructMap[Pstream::myProcNo()];
1074 const List<T>& subField = sendFields[Pstream::myProcNo()];
1090 Pstream::waitRequests(nOutstanding);
1095 for (
label domain = 0; domain < Pstream::nProcs(); domain++)
1097 const labelList& map = constructMap[domain];
1099 if (domain != Pstream::myProcNo() && map.size())
1101 const List<T>& subField = recvFields[domain];
1103 checkReceivedSize(domain, map.size(), subField.size());
1121 <<
"Unknown communication schedule " << int(commsType)
1152 toDomain << subField;
1166 field.setSize(constructSize_);
1170 const labelList& map = constructMap_[domain];
1177 if (recvField.size() != map.size())
1180 <<
"Expected from processor " << domain
1181 <<
" " << map.size() <<
" but received "
1182 << recvField.size() <<
" elements."
1201 template<
class T,
class negateOp>
1205 const negateOp& negOp,
1284 distribute(fldList, tag);
1286 fld.setCapacity(fldList.size());
1294 const label constructSize,
1356 const label constructSize,