#ifndef __REMOTE_CONNECTOR_HPP__ #define __REMOTE_CONNECTOR_HPP__ #include "xios_spl.hpp" #include "array_new.hpp" #include "distributed_view.hpp" #include "mpi.hpp" #include "local_view.hpp" #include "distributed_view.hpp" #include "context_client.hpp" namespace xios { class CRemoteConnector { private: shared_ptr srcView_; shared_ptr dstView_; map> connector_ ; // connector[rank][srcIndex] MPI_Comm localComm_ ; map nbSenders_ ; // number of participant when sending remote buffer map> element_ ; // global index of elements to send public: CRemoteConnector(shared_ptr srcView, shared_ptr dstView, MPI_Comm localComm) : srcView_(srcView), dstView_(dstView), localComm_(localComm){} ; void computeConnector(void) ; map>& getDistributedGlobalIndex() { return element_ ;} template void transfer(const CArray& dataIn, map>& dataOut) { auto ptrDataIn = dataIn.dataFirst() ; for(auto& indexRank : connector_) { int rank=indexRank.first ; auto& index=indexRank.second ; auto it = dataOut.emplace(rank, CArray(index.size())).first ; // return an iterator on the obect inserted auto ptrDataOut = it->second.dataFirst() ; for(auto ind : index) { *ptrDataOut = ptrDataIn[ind] ; ptrDataOut++ ; } } } template void sendToServer(map>& dataOut, CContextClient* client, CEventClient& event, const CMessage& messageHeader) { list messages; for(auto ranksData : dataOut) { int rank = ranksData.first ; auto& data = ranksData.second ; messages.push_back(CMessage(messageHeader)); messages.back().push(data) ; event.push(rank, nbSenders_[rank], messages.back()); } client->sendEvent(event) ; } template void transferToServer(const CArray& dataIn, CContextClient* client, CEventClient& event, const CMessage& messageHeader) { map> dataOut ; transfer(dataIn, dataOut) ; sendToServer(dataOut, client, event,messageHeader) ; } } ; } #endif