source: XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution/grid_scatterer_connector.hpp @ 1960

Last change on this file since 1960 was 1934, checked in by ymipsl, 4 years ago

Big update on on going work related to data distribution and transfer between clients and servers.
Revisite of the source and store filter using "connectors".

-> inputs work again

YM

  • Property svn:executable set to *
File size: 2.9 KB
Line 
1#ifndef __GRID_SCATTERER_CONNECTOR_HPP__
2#define __GRID_SCATTERER_CONNECTOR_HPP__
3
4#include "xios_spl.hpp"
5#include "array_new.hpp"
6#include "distributed_view.hpp"
7#include "mpi.hpp"
8#include "local_view.hpp"
9#include "distributed_view.hpp"
10#include "context_client.hpp"
11#include "scatterer_connector.hpp"
12
13
14namespace xios
15{
16 
17  class CGridScattererConnector
18  {
19    private:
20     vector<CScattererConnector*> elementsConnector_ ;
21     map<int,int> nbSenders_ ;
22     vector<int> ranks_ ;
23     map<int,int> dstSize_ ;
24     
25
26    public:
27      CGridScattererConnector(vector<CScattererConnector*> elementsConnector) : elementsConnector_(elementsConnector) 
28      {
29        nbSenders_ = elementsConnector[0]->getNbSenders() ;
30        for(auto& rank : nbSenders_) 
31        {
32          ranks_.push_back(rank.first) ;
33          dstSize_[rank.first] = 1 ;
34        }
35
36        // init dstSize_
37        for(auto& connector : elementsConnector_) 
38        {
39          auto& sizes = connector->getDstSize() ;
40          for(auto& rankSize : sizes) dstSize_[rankSize.first] = dstSize_[rankSize.first] * rankSize.second ;
41        }   
42      }     
43
44
45      template<typename T, int N> 
46      void transfer(const CArray<T,N>& input, map<int, CArray<T,1>>& output)
47      {
48        int n = elementsConnector_.size()-1 ;
49        CScattererConnector** connector = elementsConnector_.data() + n ;
50        for(int rank : ranks_) 
51        {
52          auto& out = output[rank] ;
53          out.resize(dstSize_[rank]) ;
54          elementsConnector_[n]->transfer(rank, connector, n, input.dataFirst(), out.dataFirst()) ;
55        }
56      }
57 
58      template<typename T, int N> 
59      void transfer(const CArray<T,N>& input, CContextClient* client, CEventClient& event, const CMessage& messageHeader)
60      {
61        map<int, CArray<T,1>> output ;
62        transfer(input, output) ;
63        sendToServer(output, client, event, messageHeader) ;
64      }
65     
66      template<typename T>
67      void sendToServer(const map<int, CArray<T,1>>& dataOut, CContextClient* client, CEventClient& event, const CMessage& messageHeader)
68      {
69        list<CMessage> messages;
70        for(auto& ranksData : dataOut)
71        {
72          int rank = ranksData.first ;
73          auto& data = ranksData.second ;
74
75          messages.push_back(CMessage(messageHeader));
76          messages.back().push(data) ;
77          event.push(rank, nbSenders_[rank], messages.back());
78        }
79        client->sendEvent(event) ;
80      } 
81     
82      void transfer(CContextClient* client, CEventClient& event, const CMessage& messageHeader)
83      {
84        list<CMessage> messages;
85        for(auto& it : nbSenders_)
86        {
87          int rank = it.first ;
88          auto& nbSender = it.second ;
89
90          messages.push_back(CMessage(messageHeader));
91          event.push(rank, nbSenders_[rank], messages.back());
92        }
93        client->sendEvent(event) ;
94      } 
95  };
96}
97
98#endif
Note: See TracBrowser for help on using the repository browser.