source: XIOS3/branches/xios-3.0-beta/src/node/reduce_domain_to_axis.cpp @ 2423

Last change on this file since 2423 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

File size: 4.0 KB
Line 
1#include "reduce_domain_to_axis.hpp"
2#include "axis_algorithm_reduce_domain.hpp"
3#include "type.hpp"
4#include "axis.hpp"
5#include "domain.hpp"
6
7namespace xios {
8
9  /// ////////////////////// Définitions ////////////////////// ///
10
11  CReduceDomainToAxis::CReduceDomainToAxis(void)
12    : CObjectTemplate<CReduceDomainToAxis>(), CReduceDomainToAxisAttributes(), CTransformation<CAxis>()
13  { /* Ne rien faire de plus */ }
14
15  CReduceDomainToAxis::CReduceDomainToAxis(const StdString & id)
16    : CObjectTemplate<CReduceDomainToAxis>(id), CReduceDomainToAxisAttributes(), CTransformation<CAxis>()
17  { /* Ne rien faire de plus */ }
18
19  CReduceDomainToAxis::~CReduceDomainToAxis(void)
20  {}
21
22  CTransformation<CAxis>* CReduceDomainToAxis::create(const StdString& id, xml::CXMLNode* node)
23  {
24    CReduceDomainToAxis* reduceDomain = CReduceDomainToAxisGroup::get("reduce_domain_to_axis_definition")->createChild(id);
25    if (node) reduceDomain->parse(*node);
26    return static_cast<CTransformation<CAxis>*>(reduceDomain);
27  }
28
29  bool CReduceDomainToAxis::registerTrans()
30  {
31    return registerTransformation(TRANS_REDUCE_DOMAIN_TO_AXIS, {create, getTransformation});
32  }
33
34  bool CReduceDomainToAxis::_dummyRegistered = CReduceDomainToAxis::registerTrans();
35
36  //----------------------------------------------------------------
37
38  StdString CReduceDomainToAxis::GetName(void)    { return StdString("reduce_domain_to_axis"); }
39  StdString CReduceDomainToAxis::GetDefName(void) { return StdString("reduce_domain_to_axis"); }
40  ENodeType CReduceDomainToAxis::GetType(void)    { return eReduceDomainToAxis; }
41
42  void CReduceDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)
43  {
44    if (CDomain::type_attr::unstructured == domainSrc->type)
45      ERROR("CReduceDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)",
46       << "Domain reduction is only supported for rectilinear or curvillinear grid."
47       << "Domain source " <<domainSrc->getId() << std::endl
48       << "Axis destination " << axisDst->getId());
49
50    if (this->operation.isEmpty())
51      ERROR("CReduceDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)",
52             << "An operation must be defined."
53             << "Domain source " <<domainSrc->getId() << std::endl
54             << "Axis destination " << axisDst->getId());
55
56    if (this->direction.isEmpty())
57      ERROR("CReduceDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)",
58             << "A direction to apply the operation must be defined. It should be: 'iDir' or 'jDir'"
59             << "Domain source " <<domainSrc->getId() << std::endl
60             << "Axis destination " << axisDst->getId());
61    if (this->local.isEmpty()) local=false ;
62
63  }
64
65  shared_ptr<CGenericAlgorithmTransformation> CReduceDomainToAxis::createAlgorithm(bool isSource,
66                                                        CGrid* gridDst, CGrid* gridSrc,
67                                                        int elementPositionInGrid,
68                                                        std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
69                                                        std::map<int, int>& elementPositionInGridSrc2AxisPosition,
70                                                        std::map<int, int>& elementPositionInGridSrc2DomainPosition,
71                                                        std::map<int, int>& elementPositionInGridDst2ScalarPosition,
72                                                        std::map<int, int>& elementPositionInGridDst2AxisPosition,
73                                                        std::map<int, int>& elementPositionInGridDst2DomainPosition)
74  {
75    return CAxisAlgorithmReduceDomain::create(isSource, gridDst,  gridSrc, this, elementPositionInGrid,
76                       elementPositionInGridSrc2ScalarPosition, elementPositionInGridSrc2AxisPosition, elementPositionInGridSrc2DomainPosition,
77                       elementPositionInGridDst2ScalarPosition, elementPositionInGridDst2AxisPosition, elementPositionInGridDst2DomainPosition) ;
78  }
79}
Note: See TracBrowser for help on using the repository browser.