void Foam::mapDistribute::distribute ( const Pstream::commsTypes commsType, const List<labelPair>& schedule, const label constructSize, const labelListList& subMap, const labelListList& constructMap, List<T>& field ) { if (commsType == Pstream::blocking) { // Since buffered sending can reuse the field to collect the // received data. // Send sub field to neighbour for (label domain = 0; domain < Pstream::nProcs(); domain++) { const labelList& map = subMap[domain]; if (domain != Pstream::myProcNo() && map.size()) { OPstream toNbr(Pstream::blocking, domain); toNbr << UIndirectList<T>(field, map); } } // Subset myself const labelList& mySubMap = subMap[Pstream::myProcNo()]; List<T> subField(mySubMap.size()); forAll(mySubMap, i) { subField[i] = field[mySubMap[i]]; } // Receive sub field from myself (subField) const labelList& map = constructMap[Pstream::myProcNo()]; field.setSize(constructSize); forAll(map, i) { field[map[i]] = subField[i]; } // Receive sub field from neighbour for (label domain = 0; domain < Pstream::nProcs(); domain++) { const labelList& map = constructMap[domain]; if (domain != Pstream::myProcNo() && map.size()) { IPstream fromNbr(Pstream::blocking, domain); List<T> subField(fromNbr); if (subField.size() != map.size()) { FatalErrorIn ( "template<class T>\n" "void mapDistribute::distribute\n" "(\n" " const Pstream::commsTypes commsType,\n" " const List<labelPair>& schedule,\n" " const label constructSize,\n" " const labelListList& subMap,\n" " const labelListList& constructMap,\n" " List<T>& field\n" ")\n" ) << "Expected from processor " << domain << " " << map.size() << " but received " << subField.size() << " elements." << abort(FatalError); } forAll(map, i) { field[map[i]] = subField[i]; } } } }
void Foam::mapDistribute::distribute ( const Pstream::commsTypes commsType, const List<labelPair>& schedule, const label constructSize, const labelListList& subMap, const labelListList& constructMap, List<T>& field, const int tag ) { if (!Pstream::parRun()) { // Do only me to me. const labelList& mySubMap = subMap[Pstream::myProcNo()]; List<T> subField(mySubMap.size()); forAll(mySubMap, i) { subField[i] = field[mySubMap[i]]; } // Receive sub field from myself (subField) const labelList& map = constructMap[Pstream::myProcNo()]; field.setSize(constructSize); forAll(map, i) { field[map[i]] = subField[i]; } return; } if (commsType == Pstream::blocking) { // Since buffered sending can reuse the field to collect the // received data. // Send sub field to neighbour for (label domain = 0; domain < Pstream::nProcs(); domain++) { const labelList& map = subMap[domain]; if (domain != Pstream::myProcNo() && map.size()) { OPstream toNbr(Pstream::blocking, domain, 0, tag); toNbr << UIndirectList<T>(field, map); } } // Subset myself const labelList& mySubMap = subMap[Pstream::myProcNo()]; List<T> subField(mySubMap.size()); forAll(mySubMap, i) { subField[i] = field[mySubMap[i]]; } // Receive sub field from myself (subField) const labelList& map = constructMap[Pstream::myProcNo()]; field.setSize(constructSize); forAll(map, i) { field[map[i]] = subField[i]; } // Receive sub field from neighbour for (label domain = 0; domain < Pstream::nProcs(); domain++) { const labelList& map = constructMap[domain]; if (domain != Pstream::myProcNo() && map.size()) { IPstream fromNbr(Pstream::blocking, domain, 0, tag); List<T> subField(fromNbr); checkReceivedSize(domain, map.size(), subField.size()); forAll(map, i) { field[map[i]] = subField[i]; } } } }