source: XIOS3/trunk/src/transformation/scalar_algorithm/scalar_algorithm_redistribute.cpp @ 2634

Last change on this file since 2634 was 2613, checked in by jderouillat, 4 months ago

Fix the attached mode for scalar output, and some bugs revealed by the adastra porting in debug mode

  • Property svn:executable set to *
File size: 5.6 KB
Line 
1/*!
2   \file scalar_algorithm_redistribute.cpp
3   \brief Algorithm for redistribute a scalar.
4 */
5#include "scalar_algorithm_redistribute.hpp"
6#include "redistribute_scalar.hpp"
7#include "scalar.hpp"
8#include "grid.hpp"
9#include "grid_transformation_factory_impl.hpp"
10#include "context.hpp"
11
12namespace xios
13{
14
15  shared_ptr<CGenericAlgorithmTransformation> CScalarAlgorithmRedistribute::create(bool isSource, CGrid* gridDst, CGrid* gridSrc,
16                                                               CTransformation<CScalar>* transformation,
17                                                               int elementPositionInGrid,
18                                                               std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
19                                                               std::map<int, int>& elementPositionInGridSrc2AxisPosition,
20                                                               std::map<int, int>& elementPositionInGridSrc2DomainPosition, 
21                                                               std::map<int, int>& elementPositionInGridDst2ScalarPosition,
22                                                               std::map<int, int>& elementPositionInGridDst2AxisPosition,
23                                                               std::map<int, int>& elementPositionInGridDst2DomainPosition)
24  TRY
25  {
26    std::vector<CScalar*> scalarListDestP = gridDst->getScalars();
27    std::vector<CScalar*> scalarListSrcP  = gridSrc->getScalars();
28
29    CRedistributeScalar* redistributeScalar = dynamic_cast<CRedistributeScalar*> (transformation);
30    int scalarDstIndex = elementPositionInGridDst2ScalarPosition[elementPositionInGrid];
31    int scalarSrcIndex = elementPositionInGridSrc2ScalarPosition[elementPositionInGrid];
32
33    return make_shared<CScalarAlgorithmRedistribute>(isSource, scalarListDestP[scalarDstIndex], scalarListSrcP[scalarSrcIndex], redistributeScalar);
34  }
35  CATCH
36
37  bool CScalarAlgorithmRedistribute::dummyRegistered_ = CScalarAlgorithmRedistribute::registerTrans();
38  bool CScalarAlgorithmRedistribute::registerTrans()
39  TRY
40  {
41    return CGridTransformationFactory<CScalar>::registerTransformation(TRANS_REDISTRIBUTE_SCALAR, create);
42  }
43  CATCH
44
45  CScalarAlgorithmRedistribute::CScalarAlgorithmRedistribute(bool isSource, CScalar* scalarDestination, CScalar* scalarSource, CRedistributeScalar* redistributeScalar)
46  : CAlgorithmTransformationTransfer(isSource)
47  TRY
48  {
49
50    CContext* context = CContext::getCurrent(); 
51
52    scalarDestination->n.reset();
53    scalarDestination->mask.reset();
54    scalarDestination->value.reset();
55    scalarDestination->bounds.reset();
56
57    redistributeScalar->checkValid(scalarSource);
58
59    // define the global index of the new domain
60
61    CArray<size_t,1> globalIndex ;
62
63    if (    redistributeScalar->type == CRedistributeScalar::type_attr::bands
64         || redistributeScalar->type == CRedistributeScalar::type_attr::column
65         || redistributeScalar->type == CRedistributeScalar::type_attr::root )
66    {
67      if (context->getIntraCommRank()==0)
68      {
69        scalarDestination->n = 1;
70        globalIndex.resize(1) ;
71        globalIndex(0)=0 ;
72      }
73      else
74      {
75        scalarDestination->n = 0;
76        globalIndex.resize(0) ;
77      }
78    }
79    else if (redistributeScalar->type == CRedistributeScalar::type_attr::full)
80    {
81      scalarDestination->n = 1;
82      globalIndex.resize(1) ;
83      globalIndex(0)=0 ;
84    }
85   
86    auto& transMap = this->transformationMapping_;
87    for(int i=0; i<globalIndex.numElements(); i++) transMap[globalIndex(i)]=globalIndex(i) ;
88
89    auto elementDst=shared_ptr<CLocalElement>(new CLocalElement(context->getIntraCommRank(), 1, globalIndex)) ;
90    elementDst->addFullView() ;
91
92    auto transformConnector = make_shared<CTransformConnector>(scalarSource->getLocalView(CElementView::FULL), elementDst->getView(CElementView::FULL),context->getIntraComm()) ;
93    transformConnector->computeConnector() ;
94
95    CArray<double,1> valSrc, valDst ;
96    valSrc.resize(scalarSource->getLocalView(CElementView::FULL)->getSize()) ;
97
98    if (scalarSource->hasBounds()) 
99    {
100      transformConnector->transfer(2, scalarSource->bounds, scalarDestination->bounds) ;
101    }
102   
103    if (scalarSource->hasLabel())
104    {
105//ym transferTransformConnector.transfer(axisSrc->label, axisDestination->label) ;  -> probably not supported now, see later
106    }
107
108    // transfer the mask
109    auto transformMask = make_shared<CTransformConnector>(scalarSource->getLocalView(CElementView::WORKFLOW), elementDst->getView(CElementView::FULL),context->getIntraComm()) ;
110    transformMask->computeConnector() ;
111
112    CArray<bool,1> workflow(scalarSource->getLocalView(CElementView::WORKFLOW)->getSize()) ;
113    CArray<bool,1> mask ;
114    mask.resize(scalarSource->getLocalView(CElementView::FULL)->getSize()) ;
115    workflow=true ;
116   
117    transformMask->transfer(workflow, mask, false) ;   
118    if (mask.numElements()>0)
119    {
120      scalarDestination->mask = mask(0) ;
121    }
122
123    scalarDestination->checkAttributes() ;
124    this->computeAlgorithm(scalarSource->getLocalView(CElementView::WORKFLOW), scalarDestination->getLocalView(CElementView::WORKFLOW)) ;
125
126    valDst.resize(scalarDestination->getLocalView(CElementView::FULL)->getSize()) ;
127    if (scalarSource->hasValue())
128    {
129      if (valSrc.numElements()>0)  valSrc(0)=scalarSource->value ;
130      transformConnector->transfer(valSrc, valDst) ;
131      if (valDst.numElements()>0)  scalarDestination->value = valDst(0) ;
132    }
133  }
134  CATCH
135
136
137}
Note: See TracBrowser for help on using the repository browser.