source: XIOS/dev/branch_yushan/src/transformation/grid_transformation_factory_impl.hpp @ 1101

Last change on this file since 1101 was 1101, checked in by yushan, 7 years ago

From ADA, test_omp (test_client + openmp) OK. Todo: add field_C

File size: 6.3 KB
Line 
1/*!
2   \file grid_transformation_factory_impl.hpp
3   \author Ha NGUYEN
4   \since 23 June 2016
5   \date 23 June 2016
6
7   \brief Helper class to create different transformations.
8 */
9#ifndef __XIOS_GRID_TRANSFORMATION_FACTORY_HPP__
10#define __XIOS_GRID_TRANSFORMATION_FACTORY_HPP__
11
12#include "xios_spl.hpp"
13#include "exception.hpp"
14#include "transformation.hpp"
15
16namespace xios {
17
18class CGrid;
19class CGenericAlgorithmTransformation;
20
21
22/*!
23  \class CGridTransformationFactory
24  This class is a helper class to chose a algorithm (transformation) from the alogrithm list of
25specific grid.
26*/
27template<typename T>
28class CGridTransformationFactory
29{
30public:
31  /** Default constructor */
32  CGridTransformationFactory() {}
33  virtual ~CGridTransformationFactory() {}
34
35  static CGenericAlgorithmTransformation* createTransformation(ETranformationType transType,
36                                                               CGrid* gridDst, CGrid* gridSrc,
37                                                               CTransformation<T>* transformation,
38                                                               int elementPositionInGrid,
39                                                               std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
40                                                               std::map<int, int>& elementPositionInGridSrc2AxisPosition,
41                                                               std::map<int, int>& elementPositionInGridSrc2DomainPosition,
42                                                               std::map<int, int>& elementPositionInGridDst2ScalarPosition,
43                                                               std::map<int, int>& elementPositionInGridDst2AxisPosition,
44                                                               std::map<int, int>& elementPositionInGridDst2DomainPosition);
45
46public:
47  typedef CGenericAlgorithmTransformation* (*CreateTransformationCallBack)(CGrid* gridDst, CGrid* gridSrc,
48                                                                           CTransformation<T>* transformation,
49                                                                           int elementPositionInGrid,
50                                                                           std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
51                                                                           std::map<int, int>& elementPositionInGridSrc2AxisPosition,
52                                                                           std::map<int, int>& elementPositionInGridSrc2DomainPosition,
53                                                                           std::map<int, int>& elementPositionInGridDst2ScalarPosition,
54                                                                           std::map<int, int>& elementPositionInGridDst2AxisPosition,
55                                                                           std::map<int, int>& elementPositionInGridDst2DomainPosition);
56
57  typedef std::map<ETranformationType, CreateTransformationCallBack> CallBackMap;
58  static CallBackMap* transformationCreationCallBacks_;
59  //#pragma omp threadprivate(transformationCreationCallBacks_)
60 
61  static bool registerTransformation(ETranformationType transType, CreateTransformationCallBack createFn);
62  static bool unregisterTransformation(ETranformationType transType);
63  static bool initializeTransformation_;
64  #pragma omp threadprivate(initializeTransformation_)
65};
66
67template<typename T>
68typename CGridTransformationFactory<T>::CallBackMap* CGridTransformationFactory<T>::transformationCreationCallBacks_ = 0;
69template<typename T>
70bool CGridTransformationFactory<T>::initializeTransformation_ = false;
71
72template<typename T>
73CGenericAlgorithmTransformation* CGridTransformationFactory<T>::createTransformation(ETranformationType transType,
74                                                                               CGrid* gridDst, CGrid* gridSrc,
75                                                                               CTransformation<T>* transformation,
76                                                                               int elementPositionInGrid,
77                                                                               std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
78                                                                               std::map<int, int>& elementPositionInGridSrc2AxisPosition,
79                                                                               std::map<int, int>& elementPositionInGridSrc2DomainPosition,
80                                                                               std::map<int, int>& elementPositionInGridDst2ScalarPosition,
81                                                                               std::map<int, int>& elementPositionInGridDst2AxisPosition,
82                                                                               std::map<int, int>& elementPositionInGridDst2DomainPosition)
83{
84  typename CallBackMap::const_iterator it = (*transformationCreationCallBacks_).find(transType);
85  if ((*transformationCreationCallBacks_).end() == it)
86  {
87     ERROR("CGridTransformationFactory::createTransformation(ETranformationType transType)",
88           << "Transformation type " << transType
89           << " doesn't exist. Please define.");
90  }
91  return (it->second)(gridDst, gridSrc, transformation, elementPositionInGrid,
92                      elementPositionInGridSrc2ScalarPosition,
93                      elementPositionInGridSrc2AxisPosition,
94                      elementPositionInGridSrc2DomainPosition,
95                      elementPositionInGridDst2ScalarPosition,
96                      elementPositionInGridDst2AxisPosition,
97                      elementPositionInGridDst2DomainPosition);
98}
99
100template<typename T>
101bool CGridTransformationFactory<T>::registerTransformation(ETranformationType transType, CreateTransformationCallBack createFn)
102{
103  if (0 == transformationCreationCallBacks_)
104    transformationCreationCallBacks_ = new CallBackMap();
105
106  return (*transformationCreationCallBacks_).insert(make_pair(transType, createFn)).second;
107}
108
109template<typename T>
110bool CGridTransformationFactory<T>::unregisterTransformation(ETranformationType transType)
111{
112  return (1 == (*transformationCreationCallBacks_).erase(transType));
113}
114
115
116}
117#endif // __XIOS_GRID_TRANSFORMATION_FACTORY_HPP__
Note: See TracBrowser for help on using the repository browser.