#include "grid_algorithm.hpp" #include "grid_elements.hpp" #include "grid_local_view.hpp" #include "grid.hpp" #include "algo_types.hpp" #include "context.hpp" namespace xios { CGridAlgorithm::CGridAlgorithm(CGrid* gridSrc, CGrid* gridDst, int pos, CGenericAlgorithmTransformation* algo) : gridSrc_(gridSrc), gridDst_(gridDst), pos_(pos), algorithm_(algo) { //! Scalar CScalarAlgorithmReduceAxis::registerTrans(); CScalarAlgorithmExtractAxis::registerTrans(); CScalarAlgorithmReduceDomain::registerTrans(); CScalarAlgorithmReduceScalar::registerTrans(); //! Axis CAxisAlgorithmZoom::registerTrans(); CAxisAlgorithmExtractDomain::registerTrans(); CAxisAlgorithmInterpolate::registerTrans(); CAxisAlgorithmExtract::registerTrans(); CAxisAlgorithmInverse::registerTrans(); CAxisAlgorithmReduceDomain::registerTrans(); CAxisAlgorithmReduceAxis::registerTrans(); CAxisAlgorithmTemporalSplitting::registerTrans(); CAxisAlgorithmDuplicateScalar::registerTrans(); //! Domain CDomainAlgorithmComputeConnectivity::registerTrans(); CDomainAlgorithmInterpolate::registerTrans(); CDomainAlgorithmZoom::registerTrans(); CDomainAlgorithmExpand::registerTrans(); CDomainAlgorithmReorder::registerTrans(); CDomainAlgorithmExtract::registerTrans(); this->computeAlgorithm() ; } void CGridAlgorithm::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 CGridAlgorithm::apply(const CArray& dataIn, CArray& dataOut) { CArray dataOutTmp ; gridTransformConnector_->transfer(dataIn, dataOutTmp) ; algorithm_->apply(dimBefore_, dimAfter_, dataOutTmp, dataOut) ; } }