Changeset 1275 for XIOS/dev/XIOS_DEV_CMIP6/src/filter
- Timestamp:
- 09/25/17 10:59:29 (7 years ago)
- Location:
- XIOS/dev/XIOS_DEV_CMIP6/src/filter
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/XIOS_DEV_CMIP6/src/filter/spatial_transform_filter.cpp
r1260 r1275 27 27 size_t inputCount = 1 + (auxInputs.empty() ? 0 : auxInputs.size()); 28 28 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 31 42 if (!lastFilter) 32 43 lastFilter = filter; … … 56 67 onOutputReady(outputPacket); 57 68 } 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 58 132 59 133 CSpatialTransformFilterEngine::CSpatialTransformFilterEngine(CGridTransformation* gridTransformation) -
XIOS/dev/XIOS_DEV_CMIP6/src/filter/spatial_transform_filter.hpp
r1158 r1275 49 49 double outputDefaultValue; 50 50 }; // class CSpatialTransformFilter 51 52 53 /*! 54 * A specific spatial filter for the temporal_splitting transformation scalar -> axis. An incoming flux will be stored in an aditional dimension given by the destination axis. 55 * At each flux received, the storing index (record) is increased. When it reach the size of the axis (nrecords) a new flux is generated and the record is reset to 0 56 */ 57 58 class CSpatialTemporalFilter : public CSpatialTransformFilter 59 { 60 public: 61 /*! 62 * Constructs a filter wrapping the specified spatial transformation. 63 * 64 * \param gc the associated garbage collector 65 * \param engine the engine defining the spatial transformation 66 * \param [in] gridTransformation the associated transformations 67 * \param outputValue default value of output pin 68 * \param [in] inputSlotsCount number of input, by default there is only one for field src 69 */ 70 CSpatialTemporalFilter(CGarbageCollector& gc, CSpatialTransformFilterEngine* engine, CGridTransformation* gridTransformation, double outputValue, size_t inputSlotsCount = 1); 71 72 73 protected: 74 /*! 75 Overriding this function to process transformations with auxillary inputs 76 */ 77 void virtual onInputReady(std::vector<CDataPacketPtr> data); 78 //! Current record in the filter 79 int record ; 80 //! Maximum number of records 81 int nrecords; 82 //! Temporary storage for output flux 83 CArray<double, 1> tmpData; 84 85 86 }; // class CSpatialTemporalFilter 87 51 88 52 89 /*!
Note: See TracChangeset
for help on using the changeset viewer.