source: XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/transformation.hpp @ 2011

Last change on this file since 2011 was 2011, checked in by ymipsl, 3 years ago
  • bug fix when createing mask on server side when overlapping grid
  • implement axis interpolation on pressure coordinate
  • big cleaning in transformation

YM

  • Property svn:executable set to *
File size: 5.1 KB
Line 
1#ifndef __XIOS_CTransformation__
2#define __XIOS_CTransformation__
3
4#include "xios_spl.hpp"
5#include "xml_node.hpp"
6#include "transformation_enum.hpp"
7
8namespace xios {
9
10  ///--------------------------------------------------------------
11  /*!
12    \class CTransformation
13    This class describes inverse_axis in xml file.
14  */
15  class CGenericAlgorithmTransformation;
16   class CGrid;
17
18  template<typename T>
19  class CTransformation
20  {
21  public:
22    typedef typename std::list<std::pair<ETranformationType, CTransformation<T>* > > TransformationMapTypes;
23    typedef TransformationMapTypes TransMapTypes;
24
25    public :
26      /// Constructeurs ///
27      CTransformation(void) {}
28      virtual void checkValid(T* dest) {}
29
30      std::vector<StdString> checkAuxInputs() { return checkAuxInputs_(); }
31      static CTransformation<T>* createTransformation(ETranformationType transType, const StdString& id, xml::CXMLNode* node=0);
32      static CTransformation<T>* getTransformation(ETranformationType transType, const StdString& id);
33
34      virtual const string& getId(void) = 0 ;
35      virtual ETranformationType getTransformationType(void)=0;
36      virtual void inheritFrom(CTransformation<T>* src) = 0 ;
37
38      virtual const string& getId_(void) { ERROR("string Transformation<T>::getId())",<< "unimplemented virtual function for child"); } ;
39      virtual const string& getName(void) { ERROR("string Transformation<T>::getId())",<< "unimplemented virtual function for child"); } ;
40      virtual const string& getDefName(void) { ERROR("string Transformation<T>::getId())",<< "unimplemented virtual function for child"); } ;
41      virtual CGenericAlgorithmTransformation* createAlgorithm(bool isSource,
42                                                               CGrid* gridDst, CGrid* gridSrc,
43                                                               int elementPositionInGrid,
44                                                               std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
45                                                               std::map<int, int>& elementPositionInGridSrc2AxisPosition,
46                                                               std::map<int, int>& elementPositionInGridSrc2DomainPosition,
47                                                               std::map<int, int>& elementPositionInGridDst2ScalarPosition,
48                                                               std::map<int, int>& elementPositionInGridDst2AxisPosition,
49                                                               std::map<int, int>& elementPositionInGridDst2DomainPosition) =0 ;
50
51      /// Destructeur ///
52    public:
53      virtual ~CTransformation(void) {}
54
55    protected:
56      typedef CTransformation<T>* (*createTransformationCallBack)(const StdString&, xml::CXMLNode*);
57      typedef CTransformation<T>* (*getIdTransformationCallBack)(const StdString&);
58      typedef std::map<ETranformationType, tuple<createTransformationCallBack,getIdTransformationCallBack>> callBackMap;
59      static callBackMap* callBacks_;
60
61      static bool registerTransformation(ETranformationType transType, tuple<createTransformationCallBack,getIdTransformationCallBack> callBackFunctions);
62      static bool unregisterTransformation(ETranformationType transType);
63
64    protected:
65      virtual std::vector<StdString> checkAuxInputs_() { return std::vector<StdString>(); }
66
67  }; // class CTransformation
68
69  template<typename T>
70  typename CTransformation<T>::callBackMap* CTransformation<T>::callBacks_ = 0; //CTransformation<T>::CallBackMap();
71
72  template<typename T>
73  CTransformation<T>* CTransformation<T>::createTransformation(ETranformationType transType, const StdString& id, xml::CXMLNode* node)
74  {
75    int transTypeInt = transType;
76    typename callBackMap::const_iterator it = (*callBacks_).find(transType);
77    if ((*callBacks_).end() == it)
78    {
79       ERROR("CTransformation<T>::createTransformation(ETranformationType transType)",
80             << "Transformation type " << transType
81             << "doesn't exist. Please define.");
82    }
83    return (get<0>(it->second))(id,node);
84  }
85
86  template<typename T>
87  CTransformation<T>* CTransformation<T>::getTransformation(ETranformationType transType, const StdString& id)
88  {
89    int transTypeInt = transType;
90    typename callBackMap::const_iterator it = (*callBacks_).find(transType);
91    if ((*callBacks_).end() == it)
92    {
93       ERROR("CTransformation<T>::getTransformation(ETranformationType transType, const StdString& id)",
94             << "Transformation type " << transType
95             << "doesn't exist. Please define.");
96    }
97    return (get<1>(it->second))(id);
98  }
99
100  template<typename T>
101  bool CTransformation<T>::registerTransformation(ETranformationType transType,  tuple<createTransformationCallBack, getIdTransformationCallBack> functions)
102  {
103    if (0 == callBacks_) callBacks_ = new callBackMap();
104    return (* callBacks_).insert(make_pair(transType, functions)).second;
105  }
106
107  template<typename T>
108  bool CTransformation<T>::unregisterTransformation(ETranformationType transType)
109  {
110    int transTypeInt = transType;
111    return (1 == (*callBacks_).erase(transType));
112  }
113
114} // namespace xios
115
116#endif // __XIOS_CTransformation__
Note: See TracBrowser for help on using the repository browser.