axis_algorithm_reduce_domain.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /*!
  2. \file axis_algorithm_reduce_domain.cpp
  3. \author Ha NGUYEN
  4. \since 23 June 2016
  5. \date 23 June 2016
  6. \brief Algorithm for reduce a domain to an axis
  7. */
  8. #include "axis_algorithm_reduce_domain.hpp"
  9. #include "reduce_domain_to_axis.hpp"
  10. #include "axis.hpp"
  11. #include "domain.hpp"
  12. #include "grid.hpp"
  13. #include "grid_transformation_factory_impl.hpp"
  14. #include "reduction.hpp"
  15. namespace xios {
  16. CGenericAlgorithmTransformation* CAxisAlgorithmReduceDomain::create(CGrid* gridDst, CGrid* gridSrc,
  17. CTransformation<CAxis>* transformation,
  18. int elementPositionInGrid,
  19. std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
  20. std::map<int, int>& elementPositionInGridSrc2AxisPosition,
  21. std::map<int, int>& elementPositionInGridSrc2DomainPosition,
  22. std::map<int, int>& elementPositionInGridDst2ScalarPosition,
  23. std::map<int, int>& elementPositionInGridDst2AxisPosition,
  24. std::map<int, int>& elementPositionInGridDst2DomainPosition)
  25. {
  26. std::vector<CAxis*> axisListDestP = gridDst->getAxis();
  27. std::vector<CDomain*> domainListSrcP = gridSrc->getDomains();
  28. CReduceDomainToAxis* reduceDomain = dynamic_cast<CReduceDomainToAxis*> (transformation);
  29. int axisDstIndex = elementPositionInGridDst2AxisPosition[elementPositionInGrid];
  30. int domainSrcIndex = elementPositionInGridSrc2DomainPosition[elementPositionInGrid];
  31. return (new CAxisAlgorithmReduceDomain(axisListDestP[axisDstIndex], domainListSrcP[domainSrcIndex], reduceDomain));
  32. }
  33. bool CAxisAlgorithmReduceDomain::registerTrans()
  34. {
  35. CGridTransformationFactory<CAxis>::registerTransformation(TRANS_REDUCE_DOMAIN_TO_AXIS, create);
  36. }
  37. CAxisAlgorithmReduceDomain::CAxisAlgorithmReduceDomain(CAxis* axisDestination, CDomain* domainSource, CReduceDomainToAxis* algo)
  38. : CAxisAlgorithmTransformation(axisDestination, domainSource), reduction_(0)
  39. {
  40. algo->checkValid(axisDestination, domainSource);
  41. StdString op;
  42. switch (algo->operation)
  43. {
  44. case CReduceDomainToAxis::operation_attr::sum:
  45. op = "sum";
  46. break;
  47. case CReduceDomainToAxis::operation_attr::min:
  48. op = "min";
  49. break;
  50. case CReduceDomainToAxis::operation_attr::max:
  51. op = "max";
  52. break;
  53. case CReduceDomainToAxis::operation_attr::average:
  54. op = "average";
  55. break;
  56. default:
  57. ERROR("CAxisAlgorithmReduceDomain::CAxisAlgorithmReduceDomain(CAxis* axisDestination, CDomain* domainSource, CReduceDomainToAxis* algo)",
  58. << "Operation is wrongly defined. Supported operations: sum, min, max, average." << std::endl
  59. << "Domain source " <<domainSource->getId() << std::endl
  60. << "Axis destination " << axisDestination->getId());
  61. }
  62. dir_ = (CReduceDomainToAxis::direction_attr::iDir == algo->direction) ? iDir : jDir;
  63. reduction_ = CReductionAlgorithm::createOperation(CReductionAlgorithm::ReductionOperations[op]);
  64. local = algo->local ;
  65. }
  66. void CAxisAlgorithmReduceDomain::apply(const std::vector<std::pair<int,double> >& localIndex,
  67. const double* dataInput,
  68. CArray<double,1>& dataOut,
  69. std::vector<bool>& flagInitial,
  70. bool ignoreMissingValue, bool firstPass)
  71. {
  72. reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue, firstPass);
  73. }
  74. void CAxisAlgorithmReduceDomain::updateData(CArray<double,1>& dataOut)
  75. {
  76. reduction_->updateData(dataOut);
  77. }
  78. CAxisAlgorithmReduceDomain::~CAxisAlgorithmReduceDomain()
  79. {
  80. if (0 != reduction_) delete reduction_;
  81. }
  82. void CAxisAlgorithmReduceDomain::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs)
  83. {
  84. this->transformationMapping_.resize(1);
  85. this->transformationWeight_.resize(1);
  86. TransformationIndexMap& transMap = this->transformationMapping_[0];
  87. TransformationWeightMap& transWeight = this->transformationWeight_[0];
  88. CArray<int,1>& axisDstIndex = axisDest_->index;
  89. int ni_glo = domainSrc_->ni_glo, nj_glo = domainSrc_->nj_glo;
  90. if (iDir == dir_)
  91. {
  92. if (local)
  93. {
  94. const CArray<int, 1>& i_index = domainSrc_-> i_index.getValue() ;
  95. const CArray<int, 1>& j_index = domainSrc_-> j_index.getValue() ;
  96. const CArray<bool,1>& localMask = domainSrc_-> localMask ;
  97. int nbDomainIdx = i_index.numElements();
  98. for (int idxDomain = 0; idxDomain < nbDomainIdx; ++idxDomain)
  99. {
  100. if (localMask(idxDomain))
  101. {
  102. transMap[j_index(idxDomain)].push_back(j_index(idxDomain)* ni_glo + i_index(idxDomain));
  103. transWeight[j_index(idxDomain)].push_back(1.0) ;
  104. }
  105. }
  106. }
  107. else
  108. {
  109. int nbAxisIdx = axisDstIndex.numElements();
  110. for (int idxAxis = 0; idxAxis < nbAxisIdx; ++idxAxis)
  111. {
  112. int globalAxisIdx = axisDstIndex(idxAxis);
  113. transMap[globalAxisIdx].resize(ni_glo);
  114. transWeight[globalAxisIdx].resize(ni_glo);
  115. for (int idx = 0; idx < ni_glo; ++idx)
  116. {
  117. transMap[globalAxisIdx][idx] = globalAxisIdx * ni_glo + idx;
  118. transWeight[globalAxisIdx][idx] = 1.0;
  119. }
  120. }
  121. }
  122. }
  123. else if (jDir == dir_)
  124. {
  125. int nbAxisIdx = axisDstIndex.numElements();
  126. if (local)
  127. {
  128. const CArray<int, 1>& i_index = domainSrc_-> i_index.getValue() ;
  129. const CArray<int, 1>& j_index = domainSrc_-> j_index.getValue() ;
  130. const CArray<bool,1>& localMask = domainSrc_-> localMask ;
  131. int nbDomainIdx = i_index.numElements();
  132. for (int idxDomain = 0; idxDomain < nbDomainIdx; ++idxDomain)
  133. {
  134. if (localMask(idxDomain))
  135. {
  136. transMap[i_index(idxDomain)].push_back(j_index(idxDomain)* ni_glo + i_index(idxDomain));
  137. transWeight[i_index(idxDomain)].push_back(1.0) ;
  138. }
  139. }
  140. }
  141. else
  142. {
  143. for (int idxAxis = 0; idxAxis < nbAxisIdx; ++idxAxis)
  144. {
  145. int globalAxisIdx = axisDstIndex(idxAxis);
  146. transMap[globalAxisIdx].resize(nj_glo);
  147. transWeight[globalAxisIdx].resize(nj_glo);
  148. for (int idx = 0; idx < nj_glo; ++idx)
  149. {
  150. transMap[globalAxisIdx][idx] = globalAxisIdx + ni_glo*idx;
  151. transWeight[globalAxisIdx][idx] = 1.0;
  152. }
  153. }
  154. }
  155. }
  156. else
  157. {}
  158. }
  159. }