Changeset 1299


Ignore:
Timestamp:
10/09/17 10:07:07 (7 years ago)
Author:
ymipsl
Message:

Add new attribute "local" in reduce_domain_to_axis transformation :

  • "local" mean that the reduction is apply locally ie only on current process.

YM

Location:
XIOS/dev/XIOS_DEV_CMIP6/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/XIOS_DEV_CMIP6/src/config/reduce_domain_to_axis_attribute.conf

    r980 r1299  
    33/* Direction to apply operation (i, j) */ 
    44DECLARE_ENUM2(direction,  iDir, jDir) 
     5DECLARE_ATTRIBUTE(bool, local) 
  • XIOS/dev/XIOS_DEV_CMIP6/src/node/reduce_domain_to_axis.cpp

    r1204 r1299  
    6262             << "Domain source " <<domainSrc->getId() << std::endl 
    6363             << "Axis destination " << axisDst->getId()); 
    64      
     64    if (this->local.isEmpty()) local=false ; 
     65 
    6566    switch (direction) 
    6667    { 
  • XIOS/dev/XIOS_DEV_CMIP6/src/transformation/axis_algorithm_reduce_domain.cpp

    r1260 r1299  
    7171  dir_ = (CReduceDomainToAxis::direction_attr::iDir == algo->direction)  ? iDir : jDir; 
    7272  reduction_ = CReductionAlgorithm::createOperation(CReductionAlgorithm::ReductionOperations[op]); 
     73  local = algo->local ; 
    7374} 
    7475 
     
    104105  if (iDir == dir_) 
    105106  { 
    106     int nbAxisIdx = axisDstIndex.numElements(); 
    107     for (int idxAxis = 0; idxAxis < nbAxisIdx; ++idxAxis) 
     107    if (local) 
    108108    { 
    109       int globalAxisIdx = axisDstIndex(idxAxis); 
    110       transMap[globalAxisIdx].resize(ni_glo); 
    111       transWeight[globalAxisIdx].resize(ni_glo); 
    112       for (int idx = 0; idx < ni_glo; ++idx) 
     109      const CArray<int, 1>& i_index = domainSrc_-> i_index.getValue() ; 
     110      const CArray<int, 1>& j_index = domainSrc_-> j_index.getValue() ; 
     111      const CArray<bool,1>& localMask = domainSrc_-> localMask ; 
     112      int nbDomainIdx = i_index.numElements(); 
     113       
     114      for (int idxDomain = 0; idxDomain < nbDomainIdx; ++idxDomain) 
    113115      { 
    114         transMap[globalAxisIdx][idx] = globalAxisIdx * ni_glo + idx; 
    115         transWeight[globalAxisIdx][idx] = 1.0; 
     116        if (localMask(idxDomain)) 
     117        {  
     118          transMap[j_index(idxDomain)].push_back(j_index(idxDomain)* ni_glo + i_index(idxDomain)); 
     119          transWeight[j_index(idxDomain)].push_back(1.0) ; 
     120        } 
     121      } 
     122    } 
     123    else 
     124    { 
     125      int nbAxisIdx = axisDstIndex.numElements(); 
     126      for (int idxAxis = 0; idxAxis < nbAxisIdx; ++idxAxis) 
     127      { 
     128        int globalAxisIdx = axisDstIndex(idxAxis); 
     129        transMap[globalAxisIdx].resize(ni_glo); 
     130        transWeight[globalAxisIdx].resize(ni_glo); 
     131        for (int idx = 0; idx < ni_glo; ++idx) 
     132        { 
     133          transMap[globalAxisIdx][idx] = globalAxisIdx * ni_glo + idx; 
     134          transWeight[globalAxisIdx][idx] = 1.0; 
     135        } 
    116136      } 
    117137    } 
     
    120140  { 
    121141    int nbAxisIdx = axisDstIndex.numElements(); 
    122     for (int idxAxis = 0; idxAxis < nbAxisIdx; ++idxAxis) 
     142    if (local) 
    123143    { 
    124       int globalAxisIdx = axisDstIndex(idxAxis); 
    125       transMap[globalAxisIdx].resize(nj_glo); 
    126       transWeight[globalAxisIdx].resize(nj_glo); 
    127       for (int idx = 0; idx < nj_glo; ++idx) 
     144      const CArray<int, 1>& i_index = domainSrc_-> i_index.getValue() ; 
     145      const CArray<int, 1>& j_index = domainSrc_-> j_index.getValue() ; 
     146      const CArray<bool,1>& localMask = domainSrc_-> localMask ; 
     147      int nbDomainIdx = i_index.numElements(); 
     148       
     149      for (int idxDomain = 0; idxDomain < nbDomainIdx; ++idxDomain) 
    128150      { 
    129         transMap[globalAxisIdx][idx] = globalAxisIdx + ni_glo*idx; 
    130         transWeight[globalAxisIdx][idx] = 1.0; 
     151        if (localMask(idxDomain)) 
     152        {  
     153          transMap[i_index(idxDomain)].push_back(j_index(idxDomain)* ni_glo + i_index(idxDomain)); 
     154          transWeight[i_index(idxDomain)].push_back(1.0) ; 
     155        } 
     156      } 
     157    } 
     158    else 
     159    { 
     160      for (int idxAxis = 0; idxAxis < nbAxisIdx; ++idxAxis) 
     161      { 
     162        int globalAxisIdx = axisDstIndex(idxAxis); 
     163        transMap[globalAxisIdx].resize(nj_glo); 
     164        transWeight[globalAxisIdx].resize(nj_glo); 
     165        for (int idx = 0; idx < nj_glo; ++idx) 
     166        { 
     167          transMap[globalAxisIdx][idx] = globalAxisIdx + ni_glo*idx; 
     168          transWeight[globalAxisIdx][idx] = 1.0; 
     169        } 
    131170      } 
    132171    } 
  • XIOS/dev/XIOS_DEV_CMIP6/src/transformation/axis_algorithm_reduce_domain.hpp

    r1260 r1299  
    4646    jDir = 2 
    4747  }; 
    48  
     48   
    4949  ReduceDirection dir_; 
     50  bool local ; 
     51   
    5052protected: 
    5153  void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs);  
Note: See TracChangeset for help on using the changeset viewer.