Changeset 933 for XIOS/trunk/src/transformation/grid_transformation.cpp
- Timestamp:
- 09/22/16 10:58:32 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/transformation/grid_transformation.cpp
r895 r933 8 8 */ 9 9 #include "grid_transformation.hpp" 10 #include "grid_transformation_factory_impl.hpp" 10 11 #include "algo_types.hpp" 11 12 #include "context.hpp" … … 30 31 31 32 /*! 32 Select algorithm of a scalar correspo ding to its transformation type and its position in each element33 Select algorithm of a scalar corresponding to its transformation type and its position in each element 33 34 \param [in] elementPositionInGrid position of element in grid. e.g: a grid has 1 domain and 1 axis, then position of domain is 0 and position of axis is 1 34 35 \param [in] transType transformation type, for now we have … … 37 38 void CGridTransformation::selectScalarAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) 38 39 { 39 int scalarSrcIndex = -1, axisSrcIndex = -1, domainSrcIndex = -1;40 40 std::vector<CScalar*> scaListDestP = gridDestination_->getScalars(); 41 std::vector<CScalar*> scaListSrcP = gridSource_->getScalars();42 std::vector<CAxis*> axisListSrcP = gridSource_->getAxis();43 std::vector<CDomain*> domainListSrcP = gridSource_->getDomains();44 45 41 int scalarDstIndex = elementPositionInGridDst2ScalarPosition_[elementPositionInGrid]; 46 42 CScalar::TransMapTypes trans = scaListDestP[scalarDstIndex]->getAllTransformations(); … … 48 44 49 45 for (int i = 0; i < transformationOrder; ++i, ++it) {} // Find the correct transformation 50 51 CReduceAxisToScalar* reduceAxis = 0;52 46 CGenericAlgorithmTransformation* algo = 0; 53 switch (transType) 54 { 55 case TRANS_REDUCE_AXIS_TO_SCALAR: 56 reduceAxis = dynamic_cast<CReduceAxisToScalar*> (it->second); 57 axisSrcIndex = elementPositionInGridSrc2AxisPosition_[elementPositionInGrid]; 58 algo = new CScalarAlgorithmReduceScalar(scaListDestP[scalarDstIndex], axisListSrcP[axisSrcIndex], reduceAxis); 59 break; 60 default: 61 break; 62 } 47 algo = CGridTransformationFactory<CScalar>::createTransformation(transType, 48 gridDestination_, 49 gridSource_, 50 it->second, 51 elementPositionInGrid, 52 elementPositionInGridSrc2ScalarPosition_, 53 elementPositionInGridSrc2AxisPosition_, 54 elementPositionInGridSrc2DomainPosition_, 55 elementPositionInGridDst2ScalarPosition_, 56 elementPositionInGridDst2AxisPosition_, 57 elementPositionInGridDst2DomainPosition_); 63 58 algoTransformation_.push_back(algo); 64 59 } 65 60 66 61 /*! 67 Select algorithm of an axis correspo ding to its transformation type and its position in each element62 Select algorithm of an axis corresponding to its transformation type and its position in each element 68 63 \param [in] elementPositionInGrid position of element in grid. e.g: a grid has 1 domain and 1 axis, then position of domain is 0 and position of axis is 1 69 64 \param [in] transType transformation type, for now we have zoom_axis, inverse_axis, interpolate_axis … … 72 67 void CGridTransformation::selectAxisAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) 73 68 { 74 int axisSrcIndex = -1, domainSrcIndex = -1;75 69 std::vector<CAxis*> axisListDestP = gridDestination_->getAxis(); 76 std::vector<CAxis*> axisListSrcP = gridSource_->getAxis();77 std::vector<CDomain*> domainListSrcP = gridSource_->getDomains();78 79 70 int axisDstIndex = elementPositionInGridDst2AxisPosition_[elementPositionInGrid]; 80 71 CAxis::TransMapTypes trans = axisListDestP[axisDstIndex]->getAllTransformations(); 81 72 CAxis::TransMapTypes::const_iterator it = trans.begin(); 82 83 73 for (int i = 0; i < transformationOrder; ++i, ++it) {} // Find the correct transformation 84 74 85 CZoomAxis* zoomAxis = 0;86 CInterpolateAxis* interpAxis = 0;87 CReduceDomainToAxis* reduceDomain = 0;88 CExtractDomainToAxis* extractDomain = 0;89 75 CGenericAlgorithmTransformation* algo = 0; 90 switch (transType) 91 { 92 case TRANS_INTERPOLATE_AXIS: 93 interpAxis = dynamic_cast<CInterpolateAxis*> (it->second); 94 axisSrcIndex = elementPositionInGridSrc2AxisPosition_[elementPositionInGrid]; 95 algo = new CAxisAlgorithmInterpolate(axisListDestP[axisDstIndex], axisListSrcP[axisSrcIndex], interpAxis); 96 break; 97 case TRANS_ZOOM_AXIS: 98 zoomAxis = dynamic_cast<CZoomAxis*> (it->second); 99 axisSrcIndex = elementPositionInGridSrc2AxisPosition_[elementPositionInGrid]; 100 algo = new CAxisAlgorithmZoom(axisListDestP[axisDstIndex], axisListSrcP[axisSrcIndex], zoomAxis); 101 break; 102 case TRANS_INVERSE_AXIS: 103 axisSrcIndex = elementPositionInGridSrc2AxisPosition_[elementPositionInGrid]; 104 algo = new CAxisAlgorithmInverse(axisListDestP[axisDstIndex], axisListSrcP[axisSrcIndex]); 105 break; 106 case TRANS_REDUCE_DOMAIN_TO_AXIS: 107 reduceDomain = dynamic_cast<CReduceDomainToAxis*> (it->second); 108 domainSrcIndex = elementPositionInGridSrc2DomainPosition_[elementPositionInGrid]; 109 algo = new CAxisAlgorithmReduceDomain(axisListDestP[axisDstIndex], domainListSrcP[domainSrcIndex], reduceDomain); 110 break; 111 case TRANS_EXTRACT_DOMAIN_TO_AXIS: 112 extractDomain = dynamic_cast<CExtractDomainToAxis*> (it->second); 113 domainSrcIndex = elementPositionInGridSrc2DomainPosition_[elementPositionInGrid]; 114 algo = new CAxisAlgorithmExtractDomain(axisListDestP[axisDstIndex], domainListSrcP[domainSrcIndex], extractDomain); 115 break; 116 default: 117 break; 118 } 76 algo = CGridTransformationFactory<CAxis>::createTransformation(transType, 77 gridDestination_, 78 gridSource_, 79 it->second, 80 elementPositionInGrid, 81 elementPositionInGridSrc2ScalarPosition_, 82 elementPositionInGridSrc2AxisPosition_, 83 elementPositionInGridSrc2DomainPosition_, 84 elementPositionInGridDst2ScalarPosition_, 85 elementPositionInGridDst2AxisPosition_, 86 elementPositionInGridDst2DomainPosition_); 119 87 algoTransformation_.push_back(algo); 120 88 } 121 89 122 90 /*! 123 Select algorithm of a domain correspo ding to its transformation type and its position in each element91 Select algorithm of a domain corresponding to its transformation type and its position in each element 124 92 \param [in] elementPositionInGrid position of element in grid. e.g: a grid has 1 domain and 1 axis, then position of domain is 0 and position of axis is 1 125 93 \param [in] transType transformation type, for now we have zoom_domain, interpolate_domain … … 129 97 { 130 98 std::vector<CDomain*> domainListDestP = gridDestination_->getDomains(); 131 std::vector<CDomain*> domainListSrcP = gridSource_->getDomains();132 133 99 int domainIndex = elementPositionInGridDst2DomainPosition_[elementPositionInGrid]; 134 100 CDomain::TransMapTypes trans = domainListDestP[domainIndex]->getAllTransformations(); 135 101 CDomain::TransMapTypes::const_iterator it = trans.begin(); 136 137 102 for (int i = 0; i < transformationOrder; ++i, ++it) {} // Find the correct transformation 138 103 139 CZoomDomain* zoomDomain = 0;140 CInterpolateDomain* interpFileDomain = 0;141 104 CGenericAlgorithmTransformation* algo = 0; 142 switch (transType) 143 { 144 case TRANS_INTERPOLATE_DOMAIN: 145 interpFileDomain = dynamic_cast<CInterpolateDomain*> (it->second); 146 algo = new CDomainAlgorithmInterpolate(domainListDestP[domainIndex], domainListSrcP[domainIndex],interpFileDomain); 147 break; 148 case TRANS_ZOOM_DOMAIN: 149 zoomDomain = dynamic_cast<CZoomDomain*> (it->second); 150 algo = new CDomainAlgorithmZoom(domainListDestP[domainIndex], domainListSrcP[domainIndex], zoomDomain); 151 break; 152 default: 153 break; 154 } 105 algo = CGridTransformationFactory<CDomain>::createTransformation(transType, 106 gridDestination_, 107 gridSource_, 108 it->second, 109 elementPositionInGrid, 110 elementPositionInGridSrc2ScalarPosition_, 111 elementPositionInGridSrc2AxisPosition_, 112 elementPositionInGridSrc2DomainPosition_, 113 elementPositionInGridDst2ScalarPosition_, 114 elementPositionInGridDst2AxisPosition_, 115 elementPositionInGridDst2DomainPosition_); 155 116 algoTransformation_.push_back(algo); 156 117 } … … 162 123 \param [in] transType transformation type 163 124 */ 164 void CGridTransformation::setUpGridDestination(int elementPositionInGrid, ETranformationType transType, int nbTransformation)125 void CGridTransformation::setUpGridDestination(int elementPositionInGrid, ETranformationType transType, AlgoType algoType) 165 126 { 166 127 if (isSpecialTransformation(transType)) return; … … 184 145 185 146 int scalarIndex = -1, axisIndex = -1, domainIndex = -1; 186 switch (transType) 187 { 188 case TRANS_INTERPOLATE_DOMAIN: 189 case TRANS_ZOOM_DOMAIN: 147 switch (algoType) 148 { 149 case domainType: 190 150 domainIndex = elementPositionInGridDst2DomainPosition_[elementPositionInGrid]; 191 151 break; 192 193 case TRANS_INTERPOLATE_AXIS: 194 case TRANS_ZOOM_AXIS: 195 case TRANS_INVERSE_AXIS: 196 case TRANS_REDUCE_DOMAIN_TO_AXIS: 197 case TRANS_EXTRACT_DOMAIN_TO_AXIS: 152 case axisType: 198 153 axisIndex = elementPositionInGridDst2AxisPosition_[elementPositionInGrid]; 199 154 break; 200 201 case TRANS_REDUCE_AXIS_TO_SCALAR: 155 case scalarType: 202 156 scalarIndex = elementPositionInGridDst2ScalarPosition_[elementPositionInGrid]; 203 157 break; … … 244 198 \param [in] transType transformation type 245 199 */ 246 void CGridTransformation::setUpGridSource(int elementPositionInGrid, ETranformationType transType, int nbTransformation)200 void CGridTransformation::setUpGridSource(int elementPositionInGrid, AlgoType algoType) 247 201 { 248 202 if (!tempGridSrcs_.empty() && (getNbAlgo()-1) == tempGridSrcs_.size()) … … 264 218 int axisIndex = -1, domainIndex = -1, scalarIndex = -1; 265 219 int axisListIndex = 0, domainListIndex = 0, scalarListIndex = 0; 266 switch (transType) 267 { 268 case TRANS_INTERPOLATE_DOMAIN: 269 case TRANS_ZOOM_DOMAIN: 220 switch (algoType) 221 { 222 case domainType: 270 223 domainIndex = elementPositionInGridDst2DomainPosition_[elementPositionInGrid]; 271 224 break; 272 273 case TRANS_INTERPOLATE_AXIS: 274 case TRANS_ZOOM_AXIS: 275 case TRANS_INVERSE_AXIS: 276 case TRANS_REDUCE_DOMAIN_TO_AXIS: 277 case TRANS_EXTRACT_DOMAIN_TO_AXIS: 225 case axisType: 278 226 axisIndex = elementPositionInGridDst2AxisPosition_[elementPositionInGrid]; 279 227 break; 280 281 case TRANS_REDUCE_AXIS_TO_SCALAR: 228 case scalarType: 282 229 scalarIndex = elementPositionInGridDst2ScalarPosition_[elementPositionInGrid]; 283 230 break; … … 378 325 int transformationOrder = (it->second).second; 379 326 SourceDestinationIndexMap globaIndexWeightFromSrcToDst; 327 AlgoType algoType = algoTypes_[std::distance(itb, it)]; 380 328 381 329 // Create a temporary grid destination which contains transformed element of grid destination and 382 // non-transformed elements fo grid source383 setUpGridDestination(elementPositionInGrid, transType, nbAgloTransformation);330 // non-transformed elements to grid source 331 setUpGridDestination(elementPositionInGrid, transType, algoType); 384 332 385 333 // First of all, select an algorithm 386 334 if (!dynamicalTransformation_ || (algoTransformation_.size() < listAlgos_.size())) 387 335 { 388 selectAlgo(elementPositionInGrid, transType, transformationOrder, algoType s_[std::distance(itb, it)]);336 selectAlgo(elementPositionInGrid, transType, transformationOrder, algoType); 389 337 algo = algoTransformation_.back(); 390 338 } … … 392 340 algo = algoTransformation_[std::distance(itb, it)]; 393 341 394 if ( 0 != algo) // Only registered transformation can be executed342 if ((0 != algo) && (CGenericAlgorithmTransformation::ELEMENT_NO_MODIFICATION_WITH_DATA == algo->type())) // Only registered transformation can be executed 395 343 { 396 344 algo->computeIndexSourceMapping(dataAuxInputs); … … 409 357 { 410 358 // Now grid destination becomes grid source in a new transformation 411 if (nbAgloTransformation != (nbNormalAlgos_-1)) setUpGridSource(elementPositionInGrid, transType, nbAgloTransformation);359 if (nbAgloTransformation != (nbNormalAlgos_-1)) setUpGridSource(elementPositionInGrid, algoType); 412 360 } 413 361 ++nbAgloTransformation;
Note: See TracChangeset
for help on using the changeset viewer.