#ifndef __TRANSFORM_CONNECTOR_HPP__ #define __TRANSFORM_CONNECTOR_HPP__ #include "xios_spl.hpp" #include "array_new.hpp" #include "distributed_view.hpp" #include "local_view.hpp" #include "scatterer_connector.hpp" #include "gatherer_connector.hpp" #include "mpi.hpp" namespace xios { class CTransformConnector { public: CTransformConnector(shared_ptr srcView, shared_ptr dstView, MPI_Comm localComm) : srcView_(srcView), dstView_(dstView), localComm_(localComm) {} void computeConnector(void) ; private: MPI_Comm localComm_ ; shared_ptr srcView_ ; shared_ptr dstView_ ; map recvRankSize_ ; shared_ptr scattererConnector_ ; shared_ptr gathererConnector_ ; public: template void transfer(int repeat, int sizeT, const CArray& dataIn, CArray& dataOut) { map> tmpArrayIn ; scattererConnector_->transfer(repeat, sizeT, dataIn, tmpArrayIn) ; vector requests ; MPI_Request request ; for(auto it : tmpArrayIn) { auto& array = it.second ; MPI_Issend(array.dataFirst(), array.numElements(), MPI_GetType(), it.first, 0, localComm_, &request) ; requests.push_back(request) ; } map> tmpArrayOut ; for(auto it : recvRankSize_) { auto& array = tmpArrayOut[it.first] ; array.resize(it.second*repeat*sizeT) ; MPI_Irecv(array.dataFirst(), array.numElements(), MPI_GetType(), it.first, 0, localComm_, &request) ; requests.push_back(request) ; } vector status(requests.size()) ; MPI_Waitall(requests.size(), requests.data(),status.data()) ; const double nanValue = std::numeric_limits::quiet_NaN(); gathererConnector_->transfer(repeat, sizeT , tmpArrayOut, dataOut, nanValue) ; } template void transfer(int sizeT, const CArray& dataIn, CArray& dataOut) { transfer(1, sizeT, dataIn, dataOut) ; } template void transfer(const CArray& dataIn, CArray& dataOut) { transfer(1, 1, dataIn, dataOut) ; } }; } #endif