#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, CGenericAlgorithmTransformation* algo) : CGridAlgorithm(algo), gridSrc_(gridSrc), gridDst_(gridDst), pos_(pos) { computeAlgorithm() ; } void CGridAlgorithmGeneric::computeAlgorithm(void) { CGridLocalElements* gridSrcElements = gridSrc_->getGridLocalElements() ; CGridLocalElements* gridDstElements = gridDst_->getGridLocalElements() ; CGridLocalView* srcView = gridSrcElements->getView(CElementView::WORKFLOW) ; CGridLocalView* 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] = new CLocalElement(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_ = new CGridTransformConnector(srcView->getViews(), remoteViews, comm ) ; } 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) ; } }