source: XIOS/dev/branch_openmp/src/transformation/grid_transformation_selector.hpp @ 1328

Last change on this file since 1328 was 1328, checked in by yushan, 6 years ago

dev_omp

File size: 3.6 KB
Line 
1/*!
2   \file grid_transformation.hpp
3   \author Ha NGUYEN
4   \since 23 June 2016
5   \date 23 June 2016
6
7   \brief Helper class to select different transformations.
8 */
9#ifndef __XIOS_GRID_TRANSFORMATION_SELECTOR_HPP__
10#define __XIOS_GRID_TRANSFORMATION_SELECTOR_HPP__
11
12#include <map>
13#include <vector>
14#include "mpi_std.hpp"
15#include "generic_algorithm_transformation.hpp"
16#include "transformation_enum.hpp"
17#include "duration.hpp"
18
19namespace xios {
20
21class CGrid;
22
23/*!
24  \class CGridTransformationSelector
25  This class is a helper class to chose a algorithm (transformation) from the algorithm list of
26specific grid.
27*/
28class CGridTransformationSelector
29{
30public:
31  // Stupid C++98, should be replaced with tuple.
32  // List of algorithm to process. Order of element in this list
33  // <Position of element in grid, <transformationType, <transformation order, alogrithm type> > >
34  typedef std::list<std::pair<int,std::pair<ETranformationType,std::pair<int,int> > > > ListAlgoType;
35protected:
36  enum AlgoType {
37    scalarType = 0, axisType = 1, domainType = 2
38  };
39
40protected:
41  enum TransformationType {
42    special = 0, normal = 1
43  };
44
45public:
46  /** Default constructor */
47  CGridTransformationSelector(CGrid* destination, CGrid* source, TransformationType type = normal);
48  virtual ~CGridTransformationSelector();
49
50  ListAlgoType getAlgoList() const { return listAlgos_; }
51  int getNbAlgo() { return nbNormalAlgos_; }
52  const std::vector<StdString>& getAuxInputs() const { return auxInputs_; }
53  const std::vector<CGenericAlgorithmTransformation*>& getAlgos() const { return algoTransformation_; }
54
55protected:
56  void updateElementPosition();
57  void initializeAlgorithms();
58  void initializeDomainAlgorithms(int domPositionInGrid);
59  void initializeAxisAlgorithms(int axisPositionInGrid);
60  void initializeScalarAlgorithms(int scalarPositionInGrid);
61  void initializeTransformations(TransformationType type);
62  void selectAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder, int algo);
63  bool isSpecialTransformation(ETranformationType transType);
64  void registerTransformations();
65
66protected:
67  virtual void selectScalarAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) = 0;
68  virtual void selectAxisAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) = 0;
69  virtual void selectDomainAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) = 0;
70
71protected:
72  //! Grid source on transformation
73  CGrid* gridSource_;
74
75  //! Grid destination on transformation
76  CGrid* gridDestination_;
77
78  //! Grid source and grid destination it's the same
79  bool isSameGrid_;
80
81protected:
82  //! List of algorithm types and their order
83  ListAlgoType listAlgos_;
84
85  //! Number of normal algorithm
86  int nbNormalAlgos_;
87
88  //! Number of special algorithms (such as generate_rectilinear_grid)
89  int nbSpecialAlgos_;
90
91  // true if domain algorithm and false if axis algorithm (can be replaced by tuple with listAlgos_
92  std::vector<AlgoType> algoTypes_;
93
94  // Mapping between position of an element in grid and its transformation (if any)
95  std::vector<CGenericAlgorithmTransformation*> algoTransformation_;
96
97  //! Position of scalar, axis and domain in grid
98  std::map<int, int> elementPositionInGridSrc2AxisPosition_, elementPositionInGridSrc2DomainPosition_, elementPositionInGridSrc2ScalarPosition_;
99  std::map<int, int> elementPositionInGridDst2AxisPosition_, elementPositionInGridDst2DomainPosition_, elementPositionInGridDst2ScalarPosition_;
100
101  std::vector<StdString> auxInputs_;
102  std::set<Time> timeStamp_; //! Time stamps for auxillary inputs
103};
104
105}
106#endif // __XIOS_GRID_TRANSFORMATION_SELECTOR_HPP__
Note: See TracBrowser for help on using the repository browser.