Ignore:
Timestamp:
11/15/17 12:14:34 (6 years ago)
Author:
yushan
Message:

dev_omp

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/branch_openmp/src/filter/spatial_transform_filter.cpp

    r1287 r1328  
     1#include "mpi.hpp" 
    12#include "spatial_transform_filter.hpp" 
    23#include "grid_transformation.hpp" 
    34#include "context.hpp" 
    45#include "context_client.hpp" 
     6using namespace ep_lib; 
    57 
    68namespace xios 
     
    6567  } 
    6668 
     69  //std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> > CSpatialTransformFilterEngine::engines; 
    6770  std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> > *CSpatialTransformFilterEngine::engines_ptr = 0; 
    6871 
     
    7275      ERROR("CSpatialTransformFilterEngine& CSpatialTransformFilterEngine::get(CGridTransformation* gridTransformation)", 
    7376            "Impossible to get the requested engine, the grid transformation is invalid."); 
    74  
     77     
    7578    if(engines_ptr == NULL) engines_ptr = new std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> >; 
    7679 
     80    //std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> >::iterator it = engines.find(gridTransformation); 
    7781    std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> >::iterator it = engines_ptr->find(gridTransformation); 
     82    //if (it == engines.end()) 
    7883    if (it == engines_ptr->end()) 
    7984    { 
    8085      boost::shared_ptr<CSpatialTransformFilterEngine> engine(new CSpatialTransformFilterEngine(gridTransformation)); 
     86      //it = engines.insert(std::make_pair(gridTransformation, engine)).first; 
    8187      it = engines_ptr->insert(std::make_pair(gridTransformation, engine)).first; 
    8288    } 
     
    122128    double defaultValue = std::numeric_limits<double>::quiet_NaN(); 
    123129    if (0 != dataDest.numElements()) ignoreMissingValue = NumTraits<double>::isnan(dataDest(0)); 
    124      
    125     const std::list<CGridTransformation::SendingIndexGridSourceMap> *listLocalIndexSend_ptr = & (gridTransformation->getLocalIndexToSendFromGridSource()); 
    126      
     130 
    127131    const std::list<CGridTransformation::SendingIndexGridSourceMap>& listLocalIndexSend = gridTransformation->getLocalIndexToSendFromGridSource(); 
    128132    const std::list<CGridTransformation::RecvIndexGridDestinationMap>& listLocalIndexToReceive = gridTransformation->getLocalIndexToReceiveOnGridDest(); 
     
    133137    CArray<double,1> dataCurrentDest(dataSrc.copy()); 
    134138 
    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(); 
    137141    std::list<CGridTransformation::RecvIndexGridDestinationMap>::const_iterator itListRecv = listLocalIndexToReceive.begin(); 
    138142    std::list<size_t>::const_iterator itNbListRecv = listNbLocalIndexToReceive.begin(); 
     
    155159          sendBuff[idxSendBuff] = new double[itSend->second.numElements()]; 
    156160      } 
    157        
    158       const CGridTransformation::RecvIndexGridDestinationMap& localIndexToReceive = *itListRecv; 
    159       CGridTransformation::RecvIndexGridDestinationMap::const_iterator itbRecv = localIndexToReceive.begin(), itRecv, 
    160                                                                        iteRecv = localIndexToReceive.end(); 
    161161 
    162162      idxSendBuff = 0; 
    163       std::vector<ep_lib::MPI_Request> sendRecvRequest(localIndexToSend.size()+localIndexToReceive.size()); 
     163      std::vector<MPI_Request> sendRecvRequest(localIndexToSend.size() + itListRecv->size()); 
    164164      int position = 0; 
    165165      for (itSend = itbSend; itSend != iteSend; ++itSend, ++idxSendBuff) 
     
    172172          sendBuff[idxSendBuff][idx] = dataCurrentSrc(localIndex_p(idx)); 
    173173        } 
    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++]); 
    176175      } 
    177176 
    178177      // 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(); 
    180181      int recvBuffSize = 0; 
    181182      for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) recvBuffSize += itRecv->second.size(); //(recvBuffSize < itRecv->second.size()) 
     
    188189        int srcRank = itRecv->first; 
    189190        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++]); 
    192192        currentBuff += countSize; 
    193193      } 
    194       std::vector<ep_lib::MPI_Status> status(sendRecvRequest.size()); 
     194      std::vector<MPI_Status> status(sendRecvRequest.size()); 
    195195      MPI_Waitall(sendRecvRequest.size(), &sendRecvRequest[0], &status[0]); 
    196196 
     
    203203      std::vector<bool> localInitFlag(dataCurrentDest.numElements(), true); 
    204204      currentBuff = 0; 
     205      bool firstPass=true;  
    205206      for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) 
    206207      { 
     
    211212                         dataCurrentDest, 
    212213                         localInitFlag, 
    213                          ignoreMissingValue); 
     214                         ignoreMissingValue,firstPass); 
    214215 
    215216        currentBuff += countSize; 
     217        firstPass=false ; 
    216218      } 
    217219 
Note: See TracChangeset for help on using the changeset viewer.