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

Last change on this file since 2130 was 2130, checked in by ymipsl, 3 years ago

New management of client-server buffers.

  • buffers can grow automatically in intialization phase
  • buffers is evaluated after the close context definition phase and fixed at optimal value.

YM

  • Property svn:executable set to *
File size: 3.0 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      const map<int,int>& getTransferedDataSize(void) {return dstSize_;}
45     
46      template<typename T, int N> 
47      void transfer(const CArray<T,N>& input, map<int, CArray<T,1>>& output)
48      {
49        int n = elementsConnector_.size()-1 ;
50        CScattererConnector** connector = elementsConnector_.data() + n ;
51        for(int rank : ranks_) 
52        {
53          auto& out = output[rank] ;
54          out.resize(dstSize_[rank]) ;
55          elementsConnector_[n]->transfer(rank, connector, n, input.dataFirst(), out.dataFirst()) ;
56        }
57      }
58 
59      template<typename T, int N> 
60      void transfer(const CArray<T,N>& input, CContextClient* client, CEventClient& event, const CMessage& messageHeader)
61      {
62        map<int, CArray<T,1>> output ;
63        transfer(input, output) ;
64        sendToServer(output, client, event, messageHeader) ;
65      }
66     
67      template<typename T>
68      void sendToServer(const map<int, CArray<T,1>>& dataOut, CContextClient* client, CEventClient& event, const CMessage& messageHeader)
69      {
70        list<CMessage> messages;
71        for(auto& ranksData : dataOut)
72        {
73          int rank = ranksData.first ;
74          auto& data = ranksData.second ;
75
76          messages.push_back(CMessage(messageHeader));
77          messages.back().push(data) ;
78          event.push(rank, nbSenders_[rank], messages.back());
79        }
80        client->sendEvent(event) ;
81      } 
82     
83      void transfer(CContextClient* client, CEventClient& event, const CMessage& messageHeader)
84      {
85        list<CMessage> messages;
86        for(auto& it : nbSenders_)
87        {
88          int rank = it.first ;
89          auto& nbSender = it.second ;
90
91          messages.push_back(CMessage(messageHeader));
92          event.push(rank, nbSenders_[rank], messages.back());
93        }
94        client->sendEvent(event) ;
95      } 
96  };
97}
98
99#endif
Note: See TracBrowser for help on using the repository browser.