Ignore:
Timestamp:
02/01/22 15:28:48 (2 years ago)
Author:
ymipsl
Message:

Improve reduction transformation

  • make the difference between reduction over geometry or reduction between process.
  • geometrical reduction :

domain -> axis
axis -> scalar
domain -> scalar

  • reduction across processes for redondant geometrical cell :

axis -> axis
scalar -> scalar

Reduction can be local (only for the geometrical cell owned by current process) or global, using the "local" attribute (bool) over the reduction.

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution/grid_gatherer_connector.hpp

    r2267 r2291  
    1010#include "context_client.hpp" 
    1111#include "gatherer_connector.hpp" 
     12#include "reduction_types.hpp" 
    1213 
    1314 
     
    3031 
    3132      template<typename T>  
    32       void transfer(const map<int, CArray<T,1>>& input, CArray<T,1>& output) 
     33      void transfer(const map<int, CArray<T,1>>& input, CArray<T,1>& output, EReduction op = EReduction::none) 
    3334      { 
    3435        int n = elementsConnector_.size()-1 ; 
    35        shared_ptr<CGathererConnector>* connector = elementsConnector_.data() + n ; 
     36        shared_ptr<CGathererConnector>* connector = elementsConnector_.data() + n ; 
    3637        output.resize(dstSize_) ; 
    37         for(auto& rankDataIn : input)  
     38        
     39        if (op == EReduction::none) 
     40          for(auto& rankDataIn : input)  
     41            elementsConnector_[n]->transfer(rankDataIn.first, connector, n, rankDataIn.second.dataFirst(), output.dataFirst()) ; 
     42        else 
    3843        { 
    39           elementsConnector_[n]->transfer(rankDataIn.first, connector, n, rankDataIn.second.dataFirst(), output.dataFirst()) ; 
     44          T defaultValue = std::numeric_limits<T>::quiet_NaN(); 
     45          vector<int> count(dstSize_,0) ; 
     46          for(auto& rankDataIn : input)  
     47            elementsConnector_[n]->transfer(rankDataIn.first, connector, n, rankDataIn.second.dataFirst(), output.dataFirst(), op, count.data()) ; 
     48 
     49          for(int i=0;i<dstSize_;i++) if (count[i]==0) output(i)=defaultValue ; 
    4050        } 
    4151      }  
     
    5565 
    5666      template<typename T> 
    57       void transfer(CEventServer& event, CArray<T,1>& dataOut) 
     67      void transfer(CEventServer& event, CArray<T,1>& dataOut, EReduction op = EReduction::none) 
    5868      { 
    5969        map<int, CArray<T,1>> dataIn ; 
     
    6373          (*subEvent.buffer) >> data ; 
    6474        } 
    65         transfer(dataIn, dataOut) ; 
     75        transfer(dataIn, dataOut, op) ; 
    6676      } 
    6777       
Note: See TracChangeset for help on using the changeset viewer.