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,
136 const label myRank = Pstream::myProcNo(comm);
137 const label nProcs = Pstream::nProcs(comm);
139 if (!Pstream::parRun())
143 const labelList& mySubMap = subMap[myRank];
145 List<T> subField(mySubMap.size());
148 subField[i] = accessAndFlip(
field, mySubMap[i], subHasFlip, negOp);
152 const labelList& map = constructMap[myRank];
154 field.setSize(constructSize);
169 if (commsType == Pstream::commsTypes::blocking)
175 for (
const int domain : Pstream::allProcs(comm))
179 if (domain != myRank && map.size())
183 Pstream::commsTypes::blocking,
193 subField[i] = accessAndFlip
206 const labelList& mySubMap = subMap[myRank];
208 List<T> subField(mySubMap.size());
211 subField[i] = accessAndFlip(
field, mySubMap[i], subHasFlip, negOp);
215 const labelList& map = constructMap[myRank];
217 field.setSize(constructSize);
230 for (
const int domain : Pstream::allProcs(comm))
232 const labelList& map = constructMap[domain];
234 if (domain != myRank && map.size())
238 Pstream::commsTypes::blocking,
246 checkReceivedSize(domain, map.size(), subField.size());
260 else if (commsType == Pstream::commsTypes::scheduled)
265 List<T> newField(constructSize);
269 const labelList& mySubMap = subMap[myRank];
271 List<T> subField(mySubMap.size());
274 subField[i] = accessAndFlip
286 constructMap[myRank],
302 label sendProc = twoProcs[0];
303 label recvProc = twoProcs[1];
305 if (myRank == sendProc)
311 Pstream::commsTypes::scheduled,
322 subField[i] = accessAndFlip
335 Pstream::commsTypes::scheduled,
343 const labelList& map = constructMap[recvProc];
345 checkReceivedSize(recvProc, map.size(), subField.size());
364 Pstream::commsTypes::scheduled,
372 const labelList& map = constructMap[sendProc];
374 checkReceivedSize(sendProc, map.size(), subField.size());
389 Pstream::commsTypes::scheduled,
400 subField[i] = accessAndFlip
412 field.transfer(newField);
414 else if (commsType == Pstream::commsTypes::nonBlocking)
416 label nOutstanding = Pstream::nRequests();
420 PstreamBuffers pBufs(Pstream::commsTypes::nonBlocking, tag, comm);
423 for (
const int domain : Pstream::allProcs(comm))
427 if (domain != myRank && map.size())
435 subField[i] = accessAndFlip
443 toDomain << subField;
453 List<T> mySubField(mySub.size());
456 mySubField[i] = accessAndFlip
465 field.setSize(constructSize);
468 const labelList& map = constructMap[myRank];
483 Pstream::waitRequests(nOutstanding);
486 for (
const int domain : Pstream::allProcs(comm))
488 const labelList& map = constructMap[domain];
490 if (domain != myRank && map.size())
495 checkReceivedSize(domain, map.size(), recvField.size());
515 for (
const int domain : Pstream::allProcs(comm))
519 if (domain != myRank && map.size())
521 List<T>& subField = sendFields[domain];
525 subField[i] = accessAndFlip
536 Pstream::commsTypes::nonBlocking,
538 subField.cdata_bytes(),
539 subField.size_bytes(),
550 for (
const int domain : Pstream::allProcs(comm))
552 const labelList& map = constructMap[domain];
554 if (domain != myRank && map.size())
556 recvFields[domain].
setSize(map.size());
559 Pstream::commsTypes::nonBlocking,
561 recvFields[domain].data_bytes(),
562 recvFields[domain].size_bytes(),
575 List<T>& subField = sendFields[myRank];
579 subField[i] = accessAndFlip
592 field.setSize(constructSize);
597 const labelList& map = constructMap[myRank];
598 const List<T>& subField = sendFields[myRank];
614 Pstream::waitRequests(nOutstanding);
619 for (
const int domain : Pstream::allProcs(comm))
621 const labelList& map = constructMap[domain];
623 if (domain != myRank && map.size())
625 const List<T>& subField = recvFields[domain];
627 checkReceivedSize(domain, map.size(), subField.size());
645 <<
"Unknown communication schedule " << int(commsType)
652 template<
class T,
class CombineOp,
class negateOp>
657 const label constructSize,
659 const bool subHasFlip,
661 const bool constructHasFlip,
664 const CombineOp& cop,
665 const negateOp& negOp,
670 const label myRank = Pstream::myProcNo(comm);
671 const label nProcs = Pstream::nProcs(comm);
673 if (!Pstream::parRun())
677 const labelList& mySubMap = subMap[myRank];
679 List<T> subField(mySubMap.size());
682 subField[i] = accessAndFlip(
field, mySubMap[i], subHasFlip, negOp);
686 const labelList& map = constructMap[myRank];
688 field.setSize(constructSize);
691 flipAndCombine(map, constructHasFlip, subField, cop, negOp,
field);
696 if (commsType == Pstream::commsTypes::blocking)
702 for (
const int domain : Pstream::allProcs(comm))
706 if (domain != myRank && map.size())
710 Pstream::commsTypes::blocking,
719 subField[i] = accessAndFlip
732 const labelList& mySubMap = subMap[myRank];
734 List<T> subField(mySubMap.size());
737 subField[i] = accessAndFlip(
field, mySubMap[i], subHasFlip, negOp);
741 const labelList& map = constructMap[myRank];
743 field.setSize(constructSize);
746 flipAndCombine(map, constructHasFlip, subField, cop, negOp,
field);
749 for (
const int domain : Pstream::allProcs(comm))
751 const labelList& map = constructMap[domain];
753 if (domain != myRank && map.size())
757 Pstream::commsTypes::blocking,
765 checkReceivedSize(domain, map.size(), subField.size());
779 else if (commsType == Pstream::commsTypes::scheduled)
784 List<T> newField(constructSize, nullValue);
787 const labelList& mySubMap = subMap[myRank];
790 List<T> subField(mySubMap.size());
793 subField[i] = accessAndFlip
803 const labelList& map = constructMap[myRank];
824 label sendProc = twoProcs[0];
825 label recvProc = twoProcs[1];
827 if (myRank == sendProc)
833 Pstream::commsTypes::scheduled,
845 subField[i] = accessAndFlip
858 Pstream::commsTypes::scheduled,
865 const labelList& map = constructMap[recvProc];
867 checkReceivedSize(recvProc, map.size(), subField.size());
886 Pstream::commsTypes::scheduled,
893 const labelList& map = constructMap[sendProc];
895 checkReceivedSize(sendProc, map.size(), subField.size());
910 Pstream::commsTypes::scheduled,
922 subField[i] = accessAndFlip
934 field.transfer(newField);
936 else if (commsType == Pstream::commsTypes::nonBlocking)
938 label nOutstanding = Pstream::nRequests();
942 PstreamBuffers pBufs(Pstream::commsTypes::nonBlocking, tag, comm);
945 for (
const int domain : Pstream::allProcs(comm))
949 if (domain != myRank && map.size())
957 subField[i] = accessAndFlip
965 toDomain << subField;
976 List<T> mySubField(myMap.size());
979 mySubField[i] = accessAndFlip
989 field.setSize(constructSize);
993 const labelList& map = constructMap[myRank];
1008 Pstream::waitRequests(nOutstanding);
1011 for (
const int domain : Pstream::allProcs(comm))
1013 const labelList& map = constructMap[domain];
1015 if (domain != myRank && map.size())
1020 checkReceivedSize(domain, map.size(), recvField.size());
1040 for (
const int domain : Pstream::allProcs(comm))
1044 if (domain != myRank && map.size())
1046 List<T>& subField = sendFields[domain];
1050 subField[i] = accessAndFlip
1061 Pstream::commsTypes::nonBlocking,
1063 subField.cdata_bytes(),
1064 subField.size_bytes(),
1075 for (
const int domain : Pstream::allProcs(comm))
1077 const labelList& map = constructMap[domain];
1079 if (domain != myRank && map.size())
1081 recvFields[domain].
setSize(map.size());
1084 Pstream::commsTypes::nonBlocking,
1086 recvFields[domain].data_bytes(),
1087 recvFields[domain].size_bytes(),
1099 List<T>& subField = sendFields[myRank];
1103 subField[i] = accessAndFlip
1116 field.setSize(constructSize);
1121 const labelList& map = constructMap[myRank];
1122 const List<T>& subField = sendFields[myRank];
1138 Pstream::waitRequests(nOutstanding);
1143 for (
const int domain : Pstream::allProcs(comm))
1145 const labelList& map = constructMap[domain];
1147 if (domain != myRank && map.size())
1149 const List<T>& subField = recvFields[domain];
1151 checkReceivedSize(domain, map.size(), subField.size());
1169 <<
"Unknown communication schedule " << int(commsType)
1200 toDomain << subField;
1214 field.setSize(constructSize_);
1218 const labelList& map = constructMap_[domain];
1225 if (recvField.size() != map.size())
1228 <<
"Expected from processor " << domain
1229 <<
" " << map.size() <<
" but received "
1230 << recvField.size() <<
" elements."
1249 template<
class T,
class negateOp>
1253 const negateOp& negOp,
1335 distribute(fldList, tag);
1337 fld.setCapacity(fldList.size());
1345 const label constructSize,
1410 const label constructSize,