source: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/extract_domain_to_axis.cpp @ 2011

Last change on this file since 2011 was 2011, checked in by ymipsl, 3 years ago
  • bug fix when createing mask on server side when overlapping grid
  • implement axis interpolation on pressure coordinate
  • big cleaning in transformation

YM

File size: 6.0 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 axis_n_glo = axisDst->n_glo;
51    int domain_ni_glo = domainSrc->ni_glo;
52    int domain_nj_glo = domainSrc->nj_glo;
53
54    if (this->direction.isEmpty())
55      ERROR("CExtractDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)",
56             << "A direction to apply the operation must be defined. It should be: 'iDir' or 'jDir'"
57             << "Domain source " <<domainSrc->getId() << std::endl
58             << "Axis destination " << axisDst->getId());
59 
60    if (this->position.isEmpty())
61      ERROR("CExtractDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)",
62             << "Position to extract axis must be defined. " << std::endl
63             << "Domain source " <<domainSrc->getId() << std::endl
64             << "Axis destination " << axisDst->getId());
65   
66    switch (direction)
67    {
68      case direction_attr::jDir:
69        if (axis_n_glo != domain_ni_glo)
70          ERROR("CExtractDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)",
71            << "Extract domain along j, axis destination should have n_glo equal to ni_glo of domain source"
72            << "Domain source " <<domainSrc->getId() << " has nj_glo " << domain_ni_glo << std::endl
73            << "Axis destination " << axisDst->getId() << " has n_glo " << axis_n_glo);
74        if ((position < 0) || (position > domain_ni_glo))
75        ERROR("CExtractDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)",
76          << "Extract domain along j, position should be inside 0 and ni_glo of domain source"
77          << "Domain source " <<domainSrc->getId() << " has nj_glo " << domain_ni_glo << std::endl
78          << "Axis destination " << axisDst->getId() << std::endl
79          << "Position " << position);
80         break;
81
82      case direction_attr::iDir:
83        if (axis_n_glo != domain_nj_glo)
84          ERROR("CExtractDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)",
85            << "Extract domain along i, axis destination should have n_glo equal to nj_glo of domain source"
86            << "Domain source " <<domainSrc->getId() << " has nj_glo " << domain_nj_glo << std::endl
87            << "Axis destination " << axisDst->getId() << " has n_glo " << axis_n_glo);
88        if ((position < 0) || (position > domain_nj_glo))
89        ERROR("CExtractDomainToAxis::checkValid(CAxis* axisDst, CDomain* domainSrc)",
90          << "Extract domain along i, position should be inside 0 and nj_glo of domain source"
91          << "Domain source " <<domainSrc->getId() << " has nj_glo " << domain_ni_glo << std::endl
92          << "Axis destination " << axisDst->getId() << std::endl
93          << "Position " << position);
94        break;
95
96      default:
97        break;
98    }
99  }
100
101  CGenericAlgorithmTransformation* CExtractDomainToAxis::createAlgorithm(bool isSource,
102                                                        CGrid* gridDst, CGrid* gridSrc,
103                                                        int elementPositionInGrid,
104                                                        std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
105                                                        std::map<int, int>& elementPositionInGridSrc2AxisPosition,
106                                                        std::map<int, int>& elementPositionInGridSrc2DomainPosition,
107                                                        std::map<int, int>& elementPositionInGridDst2ScalarPosition,
108                                                        std::map<int, int>& elementPositionInGridDst2AxisPosition,
109                                                        std::map<int, int>& elementPositionInGridDst2DomainPosition)
110  {
111    return CAxisAlgorithmExtractDomain::create(isSource, gridDst, gridSrc, this, elementPositionInGrid, 
112                       elementPositionInGridSrc2ScalarPosition, elementPositionInGridSrc2AxisPosition, elementPositionInGridSrc2DomainPosition,
113                       elementPositionInGridDst2ScalarPosition, elementPositionInGridDst2AxisPosition, elementPositionInGridDst2DomainPosition);
114  }
115}
Note: See TracBrowser for help on using the repository browser.