source: XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/axis_algorithm/axis_algorithm_extract_domain.cpp @ 2255

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

Implement extract axis transformations (from axis and from domain) using source views. extract_domain_to_axis do not require n_glo any more, n_glo is defined using the domain source dimension and the direction requested.

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 6.6 KB
Line 
1/*!
2   \file axis_algorithm_reduce_domain.cpp
3   \author Ha NGUYEN
4   \since 23 June 2016
5   \date 23 June 2016
6
7   \brief Algorithm for extract a domain to an axis
8 */
9#include "axis_algorithm_extract_domain.hpp"
10#include "extract_domain_to_axis.hpp"
11#include "axis.hpp"
12#include "domain.hpp"
13#include "grid.hpp"
14#include "grid_transformation_factory_impl.hpp"
15#include "reduction.hpp"
16
17namespace xios {
18CGenericAlgorithmTransformation* CAxisAlgorithmExtractDomain::create(bool isSource, CGrid* gridDst, CGrid* gridSrc,
19                                                                     CTransformation<CAxis>* transformation,
20                                                                     int elementPositionInGrid,
21                                                                     std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
22                                                                     std::map<int, int>& elementPositionInGridSrc2AxisPosition,
23                                                                     std::map<int, int>& elementPositionInGridSrc2DomainPosition,
24                                                                     std::map<int, int>& elementPositionInGridDst2ScalarPosition,
25                                                                     std::map<int, int>& elementPositionInGridDst2AxisPosition,
26                                                                     std::map<int, int>& elementPositionInGridDst2DomainPosition)
27TRY
28{
29  std::vector<CAxis*> axisListDestP = gridDst->getAxis();
30  std::vector<CDomain*> domainListSrcP = gridSrc->getDomains();
31
32  CExtractDomainToAxis* extractDomain = dynamic_cast<CExtractDomainToAxis*> (transformation);
33  int axisDstIndex = elementPositionInGridDst2AxisPosition[elementPositionInGrid];
34  int domainSrcIndex = elementPositionInGridSrc2DomainPosition[elementPositionInGrid];
35
36  return (new CAxisAlgorithmExtractDomain(isSource, axisListDestP[axisDstIndex], domainListSrcP[domainSrcIndex], extractDomain));
37}
38CATCH
39
40bool CAxisAlgorithmExtractDomain::dummyRegistered_ = CAxisAlgorithmExtractDomain::registerTrans();
41bool CAxisAlgorithmExtractDomain::registerTrans()
42TRY
43{
44  return CGridTransformationFactory<CAxis>::registerTransformation(TRANS_EXTRACT_DOMAIN_TO_AXIS, create);
45}
46CATCH
47
48
49CAxisAlgorithmExtractDomain::CAxisAlgorithmExtractDomain(bool isSource, CAxis* axisDestination, CDomain* domainSource, CExtractDomainToAxis* algo)
50 : CAlgorithmTransformationTransfer(isSource), pos_(-1), axisDest_(axisDestination), domainSrc_(domainSource)
51TRY
52{
53  axisDestination->axis_type.reset();
54  axisDestination->n_glo.reset();
55  axisDestination->index.reset();
56  axisDestination->n.reset();
57  axisDestination->begin.reset();
58
59  axisDestination->mask.reset();
60  axisDestination->data_index.reset();
61  axisDestination->data_n.reset();
62  axisDestination->data_begin.reset();
63
64  axisDestination->value.reset();
65  axisDestination->label.reset();
66  axisDestination->bounds.reset();
67
68  algo->checkValid(axisDestination, domainSource);
69  StdString op = "extract";
70
71  int nglo,nloc;
72  switch (algo->direction)
73  {
74    case CExtractDomainToAxis::direction_attr::jDir:
75      dir_ = jDir;
76      nglo = domainSource->nj_glo.getValue();
77      nloc = domainSource->nj.getValue();
78      break;
79    case CExtractDomainToAxis::direction_attr::iDir:
80      dir_ = iDir;
81      nglo = domainSource->ni_glo.getValue();
82      nloc = domainSource->ni.getValue();
83      break;
84    default:
85      break;
86  }
87 
88  axisDestination->n_glo.setValue( nglo );
89  axisDestination->index.resize( nloc );
90  axisDestination->data_index.resize( nloc );
91  axisDestination->data_index = -1;
92
93  if ( axisDestination->index.isEmpty() )
94  {
95    axisDestination->n.setValue( 0 );
96    axisDestination->begin.setValue( 0 );
97  }
98
99  pos_ = algo->position;
100
101  auto& transMap = this->transformationMapping_;
102 
103  CArray<size_t,1> sourceGlobalIdx = domainSource->getLocalElement()->getGlobalIndex();
104  int indexSize = sourceGlobalIdx.numElements();
105
106  CArray<int,1> sourceWorkflowIdx = domainSource->getLocalView(CElementView::WORKFLOW)->getIndex();
107  int srcWorkflowSize = sourceWorkflowIdx.numElements();
108 
109  int iIdxSrcMin = INT_MAX;
110  int jIdxSrcMin = INT_MAX;
111  int IdxMin = INT_MAX;
112  for (int countSrc = 0; countSrc < indexSize ; ++countSrc)
113  {
114    if ( sourceGlobalIdx(countSrc)%domainSource->ni_glo < iIdxSrcMin )
115      iIdxSrcMin = sourceGlobalIdx(countSrc)%domainSource->ni_glo;
116    if ( sourceGlobalIdx(countSrc)/domainSource->ni_glo < jIdxSrcMin )
117      jIdxSrcMin = sourceGlobalIdx(countSrc)/domainSource->ni_glo;
118    if ( sourceGlobalIdx(countSrc) < IdxMin )
119      IdxMin = sourceGlobalIdx(countSrc);
120  }
121 
122  if (jDir == dir_)
123  {
124    int countDest(0);
125    for (int countSrc = 0; countSrc < indexSize ; ++countSrc)
126    {
127      if ( sourceGlobalIdx(countSrc)%domainSource->ni_glo == pos_ )
128      {
129        axisDest_->index(countDest) = sourceGlobalIdx(countSrc)/domainSource->ni_glo;
130        int iIdxSrc2 = (countSrc+IdxMin)%domainSource->ni_glo;
131        int jIdxSrc2 = (countSrc+IdxMin)/domainSource->ni_glo;
132        int convert_locally_global_idx = (jIdxSrc2-jIdxSrcMin)*domainSource->ni + (iIdxSrc2-iIdxSrcMin) ;
133        bool concerned_by_WF(false);
134        for ( int i = 0 ; i<sourceWorkflowIdx.numElements() ; ++i )
135        {
136          if (sourceWorkflowIdx(i)==convert_locally_global_idx)
137          {     
138                concerned_by_WF = true;
139                break;
140          }
141        }
142        if (concerned_by_WF)
143        {
144          axisDest_->data_index(countDest) = countDest;
145          transMap[axisDest_->index(countDest)] = sourceGlobalIdx(countSrc);
146        }
147        countDest++;
148      }
149    }
150  }
151  else if (iDir == dir_)
152  {
153    int countDest(0);
154    for (int countSrc = 0; countSrc < indexSize ; ++countSrc)
155    {
156      if ( sourceGlobalIdx(countSrc)/domainSource->ni_glo == pos_ )
157      {
158        axisDest_->index(countDest) = sourceGlobalIdx(countSrc)%domainSource->ni_glo;
159        int iIdxSrc2 = (countSrc+IdxMin)%domainSource->ni_glo;
160        int jIdxSrc2 = (countSrc+IdxMin)/domainSource->ni_glo;
161        int convert_locally_global_idx = (jIdxSrc2-jIdxSrcMin)*domainSource->ni + (iIdxSrc2-iIdxSrcMin) ;
162        bool concerned_by_WF(false);
163        for ( int i = 0 ; i<sourceWorkflowIdx.numElements() ; ++i )
164        {
165          if (sourceWorkflowIdx(i)==convert_locally_global_idx)
166          {     
167                concerned_by_WF = true;
168                break;
169          }
170        }
171        if (concerned_by_WF)
172        {
173          axisDest_->data_index(countDest) = countDest;
174          transMap[axisDest_->index(countDest)] = sourceGlobalIdx(countSrc);
175        }
176        countDest++;
177      }
178    }
179  }
180  else
181  {}
182
183  axisDestination->checkAttributes() ;
184  this->computeAlgorithm(domainSource->getLocalView(CElementView::WORKFLOW), axisDestination->getLocalView(CElementView::WORKFLOW)) ;
185}
186CATCH
187
188
189CAxisAlgorithmExtractDomain::~CAxisAlgorithmExtractDomain()
190TRY
191{
192}
193CATCH
194
195}
Note: See TracBrowser for help on using the repository browser.