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

dev_omp

Location:
XIOS/dev/branch_openmp/src/filter
Files:
6 edited

Legend:

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

    r1205 r1328  
    1717  void CFileWriterFilter::onInputReady(std::vector<CDataPacketPtr> data) 
    1818  { 
    19     CDataPacketPtr packet = data[0]; 
    20  
    2119    const bool detectMissingValue = (!field->detect_missing_value.isEmpty() 
    2220                                      && !field->default_value.isEmpty() 
    2321                                      && field->detect_missing_value == true); 
     22 
     23    CArray<double, 1> dataArray = (detectMissingValue) ? data[0]->data.copy() : data[0]->data; 
     24 
    2425    if (detectMissingValue) 
    2526    { 
    2627      const double missingValue = field->default_value; 
    27       const size_t nbData = packet->data.numElements(); 
     28      const size_t nbData = dataArray.numElements(); 
    2829      for (size_t idx = 0; idx < nbData; ++idx) 
    2930      { 
    30         if (NumTraits<double>::isnan(packet->data(idx))) 
    31           packet->data(idx) = missingValue; 
     31        if (NumTraits<double>::isnan(dataArray(idx))) 
     32          dataArray(idx) = missingValue; 
    3233      } 
    3334    } 
    3435 
    35     field->sendUpdateData(packet->data); 
     36    field->sendUpdateData(dataArray); 
    3637  } 
    3738 
  • XIOS/dev/branch_openmp/src/filter/source_filter.cpp

    r1205 r1328  
    9999  void CSourceFilter::signalEndOfStream(CDate date) 
    100100  { 
     101    date = date + offset; // this is a temporary solution, it should be part of a proper temporal filter 
     102 
    101103    CDataPacketPtr packet(new CDataPacket); 
    102104    packet->date = date; 
  • 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 
  • XIOS/dev/branch_openmp/src/filter/spatial_transform_filter.hpp

    r1134 r1328  
    33 
    44#include "filter.hpp" 
    5  
    65namespace xios 
    76{ 
     
    106105      //static std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> > engines; 
    107106      static std::map<CGridTransformation*, boost::shared_ptr<CSpatialTransformFilterEngine> > *engines_ptr; 
    108       #pragma omp threadprivate(engines_ptr) 
    109        
    110107  }; // class CSpatialTransformFilterEngine 
    111108} // namespace xios 
  • XIOS/dev/branch_openmp/src/filter/store_filter.cpp

    r1205 r1328  
    7878  void CStoreFilter::onInputReady(std::vector<CDataPacketPtr> data) 
    7979  { 
    80     CDataPacketPtr packet = data[0]; 
     80 
     81    CDataPacketPtr packet; 
     82    if (detectMissingValues) 
     83    { 
     84      const size_t nbData = data[0]->data.numElements(); 
     85 
     86      packet = CDataPacketPtr(new CDataPacket); 
     87      packet->date = data[0]->date; 
     88      packet->timestamp = data[0]->timestamp; 
     89      packet->status = data[0]->status; 
     90      packet->data.resize(nbData); 
     91      packet->data = data[0]->data; 
     92 
     93      for (size_t idx = 0; idx < nbData; ++idx) 
     94      { 
     95        if (NumTraits<double>::isnan(packet->data(idx))) 
     96          packet->data(idx) = missingValue; 
     97      } 
     98 
     99    } 
     100 
     101    else 
     102    { 
     103      packet = data[0]; 
     104    } 
    81105 
    82106    packets.insert(std::make_pair(packet->timestamp, packet)); 
     
    85109    gc.registerObject(this, packet->timestamp); 
    86110 
    87     if (detectMissingValues) 
    88     { 
    89       const size_t nbData = packet->data.numElements(); 
    90       for (size_t idx = 0; idx < nbData; ++idx) 
    91       { 
    92         if (NumTraits<double>::isnan(packet->data(idx))) 
    93           packet->data(idx) = missingValue; 
    94       } 
    95     } 
    96111  } 
    97112 
  • XIOS/dev/branch_openmp/src/filter/temporal_filter.cpp

    r1124 r1328  
    1414    , isOnceOperation(functor->timeType() == func::CFunctor::once) 
    1515    , isInstantOperation(functor->timeType() == func::CFunctor::instant) 
    16     // If we can optimize the sampling when dealing with an instant functor we do it 
    17     , samplingFreq((isInstantOperation && samplingFreq == TimeStep && samplingOffset == NoneDu) ? opFreq : samplingFreq) 
    18     , samplingOffset((isInstantOperation && samplingFreq == TimeStep && samplingOffset == NoneDu) ? opFreq - initDate.getRelCalendar().getTimeStep() : samplingOffset) 
     16    , samplingFreq(samplingFreq) 
     17    , samplingOffset(samplingOffset) 
    1918    , opFreq(opFreq) 
    2019    , nextSamplingDate(initDate + this->samplingOffset + initDate.getRelCalendar().getTimeStep()) 
Note: See TracChangeset for help on using the changeset viewer.