20 int elementPositionInGrid,
21 std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
22 std::map<int, int>& elementPositionInGridSrc2AxisPosition,
23 std::map<int, int>& elementPositionInGridSrc2DomainPosition,
24 std::map<int, int>& elementPositionInGridDst2ScalarPosition,
25 std::map<int, int>& elementPositionInGridDst2AxisPosition,
26 std::map<int, int>& elementPositionInGridDst2DomainPosition)
29 std::vector<CAxis*> axisListDestP = gridDst->getAxis();
30 std::vector<CDomain*> domainListSrcP = gridSrc->getDomains();
33 int axisDstIndex = elementPositionInGridDst2AxisPosition[elementPositionInGrid];
34 int domainSrcIndex = elementPositionInGridSrc2DomainPosition[elementPositionInGrid];
52 algo->
checkValid(axisDestination, domainSource);
54 switch (algo->operation)
56 case CReduceDomainToAxis::operation_attr::sum:
59 case CReduceDomainToAxis::operation_attr::min:
62 case CReduceDomainToAxis::operation_attr::max:
65 case CReduceDomainToAxis::operation_attr::average:
69 ERROR(
"CAxisAlgorithmReduceDomain::CAxisAlgorithmReduceDomain(CAxis* axisDestination, CDomain* domainSource, CReduceDomainToAxis* algo)",
70 <<
"Operation is wrongly defined. Supported operations: sum, min, max, average." << std::endl
71 <<
"Domain source " <<domainSource->
getId() << std::endl
72 <<
"Axis destination " << axisDestination->
getId());
76 dir_ = (CReduceDomainToAxis::direction_attr::iDir == algo->direction) ?
iDir :
jDir;
83 const double* dataInput,
85 std::vector<bool>& flagInitial,
86 bool ignoreMissingValue,
bool firstPass)
89 reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue, firstPass);
125 int nbDomainIdx = i_index.numElements();
127 for (
int idxDomain = 0; idxDomain < nbDomainIdx; ++idxDomain)
129 if (localMask(idxDomain))
131 transMap[j_index(idxDomain)].push_back(j_index(idxDomain)* ni_glo +
i_index(idxDomain));
132 transWeight[j_index(idxDomain)].push_back(1.0) ;
138 int nbAxisIdx = axisDstIndex.numElements();
139 for (
int idxAxis = 0; idxAxis < nbAxisIdx; ++idxAxis)
141 int globalAxisIdx = axisDstIndex(idxAxis);
142 transMap[globalAxisIdx].resize(ni_glo);
143 transWeight[globalAxisIdx].resize(ni_glo);
144 for (
int idx = 0; idx < ni_glo; ++idx)
146 transMap[globalAxisIdx][idx] = globalAxisIdx * ni_glo + idx;
147 transWeight[globalAxisIdx][idx] = 1.0;
154 int nbAxisIdx = axisDstIndex.numElements();
160 int nbDomainIdx = i_index.numElements();
162 for (
int idxDomain = 0; idxDomain < nbDomainIdx; ++idxDomain)
164 if (localMask(idxDomain))
166 transMap[
i_index(idxDomain)].push_back(j_index(idxDomain)* ni_glo +
i_index(idxDomain));
167 transWeight[
i_index(idxDomain)].push_back(1.0) ;
173 for (
int idxAxis = 0; idxAxis < nbAxisIdx; ++idxAxis)
175 int globalAxisIdx = axisDstIndex(idxAxis);
176 transMap[globalAxisIdx].resize(
nj_glo);
177 transWeight[globalAxisIdx].resize(
nj_glo);
178 for (
int idx = 0; idx <
nj_glo; ++idx)
180 transMap[globalAxisIdx][idx] = globalAxisIdx + ni_glo*idx;
181 transWeight[globalAxisIdx][idx] = 1.0;
virtual void apply(const std::vector< std::pair< int, double > > &localIndex, const double *dataInput, CArray< double, 1 > &dataOut, std::vector< bool > &flagInitial, bool ignoreMissingValue, bool firstPass)
Apply a operation on local data.
static bool registerTrans()
virtual void checkValid(CAxis *axisDst, CDomain *domainSrc)
CArray< int, 1 > & i_index
Parent class for all reduction.
static CGenericAlgorithmTransformation * create(CGrid *gridDst, CGrid *gridSrc, CTransformation< CAxis > *transformation, int elementPositionInGrid, std::map< int, int > &elementPositionInGridSrc2ScalarPosition, std::map< int, int > &elementPositionInGridSrc2AxisPosition, std::map< int, int > &elementPositionInGridSrc2DomainPosition, std::map< int, int > &elementPositionInGridDst2ScalarPosition, std::map< int, int > &elementPositionInGridDst2AxisPosition, std::map< int, int > &elementPositionInGridDst2DomainPosition)
const StdString & getId(void) const
Accesseurs ///.
static std::map< StdString, EReductionType > ReductionOperations
Reduce a domain to an axis.
CATCH CScalarAlgorithmReduceScalar::CScalarAlgorithmReduceScalar(CScalar *scalarDestination, CScalar *scalarSource, CReduceScalarToScalar *algo ERROR)("CScalarAlgorithmReduceScalar::CScalarAlgorithmReduceScalar(CScalar* scalarDestination, CScalar* scalarSource, CReduceScalarToScalar* algo)",<< "Operation must be defined."<< "Scalar source "<< scalarSource->getId()<< std::endl<< "Scalar destination "<< scalarDestination->getId())
static CReductionAlgorithm * createOperation(EReductionType reduceType)
Create an operation (sum, max, min) based on type.
void computeIndexSourceMapping_(const std::vector< CArray< double, 1 > * > &dataAuxInputs)
Algorithm for reduce an axis to a axis.
CReductionAlgorithm * reduction_
virtual ~CAxisAlgorithmReduceDomain()
CATCH CAxisAlgorithmExtractDomain::CAxisAlgorithmExtractDomain(CAxis *axisDestination, CDomain *domainSource, CExtractDomainToAxis *algo) StdStrin op)
TransformationIndexMap & transMap
virtual void updateData(CArray< double, 1 > &dataOut)
Update whole dataOut (on necessary).
TransformationWeightMap & transWeight
CAxisAlgorithmReduceDomain(CAxis *axisDestination, CDomain *domainSource, CReduceDomainToAxis *algo)