source: XIOS3/trunk/src/distribution/transform_connector.hpp

Last change on this file was 2507, checked in by ymipsl, 13 months ago

Merging XIOS3_ATTACHED branch into XIOS3 trunk.

YM

  • Property svn:executable set to *
File size: 3.6 KB
Line 
1#ifndef __TRANSFORM_CONNECTOR_HPP__
2#define __TRANSFORM_CONNECTOR_HPP__
3
4#include "xios_spl.hpp"
5#include "array_new.hpp"
6#include "distributed_view.hpp"
7#include "local_view.hpp"
8#include "scatterer_connector.hpp"
9#include "gatherer_connector.hpp"
10#include "mpi.hpp"
11
12namespace xios
13{
14 
15 
16  class CTransformConnector
17  {
18     
19    public:
20      CTransformConnector(shared_ptr<CLocalView> srcView, shared_ptr<CLocalView> dstView, MPI_Comm localComm) 
21                          : srcView_(srcView), dstView_(dstView), localComm_(localComm) {}
22   
23      void computeConnector(void) ; 
24    private:
25
26      MPI_Comm localComm_ ;
27      shared_ptr<CLocalView> srcView_ ;
28      shared_ptr<CLocalView> dstView_ ;
29      map<int,int> recvRankSize_ ;
30      shared_ptr<CScattererConnector> scattererConnector_ ;
31      shared_ptr<CGathererConnector>  gathererConnector_ ;
32   
33    public:
34     
35
36      template<typename T> 
37      void transfer(int repeat, int sizeT, const CArray<T,1>& dataIn, CArray<T,1>& dataOut, bool useMissingValue, T missingValue)
38      {
39        map<int,CArray<T,1>> tmpArrayIn ;
40        scattererConnector_->transfer(repeat, sizeT, dataIn, tmpArrayIn) ;
41        vector<MPI_Request> requests ;
42        MPI_Request request ;
43        for(auto it : tmpArrayIn)
44        {
45          auto& array = it.second ; 
46          MPI_Issend(array.dataFirst(), array.numElements(), MPI_GetType<T>(), it.first, 0, localComm_, &request) ;
47          requests.push_back(request) ;
48        }
49       
50        map<int,CArray<T,1>> tmpArrayOut ;
51        for(auto it : recvRankSize_)
52        {
53          auto& array = tmpArrayOut[it.first] ;
54          array.resize(it.second*repeat*sizeT) ;
55          MPI_Irecv(array.dataFirst(), array.numElements(), MPI_GetType<T>(), it.first, 0, localComm_, &request) ;
56          requests.push_back(request) ;
57        }
58       
59        vector<MPI_Status> status(requests.size()) ;
60        MPI_Waitall(requests.size(), requests.data(),status.data()) ;
61       
62        if (useMissingValue) gathererConnector_->transfer(repeat, sizeT , tmpArrayOut, dataOut, missingValue) ;
63        else gathererConnector_->transfer(repeat, sizeT , tmpArrayOut, dataOut) ;
64 //       const double nanValue = std::numeric_limits<double>::quiet_NaN();
65 //       gathererConnector_->transfer(repeat, sizeT , tmpArrayOut, dataOut, nanValue) ;
66      }
67
68      template<typename T> 
69      void transfer(int repeat, int sizeT, const CArray<T,1>& dataIn, CArray<T,1>& dataOut)
70      {
71        T missingValue ;
72        transfer(1, sizeT, dataIn, dataOut, false, missingValue) ;
73      }
74
75      template<typename T> 
76      void transfer(int repeat, int sizeT, const CArray<T,1>& dataIn, CArray<T,1>& dataOut, T missingValue)
77      {
78        transfer(1, sizeT, dataIn, dataOut, true, missingValue) ;
79      }
80
81      template<typename T> 
82      void transfer(int sizeT, const CArray<T,1>& dataIn, CArray<T,1>& dataOut)
83      {
84        transfer(1, sizeT, dataIn, dataOut) ;
85      }
86
87      template<typename T> 
88      void transfer(int sizeT, const CArray<T,1>& dataIn, CArray<T,1>& dataOut, T missingValue)
89      {
90        transfer(1, sizeT, dataIn, dataOut, missingValue) ;
91      }
92   
93      template<typename T> 
94      void transfer(const CArray<T,1>& dataIn, CArray<T,1>& dataOut)
95      {
96        transfer(1, 1, dataIn, dataOut) ;
97      }
98
99      template<typename T> 
100      void transfer(const CArray<T,1>& dataIn, CArray<T,1>& dataOut, T missingValue)
101      {
102        transfer(1, 1, dataIn, dataOut, missingValue) ;
103      }
104
105  };
106
107}
108
109#endif
Note: See TracBrowser for help on using the repository browser.