source: XIOS3/dev/XIOS_ATTACHED/src/transformation/axis_algorithm/axis_algorithm_redistribute.cpp @ 2482

Last change on this file since 2482 was 2482, checked in by ymipsl, 15 months ago

First guess in supression of attached mode replaced by online reader and write filters

YM

  • Property svn:executable set to *
File size: 6.8 KB
Line 
1/*!
2   \file axis_algorithm_redistribute.cpp
3   \brief Algorithm for redistribute an axis.
4 */
5#include "axis_algorithm_redistribute.hpp"
6#include "redistribute_axis.hpp"
7#include "axis.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> CAxisAlgorithmRedistribute::create(bool isSource, CGrid* gridDst, CGrid* gridSrc,
16                                                               CTransformation<CAxis>* 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<CAxis*> axisListDestP = gridDst->getAxis();
27    std::vector<CAxis*> axisListSrcP  = gridSrc->getAxis();
28
29    CRedistributeAxis* redistributeAxis = dynamic_cast<CRedistributeAxis*> (transformation);
30    int axisDstIndex = elementPositionInGridDst2AxisPosition[elementPositionInGrid];
31    int axisSrcIndex = elementPositionInGridSrc2AxisPosition[elementPositionInGrid];
32
33    return make_shared<CAxisAlgorithmRedistribute>(isSource, axisListDestP[axisDstIndex], axisListSrcP[axisSrcIndex], redistributeAxis);
34  }
35  CATCH
36
37  bool CAxisAlgorithmRedistribute::dummyRegistered_ = CAxisAlgorithmRedistribute::registerTrans();
38  bool CAxisAlgorithmRedistribute::registerTrans()
39  TRY
40  {
41    return CGridTransformationFactory<CAxis>::registerTransformation(TRANS_REDISTRIBUTE_AXIS, create);
42  }
43  CATCH
44
45  CAxisAlgorithmRedistribute::CAxisAlgorithmRedistribute(bool isSource, CAxis* axisDestination, CAxis* axisSource, CRedistributeAxis* redistributeAxis)
46  : CAlgorithmTransformationTransfer(isSource)
47  TRY
48  {
49    CContext* context = CContext::getCurrent(); 
50
51    axisDestination->n_glo.reset();
52    axisDestination->index.reset();
53    axisDestination->n.reset();
54    axisDestination->begin.reset();
55
56    axisDestination->mask.reset();
57    axisDestination->data_index.reset();
58    axisDestination->data_n.reset();
59    axisDestination->data_begin.reset();
60
61    axisDestination->value.reset();
62    axisDestination->label.reset();
63    axisDestination->bounds.reset();
64
65    redistributeAxis->checkValid(axisSource);
66
67    auto& index = redistributeAxis-> index ;
68    int n_glo = axisSource -> n_glo ;
69    axisDestination->n_glo = n_glo ;
70   
71   
72
73    // define the global index of the new domain
74
75    CArray<size_t,1> globalIndex ;
76
77    if (redistributeAxis->type == CRedistributeAxis::type_attr::index)
78    {   
79      globalIndex.resize(index.numElements()) ;
80      globalIndex=index ;
81    }
82    else
83    {
84     
85      auto distType = CRedistributeAxis::type_attr::column ;
86
87      if (redistributeAxis->type == CRedistributeAxis::type_attr::bands) distType = CRedistributeAxis::type_attr::column ;
88      else  distType=redistributeAxis->type;
89
90      int size, start ;
91      if (distType==CRedistributeAxis::type_attr::column) // Bands distribution to send to file server
92      {
93        int nbClient = context->getIntraCommSize() ;
94        int rankClient = context->getIntraCommRank() ;
95     
96        size = n_glo/nbClient ;
97        if (rankClient < n_glo % nbClient)
98        {
99         size++ ;
100         start = rankClient*size ;
101        }
102        else start = (n_glo % nbClient)*(size+1) + (rankClient-(n_glo % nbClient)) * size ;
103
104      }
105      else if (distType==CRedistributeAxis::type_attr::full) // domain is not distributed ie all servers get the same local domain
106      {
107        size=n_glo ; start=0 ;
108      }
109      else if (distType==CRedistributeAxis::type_attr::root) // domain is not distributed ie all servers get the same local domain
110      {
111        if (context->getIntraCommRank()==0) { size=n_glo ; start=0 ; }
112        else { size=0 ; start=0 ; }
113      }
114
115      globalIndex.resize(size) ;
116      size_t ind ;
117      ind=0 ;
118      for(int i=start; i<start+size; i++)
119      {
120       globalIndex(ind) =  i ;
121       ind++ ;
122      }
123    }
124   
125    axisDestination->index.resize(globalIndex.numElements()) ;
126    axisDestination->index = globalIndex ;
127    // apply the transformation to attributes
128
129    auto& transMap = this->transformationMapping_;
130    for(int i=0; i<globalIndex.numElements(); i++) transMap[globalIndex(i)]=globalIndex(i) ;
131
132    auto elementDst=shared_ptr<CLocalElement>(new CLocalElement(context->getIntraCommRank(), n_glo, globalIndex)) ;
133    elementDst->addFullView() ;
134
135    auto transformConnector = make_shared<CTransformConnector>(axisSource->getLocalView(CElementView::FULL), elementDst->getView(CElementView::FULL),context->getIntraComm()) ;
136    transformConnector->computeConnector() ;
137   
138    if (axisSource->hasValue()) transformConnector->transfer(axisSource->value, axisDestination->value) ;
139   
140   
141   
142    if (axisSource->hasBounds())
143    {
144      CArray<double,1> boundsSrc(axisSource->bounds.dataFirst(),shape(axisSource->bounds.numElements()),neverDeleteData) ;
145      CArray<double,1> boundsDst ; 
146      transformConnector->transfer(2, boundsSrc, boundsDst) ;
147      axisDestination->bounds.resize(2,globalIndex.numElements()) ;
148      axisDestination->bounds = CArray<double,2>(boundsDst.dataFirst(), shape(2,globalIndex.numElements()),neverDeleteData) ;
149    }
150   
151    if (axisSource->hasLabel())
152    {
153//ym transferTransformConnector.transfer(axisSrc->label, axisDestination->label) ;  -> probably not supported now, see later
154    }
155
156    // transfer the mask
157    auto transformMask = make_shared<CTransformConnector>(axisSource->getLocalView(CElementView::WORKFLOW), elementDst->getView(CElementView::FULL),context->getIntraComm()) ;
158    transformMask->computeConnector() ;
159
160    CArray<bool,1> workflow(axisSource->getLocalView(CElementView::WORKFLOW)->getSize()) ;
161    axisDestination->mask.resize(axisSource->getLocalView(CElementView::FULL)->getSize()) ;
162    workflow=true ;
163   
164    transformMask->transfer(workflow,axisDestination->mask,false) ;   
165
166    axisDestination->checkAttributes() ;
167    this->computeAlgorithm(axisSource->getLocalView(CElementView::WORKFLOW), axisDestination->getLocalView(CElementView::WORKFLOW)) ;
168  }
169  CATCH
170
171
172}
Note: See TracBrowser for help on using the repository browser.