#ifndef __GRID_GATHERER_CONNECTOR_HPP__ #define __GRID_GATHERER_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" #include "gatherer_connector.hpp" namespace xios { class CGridGathererConnector { private: vector elementsConnector_ ; int dstSize_ ; public: CGridGathererConnector(vector elementsConnector) : elementsConnector_(elementsConnector) { dstSize_ = 1 ; for(auto& connector : elementsConnector_) dstSize_=dstSize_*connector->getDstSize() ; } template void transfer(const map>& input, CArray& output) { int n = elementsConnector_.size()-1 ; CGathererConnector** connector = elementsConnector_.data() + n ; output.resize(dstSize_) ; for(auto& rankDataIn : input) { elementsConnector_[n]->transfer(rankDataIn.first, connector, n, rankDataIn.second.dataFirst(), output.dataFirst()) ; } } template void transfer(const map>& input, CArray& output, T missingValue) { int n = elementsConnector_.size()-1 ; CGathererConnector** connector = elementsConnector_.data() + n ; output.resize(dstSize_) ; output = missingValue ; for(auto& rankDataIn : input) { elementsConnector_[n]->transfer(rankDataIn.first, connector, n, rankDataIn.second.dataFirst(), output.dataFirst()) ; } } template void transfer(CEventServer& event, CArray& dataOut) { map> dataIn ; for (auto& subEvent : event.subEvents) { auto& data = dataIn[subEvent.rank]; (*subEvent.buffer) >> data ; } transfer(dataIn, dataOut) ; } template void transfer(CEventServer& event, CArray& dataOut, T missingValue) { map> dataIn ; for (auto& subEvent : event.subEvents) { auto& data = dataIn[subEvent.rank]; (*subEvent.buffer) >> data ; } transfer(dataIn, dataOut, missingValue) ; } }; } #endif