source: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/interpolate_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: 4.9 KB
Line 
1#include "interpolate_axis.hpp"
2#include "axis_algorithm_interpolate_coordinate.hpp"
3#include "axis_algorithm_interpolate.hpp"
4#include "type.hpp"
5#include "field.hpp"
6
7namespace xios {
8
9  /// ////////////////////// Définitions ////////////////////// ///
10
11  CInterpolateAxis::CInterpolateAxis(void)
12    : CObjectTemplate<CInterpolateAxis>(), CInterpolateAxisAttributes(), CTransformation<CAxis>()
13  { /* Ne rien faire de plus */ }
14
15  CInterpolateAxis::CInterpolateAxis(const StdString & id)
16    : CObjectTemplate<CInterpolateAxis>(id), CInterpolateAxisAttributes(), CTransformation<CAxis>()
17  { /* Ne rien faire de plus */ }
18
19  CInterpolateAxis::~CInterpolateAxis(void)
20  {}
21
22  CTransformation<CAxis>* CInterpolateAxis::create(const StdString& id, xml::CXMLNode* node)
23  {
24    CInterpolateAxis* interpAxis = CInterpolateAxisGroup::get("interpolate_axis_definition")->createChild(id);
25    if (node) interpAxis->parse(*node);
26    return static_cast<CTransformation<CAxis>*>(interpAxis);
27  }
28
29  bool CInterpolateAxis::registerTrans()
30  {
31    return registerTransformation(TRANS_INTERPOLATE_AXIS, {create, getTransformation});
32  }
33
34  bool CInterpolateAxis::_dummyRegistered = CInterpolateAxis::registerTrans();
35
36  //----------------------------------------------------------------
37
38  StdString CInterpolateAxis::GetName(void)    { return StdString("interpolate_axis"); }
39  StdString CInterpolateAxis::GetDefName(void) { return StdString("interpolate_axis"); }
40  ENodeType CInterpolateAxis::GetType(void)    { return eInterpolateAxis; }
41
42  void CInterpolateAxis::checkValid(CAxis* axisSrc)
43  {
44    if (this->order.isEmpty()) this->order.setValue(1);
45    int order = this->order.getValue();
46    if (order >= axisSrc->n_glo.getValue())
47    {
48      ERROR("CInterpolateAxis::checkValid(CAxis* axisSrc)",
49             << "Order of interpolation is greater than global size of axis source"
50             << "Size of axis source " <<axisSrc->getId() << " is " << axisSrc->n_glo.getValue()  << std::endl
51             << "Order of interpolation is " << order );
52    }
53
54    if (order < 1)
55    {
56      ERROR("CInterpolateAxis::checkValid(CAxis* axisSrc)",
57             << "Order of interpolation is smaller than 1"
58             << "Size of axis source " <<axisSrc->getId() << " is " << axisSrc->n_glo.getValue()  << std::endl
59             << "Order of interpolation is " << order );
60    }
61
62
63    if (!this->coordinate.isEmpty())
64    {
65      StdString coordinate = this->coordinate.getValue();
66      if (!CField::has(coordinate))
67        ERROR("CInterpolateAxis::checkValid(CAxis* axisSrc)",
68               << "Coordinate field whose id " << coordinate << "does not exist "
69               << "Please define one");
70    }
71  }
72
73  std::vector<StdString> CInterpolateAxis::checkAuxInputs_()
74  {
75    std::vector<StdString> auxInputs;
76    if (!this->coordinate.isEmpty())
77    {
78      StdString coordinate = this->coordinate.getValue();
79      if (!CField::has(coordinate))
80        ERROR("CInterpolateAxis::checkValid(CAxis* axisSrc)",
81               << "Coordinate field whose id " << coordinate << "does not exist "
82               << "Please define one");
83      auxInputs.push_back(coordinate);
84    }
85
86    return auxInputs;
87  }
88
89  CGenericAlgorithmTransformation* CInterpolateAxis::createAlgorithm(bool isSource,
90                                                        CGrid* gridDst, CGrid* gridSrc,
91                                                        int elementPositionInGrid,
92                                                        std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
93                                                        std::map<int, int>& elementPositionInGridSrc2AxisPosition,
94                                                        std::map<int, int>& elementPositionInGridSrc2DomainPosition,
95                                                        std::map<int, int>& elementPositionInGridDst2ScalarPosition,
96                                                        std::map<int, int>& elementPositionInGridDst2AxisPosition,
97                                                        std::map<int, int>& elementPositionInGridDst2DomainPosition)
98  {
99    if (!coordinate.isEmpty())  return CAxisAlgorithmInterpolateCoordinate::create(isSource, gridDst,  gridSrc, this, elementPositionInGrid, 
100                                      elementPositionInGridSrc2ScalarPosition, elementPositionInGridSrc2AxisPosition, elementPositionInGridSrc2DomainPosition,
101                                      elementPositionInGridDst2ScalarPosition, elementPositionInGridDst2AxisPosition, elementPositionInGridDst2DomainPosition);
102    else return CAxisAlgorithmInterpolate::create(isSource, gridDst,  gridSrc, this, elementPositionInGrid, 
103                elementPositionInGridSrc2ScalarPosition, elementPositionInGridSrc2AxisPosition, elementPositionInGridSrc2DomainPosition,
104                elementPositionInGridDst2ScalarPosition, elementPositionInGridDst2AxisPosition, elementPositionInGridDst2DomainPosition);
105  }
106}
Note: See TracBrowser for help on using the repository browser.