source: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/interpolate_domain.cpp @ 1847

Last change on this file since 1847 was 1615, checked in by ymipsl, 5 years ago

Interpolation enhancement :
Domain area can be used to improved global conservation when there is a discrepency between model area and xios computed area.

New domain attribute :

radius : radius af the spherical domain, used to compute area ond the sphere with a normalized radius of 1 (for remapper).

New domain_interpolate attribute :
use_area : remapper will take model computed area in order to perform a global conservation for flux integrated over the cell (mass for example).
In this case the domain attributes "area" and "radius" must be defined on the source or target domain to be taking into account.

YM

File size: 2.6 KB
Line 
1#include "interpolate_domain.hpp"
2#include "type.hpp"
3
4namespace xios {
5
6  /// ////////////////////// Définitions ////////////////////// ///
7
8  CInterpolateDomain::CInterpolateDomain(void)
9    : CObjectTemplate<CInterpolateDomain>(), CInterpolateDomainAttributes(), CTransformation<CDomain>()
10  { /* Ne rien faire de plus */ }
11
12  CInterpolateDomain::CInterpolateDomain(const StdString & id)
13    : CObjectTemplate<CInterpolateDomain>(id), CInterpolateDomainAttributes(), CTransformation<CDomain>()
14  { /* Ne rien faire de plus */ }
15
16  CInterpolateDomain::~CInterpolateDomain(void)
17  {}
18
19  CTransformation<CDomain>* CInterpolateDomain::create(const StdString& id, xml::CXMLNode* node)
20  {
21    CInterpolateDomain* interpDomain = CInterpolateDomainGroup::get("interpolate_domain_definition")->createChild(id);
22    if (node) interpDomain->parse(*node);
23    return static_cast<CTransformation<CDomain>*>(interpDomain);
24  }
25
26  bool CInterpolateDomain::_dummyRegistered = CInterpolateDomain::registerTrans();
27  bool CInterpolateDomain::registerTrans()
28  {
29    registerTransformation(TRANS_INTERPOLATE_DOMAIN, create);
30  }
31
32  //----------------------------------------------------------------
33
34  StdString CInterpolateDomain::GetName(void)    { return StdString("interpolate_domain"); }
35  StdString CInterpolateDomain::GetDefName(void) { return StdString("interpolate_domain"); }
36  ENodeType CInterpolateDomain::GetType(void)    { return eInterpolateDomain; }
37
38  void CInterpolateDomain::checkValid(CDomain* domainSrc)
39  {
40    int order = 2;
41    if (!this->order.isEmpty()) order = this->order.getValue();
42    else this->order.setValue(order);
43    if (order < 1)
44    {
45       ERROR("void CInterpolateDomain::checkValid(CDomain* domainSrc)",
46             << "Interpolation order is less than 1, it should be greater than 0."
47             << "Please define a correct one") ;
48    }
49
50    bool detect_missing_value=false ;
51    if (!this->detect_missing_value.isEmpty()) detect_missing_value = this->detect_missing_value.getValue();
52    else this->detect_missing_value.setValue(detect_missing_value);
53
54    bool renormalize=false ;
55    if (!this->renormalize.isEmpty()) renormalize = this->renormalize.getValue();
56    else this->renormalize.setValue(renormalize);
57
58    bool quantity=false ;
59    if (!this->quantity.isEmpty()) quantity = this->quantity.getValue();
60    else this->quantity.setValue(quantity);
61
62    if (this->mode.isEmpty()) this->mode.setValue(mode_attr::compute);
63    if (this->write_weight.isEmpty()) this->write_weight.setValue(false);
64
65    if (this->read_write_convention.isEmpty()) this->read_write_convention.setValue(read_write_convention_attr::fortran);
66
67
68  }
69
70}
Note: See TracBrowser for help on using the repository browser.