source: XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution/grid_remote_connector.cpp @ 1930

Last change on this file since 1930 was 1930, 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".

YM

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 5.1 KB
Line 
1#include "grid_remote_connector.hpp"
2#include "client_client_dht_template.hpp"
3
4
5
6namespace xios
7{
8 
9  CGridRemoteConnector::CGridRemoteConnector(vector<CLocalView*>& srcView, vector<CDistributedView*>& dstView, MPI_Comm localComm) 
10                       : srcView_(srcView), dstView_(dstView), localComm_(localComm) 
11  {}
12
13  void CGridRemoteConnector::computeConnector(void)
14  {
15    computeGenericMethod() ;
16  }
17
18  void CGridRemoteConnector::computeGenericMethod(void)
19  {
20    // generic method, every element can be distributed
21    int nDst = dstView_.size() ;
22    vector<size_t> dstSliceSize(nDst) ;
23    dstSliceSize[0] = 1 ; 
24    for(int i=1; i<nDst; i++)  dstSliceSize[i] = dstView_[i-1]->getGlobalSize()*dstSliceSize[i-1] ;
25 
26    CClientClientDHTTemplate<int>::Index2VectorInfoTypeMap dataInfo ;
27
28    CClientClientDHTTemplate<size_t>::Index2VectorInfoTypeMap info ; // info map
29    for(int pos=0; pos<nDst; pos++)
30    {
31      size_t sliceSize=dstSliceSize[pos] ;
32      map<int,CArray<size_t,1>> globalIndexView ;
33      dstView_[pos]->getGlobalIndexView(globalIndexView) ;
34     
35      CClientClientDHTTemplate<size_t>::Index2VectorInfoTypeMap lastInfo(info) ;
36
37      if (pos>0)
38      {
39        CArray<size_t,1> ranks(globalIndexView.size()) ;
40        auto it=globalIndexView.begin() ;
41        for(int i=0 ; i<ranks.numElements();i++,it++) ranks(i)=it->first ;
42        CClientClientDHTTemplate<size_t> dataRanks(info, localComm_) ;
43        dataRanks.computeIndexInfoMapping(ranks) ;
44        lastInfo = dataRanks.getInfoIndexMap() ;
45      }
46     
47      info.clear() ;
48      for(auto& it : globalIndexView)
49      {
50        int rank = it.first ;
51        auto& globalIndex = it.second ;
52        auto& inf = info[rank] ;
53        if (pos==0) for(int i=0;i<globalIndex.numElements();i++) inf.push_back(globalIndex(i)) ;
54        else
55        {
56          auto& lastGlobalIndex = lastInfo[rank] ;
57          for(size_t lastGlobalInd : lastGlobalIndex)
58          {
59            for(int i=0;i<globalIndex.numElements();i++) inf.push_back(globalIndex(i)*sliceSize+lastGlobalInd) ;
60          }
61        } 
62      }
63
64      if (pos==nDst-1)
65      {
66         for(auto& it : info)
67         {
68           int rank=it.first ;
69           auto& globalIndex = it.second ;
70           for(auto globalInd : globalIndex) dataInfo[globalInd].push_back(rank) ;
71         }
72      } 
73    }
74
75    CClientClientDHTTemplate<int> dataRanks(dataInfo, localComm_) ;
76/*
77    CClientClientDHTTemplate<int>::Index2VectorInfoTypeMap info ; // info map
78       
79// generate list of global index for dst view, and insert it into DHT map
80    int nDst = dstView_.size() ;
81    vector<size_t> dstGlobalIndex ;
82    vector<size_t> dstSliceSize(nDst) ;
83    dstSliceSize[nDst-1] = 1 ; 
84    for(int i=nDst-2; i>=0; i--)  dstSliceSize[i] = dstView_[i+1]->getGlobalSize()*dstSliceSize[i+1] ;
85    for(auto& ranks : dstView_[0]->getLocalSize())
86    {
87      dstGlobalIndex.clear() ;
88      int rank=ranks.first ;
89      size_t sliceIndex=0 ;
90      dstView_[nDst-1]->getGlobalIndex(rank, dstGlobalIndex, sliceIndex, dstSliceSize.data(), dstView_.data(), nDst-1) ;
91      for(auto globalIndex : dstGlobalIndex) info[globalIndex].push_back(rank) ; // insert into DHT
92    }
93   
94    CClientClientDHTTemplate<int> dataRanks(info, localComm_) ;
95*/   
96    // generate list of global index for src view
97    int nSrc = srcView_.size() ;
98    vector<size_t> srcSliceSize(nSrc) ;
99//    srcSliceSize[nSrc-1] = 1 ;
100//    for(int i=nSrc-2; i>=0; i--)  srcSliceSize[i] = srcView_[i+1]->getGlobalSize()*srcSliceSize[i+1] ;
101   
102    srcSliceSize[0] = 1 ; 
103    for(int i=1; i<nSrc; i++)  srcSliceSize[i] = srcView_[i-1]->getGlobalSize()*srcSliceSize[i-1] ;
104
105    vector<size_t> srcGlobalIndex ;
106    size_t sliceIndex=0 ;
107    srcView_[nSrc-1]->getGlobalIndex(srcGlobalIndex, sliceIndex, srcSliceSize.data(), srcView_.data(), nSrc-1) ;
108   
109    CArray<size_t,1> srcGlobalIndexArray(srcGlobalIndex.data(), shape(srcGlobalIndex.size()),neverDeleteData) ;
110    dataRanks.computeIndexInfoMapping(srcGlobalIndexArray) ;
111    const auto& returnInfo = dataRanks.getInfoIndexMap() ;
112
113    vector<map<int, set<size_t>>> elements(nSrc) ; // internal representation of elements composing the grid
114
115//    srcSliceSize[nSrc-1] = srcView_[nSrc-1]->getGlobalSize() ;
116//    for(int i=nSrc-2 ; i>=0 ; i--) srcSliceSize[i] = srcView_[i]->getGlobalSize()*srcSliceSize[i+1] ;
117
118    for(auto& indRanks : returnInfo)
119    {
120      size_t gridIndexGlo=indRanks.first ;
121      auto& ranks = indRanks.second ;
122      for(int i=nSrc-1; i>=0; i--)
123      {
124        auto& element = elements[i] ;
125        size_t localIndGlo = gridIndexGlo / srcSliceSize[i] ;
126        gridIndexGlo = gridIndexGlo % srcSliceSize[i] ;
127        for(int rank : ranks) element[rank].insert(localIndGlo) ;
128      }
129    }
130
131    elements_.resize(nSrc) ;
132    for(int i=0 ; i<nSrc; i++)
133    {
134      auto& element=elements[i] ;
135      for(auto& rankInd : element)
136      {
137        int rank=rankInd.first ;
138        set<size_t>& indGlo = rankInd.second ;
139        CArray<size_t,1>& indGloArray = elements_[i][rank] ;
140        indGloArray.resize(indGlo.size()) ;
141        int j=0 ;
142        for (auto index : indGlo) { indGloArray(j) = index ; j++; }
143      }
144    }
145  }
146
147}
Note: See TracBrowser for help on using the repository browser.