/*! \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 "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() {} 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: CInterpolateDomain* interpDomain_; bool writeToFile_; bool readFromFile_; StdString fileToReadWrite_; // class WriteNetCdf; class WriteNetCdf : public CNc4DataOutput { public: WriteNetCdf(const StdString& filename, const 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__