source: XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution/local_connector.hpp @ 2230

Last change on this file since 2230 was 1918, checked in by ymipsl, 4 years ago

Big update on on going work related to data distribution and transfer between clients and servers.

  • move all related file into distribution directorie
  • implement the concept of data "View"
  • implement the concept of "connector" which make the data transfer between 2 differents "Views"

YM

  • Property svn:executable set to *
File size: 4.1 KB
Line 
1#ifndef __LOCAL_CONNECTOR_HPP__
2#define __LOCAL_CONNECTOR_HPP__
3
4#include "xios_spl.hpp"
5#include "array_new.hpp"
6#include "local_view.hpp"
7
8
9
10namespace xios
11{
12 
13  class CLocalConnector
14  {
15   
16    private:
17      CLocalView* srcView_;
18      CLocalView* dstView_;
19      int srcSize_ ;
20      int dstSize_ ;
21      vector<int> connector_ ;
22      vector<bool> mask_ ;
23
24    public:
25   
26      CLocalConnector(CLocalView* srcView, CLocalView* dstView) : srcView_(srcView), dstView_(dstView), 
27                                                                  srcSize_(srcView->getSize()), dstSize_(dstView->getSize()) {}
28      void computeConnector(void);
29      int getSrcSize(void) {return srcSize_ ;}
30      int getDstSize(void) {return dstSize_ ; }
31
32      template<typename T> void transfer(const CArray<T,1>& input, CArray<T,1>& output)
33      {
34        int size=mask_.size() ;
35        output.resize(size) ;
36        for(int i=0,j=0;i<size;i++) 
37        {
38          if (mask_[i]) 
39          {
40            output(i)=input(connector_[j]) ;
41            j++ ;
42          }
43        }
44      }
45
46      template<typename T> void transfer(const CArray<T,1>& input, CArray<T,1>& output, T missingValue)
47      {
48        int size=mask_.size() ;
49        output.resize(size) ;
50        for(int i=0,j=0;i<size;i++) 
51        {
52          if (mask_[i]) 
53          {
54            output(i)=input(connector_[j]) ;
55            j++ ;
56          }
57          else output(i)=missingValue ;
58        }
59      }
60
61      template<typename T> void transfer(CLocalConnector** connectors, int nConnectors, const T* input, T* output)
62      {
63
64        int size=mask_.size() ;
65        if (nConnectors==0)
66        {
67          for(int i=0,j=0;i<size;i++) 
68            if (mask_[i]) 
69            {
70              *(output+i)=*(input+connector_[j]) ;
71              j++ ;
72            }
73        }
74        else
75        {
76          int srcSliceSize = (*(connectors-1))->getSrcSliceSize(connectors-1, nConnectors-1) ;
77          int dstSliceSize = (*(connectors-1))->getDstSliceSize(connectors-1, nConnectors-1) ;
78
79          T* out = output ; 
80          for(int i=0,j=0;i<size;i++) 
81          {
82            if (mask_[i]) 
83            {
84              (*(connectors-1))->transfer(connectors-1, nConnectors-1, input+connector_[j]*srcSliceSize, out) ; // the multiplication must be avoid in further optimization
85              j++ ;
86            }
87            out += dstSliceSize ;
88          }
89
90        }
91      }
92
93      template<typename T> void transfer(CLocalConnector** connectors, int nConnectors, const T* input, T* output, T missingValue)
94      {
95        int size=mask_.size() ;
96        if (nConnectors==0)
97        {
98          for(int i=0,j=0;i<size;i++) 
99            if (mask_[i]) 
100            {
101              *(output+i)=*(input+connector_[j]) ;
102              j++ ;
103            }
104            else *(output+i)=missingValue ;
105        }
106        else
107        {
108          int srcSliceSize = (*(connectors-1))->getSrcSliceSize(connectors-1, nConnectors-1) ;
109          int dstSliceSize = (*(connectors-1))->getDstSliceSize(connectors-1, nConnectors-1) ;
110
111          T* out = output ; 
112          for(int i=0,j=0;i<size;i++) 
113          {
114            if (mask_[i]) 
115            {
116              (*(connectors-1))->transfer(connectors-1, nConnectors-1, input+connector_[j]*srcSliceSize, out, missingValue) ; // the multiplication must be avoid in further optimization
117              j++ ;
118            }
119            else for (int j=0 ; j<dstSliceSize ; j++) *(out+j) = missingValue ;
120            out += dstSliceSize ;
121          }
122        }
123      }
124
125      int getSrcSliceSize(CLocalConnector** connectors, int nConnectors) 
126      { if (nConnectors==0) return srcSize_ ; else return srcSize_ * (*(connectors-1))->getSrcSliceSize(connectors-1,nConnectors-1) ; }
127
128      int getDstSliceSize(CLocalConnector** connectors, int nConnectors) 
129      { if (nConnectors==0) return dstSize_ ; else return dstSize_ * (*(connectors-1))->getDstSliceSize(connectors-1,nConnectors-1) ; }
130
131  };
132
133}
134
135#endif
Note: See TracBrowser for help on using the repository browser.