14 int elementPositionInGrid,
15 std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
16 std::map<int, int>& elementPositionInGridSrc2AxisPosition,
17 std::map<int, int>& elementPositionInGridSrc2DomainPosition,
18 std::map<int, int>& elementPositionInGridDst2ScalarPosition,
19 std::map<int, int>& elementPositionInGridDst2AxisPosition,
20 std::map<int, int>& elementPositionInGridDst2DomainPosition)
23 std::vector<CDomain*> domainListDestP = gridDst->getDomains();
24 std::vector<CDomain*> domainListSrcP = gridSrc->getDomains();
27 int domainDstIndex = elementPositionInGridDst2DomainPosition[elementPositionInGrid];
28 int domainSrcIndex = elementPositionInGridSrc2DomainPosition[elementPositionInGrid];
30 return (
new CDomainAlgorithmReorder(domainListDestP[domainDstIndex], domainListSrcP[domainSrcIndex], reorderDomain));
46 if (domainDestination->type != CDomain::type_attr::rectilinear)
48 ERROR(
"CDomainAlgorithmReorder::CDomainAlgorithmReorder(CDomain* domainDestination, CDomain* domainSource, CReorderDomain* reorderDomain)",
49 <<
"Domain destination is not rectilinear. This filter work only for rectilinear domain and destination domain with < id = "
50 <<domainDestination->
getId() <<
" > is of type "<<domainDestination->type<<std::endl);
53 if (domainDestination == domainSource)
55 ERROR(
"CDomainAlgorithmReorder::CDomainAlgorithmReorder(CDomain* domainDestination, CDomain* domainSource, CReorderDomain* reorderDomain)",
56 <<
"Domain source and domain destination are the same. Please make sure domain destination refers to domain source" << std::endl
57 <<
"Domain source " <<domainSource->
getId() << std::endl
58 <<
"Domain destination " <<domainDestination->
getId() << std::endl);
62 if (!reorderDomain->invert_lat.isEmpty())
64 CArray<int,1>& j_index=domainDestination->j_index ;
65 int nglo = j_index.numElements() ;
66 int nj_glo =domainDestination->nj_glo ;
68 for (
size_t i = 0; i <
nglo ; ++i)
70 j_index(i)=(nj_glo-1)-j_index(i) ;
74 if (!reorderDomain->shift_lon_fraction.isEmpty())
76 int ni_glo =domainDestination->ni_glo ;
77 int offset = ni_glo*reorderDomain->shift_lon_fraction ;
79 int nglo = i_index.numElements() ;
81 for (
size_t i = 0; i <
nglo ; ++i)
87 if (!reorderDomain->min_lon.isEmpty() && !reorderDomain->max_lon.isEmpty())
89 double min_lon=reorderDomain->min_lon ;
90 double max_lon=reorderDomain->max_lon ;
91 double delta=max_lon-min_lon ;
93 if (!domainDestination->lonvalue_1d.
isEmpty() )
96 for (
int i=0;i<lon.numElements();++i)
98 while (lon(i) > max_lon) lon(i)=lon(i)-delta ;
99 while (lon(i) < min_lon) lon(i)=lon(i)+delta ;
103 if (!domainDestination->bounds_lon_1d.
isEmpty() )
106 for (
int i=0;i<bounds_lon.extent(0);++i)
108 while (bounds_lon(0,i) > max_lon) bounds_lon(0,i)=bounds_lon(0,i)-delta ;
109 while (bounds_lon(1,i) > max_lon) bounds_lon(1,i)=bounds_lon(1,i)-delta ;
111 while (bounds_lon(0,i) < min_lon) bounds_lon(0,i)=bounds_lon(0,i)+delta ;
112 while (bounds_lon(1,i) < min_lon) bounds_lon(1,i)=bounds_lon(1,i)+delta ;
static CGenericAlgorithmTransformation * create(CGrid *gridDst, CGrid *gridSrc, CTransformation< CDomain > *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)
CArray< int, 1 > & i_index
void computeIndexSourceMapping_(const std::vector< CArray< double, 1 > * > &dataAuxInputs)
Compute the index mapping between domain on grid source and one on grid destination.
const StdString & getId(void) const
Accesseurs ///.
static bool registerTrans()
CDomainAlgorithmReorder(CDomain *domainDestination, CDomain *domainSource, CReorderDomain *reorderDomain)
virtual void checkValid(CDomain *domainSrc)
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())
Reordering data on domain.