source: XIOS/dev/branch_yushan_merged/src/transformation/axis_algorithm_extract_domain.cpp @ 1155

Last change on this file since 1155 was 1155, checked in by yushan, 7 years ago

test_remap OK with openmp

  • Property svn:executable set to *
File size: 4.7 KB
Line 
1/*!
2   \file axis_algorithm_reduce_domain.cpp
3   \author Ha NGUYEN
4   \since 23 June 2016
5   \date 23 June 2016
6
7   \brief Algorithm for extract a domain to an axis
8 */
9#include "axis_algorithm_extract_domain.hpp"
10#include "extract_domain_to_axis.hpp"
11#include "axis.hpp"
12#include "domain.hpp"
13#include "grid.hpp"
14#include "grid_transformation_factory_impl.hpp"
15
16namespace xios {
17CGenericAlgorithmTransformation* CAxisAlgorithmExtractDomain::create(CGrid* gridDst, CGrid* gridSrc,
18                                                                     CTransformation<CAxis>* transformation,
19                                                                     int elementPositionInGrid,
20                                                                     std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
21                                                                     std::map<int, int>& elementPositionInGridSrc2AxisPosition,
22                                                                     std::map<int, int>& elementPositionInGridSrc2DomainPosition,
23                                                                     std::map<int, int>& elementPositionInGridDst2ScalarPosition,
24                                                                     std::map<int, int>& elementPositionInGridDst2AxisPosition,
25                                                                     std::map<int, int>& elementPositionInGridDst2DomainPosition)
26{
27  std::vector<CAxis*> axisListDestP = gridDst->getAxis();
28  std::vector<CDomain*> domainListSrcP = gridSrc->getDomains();
29
30  CExtractDomainToAxis* extractDomain = dynamic_cast<CExtractDomainToAxis*> (transformation);
31  int axisDstIndex = elementPositionInGridDst2AxisPosition[elementPositionInGrid];
32  int domainSrcIndex = elementPositionInGridSrc2DomainPosition[elementPositionInGrid];
33
34  return (new CAxisAlgorithmExtractDomain(axisListDestP[axisDstIndex], domainListSrcP[domainSrcIndex], extractDomain));
35}
36
37//bool CAxisAlgorithmExtractDomain::_dummyRegistered = CAxisAlgorithmExtractDomain::registerTrans();
38bool CAxisAlgorithmExtractDomain::registerTrans()
39{
40  CGridTransformationFactory<CAxis>::registerTransformation(TRANS_EXTRACT_DOMAIN_TO_AXIS, create);
41}
42
43
44CAxisAlgorithmExtractDomain::CAxisAlgorithmExtractDomain(CAxis* axisDestination, CDomain* domainSource, CExtractDomainToAxis* algo)
45 : CAxisAlgorithmTransformation(axisDestination, domainSource), pos_(-1), reduction_(0)
46{
47  algo->checkValid(axisDestination, domainSource);
48  StdString op = "extract";
49
50  switch (algo->direction)
51  {
52    case CExtractDomainToAxis::direction_attr::jDir:
53      dir_ = jDir;
54      break;
55    case CExtractDomainToAxis::direction_attr::iDir:
56      dir_ = iDir;
57      break;
58    default:
59      break;
60  }
61
62  pos_ = algo->position;
63
64  if(CReductionAlgorithm::ReductionOperations_ptr == 0) 
65    CReductionAlgorithm::initReductionOperation();
66
67  reduction_ = CReductionAlgorithm::createOperation((*CReductionAlgorithm::ReductionOperations_ptr)[op]);
68}
69
70void CAxisAlgorithmExtractDomain::apply(const std::vector<std::pair<int,double> >& localIndex,
71                                        const double* dataInput,
72                                        CArray<double,1>& dataOut,
73                                        std::vector<bool>& flagInitial,                     
74                                        bool ignoreMissingValue)
75{
76  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue);
77}
78
79CAxisAlgorithmExtractDomain::~CAxisAlgorithmExtractDomain()
80{
81  if (0 != reduction_) delete reduction_;
82}
83
84void CAxisAlgorithmExtractDomain::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs)
85{
86  this->transformationMapping_.resize(1);
87  this->transformationWeight_.resize(1);
88
89  TransformationIndexMap& transMap = this->transformationMapping_[0];
90  TransformationWeightMap& transWeight = this->transformationWeight_[0];
91
92  CArray<int,1>& axisDstIndex = axisDest_->index;
93  int ni_glo = domainSrc_->ni_glo, nj_glo = domainSrc_->nj_glo;
94  if (jDir == dir_)
95  {
96    int nbAxisIdx = axisDstIndex.numElements();
97    for (int idxAxis = 0; idxAxis < nbAxisIdx; ++idxAxis)
98    {
99      int globalAxisIdx = axisDstIndex(idxAxis);
100      transMap[globalAxisIdx].resize(1);
101      transWeight[globalAxisIdx].resize(1);
102      transMap[globalAxisIdx][0] = globalAxisIdx * ni_glo + pos_;
103      transWeight[globalAxisIdx][0] = 1.0;
104
105    }
106  }
107  else if (iDir == dir_)
108  {
109    int nbAxisIdx = axisDstIndex.numElements();
110    for (int idxAxis = 0; idxAxis < nbAxisIdx; ++idxAxis)
111    {
112      int globalAxisIdx = axisDstIndex(idxAxis);
113      transMap[globalAxisIdx].resize(1);
114      transWeight[globalAxisIdx].resize(1);
115      transMap[globalAxisIdx][0] = globalAxisIdx + ni_glo * pos_;
116      transWeight[globalAxisIdx][0] = 1.0;
117    }
118  }
119  else
120  {}
121}
122
123}
Note: See TracBrowser for help on using the repository browser.