Changeset 1640
- Timestamp:
- 01/22/19 17:02:30 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/filter/spatial_transform_filter.cpp
r1639 r1640 188 188 189 189 CContextClient* client = CContext::getCurrent()->client; 190 int rank; 191 MPI_Comm_rank (client->intraComm, &rank); 190 192 191 193 // Get default value for output data … … 217 219 int idxSendBuff = 0; 218 220 std::vector<double*> sendBuff(localIndexToSend.size()); 221 double* sendBuffRank; 219 222 for (itSend = itbSend; itSend != iteSend; ++itSend, ++idxSendBuff) 220 223 { 224 int destRank = itSend->first; 221 225 if (0 != itSend->second.numElements()) 222 sendBuff[idxSendBuff] = new double[itSend->second.numElements()]; 226 { 227 if (rank != itSend->first) 228 sendBuff[idxSendBuff] = new double[itSend->second.numElements()]; 229 else 230 sendBuffRank = new double[itSend->second.numElements()]; 231 } 223 232 } 224 233 … … 230 239 const CArray<int,1>& localIndex_p = itSend->second; 231 240 int countSize = localIndex_p.numElements(); 232 for (int idx = 0; idx < countSize; ++idx) 233 { 234 sendBuff[idxSendBuff][idx] = dataCurrentSrc(localIndex_p(idx)); 235 } 236 sendRecvRequest.push_back(MPI_Request()); 237 MPI_Isend(sendBuff[idxSendBuff], countSize, MPI_DOUBLE, destRank, 12, client->intraComm, &sendRecvRequest.back()); 241 if (destRank != rank) 242 { 243 for (int idx = 0; idx < countSize; ++idx) 244 { 245 sendBuff[idxSendBuff][idx] = dataCurrentSrc(localIndex_p(idx)); 246 sendRecvRequest.push_back(MPI_Request()); 247 MPI_Isend(sendBuff[idxSendBuff], countSize, MPI_DOUBLE, destRank, 12, client->intraComm, &sendRecvRequest.back()); 248 } 249 } 250 else 251 { 252 for (int idx = 0; idx < countSize; ++idx) 253 { 254 sendBuffRank[idx] = dataCurrentSrc(localIndex_p(idx)); 255 } 256 } 238 257 } 239 258 … … 243 262 iteRecv = localIndexToReceive.end(); 244 263 int recvBuffSize = 0; 245 for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) recvBuffSize += itRecv->second.size(); //(recvBuffSize < itRecv->second.size()) 246 //? itRecv->second.size() : recvBuffSize; 264 for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) 265 { 266 if (itRecv->first != rank ) 267 recvBuffSize += itRecv->second.size(); 268 } 269 //(recvBuffSize < itRecv->second.size()) ? itRecv->second.size() : recvBuffSize; 247 270 double* recvBuff; 271 248 272 if (0 != recvBuffSize) recvBuff = new double[recvBuffSize]; 249 273 int currentBuff = 0; … … 251 275 { 252 276 int srcRank = itRecv->first; 253 int countSize = itRecv->second.size(); 254 sendRecvRequest.push_back(MPI_Request()); 255 MPI_Irecv(recvBuff + currentBuff, countSize, MPI_DOUBLE, srcRank, 12, client->intraComm, &sendRecvRequest.back()); 256 currentBuff += countSize; 277 if (srcRank != rank) 278 { 279 int countSize = itRecv->second.size(); 280 sendRecvRequest.push_back(MPI_Request()); 281 MPI_Irecv(recvBuff + currentBuff, countSize, MPI_DOUBLE, srcRank, 12, client->intraComm, &sendRecvRequest.back()); 282 currentBuff += countSize; 283 } 257 284 } 258 285 std::vector<MPI_Status> status(sendRecvRequest.size()); … … 267 294 for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) 268 295 { 269 int countSize = itRecv->second.size();270 296 const std::vector<std::pair<int,double> >& localIndex_p = itRecv->second; 271 (*itAlgo)->apply(localIndex_p, 272 recvBuff+currentBuff, 273 dataCurrentDest, 274 localInitFlag, 275 ignoreMissingValue,firstPass); 276 277 currentBuff += countSize; 297 int srcRank = itRecv->first; 298 if (srcRank != rank) 299 { 300 int countSize = itRecv->second.size(); 301 (*itAlgo)->apply(localIndex_p, 302 recvBuff+currentBuff, 303 dataCurrentDest, 304 localInitFlag, 305 ignoreMissingValue,firstPass); 306 currentBuff += countSize; 307 } 308 else 309 { 310 (*itAlgo)->apply(localIndex_p, 311 sendBuffRank, 312 dataCurrentDest, 313 localInitFlag, 314 ignoreMissingValue,firstPass); 315 } 316 278 317 firstPass=false ; 279 318 } … … 285 324 { 286 325 if (0 != itSend->second.numElements()) 287 delete [] sendBuff[idxSendBuff]; 326 { 327 if (rank != itSend->first) 328 delete [] sendBuff[idxSendBuff]; 329 else 330 delete [] sendBuffRank; 331 } 288 332 } 289 333 if (0 != recvBuffSize) delete [] recvBuff;
Note: See TracChangeset
for help on using the changeset viewer.