source: XIOS3/trunk/src/distribution/grid_scatterer_connector.hpp @ 2628

Last change on this file since 2628 was 2628, checked in by jderouillat, 7 weeks ago

New timers integration/reporting

  • Property svn:executable set to *
File size: 3.3 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#include "timer.hpp"
13
14namespace xios
15{
16  extern CLogType logProfile ;
17 
18  class CGridScattererConnector
19  {
20    private:
21     vector<shared_ptr<CScattererConnector>> elementsConnector_ ;
22     map<int,int> nbSenders_ ;
23     vector<int> ranks_ ;
24     map<int,int> dstSize_ ;
25     
26
27    public:
28      CGridScattererConnector(vector<shared_ptr<CScattererConnector>> elementsConnector) : elementsConnector_(elementsConnector) 
29      {
30        nbSenders_ = elementsConnector[0]->getNbSenders() ;
31        for(auto& rank : nbSenders_) 
32        {
33          ranks_.push_back(rank.first) ;
34          dstSize_[rank.first] = 1 ;
35        }
36
37        // init dstSize_
38        for(auto& connector : elementsConnector_) 
39        {
40          auto& sizes = connector->getDstSize() ;
41          for(auto& rankSize : sizes) dstSize_[rankSize.first] = dstSize_[rankSize.first] * rankSize.second ;
42        }   
43      }     
44
45      const map<int,int>& getTransferedDataSize(void) {return dstSize_;}
46     
47      template<typename T, int N> 
48      void transfer(const CArray<T,N>& input, map<int, CArray<T,1>>& output)
49      {
50        int n = elementsConnector_.size()-1 ;
51        shared_ptr<CScattererConnector>* connector = elementsConnector_.data() + n ;
52        for(int rank : ranks_) 
53        {
54          auto& out = output[rank] ;
55          out.resize(dstSize_[rank]) ;
56          elementsConnector_[n]->transfer(rank, connector, n, input.dataFirst(), out.dataFirst()) ;
57        }
58      }
59 
60      template<typename T, int N> 
61      void transfer(const CArray<T,N>& input, CContextClient* client, CEventClient& event, const CMessage& messageHeader)
62      {
63        map<int, CArray<T,1>> output ;
64        transfer(input, output) ;
65        sendToServer(output, client, event, messageHeader) ;
66      }
67     
68      template<typename T>
69      void sendToServer(const map<int, CArray<T,1>>& dataOut, CContextClient* client, CEventClient& event, const CMessage& messageHeader)
70      {
71        list<CMessage> messages;
72        for(auto& ranksData : dataOut)
73        {
74          int rank = ranksData.first ;
75          auto& data = ranksData.second ;
76
77          messages.push_back(CMessage(messageHeader));
78          messages.back().push(data) ;
79          event.push(rank, nbSenders_[rank], messages.back());
80        }
81        if (info.isActive(logProfile)) CTimer::get("Scatter event").resume();
82        client->sendEvent(event) ;
83        if (info.isActive(logProfile)) CTimer::get("Scatter event").suspend();
84      } 
85     
86      void transfer(CContextClient* client, CEventClient& event, const CMessage& messageHeader)
87      {
88        list<CMessage> messages;
89        for(auto& it : nbSenders_)
90        {
91          int rank = it.first ;
92          auto& nbSender = it.second ;
93
94          messages.push_back(CMessage(messageHeader));
95          event.push(rank, nbSenders_[rank], messages.back());
96        }
97        client->sendEvent(event) ;
98      } 
99  };
100}
101
102#endif
Note: See TracBrowser for help on using the repository browser.