#include "grid_remote_connector.hpp" #include "client_client_dht_template.hpp" namespace xios { CGridRemoteConnector::CGridRemoteConnector(vector& srcView, vector& dstView, MPI_Comm localComm) : srcView_(srcView), dstView_(dstView), localComm_(localComm) {} void CGridRemoteConnector::computeConnector(void) { computeGenericMethod() ; } void CGridRemoteConnector::computeGenericMethod(void) { // generic method, every element can be distributed CClientClientDHTTemplate::Index2VectorInfoTypeMap info ; // info map // generate list of global index for dst view, and insert it into DHT map int nDst = dstView_.size() ; vector dstGlobalIndex ; vector dstSliceSize(nDst) ; dstSliceSize[nDst-1] = 1 ; for(int i=nDst-2; i>=0; i--) dstSliceSize[i] = dstView_[i+1]->getGlobalSize()*dstSliceSize[i+1] ; for(auto& ranks : dstView_[0]->getLocalSize()) { dstGlobalIndex.clear() ; int rank=ranks.first ; size_t sliceIndex=0 ; dstView_[nDst-1]->getGlobalIndex(rank, dstGlobalIndex, sliceIndex, dstSliceSize.data(), dstView_.data(), nDst-1) ; for(auto globalIndex : dstGlobalIndex) info[globalIndex].push_back(rank) ; // insert into DHT } CClientClientDHTTemplate dataRanks(info, localComm_) ; // generate list of global index for src view int nSrc = srcView_.size() ; vector srcSliceSize(nSrc) ; srcSliceSize[nSrc-1] = 1 ; for(int i=nSrc-2; i>=0; i--) srcSliceSize[i] = srcView_[i+1]->getGlobalSize()*srcSliceSize[i+1] ; vector srcGlobalIndex ; size_t sliceIndex=0 ; srcView_[nSrc-1]->getGlobalIndex(srcGlobalIndex, sliceIndex, srcSliceSize.data(), srcView_.data(), nSrc-1) ; CArray srcGlobalIndexArray(srcGlobalIndex.data(), shape(srcGlobalIndex.size()),neverDeleteData) ; dataRanks.computeIndexInfoMapping(srcGlobalIndexArray) ; const auto& returnInfo = dataRanks.getInfoIndexMap() ; vector>> elements(nSrc) ; // internal representation of elements composing the grid srcSliceSize[nSrc-1] = srcView_[nSrc-1]->getGlobalSize() ; for(int i=nSrc-2 ; i>=0 ; i--) srcSliceSize[i] = srcView_[i]->getGlobalSize()*srcSliceSize[i+1] ; for(auto& indRanks : returnInfo) { size_t gridIndexGlo=indRanks.first ; auto& ranks = indRanks.second ; for(int i=0;i& indGlo = rankInd.second ; CArray& indGloArray = elements_[i][rank] ; indGloArray.resize(indGlo.size()) ; int j=0 ; for (auto index : indGlo) { indGloArray(j) = index ; j++; } } } } }