source: XIOS/trunk/src/node/reduce_domain_to_axis.cpp @ 938

Last change on this file since 938 was 938, checked in by mhnguyen, 8 years ago

Modifying reduce_axis_to_domain attribute to prevent error-prone

+) Change attribute from string to enum
+) Remove some redundant codes

Test
+) Ok

File size: 3.2 KB
Line 
1#include "reduce_domain_to_axis.hpp"
2#include "type.hpp"
3#include "axis.hpp"
4#include "domain.hpp"
5
6namespace xios {
7
8  /// ////////////////////// Définitions ////////////////////// ///
9
10  CReduceDomainToAxis::CReduceDomainToAxis(void)
11    : CObjectTemplate<CReduceDomainToAxis>(), CReduceDomainToAxisAttributes(), CTransformation<CAxis>()
12  { /* Ne rien faire de plus */ }
13
14  CReduceDomainToAxis::CReduceDomainToAxis(const StdString & id)
15    : CObjectTemplate<CReduceDomainToAxis>(id), CReduceDomainToAxisAttributes(), CTransformation<CAxis>()
16  { /* Ne rien faire de plus */ }
17
18  CReduceDomainToAxis::~CReduceDomainToAxis(void)
19  {}
20
21  CTransformation<CAxis>* CReduceDomainToAxis::create(const StdString& id, xml::CXMLNode* node)
22  {
23    CReduceDomainToAxis* reduceDomain = CReduceDomainToAxisGroup::get("reduce_domain_to_axis_definition")->createChild(id);
24    if (node) reduceDomain->parse(*node);
25    return static_cast<CTransformation<CAxis>*>(reduceDomain);
26  }
27
28  bool CReduceDomainToAxis::registerTrans()
29  {
30    return registerTransformation(TRANS_REDUCE_DOMAIN_TO_AXIS, CReduceDomainToAxis::create);
31  }
32
33  bool CReduceDomainToAxis::_dummyRegistered = CReduceDomainToAxis::registerTrans();
34
35  //----------------------------------------------------------------
36
37  StdString CReduceDomainToAxis::GetName(void)    { return StdString("reduce_domain_to_axis"); }
38  StdString CReduceDomainToAxis::GetDefName(void) { return StdString("reduce_domain_to_axis"); }
39  ENodeType CReduceDomainToAxis::GetType(void)    { return eReduceDomainToAxis; }
40
41  void CReduceDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)
42  {
43    if (CDomain::type_attr::unstructured == domainSrc->type)
44      ERROR("CReduceDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)",
45       << "Domain reduction is only supported for rectilinear or curvillinear grid."
46       << "Domain source " <<domainSrc->getId() << std::endl
47       << "Axis destination " << axisDst->getId());
48
49    int axis_n_glo = axisDst->n_glo;
50    int domain_ni_glo = domainSrc->ni_glo;
51    int domain_nj_glo = domainSrc->nj_glo;
52
53    StdString opLists[]= {"sum","min","max"};
54    std::set<StdString> opString(opLists, opLists + sizeof(opLists)/sizeof(opLists[0]));
55
56    if (this->operation.isEmpty())
57      ERROR("CReduceDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)",
58             << "An operation must be defined."
59             << "Domain source " <<domainSrc->getId() << std::endl
60             << "Axis destination " << axisDst->getId());
61
62    StdString op = this->operation;
63    if (opString.end() == opString.find(op))
64      ERROR("CReduceDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)",
65         << "Operation '" << op << "' not found. Please make sure to use a supported one"
66         << "Domain source " <<domainSrc->getId() << std::endl
67         << "Axis destination " << axisDst->getId());
68
69    if (this->direction.isEmpty())
70      ERROR("CReduceDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)",
71             << "A direction to apply the operation must be defined. It should be: 'iDir' or 'jDir'"
72             << "Domain source " <<domainSrc->getId() << std::endl
73             << "Axis destination " << axisDst->getId());
74  }
75
76}
Note: See TracBrowser for help on using the repository browser.