source: XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/scalar_algorithm/scalar_algorithm_extract_axis.cpp @ 2303

Last change on this file since 2303 was 2303, checked in by jderouillat, 2 years ago

Compute transformation algorithm using source views to extract scalars from axis

  • 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.