source: XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/grid_algorithm.cpp @ 2001

Last change on this file since 2001 was 2001, checked in by ymipsl, 3 years ago

Bug fix when introducing gridAlgorithm

YM

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 3.0 KB
Line 
1#include "grid_algorithm.hpp"
2#include "grid_elements.hpp"
3#include "grid_local_view.hpp"
4#include "grid.hpp"
5#include "algo_types.hpp"
6#include "context.hpp"
7
8namespace xios
9{
10
11  CGridAlgorithm::CGridAlgorithm(CGrid* gridSrc, CGrid* gridDst, int pos,  CGenericAlgorithmTransformation* algo)
12  : gridSrc_(gridSrc), gridDst_(gridDst), pos_(pos), algorithm_(algo)
13  {
14    //! Scalar
15    CScalarAlgorithmReduceAxis::registerTrans();
16    CScalarAlgorithmExtractAxis::registerTrans();
17    CScalarAlgorithmReduceDomain::registerTrans();
18    CScalarAlgorithmReduceScalar::registerTrans();
19
20    //! Axis
21    CAxisAlgorithmZoom::registerTrans();
22    CAxisAlgorithmExtractDomain::registerTrans();
23    CAxisAlgorithmInterpolate::registerTrans();
24    CAxisAlgorithmExtract::registerTrans();
25    CAxisAlgorithmInverse::registerTrans();
26    CAxisAlgorithmReduceDomain::registerTrans();
27    CAxisAlgorithmReduceAxis::registerTrans();
28    CAxisAlgorithmTemporalSplitting::registerTrans();
29    CAxisAlgorithmDuplicateScalar::registerTrans();
30
31    //! Domain
32    CDomainAlgorithmComputeConnectivity::registerTrans();
33    CDomainAlgorithmInterpolate::registerTrans();
34    CDomainAlgorithmZoom::registerTrans();
35    CDomainAlgorithmExpand::registerTrans();
36    CDomainAlgorithmReorder::registerTrans();
37    CDomainAlgorithmExtract::registerTrans();
38
39    this->computeAlgorithm() ;
40  }
41
42  void CGridAlgorithm::computeAlgorithm(void)
43  {
44    CGridLocalElements* gridSrcElements = gridSrc_->getGridLocalElements() ;
45    CGridLocalElements* gridDstElements = gridDst_->getGridLocalElements() ;
46   
47    CGridLocalView* srcView = gridSrcElements->getView(CElementView::WORKFLOW) ;
48    CGridLocalView* dstView = gridDstElements->getView(CElementView::WORKFLOW) ;
49    MPI_Comm comm = CContext::getCurrent()->getIntraComm() ;
50    int commSize = CContext::getCurrent()->getIntraCommSize() ;
51    int commRank = CContext::getCurrent()->getIntraCommRank() ;
52   
53    auto& elements =  gridSrcElements->getElements() ;
54    int nElements = elements.size() ;
55    vector<CLocalElement*> remoteElements(nElements) ;
56    vector<CLocalView*> remoteViews(nElements) ;
57    for(int i=0;i<nElements;i++)
58    {
59      if (i==pos_) remoteElements[i] = algorithm_->getRecvElement() ;
60      else
61      { 
62        CArray<size_t,1> globalIndexView ;
63        srcView->getView(i)->getGlobalIndexView(globalIndexView) ;
64        remoteElements[i] = new CLocalElement(commRank, srcView->getView(i)->getGlobalSize(),globalIndexView) ;
65        remoteElements[i]->addFullView() ;
66        if (i>pos_) dimBefore_ *= srcView->getView(i)->getSize() ;
67        else dimAfter_ *= srcView->getView(i)->getSize() ;
68         
69      }
70      remoteViews[i] = remoteElements[i] -> getView(CElementView::FULL);
71    }
72
73    gridTransformConnector_ = new CGridTransformConnector(srcView->getViews(), remoteViews, comm ) ;
74 
75  }
76
77  void CGridAlgorithm::apply(const CArray<double,1>& dataIn, CArray<double,1>& dataOut)
78  {
79    CArray<double,1> dataOutTmp ;
80    gridTransformConnector_->transfer(dataIn, dataOutTmp) ;
81    algorithm_->apply(dimBefore_, dimAfter_, dataOutTmp, dataOut) ;
82  }
83
84
85}
Note: See TracBrowser for help on using the repository browser.