- Timestamp:
- 11/15/17 12:14:34 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/branch_openmp/src/filter/spatial_transform_filter.cpp
r1287 r1328 1 #include "mpi.hpp" 1 2 #include "spatial_transform_filter.hpp" 2 3 #include "grid_transformation.hpp" 3 4 #include "context.hpp" 4 5 #include "context_client.hpp" 6 using namespace ep_lib; 5 7 6 8 namespace xios … … 65 67 } 66 68 69 //std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> > CSpatialTransformFilterEngine::engines; 67 70 std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> > *CSpatialTransformFilterEngine::engines_ptr = 0; 68 71 … … 72 75 ERROR("CSpatialTransformFilterEngine& CSpatialTransformFilterEngine::get(CGridTransformation* gridTransformation)", 73 76 "Impossible to get the requested engine, the grid transformation is invalid."); 74 77 75 78 if(engines_ptr == NULL) engines_ptr = new std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> >; 76 79 80 //std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> >::iterator it = engines.find(gridTransformation); 77 81 std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> >::iterator it = engines_ptr->find(gridTransformation); 82 //if (it == engines.end()) 78 83 if (it == engines_ptr->end()) 79 84 { 80 85 boost::shared_ptr<CSpatialTransformFilterEngine> engine(new CSpatialTransformFilterEngine(gridTransformation)); 86 //it = engines.insert(std::make_pair(gridTransformation, engine)).first; 81 87 it = engines_ptr->insert(std::make_pair(gridTransformation, engine)).first; 82 88 } … … 122 128 double defaultValue = std::numeric_limits<double>::quiet_NaN(); 123 129 if (0 != dataDest.numElements()) ignoreMissingValue = NumTraits<double>::isnan(dataDest(0)); 124 125 const std::list<CGridTransformation::SendingIndexGridSourceMap> *listLocalIndexSend_ptr = & (gridTransformation->getLocalIndexToSendFromGridSource()); 126 130 127 131 const std::list<CGridTransformation::SendingIndexGridSourceMap>& listLocalIndexSend = gridTransformation->getLocalIndexToSendFromGridSource(); 128 132 const std::list<CGridTransformation::RecvIndexGridDestinationMap>& listLocalIndexToReceive = gridTransformation->getLocalIndexToReceiveOnGridDest(); … … 133 137 CArray<double,1> dataCurrentDest(dataSrc.copy()); 134 138 135 std::list<CGridTransformation::SendingIndexGridSourceMap>::const_iterator itListSend = listLocalIndexSend _ptr->begin(),136 iteListSend = listLocalIndexSend _ptr->end();139 std::list<CGridTransformation::SendingIndexGridSourceMap>::const_iterator itListSend = listLocalIndexSend.begin(), 140 iteListSend = listLocalIndexSend.end(); 137 141 std::list<CGridTransformation::RecvIndexGridDestinationMap>::const_iterator itListRecv = listLocalIndexToReceive.begin(); 138 142 std::list<size_t>::const_iterator itNbListRecv = listNbLocalIndexToReceive.begin(); … … 155 159 sendBuff[idxSendBuff] = new double[itSend->second.numElements()]; 156 160 } 157 158 const CGridTransformation::RecvIndexGridDestinationMap& localIndexToReceive = *itListRecv;159 CGridTransformation::RecvIndexGridDestinationMap::const_iterator itbRecv = localIndexToReceive.begin(), itRecv,160 iteRecv = localIndexToReceive.end();161 161 162 162 idxSendBuff = 0; 163 std::vector< ep_lib::MPI_Request> sendRecvRequest(localIndexToSend.size()+localIndexToReceive.size());163 std::vector<MPI_Request> sendRecvRequest(localIndexToSend.size() + itListRecv->size()); 164 164 int position = 0; 165 165 for (itSend = itbSend; itSend != iteSend; ++itSend, ++idxSendBuff) … … 172 172 sendBuff[idxSendBuff][idx] = dataCurrentSrc(localIndex_p(idx)); 173 173 } 174 MPI_Isend(sendBuff[idxSendBuff], countSize, MPI_DOUBLE, destRank, 12, client->intraComm, &sendRecvRequest[position]); 175 position++; 174 MPI_Isend(sendBuff[idxSendBuff], countSize, MPI_DOUBLE, destRank, 12, client->intraComm, &sendRecvRequest[position++]); 176 175 } 177 176 178 177 // Receiving data on destination fields 179 178 const CGridTransformation::RecvIndexGridDestinationMap& localIndexToReceive = *itListRecv; 179 CGridTransformation::RecvIndexGridDestinationMap::const_iterator itbRecv = localIndexToReceive.begin(), itRecv, 180 iteRecv = localIndexToReceive.end(); 180 181 int recvBuffSize = 0; 181 182 for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) recvBuffSize += itRecv->second.size(); //(recvBuffSize < itRecv->second.size()) … … 188 189 int srcRank = itRecv->first; 189 190 int countSize = itRecv->second.size(); 190 MPI_Irecv(recvBuff + currentBuff, countSize, MPI_DOUBLE, srcRank, 12, client->intraComm, &sendRecvRequest[position]); 191 position++; 191 MPI_Irecv(recvBuff + currentBuff, countSize, MPI_DOUBLE, srcRank, 12, client->intraComm, &sendRecvRequest[position++]); 192 192 currentBuff += countSize; 193 193 } 194 std::vector< ep_lib::MPI_Status> status(sendRecvRequest.size());194 std::vector<MPI_Status> status(sendRecvRequest.size()); 195 195 MPI_Waitall(sendRecvRequest.size(), &sendRecvRequest[0], &status[0]); 196 196 … … 203 203 std::vector<bool> localInitFlag(dataCurrentDest.numElements(), true); 204 204 currentBuff = 0; 205 bool firstPass=true; 205 206 for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) 206 207 { … … 211 212 dataCurrentDest, 212 213 localInitFlag, 213 ignoreMissingValue );214 ignoreMissingValue,firstPass); 214 215 215 216 currentBuff += countSize; 217 firstPass=false ; 216 218 } 217 219
Note: See TracChangeset
for help on using the changeset viewer.