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

Last change on this file since 1918 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: 2.5 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  };
83}
84
85#endif
Note: See TracBrowser for help on using the repository browser.