Changeset 895 for XIOS/trunk/src


Ignore:
Timestamp:
07/11/16 17:36:01 (8 years ago)
Author:
mhnguyen
Message:

Adding a new transformation: Reduce a domain to an axis

Test
+) On Curie
+) Tests pass and are correct

Location:
XIOS/trunk/src
Files:
13 added
21 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/config/node_type.conf

    r888 r895  
    6363#endif //__XIOS_CReduceAxisToScalar__ 
    6464 
     65#ifdef __XIOS_CReduceDomainToAxis__ 
     66   DECLARE_NODE(ReduceDomainToAxis, reduce_domain) 
     67#endif //__XIOS_CReduceDomainToAxis__ 
     68 
     69#ifdef __XIOS_CExtractDomainToAxis__ 
     70   DECLARE_NODE(ExtractDomainToAxis, extract_domain) 
     71#endif //__XIOS_CExtractDomainToAxis__ 
     72 
    6573#ifdef __XIOS_CContext__ 
    6674   DECLARE_NODE_PAR(Context, context) 
  • XIOS/trunk/src/group_factory_decl.cpp

    r888 r895  
    3333  macro(CScalarGroup) 
    3434  macro(CReduceAxisToScalarGroup) 
     35  macro(CReduceDomainToAxisGroup) 
     36  macro(CExtractDomainToAxisGroup) 
    3537} 
  • XIOS/trunk/src/group_template_decl.cpp

    r888 r895  
    2222  macro(Scalar) 
    2323  macro(ReduceAxisToScalar) 
     24  macro(ReduceDomainToAxis) 
     25  macro(ExtractDomainToAxis) 
    2426 
    2527} 
  • XIOS/trunk/src/node/axis.cpp

    r836 r895  
    4949     m["interpolate_axis"] = TRANS_INTERPOLATE_AXIS; 
    5050     m["inverse_axis"] = TRANS_INVERSE_AXIS; 
     51     m["reduce_domain"] = TRANS_REDUCE_DOMAIN_TO_AXIS; 
     52     m["extract_domain"] = TRANS_EXTRACT_DOMAIN_TO_AXIS; 
    5153   } 
    5254 
     
    922924    TransMapTypes::const_iterator itb = transformationMap_.begin(), it, 
    923925                                  ite = transformationMap_.end(); 
    924     for (it = itb; it != ite; ++it) 
    925     { 
    926       (it->second)->checkValid(this); 
    927     } 
     926//    for (it = itb; it != ite; ++it) 
     927//    { 
     928//      (it->second)->checkValid(this); 
     929//    } 
    928930  } 
    929931 
  • XIOS/trunk/src/node/domain.cpp

    r893 r895  
    8383   } 
    8484 
    85    
     85 
    8686   const std::vector<int>& CDomain::getIndexesToWrite(void) const 
    8787   { 
     
    215215      this->relFiles.insert(filename); 
    216216   } 
    217    
     217 
    218218   void CDomain::addRelFileCompressed(const StdString& filename) 
    219219   { 
     
    20062006    TransMapTypes::const_iterator itb = transformationMap_.begin(), it, 
    20072007                                  ite = transformationMap_.end(); 
    2008     for (it = itb; it != ite; ++it) 
    2009     { 
    2010       (it->second)->checkValid(this); 
    2011     } 
     2008//    for (it = itb; it != ite; ++it) 
     2009//    { 
     2010//      (it->second)->checkValid(this); 
     2011//    } 
    20122012  } 
    20132013 
  • XIOS/trunk/src/node/grid.cpp

    r890 r895  
    16881688             << "Dimension of grid source " << transformGridSrc->getId() << " is " << transformGridSrc->axis_domain_order.numElements()); 
    16891689      } 
    1690       else 
    1691       { 
    1692 //        int ssize = axis_domain_order.numElements(); 
    1693 //        for (int i = 0; i < ssize; ++i) 
    1694 //          if (axis_domain_order(i) != (transformGridSrc->axis_domain_order)(i)) 
    1695 //            ERROR("CGrid::completeGrid(CGrid* transformGridSrc)", 
    1696 //                  << "Grids " << this->getId() << " and " << transformGridSrc->getId() 
    1697 //                  << " don't have elements in the same order"); 
    1698       } 
    16991690    } 
    17001691 
  • XIOS/trunk/src/node/node_enum.hpp

    r888 r895  
    2727         eGenerateRectilinearDomain, 
    2828         eScalar, 
    29          eReduceAxisToScalar 
     29         eReduceAxisToScalar, 
     30         eReduceDomainToAxis, 
     31         eExtractDomainToAxis 
    3032 
    3133      } ENodeType; 
  • XIOS/trunk/src/node/node_type.hpp

    r888 r895  
    1818#include "scalar.hpp" 
    1919#include "reduce_axis_to_scalar.hpp" 
     20#include "reduce_domain_to_axis.hpp" 
     21#include "extract_domain_to_axis.hpp" 
    2022 
    2123 
  • XIOS/trunk/src/node/scalar.cpp

    r888 r895  
    9292    TransMapTypes::const_iterator itb = transformationMap_.begin(), it, 
    9393                                  ite = transformationMap_.end(); 
    94     for (it = itb; it != ite; ++it) 
    95     { 
    96       (it->second)->checkValid(this); 
    97     } 
     94//    for (it = itb; it != ite; ++it) 
     95//    { 
     96//      (it->second)->checkValid(this); 
     97//    } 
    9898  } 
    9999 
  • XIOS/trunk/src/node/transformation.hpp

    r840 r895  
    2222      /// Constructeurs /// 
    2323      CTransformation(void) {} 
    24       virtual void checkValid(T* dest) = 0; 
     24      virtual void checkValid(T* dest) {} 
    2525 
    2626      std::vector<StdString> checkAuxInputs() { return checkAuxInputs_(); } 
  • XIOS/trunk/src/node/transformation_enum.hpp

    r888 r895  
    1313        TRANS_INTERPOLATE_DOMAIN = 4, 
    1414        TRANS_GENERATE_RECTILINEAR_DOMAIN = 5, 
    15         TRANS_REDUCE_AXIS_TO_SCALAR = 6 
     15        TRANS_REDUCE_AXIS_TO_SCALAR = 6, 
     16        TRANS_REDUCE_DOMAIN_TO_AXIS = 7, 
     17        TRANS_EXTRACT_DOMAIN_TO_AXIS = 8 
    1618      } ETranformationType; 
    1719 
  • XIOS/trunk/src/object_factory_decl.cpp

    r888 r895  
    3434  macro(CScalar) 
    3535  macro(CReduceAxisToScalar) 
     36  macro(CReduceDomainToAxis) 
     37  macro(CExtractDomainToAxis) 
    3638 
    3739  macro(CFieldGroup) 
     
    5052  macro(CScalarGroup) 
    5153  macro(CReduceAxisToScalarGroup) 
     54  macro(CReduceDomainToAxisGroup) 
     55  macro(CExtractDomainToAxisGroup) 
    5256} 
  • XIOS/trunk/src/object_template_decl.cpp

    r888 r895  
    2121  template class CObjectTemplate<CScalar>; 
    2222  template class CObjectTemplate<CReduceAxisToScalar>; 
     23  template class CObjectTemplate<CReduceDomainToAxis>; 
     24  template class CObjectTemplate<CExtractDomainToAxis>; 
    2325 
    2426  template class CObjectTemplate<CContextGroup>; 
     
    3739  template class CObjectTemplate<CScalarGroup>; 
    3840  template class CObjectTemplate<CReduceAxisToScalarGroup>; 
     41  template class CObjectTemplate<CReduceDomainToAxisGroup>; 
     42  template class CObjectTemplate<CExtractDomainToAxisGroup>; 
    3943} 
  • XIOS/trunk/src/test/test_new_features.f90

    r886 r895  
    1919  INTEGER,PARAMETER :: llm=10 
    2020  INTEGER,PARAMETER :: llmInterPolated=4 
    21   DOUBLE PRECISION  :: lval(llm)=1, tsTemp, lvalInterPolated(llmInterPolated)=1 
     21  DOUBLE PRECISION  :: lval(llm)=1, tsTemp, lvalInterPolated(llmInterPolated)=1, nlev(nj_glo)=10 
    2222  TYPE(xios_field) :: field_hdl 
    2323  TYPE(xios_fieldgroup) :: fieldgroup_hdl 
     
    2929  DOUBLE PRECISION,DIMENSION(4,ni_glo,nj_glo) :: bnds_lon_glo, bnds_lat_glo 
    3030  DOUBLE PRECISION :: field_A_glo(ni_glo,nj_glo,llm), lval_ni_glo(ni_glo), lval_nj_glo(nj_glo), field_Value_glo(ni_glo,nj_glo,llm) 
    31   DOUBLE PRECISION,ALLOCATABLE :: lon(:,:),lat(:,:),field_A(:,:,:), field_All_Axis(:,:,:), lonvalue(:) , & 
     31  DOUBLE PRECISION,ALLOCATABLE :: lon(:,:),lat(:,:),field_A(:,:,:), field_A_2D(:,:), field_All_Axis(:,:,:), lonvalue(:) , & 
    3232                                  field_Axis(:), lvaln(:), lval_ni(:), lval_nj(:), field_Two_Axis(:,:), lvalnInterp(:), & 
    3333                                  lontransformed(:,:), lattransformed(:,:), lon_glotransformed(:,:), lat_glotransformed(:,:), & 
     
    106106  CALL Distribute_index(jbeginDomInterp, jendDomInterp, njDomInterp, njDomGlo, rank, size) 
    107107 
    108   ALLOCATE(field_A(0:ni+1,-1:nj+2,llm), field_Two_Axis(ni_glo,1:nj), field_Axis(nAxis), field_All_Axis(1:ni,1:nj,llm), & 
     108  ALLOCATE(field_A(0:ni+1,-1:nj+2,llm), field_A_2D(0:ni+1,-1:nj+2), field_Two_Axis(ni_glo,1:nj), field_Axis(nAxis), field_All_Axis(1:ni,1:nj,llm), & 
    109109          lon(ni,nj),lat(ni,nj), lonvalue(ni*nj), & 
    110110          lvaln(nAxis), lval_ni(ni), lval_nj(nj), lvalnInterp(nAxisinterp), & 
     
    127127  lattransformed(:,:) = lat_glotransformed(ibeginDomInterp+1:iendDomInterp+1,jbeginDomInterp+1:jendDomInterp+1) 
    128128  field_A(1:ni,1:nj,:) = field_A_glo(ibegin+1:iend+1,jbegin+1:jend+1,:) 
     129  field_A_2D(1:ni,1:nj) = field_A_glo(ibegin+1:iend+1,jbegin+1:jend+1,1) 
    129130  field_value(1:ni,1:nj,:) = field_Value_glo(ibegin+1:iend+1,jbegin+1:jend+1,:) 
    130131  field_Axis(1:nAxis)  = field_A_glo(1,1,axisBegin+1:axisEnd+1) 
     
    149150  CALL xios_set_axis_attr("axis_D", n_glo=llm, begin=axisBegin, n=nAxis, value=lvaln) 
    150151  CALL xios_set_axis_attr("axis_E", n_glo=llmInterPolated, value=lvalnInterp, begin=axisterpBegin, n=nAxisinterp) 
     152  CALL xios_set_axis_attr("axis_G", n_glo=nj_glo, value=nlev) 
     153 
    151154  CALL xios_set_domain_attr("domain_A",ni_glo=ni_glo, nj_glo=nj_glo, ibegin=ibegin, ni=ni,jbegin=jbegin,nj=nj) 
    152155  CALL xios_set_domain_attr("domain_A",data_dim=2, data_ibegin=-1, data_ni=ni+2, data_jbegin=-2, data_nj=nj+4) 
     
    206209    CALL xios_update_calendar(ts) 
    207210    CALL xios_send_field("field_A",field_A) 
     211    CALL xios_send_field("field_A_2D",field_A_2D) 
    208212    CALL xios_send_field("field_Value",field_value) 
    209213    CALL xios_send_field("field_Axis",field_Axis) 
  • XIOS/trunk/src/transformation/Functions/reduction.cpp

    r888 r895  
    33#include "min.hpp" 
    44#include "max.hpp" 
     5#include "extract.hpp" 
    56 
    67namespace xios { 
     
    1920  m["max"] = TRANS_REDUCE_MAX; 
    2021  CMaxReductionAlgorithm::registerTrans(); 
     22 
     23  m["extract"] = TRANS_REDUCE_EXTRACT; 
     24  CExtractReductionAlgorithm::registerTrans(); 
    2125} 
    2226 
  • XIOS/trunk/src/transformation/Functions/reduction_types.hpp

    r888 r895  
    1616    TRANS_REDUCE_SUM = 0, 
    1717    TRANS_REDUCE_MIN = 1, 
    18     TRANS_REDUCE_MAX = 2 
     18    TRANS_REDUCE_MAX = 2, 
     19    TRANS_REDUCE_EXTRACT = 3 
    1920  } EReductionType; 
    2021 
  • XIOS/trunk/src/transformation/axis_algorithm_transformation.cpp

    r888 r895  
    1919 
    2020CAxisAlgorithmTransformation::CAxisAlgorithmTransformation(CAxis* axisDestination, CAxis* axisSource) 
    21  : CGenericAlgorithmTransformation(), axisDest_(axisDestination), axisSrc_(axisSource) 
     21 : CGenericAlgorithmTransformation(), axisDest_(axisDestination), axisSrc_(axisSource), domainSrc_(0) 
     22{ 
     23  axisDestGlobalSize_ = axisDestination->n_glo.getValue(); 
     24  int niDest = axisDestination->n.getValue(); 
     25  int ibeginDest = axisDestination->begin.getValue(); 
     26 
     27  for (int idx = 0; idx < niDest; ++idx) 
     28    if ((axisDestination->mask)(idx)) axisDestGlobalIndex_.push_back(ibeginDest+idx); 
     29} 
     30 
     31CAxisAlgorithmTransformation::CAxisAlgorithmTransformation(CAxis* axisDestination, CDomain* domainSource) 
     32 : CGenericAlgorithmTransformation(), axisDest_(axisDestination), axisSrc_(0), domainSrc_(domainSource) 
    2233{ 
    2334  axisDestGlobalSize_ = axisDestination->n_glo.getValue(); 
     
    5162  int clientSize = client->clientSize; 
    5263 
    53  
    5464  size_t globalIndex; 
    55   int nIndexSize = axisSrc_->index.numElements(); 
     65  int nIndexSize = 0; 
     66  if (2 == elementType) nIndexSize = domainSrc_->i_index.numElements(); 
     67  else if (1 == elementType) nIndexSize = axisSrc_->index.numElements(); 
    5668  CClientClientDHTInt::Index2VectorInfoTypeMap globalIndex2ProcRank; 
    5769  globalIndex2ProcRank.rehash(std::ceil(nIndexSize/globalIndex2ProcRank.max_load_factor())); 
    5870  for (int idx = 0; idx < nIndexSize; ++idx) 
    5971  { 
    60     globalIndex = axisSrc_->index(idx); 
     72    if (2 == elementType) 
     73    { 
     74      globalIndex = domainSrc_->i_index(idx) + domainSrc_->j_index(idx) * domainSrc_->ni_glo; 
     75    } 
     76    else if (1 == elementType) 
     77    { 
     78      globalIndex = axisSrc_->index(idx); 
     79    } 
     80 
    6181    globalIndex2ProcRank[globalIndex].resize(1); 
    6282    globalIndex2ProcRank[globalIndex][0] = clientRank; 
  • XIOS/trunk/src/transformation/axis_algorithm_transformation.hpp

    r888 r895  
    1515 
    1616class CAxis; 
     17class CDomain; 
     18 
    1719/*! 
    1820  \class CAxisAlgorithmTransformation 
     
    2325public: 
    2426  CAxisAlgorithmTransformation(CAxis* axisDestination, CAxis* axisSource); 
     27  CAxisAlgorithmTransformation(CAxis* axisDestination, CDomain* domainSource); 
    2528 
    2629  virtual ~CAxisAlgorithmTransformation(); 
     
    4548  //! Axis on grid source 
    4649  CAxis* axisSrc_; 
     50 
     51  //! Domain on grid source 
     52  CDomain* domainSrc_; 
    4753}; 
    4854 
  • XIOS/trunk/src/transformation/grid_transformation.cpp

    r888 r895  
    88 */ 
    99#include "grid_transformation.hpp" 
    10 #include "reduce_axis_to_scalar.hpp" 
    11 #include "scalar_algorithm_reduce_axis.hpp" 
    12 #include "axis_algorithm_inverse.hpp" 
    13 #include "axis_algorithm_zoom.hpp" 
    14 #include "axis_algorithm_interpolate.hpp" 
    15 #include "domain_algorithm_zoom.hpp" 
    16 #include "domain_algorithm_interpolate.hpp" 
     10#include "algo_types.hpp" 
    1711#include "context.hpp" 
    1812#include "context_client.hpp" 
    19 #include "axis_algorithm_transformation.hpp" 
    2013#include "distribution_client.hpp" 
    2114#include "mpi_tag.hpp" 
     
    9285  CZoomAxis* zoomAxis = 0; 
    9386  CInterpolateAxis* interpAxis = 0; 
     87  CReduceDomainToAxis* reduceDomain = 0; 
     88  CExtractDomainToAxis* extractDomain = 0; 
    9489  CGenericAlgorithmTransformation* algo = 0; 
    9590  switch (transType) 
     
    109104      algo = new CAxisAlgorithmInverse(axisListDestP[axisDstIndex], axisListSrcP[axisSrcIndex]); 
    110105      break; 
     106    case TRANS_REDUCE_DOMAIN_TO_AXIS: 
     107      reduceDomain = dynamic_cast<CReduceDomainToAxis*> (it->second); 
     108      domainSrcIndex = elementPositionInGridSrc2DomainPosition_[elementPositionInGrid]; 
     109      algo = new CAxisAlgorithmReduceDomain(axisListDestP[axisDstIndex], domainListSrcP[domainSrcIndex], reduceDomain); 
     110      break; 
     111    case TRANS_EXTRACT_DOMAIN_TO_AXIS: 
     112      extractDomain = dynamic_cast<CExtractDomainToAxis*> (it->second); 
     113      domainSrcIndex = elementPositionInGridSrc2DomainPosition_[elementPositionInGrid]; 
     114      algo = new CAxisAlgorithmExtractDomain(axisListDestP[axisDstIndex], domainListSrcP[domainSrcIndex], extractDomain); 
     115      break; 
    111116    default: 
    112117      break; 
     
    189194    case TRANS_ZOOM_AXIS: 
    190195    case TRANS_INVERSE_AXIS: 
     196    case TRANS_REDUCE_DOMAIN_TO_AXIS: 
     197    case TRANS_EXTRACT_DOMAIN_TO_AXIS: 
    191198      axisIndex =  elementPositionInGridDst2AxisPosition_[elementPositionInGrid]; 
    192199      break; 
     
    267274    case TRANS_ZOOM_AXIS: 
    268275    case TRANS_INVERSE_AXIS: 
     276    case TRANS_REDUCE_DOMAIN_TO_AXIS: 
     277    case TRANS_EXTRACT_DOMAIN_TO_AXIS: 
    269278      axisIndex =  elementPositionInGridDst2AxisPosition_[elementPositionInGrid]; 
    270279      break; 
  • XIOS/trunk/src/type/type_util.hpp

    r888 r895  
    3636    class CReduceAxisToScalar; 
    3737    class CReduceAxisToScalarGroup; 
     38    class CReduceDomainToAxis; 
     39    class CReduceDomainToAxisGroup; 
     40    class CExtractDomainToAxis; 
     41    class CExtractDomainToAxisGroup; 
    3842 
    3943  template <typename T> inline string getStrType(void); 
     
    8892  macro(CReduceAxisToScalar) 
    8993  macro(CReduceAxisToScalarGroup) 
     94  macro(CReduceDomainToAxis) 
     95  macro(CReduceDomainToAxisGroup) 
     96  macro(CExtractDomainToAxis) 
     97  macro(CExtractDomainToAxisGroup) 
    9098#undef macro 
    9199} 
  • XIOS/trunk/src/xml_parser_decl.cpp

    r888 r895  
    2727    macro( Scalar ) 
    2828    macro( ReduceAxisToScalar ) 
     29    macro( ReduceDomainToAxis ) 
     30    macro( ExtractDomainToAxis ) 
    2931  } 
    3032} 
Note: See TracChangeset for help on using the changeset viewer.