source: XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/axis_algorithm/axis_algorithm_inverse.cpp @ 2257

Last change on this file since 2257 was 2257, checked in by jderouillat, 3 years ago

Fix bounds management in implement axis_inverse such as a no_data_modification transformation

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 5.2 KB
Line 
1/*!
2   \file axis_algorithm_inverse.hpp
3   \author Ha NGUYEN
4   \since 14 May 2015
5   \date 29 June 2015
6
7   \brief Algorithm for inversing an axis..
8 */
9#include "axis_algorithm_inverse.hpp"
10#include "context.hpp"
11#include "context_client.hpp"
12#include "axis.hpp"
13#include "grid.hpp"
14#include "grid_transformation_factory_impl.hpp"
15#include "inverse_axis.hpp"
16#include "client_client_dht_template.hpp"
17
18namespace xios {
19
20CGenericAlgorithmTransformation* CAxisAlgorithmInverse::create(bool isSource, CGrid* gridDst, CGrid* gridSrc,
21                                                               CTransformation<CAxis>* transformation,
22                                                               int elementPositionInGrid,
23                                                               std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
24                                                               std::map<int, int>& elementPositionInGridSrc2AxisPosition,
25                                                               std::map<int, int>& elementPositionInGridSrc2DomainPosition,
26                                                               std::map<int, int>& elementPositionInGridDst2ScalarPosition,
27                                                               std::map<int, int>& elementPositionInGridDst2AxisPosition,
28                                                               std::map<int, int>& elementPositionInGridDst2DomainPosition)
29TRY
30{
31  std::vector<CAxis*> axisListDestP = gridDst->getAxis();
32  std::vector<CAxis*> axisListSrcP  = gridSrc->getAxis();
33
34  CInverseAxis* inverseAxis = dynamic_cast<CInverseAxis*> (transformation);
35  int axisDstIndex = elementPositionInGridDst2AxisPosition[elementPositionInGrid];
36  int axisSrcIndex = elementPositionInGridSrc2AxisPosition[elementPositionInGrid];
37
38  return (new CAxisAlgorithmInverse(isSource, axisListDestP[axisDstIndex], axisListSrcP[axisSrcIndex], inverseAxis));
39}
40CATCH
41
42bool CAxisAlgorithmInverse::dummyRegistered_ = CAxisAlgorithmInverse::registerTrans();
43bool CAxisAlgorithmInverse::registerTrans()
44TRY
45{
46  return CGridTransformationFactory<CAxis>::registerTransformation(TRANS_INVERSE_AXIS, create);
47}
48CATCH
49
50CAxisAlgorithmInverse::CAxisAlgorithmInverse(bool isSource, CAxis* axisDestination, CAxis* axisSource, CInverseAxis* inverseAxis)
51 : CAlgorithmTransformationNoDataModification(isSource), axisDest_(axisDestination), axisSrc_(axisSource)
52TRY
53{
54 
55  axisDestination->axis_type.reset();
56  axisDestination->n_glo.reset();
57  axisDestination->index.reset();
58  axisDestination->n.reset();
59  axisDestination->begin.reset();
60
61  axisDestination->mask.reset();
62  axisDestination->data_index.reset();
63  axisDestination->data_n.reset();
64  axisDestination->data_begin.reset();
65
66  axisDestination->value.reset();
67  axisDestination->bounds.reset();
68
69  axisDestination->n_glo.setValue( axisSource->n_glo.getValue() );
70
71  if (axisDestination->n_glo.getValue() != axisSource->n_glo.getValue())
72  {
73    ERROR("CAxisAlgorithmInverse::CAxisAlgorithmInverse(CAxis* axisDestination, CAxis* axisSource)",
74           << "Two axis have different global size"
75           << "Size of axis source " <<axisSource->getId() << " is " << axisSource->n_glo.getValue()  << std::endl
76           << "Size of axis destination " <<axisDestination->getId() << " is " << axisDestination->n_glo.getValue());
77  }
78
79  int n_glo =axisDestination->n_glo.getValue() ;
80 
81  CArray<size_t,1> sourceGlobalIdx = axisSource->getLocalElement()->getGlobalIndex();
82  int indexSize = sourceGlobalIdx.numElements();
83 
84  axisDestination->index.resize( indexSize );
85  axisDestination->data_index.resize( indexSize );
86  axisDestination->data_index = -1;
87  for (size_t i = 0; i < indexSize ; ++i)
88  {
89    axisDestination->index(i) = (n_glo-1)-sourceGlobalIdx(i);
90  }
91
92  int idxMin = INT_MAX;
93  for (int countSrc = 0; countSrc < indexSize ; ++countSrc)
94  {
95    if ( sourceGlobalIdx(countSrc) < idxMin )
96      idxMin = sourceGlobalIdx(countSrc);
97  }
98
99  CArray<int,1> sourceWorkflowIdx = axisSource->getLocalView(CElementView::WORKFLOW)->getIndex();
100  int srcWorkflowSize = sourceWorkflowIdx.numElements();
101  for (size_t i = 0; i < indexSize ; ++i)
102  {
103    // ------------------ define transformation only if in the WF ------------------
104    int iIdxSrc2 = (i+idxMin)%axisSource->n_glo;
105    int convert_locally_global_idx = (iIdxSrc2-idxMin) ;
106    bool concerned_by_WF(false);
107    int i2;
108    for ( i2 = 0 ; i2<sourceWorkflowIdx.numElements() ; ++i2 )
109    {
110      if (sourceWorkflowIdx(i2)==convert_locally_global_idx)
111      {
112        concerned_by_WF = true;
113        break;
114      }
115    }
116
117    if (concerned_by_WF)
118      {
119        axisDestination->data_index(sourceWorkflowIdx(i2)) = sourceWorkflowIdx(i2);
120      }
121    // -----------------------------------------------------------------------------
122
123  }
124
125  if (axisSrc_->hasValue)
126  {
127    axisDestination->value.resize(indexSize);
128    for (size_t i = 0; i < indexSize ; ++i)
129    {
130      axisDestination->value(i) = axisSource->value(i);
131    }
132  }
133
134  if (axisSrc_->hasBounds)
135  {
136    axisDestination->bounds.resize(2,indexSize);
137    for (int i = 0; i < indexSize ; ++i)
138    {
139      axisDestination->bounds(0,i) = axisSource->bounds(0,i);
140      axisDestination->bounds(1,i) = axisSource->bounds(1,i);
141    }
142  }
143
144  axisDestination->checkAttributes() ;
145
146}
147CATCH
148
149}
Note: See TracBrowser for help on using the repository browser.