source: XIOS/trunk/src/filter/axis_algorithm_transformation.cpp @ 621

Last change on this file since 621 was 621, checked in by mhnguyen, 6 years ago

Implementing generic transformation algorithm (local commit)

+) Change a little bit to make sure everything work in order

Test
+) test_new_features passe with inverse

File size: 5.8 KB
Line 
1#include "axis_algorithm_transformation.hpp"
2#include "axis_inverse.hpp"
3#include "axis_zoom.hpp"
4
5namespace xios {
6
7CAxisAlgorithmTransformation::CAxisAlgorithmTransformation(CAxis* axisDestination, CAxis* axisSource, std::vector<ETranformationType>& algos)
8 : CGenericAlgorithmTransformation()
9{
10  for (int idx = 0; idx < algos.size(); ++idx)
11  {
12    switch (algos[idx])
13    {
14      case TRANS_ZOOM_AXIS:
15        algosOfAnAxis_.push_back(new CAxisZoom(axisDestination, axisSource));
16        break;
17      case TRANS_INVERSE_AXIS:
18        algosOfAnAxis_.push_back(new CAxisInverse(axisDestination, axisSource));
19        break;
20      default:
21        break;
22    }
23  }
24  computeIndexSourceMapping();
25}
26
27CAxisAlgorithmTransformation::~CAxisAlgorithmTransformation()
28{
29  for (int idx = 0; idx < algosOfAnAxis_.size(); ++idx) delete algosOfAnAxis_[idx];
30}
31
32void CAxisAlgorithmTransformation::computeIndexSourceMapping()
33{
34  if (!algosOfAnAxis_.empty())
35  {
36    algosOfAnAxis_[0]->computeIndexSourceMapping(this->transformationMapping_);
37    for (int idx = 1; idx < algosOfAnAxis_.size(); ++idx)
38    {
39      algosOfAnAxis_[idx]->computeIndexSourceMapping(algosOfAnAxis_[idx-1]->getTransformationMapping());
40    }
41    this->transformationMapping_ = algosOfAnAxis_[algosOfAnAxis_.size()-1]->getTransformationMapping();
42  }
43}
44
45/*!
46  Compute an array of global index from a global index on a axis
47  \param[in] axisDestGlobalIndex global index on an axis of destination grid
48  \param[in] axisSrcGlobalIndex global index on an axis of source grid (which are needed by one index on axis destination)
49  \param[in] axisPositionInGrid position of the axis in the grid
50  \param[in] gridDestGlobalDim dimension size of destination grid (it should share the same size for all dimension, maybe except the axis on which transformation is performed)
51  \param[in] globalIndexGridDestSendToServer global index of destination grid which are to be sent to server(s)
52  \param[in/out] globalIndexDestGrid array of global index (for 2d grid, this array is a line, for 3d, this array represents a plan). It should be preallocated
53  \param[in/out] globalIndexSrcGrid array of global index of source grid (for 2d grid, this array is a line, for 3d, this array represents a plan). It should be preallocated
54*/
55void CAxisAlgorithmTransformation::computeGlobalIndexFromGlobalIndexElement(int axisDestGlobalIndex,
56                                                                          const std::vector<int>& axisSrcGlobalIndex,
57                                                                          int axisPositionInGrid,
58                                                                          const std::vector<int>& gridDestGlobalDim,
59                                                                          const CArray<size_t,1>& globalIndexGridDestSendToServer,
60                                                                          CArray<size_t,1>& globalIndexDestGrid,
61                                                                          std::vector<CArray<size_t,1> >& globalIndexSrcGrid)
62{
63  int globalDim = gridDestGlobalDim.size();
64
65  std::vector<size_t> currentIndex(globalDim);
66  std::vector<int> gridAxisGlobalDim(globalDim);
67  std::vector<int> idxLoop(globalDim, 0);
68
69  size_t ssize = 1, idx = 0, realGlobalIndexSize = 0;
70  for (int i = 0; i< globalDim; ++i)
71  {
72    if (axisPositionInGrid == i) gridAxisGlobalDim[i] = 1;
73    else gridAxisGlobalDim[i] = gridDestGlobalDim[i];
74    ssize *= gridAxisGlobalDim[i];
75  }
76
77  CArray<size_t,1>::const_iterator itbArr = globalIndexGridDestSendToServer.begin(), itArr,
78                                   iteArr = globalIndexGridDestSendToServer.end();
79
80  while (idx < ssize)
81  {
82    for (int i = 0; i < globalDim-1; ++i)
83    {
84      if (idxLoop[i] == gridAxisGlobalDim[i])
85      {
86        idxLoop[i] = 0;
87        ++idxLoop[i+1];
88      }
89    }
90
91    for (int i = 0; i < globalDim; ++i) currentIndex[i] = idxLoop[i];
92    currentIndex[axisPositionInGrid] = axisDestGlobalIndex;
93
94    size_t globIndex = currentIndex[0];
95    size_t mulDim = 1;
96    for (int k = 1; k < globalDim; ++k)
97    {
98      mulDim *= gridDestGlobalDim[k-1];
99      globIndex += (currentIndex[k])*mulDim;
100    }
101
102    itArr = std::find(itbArr, iteArr, globIndex);
103    if (iteArr != itArr) ++realGlobalIndexSize;
104    ++idxLoop[0];
105    ++idx;
106  }
107
108  if (globalIndexDestGrid.numElements() != realGlobalIndexSize)
109    globalIndexDestGrid.resize(realGlobalIndexSize);
110
111  if (axisSrcGlobalIndex.size() != globalIndexSrcGrid.size()) globalIndexSrcGrid.resize(axisSrcGlobalIndex.size());
112  for (int i = 0; i < globalIndexSrcGrid.size(); ++i)
113    if (globalIndexSrcGrid[i].numElements() != realGlobalIndexSize)
114      globalIndexSrcGrid[i].resize(realGlobalIndexSize);
115
116
117  size_t realGlobalIndex = 0;
118  idx = 0;
119  idxLoop.assign(globalDim, 0);
120  while (idx < ssize)
121  {
122    for (int i = 0; i < globalDim-1; ++i)
123    {
124      if (idxLoop[i] == gridAxisGlobalDim[i])
125      {
126        idxLoop[i] = 0;
127        ++idxLoop[i+1];
128      }
129    }
130
131    for (int i = 0; i < globalDim; ++i) currentIndex[i] = idxLoop[i];
132    currentIndex[axisPositionInGrid] = axisDestGlobalIndex;
133
134    size_t globIndex = currentIndex[0];
135    size_t mulDim = 1;
136    for (int k = 1; k < globalDim; ++k)
137    {
138      mulDim *= gridDestGlobalDim[k-1];
139      globIndex += (currentIndex[k])*mulDim;
140    }
141
142    itArr = std::find(itbArr, iteArr, globIndex);
143    if (iteArr != itArr)
144    {
145      globalIndexDestGrid(realGlobalIndex) = globIndex;
146      for (int i = 0; i < globalIndexSrcGrid.size(); ++i)
147      {
148        currentIndex[axisPositionInGrid] = axisSrcGlobalIndex[i];
149        globIndex = currentIndex[0];
150        mulDim = 1;
151        for (int k = 1; k < globalDim; ++k)
152        {
153          mulDim *= gridDestGlobalDim[k-1];
154          globIndex += (currentIndex[k])*mulDim;
155        }
156        (globalIndexSrcGrid[i])(realGlobalIndex) = globIndex;
157      }
158      ++realGlobalIndex;
159    }
160
161    ++idxLoop[0];
162    ++idx;
163  }
164}
165
166
167}
Note: See TracBrowser for help on using the repository browser.