Changeset 978 for XIOS/trunk/src/transformation/grid_transformation.cpp
- Timestamp:
- 10/21/16 13:40:33 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/transformation/grid_transformation.cpp
r941 r978 100 100 CDomain::TransMapTypes trans = domainListDestP[domainIndex]->getAllTransformations(); 101 101 CDomain::TransMapTypes::const_iterator it = trans.begin(); 102 for (int i = 0; i < transformationOrder; ++i, ++it) {} // Find the correct transformation 102 for (int i = 0; i < transformationOrder; ++i, ++it) {} // Find the correct transformation 103 103 104 104 CGenericAlgorithmTransformation* algo = 0; … … 118 118 119 119 /*! 120 Find position of element in a grid as well as its type (domain, axis, scalar) and position in its own element list 121 \return element position: map<int,<int,int> > corresponds to <element position in grid, <element type, element position in element list> > 122 */ 123 std::map<int,std::pair<int,int> > CGridTransformation::getElementPosition(CGrid* grid) 124 { 125 std::vector<CScalar*> scalarListP = grid->getScalars(); 126 std::vector<CAxis*> axisListP = grid->getAxis(); 127 std::vector<CDomain*> domListP = grid->getDomains(); 128 CArray<int,1> axisDomainOrder = grid->axis_domain_order; 129 int scalarIndex = 0, axisIndex = 0, domainIndex = 0; 130 int nbElement = axisDomainOrder.numElements(), elementDim; 131 std::map<int,std::pair<int,int> > elementPosition; 132 for (int idx = 0; idx < nbElement; ++idx) 133 { 134 elementDim = axisDomainOrder(idx); 135 switch (elementDim) 136 { 137 case 2: 138 elementPosition[idx] = std::make_pair(elementDim, domainIndex); 139 ++domainIndex; 140 break; 141 case 1: 142 elementPosition[idx] = std::make_pair(elementDim, axisIndex); 143 ++axisIndex; 144 break; 145 case 0: 146 elementPosition[idx] = std::make_pair(elementDim, scalarIndex); 147 ++scalarIndex; 148 break; 149 default: 150 break; 151 } 152 } 153 154 return elementPosition; 155 } 156 157 /*! 120 158 If there are more than one transformation, a new temporary grid will be created and it will play the role of grid destination. 121 159 This new created one keeps a pointer to the real transformed element of grid destination and generate new copies of other elements from grid source. … … 123 161 \param [in] transType transformation type 124 162 */ 125 void CGridTransformation::setUpGridDestination(int elementPositionInGrid, ETranformationType transType , AlgoType algoType)163 void CGridTransformation::setUpGridDestination(int elementPositionInGrid, ETranformationType transType) 126 164 { 127 165 if (isSpecialTransformation(transType)) return; … … 130 168 { 131 169 tempGridDests_.resize(0); 170 } 171 172 if (1 == getNbAlgo()) 173 { 174 tmpGridDestination_ = gridDestination_; 175 return; 132 176 } 133 177 … … 144 188 CArray<int,1> axisDomainOrderDst = gridDestination_->axis_domain_order; 145 189 146 int scalarIndex = -1, axisIndex = -1, domainIndex = -1; 147 switch (algoType) 148 { 149 case domainType: 150 domainIndex = elementPositionInGridDst2DomainPosition_[elementPositionInGrid]; 151 break; 152 case axisType: 153 axisIndex = elementPositionInGridDst2AxisPosition_[elementPositionInGrid]; 154 break; 155 case scalarType: 156 scalarIndex = elementPositionInGridDst2ScalarPosition_[elementPositionInGrid]; 157 break; 158 default: 159 break; 160 } 161 190 std::map<int,std::pair<int,int> > elementPositionSrc = getElementPosition(gridSource_); 191 std::map<int,std::pair<int,int> > elementPositionDst = getElementPosition(gridDestination_); 192 193 CArray<int,1> elementOrder(axisDomainOrderDst.numElements()); 162 194 for (int idx = 0; idx < axisDomainOrderDst.numElements(); ++idx) 163 195 { 164 int dimElementDst = axisDomainOrderDst(idx); 165 if (2 == dimElementDst) 166 { 167 if (elementPositionInGrid == idx) 168 domainDst.push_back(domListDestP[domainIndex]); 169 else 170 domainDst.push_back(domListSrcP[elementPositionInGridSrc2DomainPosition_[elementPositionInGrid]]); 171 } 172 else if (1 == dimElementDst) 173 { 174 if (elementPositionInGrid == idx) 175 axisDst.push_back(axisListDestP[axisIndex]); 176 else 177 axisDst.push_back(axisListSrcP[elementPositionInGridSrc2AxisPosition_[elementPositionInGrid]]); 196 if (elementPositionInGrid == idx) 197 { 198 int dimElementDst = elementPositionDst[idx].first; 199 int elementIndex = elementPositionDst[idx].second; 200 switch (dimElementDst) 201 { 202 case 2: 203 domainDst.push_back(domListDestP[elementIndex]); 204 break; 205 case 1: 206 axisDst.push_back(axisListDestP[elementIndex]); 207 break; 208 case 0: 209 scalarDst.push_back(scalarListDestP[elementIndex]); 210 break; 211 default: 212 break; 213 } 214 elementOrder(idx) = dimElementDst; 178 215 } 179 216 else 180 { 181 if (elementPositionInGrid == idx) 182 scalarDst.push_back(scalarListDestP[scalarIndex]); 183 else 184 scalarDst.push_back(scalarListSrcP[elementPositionInGridSrc2ScalarPosition_[elementPositionInGrid]]); 185 } 186 } 187 188 tmpGridDestination_ = CGrid::createGrid(domainDst, axisDst, scalarDst, gridDestination_->axis_domain_order); 189 tmpGridDestination_->computeGridGlobalDimension(domainDst, axisDst, scalarDst, gridDestination_->axis_domain_order); 217 { 218 int dimElementSrc = elementPositionSrc[idx].first; 219 int elementIndex = elementPositionSrc[idx].second; 220 switch (dimElementSrc) 221 { 222 case 2: 223 domainDst.push_back(domListSrcP[elementIndex]); 224 break; 225 case 1: 226 axisDst.push_back(axisListSrcP[elementIndex]); 227 break; 228 case 0: 229 scalarDst.push_back(scalarListSrcP[elementIndex]); 230 break; 231 default: 232 break; 233 } 234 elementOrder(idx) = dimElementSrc; 235 } 236 } 237 238 tmpGridDestination_ = CGrid::createGrid(domainDst, axisDst, scalarDst, elementOrder); 239 tmpGridDestination_->computeGridGlobalDimension(domainDst, axisDst, scalarDst, elementOrder); 190 240 tempGridDests_.push_back(tmpGridDestination_); 191 241 } … … 198 248 \param [in] transType transformation type 199 249 */ 200 void CGridTransformation::setUpGridSource(int elementPositionInGrid , AlgoType algoType)250 void CGridTransformation::setUpGridSource(int elementPositionInGrid) 201 251 { 202 252 if (!tempGridSrcs_.empty() && (getNbAlgo()-1) == tempGridSrcs_.size()) … … 214 264 std::vector<CDomain*> domListSrcP = gridSource_->getDomains(), domainSrc; 215 265 216 CArray<int,1> axisDomainOrderDst = gridDestination_->axis_domain_order; 217 218 int axisIndex = -1, domainIndex = -1, scalarIndex = -1; 219 int axisListIndex = 0, domainListIndex = 0, scalarListIndex = 0; 220 switch (algoType) 221 { 222 case domainType: 223 domainIndex = elementPositionInGridDst2DomainPosition_[elementPositionInGrid]; 224 break; 225 case axisType: 226 axisIndex = elementPositionInGridDst2AxisPosition_[elementPositionInGrid]; 227 break; 228 case scalarType: 229 scalarIndex = elementPositionInGridDst2ScalarPosition_[elementPositionInGrid]; 230 break; 231 default: 232 break; 233 } 266 CArray<int,1> axisDomainOrderSrc = gridSource_->axis_domain_order; 267 CArray<int,1> axisDomainOrderDst = tmpGridDestination_->axis_domain_order; 268 269 std::map<int,std::pair<int,int> > elementPositionSrc = getElementPosition(gridSource_); 270 std::map<int,std::pair<int,int> > elementPositionDst = getElementPosition(tmpGridDestination_); 234 271 235 272 for (int idx = 0; idx < axisDomainOrderDst.numElements(); ++idx) 236 { 237 int dimElementDst = axisDomainOrderDst(idx); 238 if (2 == dimElementDst) 239 { 240 if (elementPositionInGrid == idx) 241 domainSrc.push_back(domListDestP[domainIndex]); 242 else 273 { 274 if (elementPositionInGrid == idx) 275 { 276 int dimElementDst = elementPositionDst[idx].first; 277 int elementIndex = elementPositionDst[idx].second; 278 if (2 == dimElementDst) 243 279 { 244 280 CDomain* domain = CDomain::createDomain(); 245 domain->domain_ref.setValue(domListDestP[ domainListIndex]->getId());281 domain->domain_ref.setValue(domListDestP[elementIndex]->getId()); 246 282 domain->solveRefInheritance(true); 247 283 domain->checkAttributesOnClient(); 248 284 domainSrc.push_back(domain); 249 285 } 250 ++domainListIndex; 251 } 252 else if (1 == dimElementDst) 253 { 254 if (elementPositionInGrid == idx) 255 axisSrc.push_back(axisListDestP[axisIndex]); 256 else 286 else if (1 == dimElementDst) 257 287 { 258 288 CAxis* axis = CAxis::createAxis(); 259 axis->axis_ref.setValue(axisListDestP[ axisListIndex]->getId());289 axis->axis_ref.setValue(axisListDestP[elementIndex]->getId()); 260 290 axis->solveRefInheritance(true); 261 291 axis->checkAttributesOnClient(); 262 axisSrc.push_back(axis); 263 } 264 ++axisListIndex; 265 } 266 else 267 { 268 if (elementPositionInGrid == idx) 269 scalarSrc.push_back(scalarListDestP[scalarIndex]); 292 axisSrc.push_back(axis); 293 } 270 294 else 271 295 { 272 296 CScalar* scalar = CScalar::createScalar(); 273 scalar->scalar_ref.setValue(scalarListDestP[ scalarListIndex]->getId());297 scalar->scalar_ref.setValue(scalarListDestP[elementIndex]->getId()); 274 298 scalar->solveRefInheritance(true); 275 299 scalar->checkAttributesOnClient(); 276 300 scalarSrc.push_back(scalar); 277 301 } 278 ++scalarListIndex; 302 } 303 else 304 { 305 int dimElementDst = elementPositionDst[idx].first; 306 int elementIndex = elementPositionDst[idx].second; 307 switch (dimElementDst) 308 { 309 case 2: 310 domainSrc.push_back(domListDestP[elementIndex]); 311 break; 312 case 1: 313 axisSrc.push_back(axisListDestP[elementIndex]); 314 break; 315 case 0: 316 scalarSrc.push_back(scalarListDestP[elementIndex]); 317 break; 318 default: 319 break; 320 } 279 321 } 280 322 } … … 323 365 int elementPositionInGrid = it->first; 324 366 ETranformationType transType = (it->second).first; 325 int transformationOrder = (it->second).second; 367 int transformationOrder = (it->second).second.first; 368 int algoType = ((it->second).second.second); //algoTypes_[std::distance(itb, it)]; 326 369 SourceDestinationIndexMap globaIndexWeightFromSrcToDst; 327 AlgoType algoType = algoTypes_[std::distance(itb, it)];370 328 371 329 372 // Create a temporary grid destination which contains transformed element of grid destination and 330 373 // non-transformed elements to grid source 331 setUpGridDestination(elementPositionInGrid, transType , algoType);374 setUpGridDestination(elementPositionInGrid, transType); 332 375 333 376 // First of all, select an algorithm … … 359 402 { 360 403 // Now grid destination becomes grid source in a new transformation 361 if (nbAgloTransformation != (nbNormalAlgos_-1)) setUpGridSource(elementPositionInGrid , algoType);404 if (nbAgloTransformation != (nbNormalAlgos_-1)) setUpGridSource(elementPositionInGrid); 362 405 } 363 406 ++nbAgloTransformation;
Note: See TracChangeset
for help on using the changeset viewer.