/*! \file domain_algorithm_interpolate_from_file.hpp \author Ha NGUYEN \since 09 July 2015 \date 09 Sep 2015 \brief Algorithm for interpolation on a domain. */ #ifndef __XIOS_DOMAIN_ALGORITHM_INTERPOLATE_HPP__ #define __XIOS_DOMAIN_ALGORITHM_INTERPOLATE_HPP__ #include "mpi_std.hpp" #include "domain_algorithm_transformation.hpp" #include "transformation.hpp" #include "nc4_data_output.hpp" namespace xios { class CDomain; class CInterpolateDomain; /*! \class CDomainAlgorithmInterpolate Reading interpolation from file then apply on a domain */ class CDomainAlgorithmInterpolate : public CDomainAlgorithmTransformation { public: CDomainAlgorithmInterpolate(CDomain* domainDestination, CDomain* domainSource, CInterpolateDomain* interpDomain); virtual ~CDomainAlgorithmInterpolate() {} virtual void apply(const std::vector >& localIndex, const double* dataInput, CArray& dataOut, std::vector& flagInitial, bool ignoreMissingValue, bool firstPass); virtual void updateData(CArray& dataOut); static bool registerTrans(); protected: void computeIndexSourceMapping_(const std::vector* >& dataAuxInputs); private: void readInterpolationInfo(std::string& filename, std::map > >& interpMapValue); void writeInterpolationInfo(std::string& filename, std::map > >& interpMapValue); void processPole(std::map > >& interMapValuePole, int nbGlobalPointOnPole); void computeRemap(); void readRemapInfo(); void writeRemapInfo(std::map > >&); void exchangeRemapInfo(std::map > >& interpMapValue); void convertRemapInfo(std::map > >& interpMapValue); private: CArray renormalizationFactor ; CArray allMissing ; bool detectMissingValue ; bool renormalize ; bool quantity ; CInterpolateDomain* interpDomain_; bool writeToFile_; bool readFromFile_; StdString fileToReadWrite_; bool fortranConvention ; // class WriteNetCdf; class WriteNetCdf : public CNc4DataOutput { public: WriteNetCdf(const StdString& filename, const ep_lib::MPI_Comm comm); int addDimensionWrite(const StdString& name, const StdSize size = UNLIMITED_DIM); int addVariableWrite(const StdString& name, nc_type type, const std::vector& dim); void endDefinition(); void writeDataIndex(const CArray& data, const StdString& name, bool collective, StdSize record, const std::vector* start = NULL, const std::vector* count = NULL); void writeDataIndex(const CArray& data, const StdString& name, bool collective, StdSize record, const std::vector* start = NULL, const std::vector* count = NULL); }; 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_DOMAIN_ALGORITHM_INTERPOLATE_HPP__