source: XIOS3/dev/XIOS_ATTACHED/src/transformation/scalar_algorithm/scalar_algorithm_extract_axis.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:eol-style set to native
  • Property svn:executable set to *
File size: 4.4 KB
Line 
1/*!
2   \file scalar_algorithm_extract_scalar.cpp
3   \author Ha NGUYEN
4   \since 23 June 2016
5   \date 23 June 2016
6
7   \brief Algorithm for extract an axis to a scalar
8 */
9#include "scalar_algorithm_extract_axis.hpp"
10#include "axis.hpp"
11#include "scalar.hpp"
12#include "extract_axis_to_scalar.hpp"
13#include "grid.hpp"
14#include "grid_transformation_factory_impl.hpp"
15
16#include "reduction.hpp"
17
18namespace xios {
19shared_ptr<CGenericAlgorithmTransformation> CScalarAlgorithmExtractAxis::create(bool isSource, CGrid* gridDst, CGrid* gridSrc,
20                                                                     CTransformation<CScalar>* transformation,
21                                                                     int elementPositionInGrid,
22                                                                     std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
23                                                                     std::map<int, int>& elementPositionInGridSrc2AxisPosition,
24                                                                     std::map<int, int>& elementPositionInGridSrc2DomainPosition,
25                                                                     std::map<int, int>& elementPositionInGridDst2ScalarPosition,
26                                                                     std::map<int, int>& elementPositionInGridDst2AxisPosition,
27                                                                     std::map<int, int>& elementPositionInGridDst2DomainPosition)
28TRY
29{
30  std::vector<CScalar*> scalarListDestP = gridDst->getScalars();
31  std::vector<CAxis*> axisListSrcP  = gridSrc->getAxis();
32
33  CExtractAxisToScalar* extractAxis = dynamic_cast<CExtractAxisToScalar*> (transformation);
34  int scalarDstIndex = elementPositionInGridDst2ScalarPosition[elementPositionInGrid];
35  int axisSrcIndex = elementPositionInGridSrc2AxisPosition[elementPositionInGrid];
36
37  return make_shared<CScalarAlgorithmExtractAxis>(isSource, scalarListDestP[scalarDstIndex], axisListSrcP[axisSrcIndex], extractAxis);
38}
39CATCH
40
41bool CScalarAlgorithmExtractAxis::dummyRegistered_ = CScalarAlgorithmExtractAxis::registerTrans();
42bool CScalarAlgorithmExtractAxis::registerTrans()
43TRY
44{
45  return CGridTransformationFactory<CScalar>::registerTransformation(TRANS_EXTRACT_AXIS_TO_SCALAR, create);
46}
47CATCH
48
49CScalarAlgorithmExtractAxis::CScalarAlgorithmExtractAxis(bool isSource, CScalar* scalarDestination, CAxis* axisSource, CExtractAxisToScalar* algo)
50 : CAlgorithmTransformationTransfer(isSource)
51TRY
52{
53  scalarDestination->mask.reset();
54  scalarDestination->value.reset();
55  scalarDestination->n.reset();
56
57  algo->checkValid(scalarDestination, axisSource);
58  pos_ = algo->position;
59
60  scalarDestination->mask.setValue( false ); // scalar do not contain data_index, WF view set looking at mask
61  scalarDestination->n.setValue( 0 );
62
63  // ----------------------------
64  bool scalarOnThisAxisPiece(false);
65  CArray<size_t,1> sourceGlobalIdx = axisSource->getLocalElement()->getGlobalIndex();
66  int indexSize = sourceGlobalIdx.numElements();
67  int idxSrc(-1);
68  for (int countSrc = 0; countSrc < indexSize ; ++countSrc)
69  {
70    if ( sourceGlobalIdx(countSrc) == pos_ )
71    {
72      scalarOnThisAxisPiece = true;
73      idxSrc = countSrc;
74    }
75  }
76   
77  int idxMin = INT_MAX;
78  for (int countSrc = 0; countSrc < indexSize ; ++countSrc)
79  {
80    if ( sourceGlobalIdx(countSrc) < idxMin )
81      idxMin = sourceGlobalIdx(countSrc);
82  }
83 
84  CArray<int,1> sourceWorkflowIdx = axisSource->getLocalView(CElementView::WORKFLOW)->getIndex();
85  int srcWorkflowSize = sourceWorkflowIdx.numElements();
86 
87
88  if (scalarOnThisAxisPiece)
89  {
90    int iIdxSrc2 = (idxSrc+idxMin)%axisSource->n_glo;
91    int convert_locally_global_idx = (iIdxSrc2-idxMin) ;
92    bool concerned_by_WF(false);
93    for ( int i = 0 ; i<sourceWorkflowIdx.numElements() ; ++i )
94    {
95      if (sourceWorkflowIdx(i)==convert_locally_global_idx)
96      {     
97        concerned_by_WF = true;
98        break;
99      }
100    }
101
102    // Check if in WF
103    if (concerned_by_WF)
104    {
105      this->transformationMapping_[0]=pos_ ;
106      scalarDestination->mask.setValue( true );
107      scalarDestination->n.setValue( 1 );
108    }
109
110    if (axisSource->hasValue())
111    {
112      scalarDestination->value = axisSource->value(idxSrc);
113    }
114  }
115  // ----------------------------
116 
117  scalarDestination->checkAttributes() ;
118  this->computeAlgorithm(axisSource->getLocalView(CElementView::WORKFLOW), scalarDestination->getLocalView(CElementView::WORKFLOW)) ;
119}
120CATCH
121
122
123
124}
Note: See TracBrowser for help on using the repository browser.