diff --git a/src/sampling/meshToMesh/meshToMeshParallelOps.C b/src/sampling/meshToMesh/meshToMeshParallelOps.C index 180290a469402e5386779fd89c6f116d3c4ac7ce..ed4c3efb38e78e58693a3bf646c3a314053276ce 100644 --- a/src/sampling/meshToMesh/meshToMeshParallelOps.C +++ b/src/sampling/meshToMesh/meshToMeshParallelOps.C @@ -212,27 +212,46 @@ Foam::autoPtr<Foam::mapDistribute> Foam::meshToMesh::calcProcMap } } - // convert dynamicList to labelList - forAll(sendMap, proci) - { - sendMap[proci].transfer(dynSendMap[proci]); - } - - // debug printing if (debug) { Pout<< "Of my " << tgt.nCells() << " target cells I need to send to:" << nl << "\tproc\tcells" << endl; - forAll(sendMap, proci) + forAll(dynSendMap, proci) { Pout<< '\t' << proci << '\t' - << sendMap[proci].size() << endl; + << dynSendMap[proci].size() << endl; } } + + // Convert DynamicList -> List + forAll(sendMap, proci) + { + sendMap[proci].transfer(dynSendMap[proci]); + } } - return autoPtr<mapDistribute>::New(std::move(sendMap)); + + labelList recvSizes; + Pstream::exchangeSizes(sendMap, recvSizes, UPstream::worldComm); + + // Uses linear receive order + labelListList constructMap(UPstream::nProcs()); + + label constructSize = 0; + forAll(constructMap, proci) + { + const label len = recvSizes[proci]; + constructMap[proci] = identity(len, constructSize); + constructSize += len; + } + + return autoPtr<mapDistribute>::New + ( + constructSize, + std::move(sendMap), + std::move(constructMap) + ); break; } }