XIOS  1.0
Xml I/O Server
 Tout Classes Espaces de nommage Fichiers Fonctions Variables Définitions de type Énumérations Valeurs énumérées Amis Macros
axis_algorithm_reduce_domain.cpp
Aller à la documentation de ce fichier.
1 
11 #include "axis.hpp"
12 #include "domain.hpp"
13 #include "grid.hpp"
15 #include "reduction.hpp"
16 
17 namespace xios {
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)
27 TRY
28 {
29  std::vector<CAxis*> axisListDestP = gridDst->getAxis();
30  std::vector<CDomain*> domainListSrcP = gridSrc->getDomains();
31 
32  CReduceDomainToAxis* reduceDomain = dynamic_cast<CReduceDomainToAxis*> (transformation);
33  int axisDstIndex = elementPositionInGridDst2AxisPosition[elementPositionInGrid];
34  int domainSrcIndex = elementPositionInGridSrc2DomainPosition[elementPositionInGrid];
35 
36  return (new CAxisAlgorithmReduceDomain(axisListDestP[axisDstIndex], domainListSrcP[domainSrcIndex], reduceDomain));
37 }
38 CATCH
39 
41 TRY
42 {
44 }
45 CATCH
46 
47 
49  : CAxisAlgorithmTransformation(axisDestination, domainSource), reduction_(0)
50 TRY
51 {
52  algo->checkValid(axisDestination, domainSource);
53  StdString op;
54  switch (algo->operation)
55  {
56  case CReduceDomainToAxis::operation_attr::sum:
57  op = "sum";
58  break;
59  case CReduceDomainToAxis::operation_attr::min:
60  op = "min";
61  break;
62  case CReduceDomainToAxis::operation_attr::max:
63  op = "max";
64  break;
65  case CReduceDomainToAxis::operation_attr::average:
66  op = "average";
67  break;
68  default:
69  ERROR("CAxisAlgorithmReduceDomain::CAxisAlgorithmReduceDomain(CAxis* axisDestination, CDomain* domainSource, CReduceDomainToAxis* algo)",
70  << "Operation is wrongly defined. Supported operations: sum, min, max, average." << std::endl
71  << "Domain source " <<domainSource->getId() << std::endl
72  << "Axis destination " << axisDestination->getId());
73 
74  }
75 
76  dir_ = (CReduceDomainToAxis::direction_attr::iDir == algo->direction) ? iDir : jDir;
78  local = algo->local ;
79 }
80 CATCH
81 
82 void CAxisAlgorithmReduceDomain::apply(const std::vector<std::pair<int,double> >& localIndex,
83  const double* dataInput,
84  CArray<double,1>& dataOut,
85  std::vector<bool>& flagInitial,
86  bool ignoreMissingValue, bool firstPass)
87 TRY
88 {
89  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue, firstPass);
90 }
91 CATCH
92 
94 TRY
95 {
96  reduction_->updateData(dataOut);
97 }
98 CATCH
99 
101 TRY
102 {
103  if (0 != reduction_) delete reduction_;
104 }
105 CATCH
106 
108 TRY
109 {
110  this->transformationMapping_.resize(1);
111  this->transformationWeight_.resize(1);
112 
115 
116  CArray<int,1>& axisDstIndex = axisDest_->index;
117  int ni_glo = domainSrc_->ni_glo, nj_glo = domainSrc_->nj_glo;
118  if (iDir == dir_)
119  {
120  if (local)
121  {
122  const CArray<int, 1>& i_index = domainSrc_-> i_index.getValue() ;
123  const CArray<int, 1>& j_index = domainSrc_-> j_index.getValue() ;
124  const CArray<bool,1>& localMask = domainSrc_-> localMask ;
125  int nbDomainIdx = i_index.numElements();
126 
127  for (int idxDomain = 0; idxDomain < nbDomainIdx; ++idxDomain)
128  {
129  if (localMask(idxDomain))
130  {
131  transMap[j_index(idxDomain)].push_back(j_index(idxDomain)* ni_glo + i_index(idxDomain));
132  transWeight[j_index(idxDomain)].push_back(1.0) ;
133  }
134  }
135  }
136  else
137  {
138  int nbAxisIdx = axisDstIndex.numElements();
139  for (int idxAxis = 0; idxAxis < nbAxisIdx; ++idxAxis)
140  {
141  int globalAxisIdx = axisDstIndex(idxAxis);
142  transMap[globalAxisIdx].resize(ni_glo);
143  transWeight[globalAxisIdx].resize(ni_glo);
144  for (int idx = 0; idx < ni_glo; ++idx)
145  {
146  transMap[globalAxisIdx][idx] = globalAxisIdx * ni_glo + idx;
147  transWeight[globalAxisIdx][idx] = 1.0;
148  }
149  }
150  }
151  }
152  else if (jDir == dir_)
153  {
154  int nbAxisIdx = axisDstIndex.numElements();
155  if (local)
156  {
157  const CArray<int, 1>& i_index = domainSrc_-> i_index.getValue() ;
158  const CArray<int, 1>& j_index = domainSrc_-> j_index.getValue() ;
159  const CArray<bool,1>& localMask = domainSrc_-> localMask ;
160  int nbDomainIdx = i_index.numElements();
161 
162  for (int idxDomain = 0; idxDomain < nbDomainIdx; ++idxDomain)
163  {
164  if (localMask(idxDomain))
165  {
166  transMap[i_index(idxDomain)].push_back(j_index(idxDomain)* ni_glo + i_index(idxDomain));
167  transWeight[i_index(idxDomain)].push_back(1.0) ;
168  }
169  }
170  }
171  else
172  {
173  for (int idxAxis = 0; idxAxis < nbAxisIdx; ++idxAxis)
174  {
175  int globalAxisIdx = axisDstIndex(idxAxis);
176  transMap[globalAxisIdx].resize(nj_glo);
177  transWeight[globalAxisIdx].resize(nj_glo);
178  for (int idx = 0; idx < nj_glo; ++idx)
179  {
180  transMap[globalAxisIdx][idx] = globalAxisIdx + ni_glo*idx;
181  transWeight[globalAxisIdx][idx] = 1.0;
182  }
183  }
184  }
185  }
186  else
187  {}
188 }
189 CATCH
190 
191 }
virtual void apply(const std::vector< std::pair< int, double > > &localIndex, const double *dataInput, CArray< double, 1 > &dataOut, std::vector< bool > &flagInitial, bool ignoreMissingValue, bool firstPass)
Apply a operation on local data.
std::unordered_map< int, std::vector< double > > TransformationWeightMap
Helper class to create different transformations.
virtual void checkValid(CAxis *axisDst, CDomain *domainSrc)
static bool registerTransformation(ETranformationType transType, CreateTransformationCallBack createFn)
#define TRY
Definition: exception.hpp:154
std::vector< TransformationWeightMap > transformationWeight_
Weight corresponding of source to destination.
CArray< int, 1 > & i_index
Parent class for all reduction.
static CGenericAlgorithmTransformation * create(CGrid *gridDst, CGrid *gridSrc, CTransformation< CAxis > *transformation, int elementPositionInGrid, std::map< int, int > &elementPositionInGridSrc2ScalarPosition, std::map< int, int > &elementPositionInGridSrc2AxisPosition, std::map< int, int > &elementPositionInGridSrc2DomainPosition, std::map< int, int > &elementPositionInGridDst2ScalarPosition, std::map< int, int > &elementPositionInGridDst2AxisPosition, std::map< int, int > &elementPositionInGridDst2DomainPosition)
std::vector< TransformationIndexMap > transformationMapping_
Map between global index of destination element and source element.
std::string StdString
Definition: xios_spl.hpp:48
#define xios(arg)
const StdString & getId(void) const
Accesseurs ///.
Definition: object.cpp:26
static std::map< StdString, EReductionType > ReductionOperations
Definition: reduction.hpp:25
CAxis * axisDest_
Axis on grid destination.
CATCH CScalarAlgorithmReduceScalar::CScalarAlgorithmReduceScalar(CScalar *scalarDestination, CScalar *scalarSource, CReduceScalarToScalar *algo ERROR)("CScalarAlgorithmReduceScalar::CScalarAlgorithmReduceScalar(CScalar* scalarDestination, CScalar* scalarSource, CReduceScalarToScalar* algo)",<< "Operation must be defined."<< "Scalar source "<< scalarSource->getId()<< std::endl<< "Scalar destination "<< scalarDestination->getId())
static CReductionAlgorithm * createOperation(EReductionType reduceType)
Create an operation (sum, max, min) based on type.
Definition: reduction.cpp:33
This class defines the interface for all other inherited algorithms class.
void computeIndexSourceMapping_(const std::vector< CArray< double, 1 > * > &dataAuxInputs)
Algorithm for reduce an axis to a axis.
CATCH CAxisAlgorithmExtractDomain::CAxisAlgorithmExtractDomain(CAxis *axisDestination, CDomain *domainSource, CExtractDomainToAxis *algo) StdStrin op)
CDomain * domainSrc_
Domain on grid source.
TransformationIndexMap & transMap
virtual void updateData(CArray< double, 1 > &dataOut)
Update whole dataOut (on necessary).
std::unordered_map< int, std::vector< int > > TransformationIndexMap
TransformationWeightMap & transWeight
#define CATCH
Definition: exception.hpp:155
CAxisAlgorithmReduceDomain(CAxis *axisDestination, CDomain *domainSource, CReduceDomainToAxis *algo)