Ignore:
Timestamp:
06/14/16 16:28:07 (8 years ago)
Author:
mhnguyen
Message:

Masked interpolated points will have default_value (if defined)

+) Default value is used to initialize spatial transform filter
+) Add a new case for testing masked points

Test
+) On Curie
+) All interpolation tests work

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/filter/spatial_transform_filter.cpp

    r842 r873  
    66namespace xios 
    77{ 
    8   CSpatialTransformFilter::CSpatialTransformFilter(CGarbageCollector& gc, CSpatialTransformFilterEngine* engine, size_t inputSlotsCount) 
    9     : CFilter(gc, inputSlotsCount, engine) 
     8  CSpatialTransformFilter::CSpatialTransformFilter(CGarbageCollector& gc, CSpatialTransformFilterEngine* engine, double outputValue, size_t inputSlotsCount) 
     9    : CFilter(gc, inputSlotsCount, engine), outputDefaultValue(outputValue) 
    1010  { /* Nothing to do */ } 
    1111 
    1212  std::pair<boost::shared_ptr<CSpatialTransformFilter>, boost::shared_ptr<CSpatialTransformFilter> > 
    13   CSpatialTransformFilter::buildFilterGraph(CGarbageCollector& gc, CGrid* srcGrid, CGrid* destGrid) 
     13  CSpatialTransformFilter::buildFilterGraph(CGarbageCollector& gc, CGrid* srcGrid, CGrid* destGrid, double defaultValue) 
    1414  { 
    1515    if (!srcGrid || !destGrid) 
     
    2626      const std::vector<StdString>& auxInputs = gridTransformation->getAuxInputs(); 
    2727      size_t inputCount = 1 + (auxInputs.empty() ? 0 : auxInputs.size()); 
    28       boost::shared_ptr<CSpatialTransformFilter> filter(new CSpatialTransformFilter(gc, engine, inputCount)); 
     28      boost::shared_ptr<CSpatialTransformFilter> filter(new CSpatialTransformFilter(gc, engine, defaultValue, inputCount)); 
    2929 
    3030      if (!lastFilter) 
     
    4848  } 
    4949 
     50  void CSpatialTransformFilter::onInputReady(std::vector<CDataPacketPtr> data) 
     51  { 
     52    CSpatialTransformFilterEngine* spaceFilter = static_cast<CSpatialTransformFilterEngine*>(engine); 
     53    CDataPacketPtr outputPacket = spaceFilter->applyFilter(data, outputDefaultValue); 
     54    if (outputPacket) 
     55      deliverOuput(outputPacket); 
     56  } 
     57 
    5058  CSpatialTransformFilterEngine::CSpatialTransformFilterEngine(CGridTransformation* gridTransformation) 
    5159    : gridTransformation(gridTransformation) 
     
    7583 
    7684  CDataPacketPtr CSpatialTransformFilterEngine::apply(std::vector<CDataPacketPtr> data) 
     85  { 
     86    /* Nothing to do */ 
     87  } 
     88 
     89  CDataPacketPtr CSpatialTransformFilterEngine::applyFilter(std::vector<CDataPacketPtr> data, double defaultValue) 
    7790  { 
    7891    CDataPacketPtr packet(new CDataPacket); 
     
    90103      } 
    91104      packet->data.resize(gridTransformation->getGridDestination()->storeIndex_client.numElements()); 
     105      packet->data = defaultValue; 
    92106      apply(data[0]->data, packet->data); 
    93107    } 
     
    99113  { 
    100114    CContextClient* client = CContext::getCurrent()->client; 
     115 
     116    // Get default value for output data 
     117    double defaultValue = 0.0; 
     118    if (0 != dataDest.numElements()) defaultValue = dataDest(0); 
    101119 
    102120    const std::list<CGridTransformation::SendingIndexGridSourceMap>& listLocalIndexSend = gridTransformation->getLocalIndexToSendFromGridSource(); 
    103121    const std::list<CGridTransformation::RecvIndexGridDestinationMap>& listLocalIndexToReceive = gridTransformation->getLocalIndexToReceiveOnGridDest(); 
    104122    const std::list<size_t>& listNbLocalIndexToReceive = gridTransformation->getNbLocalIndexToReceiveOnGridDest(); 
     123    const std::list<std::vector<bool> >& listLocalIndexMaskOnDest = gridTransformation->getLocalMaskIndexOnGridDest(); 
    105124 
    106125    CArray<double,1> dataCurrentDest(dataSrc.copy()); 
     
    110129    std::list<CGridTransformation::RecvIndexGridDestinationMap>::const_iterator itListRecv = listLocalIndexToReceive.begin(); 
    111130    std::list<size_t>::const_iterator itNbListRecv = listNbLocalIndexToReceive.begin(); 
    112  
    113     for (; itListSend != iteListSend; ++itListSend, ++itListRecv, ++itNbListRecv) 
     131    std::list<std::vector<bool> >::const_iterator itLocalMaskIndexOnDest = listLocalIndexMaskOnDest.begin(); 
     132 
     133    for (; itListSend != iteListSend; ++itListSend, ++itListRecv, ++itNbListRecv, ++itLocalMaskIndexOnDest) 
    114134    { 
    115135      CArray<double,1> dataCurrentSrc(dataCurrentDest); 
     
    164184 
    165185      dataCurrentDest.resize(*itNbListRecv); 
    166       dataCurrentDest = 0.0; 
     186      const std::vector<bool>& localMaskDest = *itLocalMaskIndexOnDest; 
     187      for (int i = 0; i < localMaskDest.size(); ++i) 
     188        if (localMaskDest[i]) dataCurrentDest(i) = 0.0; 
     189        else dataCurrentDest(i) = defaultValue; 
     190 
    167191      currentBuff = 0; 
    168192      for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) 
Note: See TracChangeset for help on using the changeset viewer.