#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" #include "reduction_types.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, EReduction op = EReduction::none) { int n = elementsConnector_.size()-1 ; shared_ptr* connector = elementsConnector_.data() + n ; output.resize(dstSize_) ; if (op == EReduction::none) for(auto& rankDataIn : input) elementsConnector_[n]->transfer(rankDataIn.first, connector, n, rankDataIn.second.dataFirst(), output.dataFirst()) ; else { T defaultValue = std::numeric_limits::quiet_NaN(); vector count(dstSize_,0) ; for(auto& rankDataIn : input) elementsConnector_[n]->transfer(rankDataIn.first, connector, n, rankDataIn.second.dataFirst(), output.dataFirst(), op, count.data()) ; for(int i=0;i void transfer(const map>& input, CArray& output, T missingValue) { int n = elementsConnector_.size()-1 ; shared_ptr* 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, EReduction op = EReduction::none) { map> dataIn ; for (auto& subEvent : event.subEvents) { auto& data = dataIn[subEvent.rank]; (*subEvent.buffer) >> data ; } transfer(dataIn, dataOut, op) ; } void transfer_or(CEventServer& event, CArray& dataOut) { map> dataIn ; for (auto& subEvent : event.subEvents) { auto& data = dataIn[subEvent.rank]; (*subEvent.buffer) >> data ; } transfer_or(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) ; } void transfer_or(const map>& input, CArray& output) { int n = elementsConnector_.size()-1 ; shared_ptr* connector = elementsConnector_.data() + n ; output.resize(dstSize_) ; output = false ; for(auto& rankDataIn : input) { elementsConnector_[n]->transfer_or(rankDataIn.first, connector, n, rankDataIn.second.dataFirst(), output.dataFirst()) ; } } }; } #endif