- Timestamp:
- 09/10/20 13:51:02 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution/grid_remote_connector.cpp
r1918 r1930 19 19 { 20 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 /* 21 77 CClientClientDHTTemplate<int>::Index2VectorInfoTypeMap info ; // info map 22 78 … … 37 93 38 94 CClientClientDHTTemplate<int> dataRanks(info, localComm_) ; 39 95 */ 40 96 // generate list of global index for src view 41 97 int nSrc = srcView_.size() ; 42 98 vector<size_t> srcSliceSize(nSrc) ; 43 srcSliceSize[nSrc-1] = 1 ; 44 for(int i=nSrc-2; i>=0; i--) srcSliceSize[i] = srcView_[i+1]->getGlobalSize()*srcSliceSize[i+1] ; 45 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 46 105 vector<size_t> srcGlobalIndex ; 47 106 size_t sliceIndex=0 ; … … 54 113 vector<map<int, set<size_t>>> elements(nSrc) ; // internal representation of elements composing the grid 55 114 56 srcSliceSize[nSrc-1] = srcView_[nSrc-1]->getGlobalSize() ;57 for(int i=nSrc-2 ; i>=0 ; i--) srcSliceSize[i] = srcView_[i]->getGlobalSize()*srcSliceSize[i+1] ;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] ; 58 117 59 118 for(auto& indRanks : returnInfo) … … 61 120 size_t gridIndexGlo=indRanks.first ; 62 121 auto& ranks = indRanks.second ; 63 for(int i= 0;i<nSrc;i++)122 for(int i=nSrc-1; i>=0; i--) 64 123 { 65 124 auto& element = elements[i] ; 66 size_t localIndGlo = gridIndexGlo % srcSliceSize[i] ; 125 size_t localIndGlo = gridIndexGlo / srcSliceSize[i] ; 126 gridIndexGlo = gridIndexGlo % srcSliceSize[i] ; 67 127 for(int rank : ranks) element[rank].insert(localIndGlo) ; 68 128 }
Note: See TracChangeset
for help on using the changeset viewer.