Changeset 709 for XIOS/trunk/src/filter/spatial_transform_filter.cpp
- Timestamp:
- 09/29/15 14:01:53 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/filter/spatial_transform_filter.cpp
r690 r709 80 80 std::map<int, CArray<int,1> >::const_iterator itbSend = localIndexToSend.begin(), itSend, 81 81 iteSend = localIndexToSend.end(); 82 int sendBuffSize = 0; 83 for (itSend = itbSend; itSend != iteSend; ++itSend) sendBuffSize = (sendBuffSize < itSend->second.numElements()) 84 ? itSend->second.numElements(): sendBuffSize; 85 double* sendBuff; 86 if (0 != sendBuffSize) sendBuff = new double[sendBuffSize]; 82 int idxSendBuff = 0; 83 std::vector<double*> sendBuff(localIndexToSend.size()); 84 for (itSend = itbSend; itSend != iteSend; ++itSend, ++idxSendBuff) 85 { 86 if (0 != itSend->second.numElements()) 87 sendBuff[idxSendBuff] = new double[itSend->second.numElements()]; 88 } 89 90 idxSendBuff = 0; 87 91 std::vector<MPI_Request> sendRequest; 88 for (itSend = itbSend; itSend != iteSend; ++itSend )92 for (itSend = itbSend; itSend != iteSend; ++itSend, ++idxSendBuff) 89 93 { 90 94 int destRank = itSend->first; … … 93 97 for (int idx = 0; idx < countSize; ++idx) 94 98 { 95 sendBuff[idx ] = dataSrc(localIndex_p(idx));99 sendBuff[idxSendBuff][idx] = dataSrc(localIndex_p(idx)); 96 100 } 97 101 sendRequest.push_back(MPI_Request()); 98 MPI_Isend(sendBuff , countSize, MPI_DOUBLE, destRank, 12, client->intraComm, &sendRequest.back());102 MPI_Isend(sendBuff[idxSendBuff], countSize, MPI_DOUBLE, destRank, 12, client->intraComm, &sendRequest.back()); 99 103 } 100 104 … … 113 117 int countSize = itRecv->second.size(); 114 118 MPI_Recv(recvBuff, recvBuffSize, MPI_DOUBLE, srcRank, 12, client->intraComm, &status); 119 int countBuff = 0; 120 MPI_Get_count(&status, MPI_DOUBLE, &countBuff); 121 if (countBuff != countSize) 122 ERROR("CSpatialTransformFilterEngine::apply(const CArray<double, 1>& dataSrc, CArray<double,1>& dataDest)", 123 "Incoherent between the received size and expected size"); 115 124 for (int idx = 0; idx < countSize; ++idx) 116 125 { … … 119 128 for (int i = 0; i < numIndex; ++i) 120 129 { 121 // if (localIndex_p[i].first >= dataDest.numElements())122 130 dataDest(localIndex_p[i].first) += recvBuff[idx] * localIndex_p[i].second; 123 131 } … … 125 133 } 126 134 127 std::vector<MPI_Status> requestStatus(sendRequest.size()); 128 if (!sendRequest.empty()) MPI_Wait(&sendRequest[0], &requestStatus[0]); 129 if (0 != sendBuffSize) delete [] sendBuff; 135 136 if (!sendRequest.empty()) MPI_Waitall(sendRequest.size(), &sendRequest[0], MPI_STATUSES_IGNORE); 137 idxSendBuff = 0; 138 for (itSend = itbSend; itSend != iteSend; ++itSend, ++idxSendBuff) 139 { 140 if (0 != itSend->second.numElements()) 141 delete [] sendBuff[idxSendBuff]; 142 } 130 143 if (0 != recvBuffSize) delete [] recvBuff; 131 144 }
Note: See TracChangeset
for help on using the changeset viewer.