source: XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution/reduce_transform_connector.hpp @ 1999

Last change on this file since 1999 was 1999, checked in by ymipsl, 10 months ago

Adapt transformation algorithm to new infrastructure (on going...)

YM

  • Property svn:executable set to *
File size: 4.0 KB
Line 
1#ifndef __REDUCE_TRANSFORM_CONNECTOR_HPP__
2#define __REDUCE_TRANSFORM_CONNECTOR_HPP__
3
4#include "xios_spl.hpp"
5#include "array_new.hpp"
6#include "local_view.hpp"
7#include "reduction_types.hpp"
8
9
10
11namespace xios
12{
13 
14  class CReduceTransformConnector
15  {
16   
17    private:
18      CLocalView* srcView_;
19      CLocalView* dstView_;
20
21      vector<int> connector_;  //  sizeof sum(nWeights_) 
22      vector<int> nSrc_ ;  //  sizeof dstSize_
23      int srcSize_ ;
24      int dstSize_ ;
25      bool detectMissingValue_ ;
26      EReduction type_ ;
27     
28      typedef void (CReduceTransformConnector::* transferPtr)(int, int, const CArray<double,1>& , CArray<double,1>&) ;
29      transferPtr transfer_ ;
30     
31     void computeConnector(unordered_map<int, std::vector<int>>& indexMap) ;
32     
33    public:
34
35    CReduceTransformConnector(CLocalView* srcView, CLocalView* dstView, EReduction op, unordered_map<int, std::vector<int>>& indexMap, 
36                              bool detectMissingValue=true) ;
37 
38    void transfer(const CArray<double,1>& dataIn, CArray<double,1>& dataOut)
39    {
40      transfer(1,1,dataIn, dataOut) ;
41    }
42        void transfer(int sizeT, const CArray<double,1>& dataIn, CArray<double,1>& dataOut)
43    { 
44      transfer(1,sizeT, dataIn, dataOut) ;
45    }
46
47    void transfer(int repeat, int sizeT, const CArray<double,1>& dataIn, CArray<double,1>& dataOut)
48    {
49      (this->*transfer_)(repeat, sizeT, dataIn, dataOut) ;
50    }
51   
52    private :
53   
54    void transferSum(int repeat, int sizeT, const CArray<double,1>& dataIn, CArray<double,1>& dataOut)
55    {
56      double defaultValue = std::numeric_limits<double>::quiet_NaN();
57
58      int dstSlice = dstSize_*sizeT ;
59      int srcSlice = srcSize_*sizeT ;
60      dataOut.resize(repeat* dstSlice) ;
61      dataOut=0 ;
62           
63      const double* input = dataIn.dataFirst()  ;
64      double* output = dataOut.dataFirst()  ;
65
66      if (detectMissingValue_)
67      {
68        vector<bool> touched(repeat* dstSlice, false) ;
69        int pos=0 ;
70        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice, pos+=dstSlice)
71        {
72          const double* in = input;
73          double* out = output ;
74          int k=0 ;
75          for(int i=0; i<dstSize_; i++, out+=sizeT, pos+=sizeT)
76          {
77            if (nSrc_[i]==0) for(int l=0; l<sizeT; l++) out[l] = defaultValue ;
78            else 
79            {
80              for(int j=0 ; j<nSrc_[i] ; j++,k++)
81                for(int l=0; l<sizeT; l++) 
82                {
83                  if (! std::isnan(in[connector_[k]*sizeT+l]) ) 
84                  {
85                    if (touched[pos+l]) out[l] += in[connector_[k]*sizeT+l] ;
86                    else 
87                    {
88                      touched[pos+l] = true ;
89                      out[l] = in[connector_[k]*sizeT+l] ;
90                    }
91                  }
92                }
93            }
94          }
95        }
96
97        output = dataOut.dataFirst()  ;
98        pos=0 ;
99        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice, pos+=dstSlice)
100        {
101          const double* in = input;
102          double* out = output ;
103          int k=0 ;
104          int pos=0 ;
105          for(int i=0; i<dstSize_; i++, out+=sizeT, pos+=sizeT)
106              for(int j=0 ; j<nSrc_[i] ; j++,k++)
107                for(int l=0; l<sizeT; l++) if (!touched[pos+l]) out[l] = defaultValue ;
108        }
109
110      }
111      else
112      {
113        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice)
114        {
115          const double* in = input;
116          double* out = output ;
117          int k=0 ;
118          for(int i=0; i<dstSize_; i++, out+=sizeT)
119            if (nSrc_[i]==0)
120              for(int l=0; l<sizeT; l++) out[l] = defaultValue ;
121            else 
122            {
123              for(int j=0 ; j<nSrc_[i] ; j++,k++)
124                for(int l=0; l<sizeT; l++) out[l] += in[connector_[k]*sizeT+l] ;
125            }
126        }
127      }
128    }
129
130
131 
132  };
133
134}
135
136#endif
Note: See TracBrowser for help on using the repository browser.