Ignore:
Timestamp:
03/22/18 10:43:20 (6 years ago)
Author:
yushan
Message:

branch_openmp merged with XIOS_DEV_CMIP6@1459

File:
1 edited

Legend:

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

    r1328 r1460  
    44#include "context.hpp" 
    55#include "context_client.hpp" 
     6#include "timer.hpp" 
    67using namespace ep_lib; 
    78 
     
    2930      size_t inputCount = 1 + (auxInputs.empty() ? 0 : auxInputs.size()); 
    3031      double defaultValue  = (hasMissingValue) ? std::numeric_limits<double>::quiet_NaN() : 0.0; 
    31       boost::shared_ptr<CSpatialTransformFilter> filter(new CSpatialTransformFilter(gc, engine, defaultValue, inputCount)); 
    32  
     32 
     33 
     34      const CGridTransformationSelector::ListAlgoType& algoList = gridTransformation->getAlgoList() ; 
     35      CGridTransformationSelector::ListAlgoType::const_iterator it  ; 
     36 
     37      bool isSpatialTemporal=false ; 
     38      for (it=algoList.begin();it!=algoList.end();++it)  if (it->second.first == TRANS_TEMPORAL_SPLITTING) isSpatialTemporal=true ; 
     39 
     40      boost::shared_ptr<CSpatialTransformFilter> filter ; 
     41      if( isSpatialTemporal) filter = boost::shared_ptr<CSpatialTransformFilter>(new CSpatialTemporalFilter(gc, engine, gridTransformation, defaultValue, inputCount)); 
     42      else filter = boost::shared_ptr<CSpatialTransformFilter>(new CSpatialTransformFilter(gc, engine, defaultValue, inputCount)); 
     43 
     44       
    3345      if (!lastFilter) 
    3446        lastFilter = filter; 
     
    5870      onOutputReady(outputPacket); 
    5971  } 
     72 
     73 
     74 
     75 
     76 
     77  CSpatialTemporalFilter::CSpatialTemporalFilter(CGarbageCollector& gc, CSpatialTransformFilterEngine* engine, CGridTransformation* gridTransformation, double outputValue, size_t inputSlotsCount) 
     78    : CSpatialTransformFilter(gc, engine, outputValue, inputSlotsCount), record(0) 
     79  { 
     80      const CGridTransformationSelector::ListAlgoType& algoList = gridTransformation->getAlgoList() ; 
     81      CGridTransformationSelector::ListAlgoType::const_iterator it  ; 
     82 
     83      int pos ; 
     84      for (it=algoList.begin();it!=algoList.end();++it)  
     85        if (it->second.first == TRANS_TEMPORAL_SPLITTING) 
     86        { 
     87          pos=it->first ; 
     88          if (pos < algoList.size()-1) 
     89            ERROR("SpatialTemporalFilter::CSpatialTemporalFilter(CGarbageCollector& gc, CSpatialTransformFilterEngine* engine, CGridTransformation* gridTransformation, double outputValue, size_t inputSlotsCount))", 
     90                  "temporal splitting operation must be the last of whole transformation on same grid") ; 
     91        } 
     92           
     93      CGrid* grid=gridTransformation->getGridDestination() ; 
     94 
     95      CAxis* axis = grid->getAxis(gridTransformation->getElementPositionInGridDst2AxisPosition().find(pos)->second) ; 
     96 
     97      nrecords = axis->index.numElements() ; 
     98  } 
     99 
     100 
     101  void CSpatialTemporalFilter::onInputReady(std::vector<CDataPacketPtr> data) 
     102  { 
     103    CSpatialTransformFilterEngine* spaceFilter = static_cast<CSpatialTransformFilterEngine*>(engine); 
     104    CDataPacketPtr outputPacket = spaceFilter->applyFilter(data, outputDefaultValue); 
     105 
     106    if (outputPacket) 
     107    { 
     108      size_t nelements=outputPacket->data.numElements() ; 
     109      if (!tmpData.numElements()) 
     110      { 
     111        tmpData.resize(nelements); 
     112        tmpData=outputDefaultValue ; 
     113      } 
     114 
     115      nelements/=nrecords ; 
     116      size_t offset=nelements*record ; 
     117      for(size_t i=0;i<nelements;++i)  tmpData(i+offset) = outputPacket->data(i) ; 
     118     
     119      record ++ ; 
     120      if (record==nrecords) 
     121      { 
     122        record=0 ; 
     123        CDataPacketPtr packet = CDataPacketPtr(new CDataPacket); 
     124        packet->date = data[0]->date; 
     125        packet->timestamp = data[0]->timestamp; 
     126        packet->status = data[0]->status; 
     127        packet->data.resize(tmpData.numElements()); 
     128        packet->data = tmpData; 
     129        onOutputReady(packet); 
     130        tmpData.resize(0) ; 
     131      } 
     132    } 
     133  } 
     134 
    60135 
    61136  CSpatialTransformFilterEngine::CSpatialTransformFilterEngine(CGridTransformation* gridTransformation) 
     
    122197  void CSpatialTransformFilterEngine::apply(const CArray<double, 1>& dataSrc, CArray<double,1>& dataDest) 
    123198  { 
     199    CTimer::get("CSpatialTransformFilterEngine::apply").resume();  
     200     
    124201    CContextClient* client = CContext::getCurrent()->client; 
    125202 
     
    235312 
    236313    dataDest = dataCurrentDest; 
     314 
     315    CTimer::get("CSpatialTransformFilterEngine::apply").suspend() ; 
    237316  } 
    238317} // namespace xios 
Note: See TracChangeset for help on using the changeset viewer.