source: XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/axis_algorithm/axis_algorithm_reduce_axis.cpp @ 2291

Last change on this file since 2291 was 2291, checked in by ymipsl, 2 years ago

Improve reduction transformation

  • make the difference between reduction over geometry or reduction between process.
  • geometrical reduction :

domain -> axis
axis -> scalar
domain -> scalar

  • reduction across processes for redondant geometrical cell :

axis -> axis
scalar -> scalar

Reduction can be local (only for the geometrical cell owned by current process) or global, using the "local" attribute (bool) over the reduction.

YM

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 4.5 KB
Line 
1/*!
2   \file axis_algorithm_reduce_axis.cpp
3   \author Ha NGUYEN
4   \since 23 June 2016
5   \date 23 June 2016
6
7   \brief Algorithm for reduce a axis to an axis
8 */
9#include "axis_algorithm_reduce_axis.hpp"
10#include "reduce_axis_to_axis.hpp"
11#include "axis.hpp"
12#include "grid.hpp"
13#include "grid_transformation_factory_impl.hpp"
14#include "grid_algorithm_reduce.hpp"
15
16
17namespace xios {
18shared_ptr<CGenericAlgorithmTransformation> CAxisAlgorithmReduceAxis::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<CAxis*> axisListSrcP  = gridSrc->getAxis();
31
32  CReduceAxisToAxis* reduceAxis = dynamic_cast<CReduceAxisToAxis*> (transformation);
33  int axisDstIndex   = elementPositionInGridDst2AxisPosition[elementPositionInGrid];
34  int axisSrcIndex = elementPositionInGridSrc2AxisPosition[elementPositionInGrid];
35
36  return make_shared<CAxisAlgorithmReduceAxis>(isSource, axisListDestP[axisDstIndex], axisListSrcP[axisSrcIndex], reduceAxis);
37}
38CATCH
39
40bool CAxisAlgorithmReduceAxis::dummyRegistered_ = CAxisAlgorithmReduceAxis::registerTrans();
41bool CAxisAlgorithmReduceAxis::registerTrans()
42TRY
43{
44  return CGridTransformationFactory<CAxis>::registerTransformation(TRANS_REDUCE_AXIS_TO_AXIS, create);
45}
46CATCH
47
48
49CAxisAlgorithmReduceAxis::CAxisAlgorithmReduceAxis(bool isSource, CAxis* axisDestination, CAxis* axisSource, CReduceAxisToAxis* algo)
50 : CAlgorithmTransformationReduce(isSource)
51TRY
52{
53  if (!axisDestination->checkGeometricAttributes(false))
54  {
55    axisDestination->resetGeometricAttributes();
56    axisDestination->setGeometricAttributes(*axisSource) ;
57  }
58  axisDestination->checkAttributes() ; 
59  algo->checkValid(axisDestination, axisSource);
60 
61
62  switch (algo->operation)
63  {
64    case CReduceAxisToAxis::operation_attr::sum:
65      operator_ = EReduction::sum;
66      break;
67    case CReduceAxisToAxis::operation_attr::min:
68      operator_ = EReduction::min;
69      break;
70    case CReduceAxisToAxis::operation_attr::max:
71      operator_ = EReduction::max;
72      break;
73    case CReduceAxisToAxis::operation_attr::average:
74      operator_ = EReduction::average;
75      break;
76    default:
77        ERROR("CAxisAlgorithmReduceAxis::CAxisAlgorithmReduceAxis(CAxis* axisDestination, CAxis* axisSource, CReduceAxisToAxis* algo)",
78         << "Operation is wrongly defined. Supported operations: sum, min, max, average." << std::endl
79         << "Axis source " <<axisSource->getId() << std::endl
80         << "Axis destination " << axisDestination->getId());
81  }
82
83  //TransformationIndexMap& transMap = this->transformationMapping_;
84  //CArray<int,1>& axisDstIndex = axisDestination->index;
85  //int nbAxisIdx = axisDstIndex.numElements();
86
87
88
89  auto& transMap = this->transformationMapping_;
90 
91  CArray<size_t,1> dstGlobalIndex ;
92  axisDestination->getLocalView(CElementView::WORKFLOW)->getGlobalIndexView(dstGlobalIndex) ;
93  size_t nbIdx = dstGlobalIndex.numElements();
94
95  for (size_t idx = 0; idx < nbIdx; ++idx)
96  {
97    size_t globalIdx = dstGlobalIndex(idx);
98    transMap[globalIdx].resize(1);
99    transMap[globalIdx][0]=globalIdx ;     
100  }
101
102  this->computeAlgorithm(axisSource->getLocalView(CElementView::WORKFLOW), axisDestination->getLocalView(CElementView::WORKFLOW)) ;
103}
104CATCH
105
106shared_ptr<CGridAlgorithm> CAxisAlgorithmReduceAxis::createGridAlgorithm(CGrid* gridSrc, CGrid* gridDst, int pos)
107{
108  auto algo=make_shared<CGridAlgorithmReduce>(gridSrc, gridDst, pos, shared_from_this(), operator_) ;
109  algo->computeAlgorithm(false) ;
110  return algo ; 
111}
112
113CAxisAlgorithmReduceAxis::~CAxisAlgorithmReduceAxis()
114TRY
115{
116 
117}
118CATCH
119
120
121}
Note: See TracBrowser for help on using the repository browser.