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

Last change on this file since 2423 was 2270, checked in by ymipsl, 3 years ago

Tracking memory leak :
Tranformations and algorithms are now managed with shared_ptr.

YM

File size: 5.1 KB
Line 
1#include "extract_domain_to_axis.hpp"
2#include "axis_algorithm_extract_domain.hpp"
3#include "type.hpp"
4#include "axis.hpp"
5#include "domain.hpp"
6
7namespace xios {
8
9  /// ////////////////////// Définitions ////////////////////// ///
10
11  CExtractDomainToAxis::CExtractDomainToAxis(void)
12    : CObjectTemplate<CExtractDomainToAxis>(), CExtractDomainToAxisAttributes(), CTransformation<CAxis>()
13  { /* Ne rien faire de plus */ }
14
15  CExtractDomainToAxis::CExtractDomainToAxis(const StdString & id)
16    : CObjectTemplate<CExtractDomainToAxis>(id), CExtractDomainToAxisAttributes(), CTransformation<CAxis>()
17  { /* Ne rien faire de plus */ }
18
19  CExtractDomainToAxis::~CExtractDomainToAxis(void)
20  {}
21
22  CTransformation<CAxis>* CExtractDomainToAxis::create(const StdString& id, xml::CXMLNode* node)
23  {
24    CExtractDomainToAxis* extractDomain = CExtractDomainToAxisGroup::get("extract_domain_to_axis_definition")->createChild(id);
25    if (node) extractDomain->parse(*node);
26    return static_cast<CTransformation<CAxis>*>(extractDomain);
27  }
28
29  bool CExtractDomainToAxis::registerTrans()
30  {
31    return registerTransformation(TRANS_EXTRACT_DOMAIN_TO_AXIS, {create, getTransformation});
32  }
33
34  bool CExtractDomainToAxis::_dummyRegistered = CExtractDomainToAxis::registerTrans();
35
36  //----------------------------------------------------------------
37
38  StdString CExtractDomainToAxis::GetName(void)    { return StdString("extract_domain_to_axis"); }
39  StdString CExtractDomainToAxis::GetDefName(void) { return StdString("extract_domain_to_axis"); }
40  ENodeType CExtractDomainToAxis::GetType(void)    { return eExtractDomainToAxis; }
41
42  void CExtractDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)
43  {
44    if (CDomain::type_attr::unstructured == domainSrc->type)
45      ERROR("CExtractDomainToAxis::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    int domain_ni_glo = domainSrc->ni_glo;
51    int domain_nj_glo = domainSrc->nj_glo;
52
53    if (this->direction.isEmpty())
54      ERROR("CExtractDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)",
55             << "A direction to apply the operation must be defined. It should be: 'iDir' or 'jDir'"
56             << "Domain source " <<domainSrc->getId() << std::endl
57             << "Axis destination " << axisDst->getId());
58 
59    if (this->position.isEmpty())
60      ERROR("CExtractDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)",
61             << "Position to extract axis must be defined. " << std::endl
62             << "Domain source " <<domainSrc->getId() << std::endl
63             << "Axis destination " << axisDst->getId());
64   
65    switch (direction)
66    {
67      case direction_attr::jDir:
68        if ((position < 0) || (position >= domain_ni_glo))
69        ERROR("CExtractDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)",
70          << "Extract domain along j, position should be inside 0 and ni_glo-1 of domain source"
71          << "Domain source " <<domainSrc->getId() << " has ni_glo " << domain_ni_glo << std::endl
72          << "Axis destination " << axisDst->getId() << std::endl
73          << "Position " << position);
74         break;
75
76      case direction_attr::iDir:
77        if ((position < 0) || (position >= domain_nj_glo))
78        ERROR("CExtractDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)",
79          << "Extract domain along i, position should be inside 0 and nj_glo-1 of domain source"
80          << "Domain source " <<domainSrc->getId() << " has nj_glo " << domain_nj_glo << std::endl
81          << "Axis destination " << axisDst->getId() << std::endl
82          << "Position " << position);
83        break;
84
85      default:
86        break;
87    }
88  }
89
90  shared_ptr<CGenericAlgorithmTransformation> CExtractDomainToAxis::createAlgorithm(bool isSource,
91                                                        CGrid* gridDst, CGrid* gridSrc,
92                                                        int elementPositionInGrid,
93                                                        std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
94                                                        std::map<int, int>& elementPositionInGridSrc2AxisPosition,
95                                                        std::map<int, int>& elementPositionInGridSrc2DomainPosition,
96                                                        std::map<int, int>& elementPositionInGridDst2ScalarPosition,
97                                                        std::map<int, int>& elementPositionInGridDst2AxisPosition,
98                                                        std::map<int, int>& elementPositionInGridDst2DomainPosition)
99  {
100    return CAxisAlgorithmExtractDomain::create(isSource, gridDst, gridSrc, this, elementPositionInGrid, 
101                       elementPositionInGridSrc2ScalarPosition, elementPositionInGridSrc2AxisPosition, elementPositionInGridSrc2DomainPosition,
102                       elementPositionInGridDst2ScalarPosition, elementPositionInGridDst2AxisPosition, elementPositionInGridDst2DomainPosition);
103  }
104}
Note: See TracBrowser for help on using the repository browser.