Ignore:
Timestamp:
09/25/17 10:59:29 (7 years ago)
Author:
ymipsl
Message:

implement diurnal cycle transformation taken as a grid tranformation : scalar -> axis

YM

File:
1 edited

Legend:

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

    r1260 r1275  
    2727      size_t inputCount = 1 + (auxInputs.empty() ? 0 : auxInputs.size()); 
    2828      double defaultValue  = (hasMissingValue) ? std::numeric_limits<double>::quiet_NaN() : 0.0; 
    29       boost::shared_ptr<CSpatialTransformFilter> filter(new CSpatialTransformFilter(gc, engine, defaultValue, inputCount)); 
    30  
     29 
     30 
     31      const CGridTransformationSelector::ListAlgoType& algoList = gridTransformation->getAlgoList() ; 
     32      CGridTransformationSelector::ListAlgoType::const_iterator it  ; 
     33 
     34      bool isSpatialTemporal=false ; 
     35      for (it=algoList.begin();it!=algoList.end();++it)  if (it->second.first == TRANS_TEMPORAL_SPLITTING) isSpatialTemporal=true ; 
     36 
     37      boost::shared_ptr<CSpatialTransformFilter> filter ; 
     38      if( isSpatialTemporal) filter = boost::shared_ptr<CSpatialTransformFilter>(new CSpatialTemporalFilter(gc, engine, gridTransformation, defaultValue, inputCount)); 
     39      else filter = boost::shared_ptr<CSpatialTransformFilter>(new CSpatialTransformFilter(gc, engine, defaultValue, inputCount)); 
     40 
     41       
    3142      if (!lastFilter) 
    3243        lastFilter = filter; 
     
    5667      onOutputReady(outputPacket); 
    5768  } 
     69 
     70 
     71 
     72 
     73 
     74  CSpatialTemporalFilter::CSpatialTemporalFilter(CGarbageCollector& gc, CSpatialTransformFilterEngine* engine, CGridTransformation* gridTransformation, double outputValue, size_t inputSlotsCount) 
     75    : CSpatialTransformFilter(gc, engine, outputValue, inputSlotsCount), record(0) 
     76  { 
     77      const CGridTransformationSelector::ListAlgoType& algoList = gridTransformation->getAlgoList() ; 
     78      CGridTransformationSelector::ListAlgoType::const_iterator it  ; 
     79 
     80      int pos ; 
     81      for (it=algoList.begin();it!=algoList.end();++it)  
     82        if (it->second.first == TRANS_TEMPORAL_SPLITTING) 
     83        { 
     84          pos=it->first ; 
     85          if (pos < algoList.size()-1) 
     86            ERROR("SpatialTemporalFilter::CSpatialTemporalFilter(CGarbageCollector& gc, CSpatialTransformFilterEngine* engine, CGridTransformation* gridTransformation, double outputValue, size_t inputSlotsCount))", 
     87                  "temporal splitting operation must be the last of whole transformation on same grid") ; 
     88        } 
     89           
     90      CGrid* grid=gridTransformation->getGridDestination() ; 
     91 
     92      CAxis* axis = grid->getAxis(gridTransformation->getElementPositionInGridDst2AxisPosition().find(pos)->second) ; 
     93 
     94      nrecords = axis->index.numElements() ; 
     95  } 
     96 
     97 
     98  void CSpatialTemporalFilter::onInputReady(std::vector<CDataPacketPtr> data) 
     99  { 
     100    CSpatialTransformFilterEngine* spaceFilter = static_cast<CSpatialTransformFilterEngine*>(engine); 
     101    CDataPacketPtr outputPacket = spaceFilter->applyFilter(data, outputDefaultValue); 
     102 
     103    if (outputPacket) 
     104    { 
     105      size_t nelements=outputPacket->data.numElements() ; 
     106      if (!tmpData.numElements()) 
     107      { 
     108        tmpData.resize(nelements); 
     109        tmpData=outputDefaultValue ; 
     110      } 
     111 
     112      nelements/=nrecords ; 
     113      size_t offset=nelements*record ; 
     114      for(size_t i=0;i<nelements;++i)  tmpData(i+offset) = outputPacket->data(i) ; 
     115     
     116      record ++ ; 
     117      if (record==nrecords) 
     118      { 
     119        record=0 ; 
     120        CDataPacketPtr packet = CDataPacketPtr(new CDataPacket); 
     121        packet->date = data[0]->date; 
     122        packet->timestamp = data[0]->timestamp; 
     123        packet->status = data[0]->status; 
     124        packet->data.resize(tmpData.numElements()); 
     125        packet->data = tmpData; 
     126        onOutputReady(packet); 
     127        tmpData.resize(0) ; 
     128      } 
     129    } 
     130  } 
     131 
    58132 
    59133  CSpatialTransformFilterEngine::CSpatialTransformFilterEngine(CGridTransformation* gridTransformation) 
Note: See TracChangeset for help on using the changeset viewer.