#include "grid_algorithm_generic.hpp" #include "grid_elements.hpp" #include "grid_local_view.hpp" #include "grid.hpp" #include "algo_types.hpp" #include "context.hpp" #include "transform_filter.hpp" namespace xios { CGridAlgorithmGeneric::CGridAlgorithmGeneric(CGrid* gridSrc, CGrid* gridDst, int pos, shared_ptr algo) : CGridAlgorithm(algo), gridSrc_(gridSrc), gridDst_(gridDst), pos_(pos) { } void CGridAlgorithmGeneric::computeAlgorithm(bool eliminateRedondant) { shared_ptr gridSrcElements = gridSrc_->getGridLocalElements() ; shared_ptr gridDstElements = gridDst_->getGridLocalElements() ; shared_ptr srcView = gridSrcElements->getView(CElementView::WORKFLOW) ; shared_ptr dstView = gridDstElements->getView(CElementView::WORKFLOW) ; MPI_Comm comm = CContext::getCurrent()->getIntraComm() ; int commSize = CContext::getCurrent()->getIntraCommSize() ; int commRank = CContext::getCurrent()->getIntraCommRank() ; auto& elements = gridSrcElements->getElements() ; int nElements = elements.size() ; vector> remoteElements(nElements) ; vector> remoteViews(nElements) ; for(int i=0;igetRecvElement() ; else { CArray globalIndexView ; srcView->getView(i)->getGlobalIndexView(globalIndexView) ; remoteElements[i] = make_shared(commRank, srcView->getView(i)->getGlobalSize(),globalIndexView) ; remoteElements[i]->addFullView() ; if (i>pos_) dimBefore_ *= srcView->getView(i)->getSize() ; else dimAfter_ *= srcView->getView(i)->getSize() ; } remoteViews[i] = remoteElements[i] -> getView(CElementView::FULL); } gridTransformConnector_ = make_shared(srcView->getViews(), remoteViews, comm ) ; gridTransformConnector_->computeConnector(eliminateRedondant) ; } void CGridAlgorithmGeneric::apply(const CArray& dataIn, CArray& dataOut) { CArray dataOutTmp ; gridTransformConnector_->transfer(dataIn, dataOutTmp) ; algorithm_->apply(dimBefore_, dimAfter_, dataOutTmp, dataOut) ; } void CGridAlgorithmGeneric::apply(const CArray& dataIn, const vector>& auxData, CArray& dataOut) { CArray dataOutTmp ; vector> auxDataOutTmp(auxData.size()) ; gridTransformConnector_->transfer(dataIn, dataOutTmp) ; for (int i=0; itransformAuxField(i)) gridTransformConnector_->transfer(auxData[i], auxDataOutTmp[i]) ; else auxDataOutTmp[i].reference(auxData[i]) ; } algorithm_->apply(dimBefore_, dimAfter_, dataOutTmp, auxDataOutTmp, dataOut) ; } }