/*! \file axis_algorithm_interpolate.hpp \author Ha NGUYEN \since 23 June 2015 \date 23 June 2015 \brief Algorithm for interpolation on an axis. */ #ifndef __XIOS_AXIS_ALGORITHM_INTERPOLATE_HPP__ #define __XIOS_AXIS_ALGORITHM_INTERPOLATE_HPP__ #include "axis_algorithm_transformation.hpp" #include "transformation.hpp" namespace xios { class CAxis; class CGrid; class CInterpolateAxis; /*! \class CAxisAlgorithmInterpolate Implementing interpolation on axis The values on axis source are assumed monotonic */ class CAxisAlgorithmInterpolate : public CAxisAlgorithmTransformation { public: CAxisAlgorithmInterpolate(CAxis* axisDestination, CAxis* axisSource, CInterpolateAxis* interpAxis); virtual ~CAxisAlgorithmInterpolate() {} static bool registerTrans(); protected: void computeIndexSourceMapping_(const std::vector* >& dataAuxInputs); private: void retrieveAllAxisValue(const CArray& axisValue, const CArray& axisMask, std::vector& recvBuff, std::vector& indexVec); void computeInterpolantPoint(const std::vector& recvBuff, const std::vector&, int transPos = 0); void computeWeightedValueAndMapping(const std::map > >& interpolatingIndexValues, int transPos = 0); void fillInAxisValue(std::vector >& vecAxisValue, const std::vector* >& dataAuxInputs); private: // Interpolation order int order_; StdString coordinate_; std::vector > transPosition_; private: static CGenericAlgorithmTransformation* create(CGrid* gridDst, CGrid* gridSrc, CTransformation* transformation, int elementPositionInGrid, std::map& elementPositionInGridSrc2ScalarPosition, std::map& elementPositionInGridSrc2AxisPosition, std::map& elementPositionInGridSrc2DomainPosition, std::map& elementPositionInGridDst2ScalarPosition, std::map& elementPositionInGridDst2AxisPosition, std::map& elementPositionInGridDst2DomainPosition); }; } #endif // __XIOS_AXIS_ALGORITHM_INTERPOLATE_HPP__