Changeset 827 for XIOS/trunk/src/transformation/grid_transformation.cpp
- Timestamp:
- 03/23/16 16:10:45 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/transformation/grid_transformation.cpp
r824 r827 23 23 CGridTransformation::CGridTransformation(CGrid* destination, CGrid* source) 24 24 : gridSource_(source), gridDestination_(destination), originalGridSource_(source), 25 algoTypes_(), nbAlgos_(0), currentGridIndexToOriginalGridIndex_() 25 algoTypes_(), nbAlgos_(0), currentGridIndexToOriginalGridIndex_(), tempGrids_(), 26 auxInputs_(), dynamicalTransformation_(false) 26 27 27 28 { … … 68 69 if (!isSpecialTransformation(transType)) ++nbAlgos_; 69 70 } 70 71 if (1<nbAlgos_) // Only when there are more than 1 algorithm, will we create temporary grid source72 {73 std::vector<CAxis*> axisSrcTmp = gridSource_->getAxis(), axisSrc;74 std::vector<CDomain*> domainSrcTmp = gridSource_->getDomains(), domainSrc;75 for (int idx = 0; idx < axisSrcTmp.size(); ++idx)76 {77 CAxis* axis = CAxis::createAxis();78 axis->axis_ref.setValue(axisSrcTmp[idx]->getId());79 axis->solveRefInheritance(true);80 axis->solveInheritanceTransformation();81 axis->checkAttributesOnClient();82 axisSrc.push_back(axis);83 }84 85 for (int idx = 0; idx < domainSrcTmp.size(); ++idx)86 {87 CDomain* domain = CDomain::createDomain();88 domain->domain_ref.setValue(domainSrcTmp[idx]->getId());89 domain->solveRefInheritance(true);90 domain->solveInheritanceTransformation();91 domain->checkAttributesOnClient();92 domainSrc.push_back(domain);93 }94 95 gridSource_ = CGrid::createGrid(domainSrc, axisSrc, gridDestination_->axis_domain_order);96 gridSource_->computeGridGlobalDimension(domainSrc, axisSrc, gridDestination_->axis_domain_order);97 }98 71 } 99 72 100 73 CGridTransformation::~CGridTransformation() 101 74 { 102 std:: list<CGenericAlgorithmTransformation*>::const_iterator itb = algoTransformation_.begin(), it,103 ite = algoTransformation_.end();75 std::vector<CGenericAlgorithmTransformation*>::const_iterator itb = algoTransformation_.begin(), it, 76 ite = algoTransformation_.end(); 104 77 for (it = itb; it != ite; ++it) delete (*it); 105 78 } … … 181 154 algoTypes_.push_back(false); 182 155 ++transformationOrder; 156 std::vector<StdString> auxInput = (it->second)->checkAuxInputs(); 157 for (int idx = 0; idx < auxInput.size(); ++idx) auxInputs_.push_back(auxInput[idx]); 183 158 } 184 159 } … … 208 183 algoTypes_.push_back(true); 209 184 ++transformationOrder; 185 std::vector<StdString> auxInput = (it->second)->checkAuxInputs(); 186 for (int idx = 0; idx < auxInput.size(); ++idx) auxInputs_.push_back(auxInput[idx]); 210 187 } 211 188 } … … 313 290 \param [in] transType transformation type 314 291 */ 315 void CGridTransformation::setUpGrid(int elementPositionInGrid, ETranformationType transType) 316 { 292 void CGridTransformation::setUpGrid(int elementPositionInGrid, ETranformationType transType, int nbTransformation) 293 { 294 if (!tempGrids_.empty() && (getNbAlgo()-1) == tempGrids_.size()) 295 { 296 gridSource_ = tempGrids_[nbTransformation]; 297 return; 298 } 299 317 300 std::vector<CAxis*> axisListDestP = gridDestination_->getAxis(); 318 std::vector<CAxis*> axisListSrcP = gridSource_->getAxis() ;301 std::vector<CAxis*> axisListSrcP = gridSource_->getAxis(), axisSrc; 319 302 320 303 std::vector<CDomain*> domListDestP = gridDestination_->getDomains(); 321 std::vector<CDomain*> domListSrcP = gridSource_->getDomains() ;322 323 int axisIndex , domainIndex;304 std::vector<CDomain*> domListSrcP = gridSource_->getDomains(), domainSrc; 305 306 int axisIndex = -1, domainIndex = -1; 324 307 switch (transType) 325 308 { … … 327 310 case TRANS_ZOOM_DOMAIN: 328 311 domainIndex = elementPosition2DomainPositionInGrid_[elementPositionInGrid]; 329 domListSrcP[domainIndex]->clearAllAttributes();330 domListSrcP[domainIndex]->duplicateAttributes(domListDestP[domainIndex]);331 312 break; 332 313 … … 335 316 case TRANS_INVERSE_AXIS: 336 317 axisIndex = elementPosition2AxisPositionInGrid_[elementPositionInGrid]; 337 axisListSrcP[axisIndex]->clearAllAttributes();338 axisListSrcP[axisIndex]->duplicateAttributes(axisListDestP[axisIndex]);339 318 break; 340 319 default: 341 320 break; 342 321 } 343 gridSource_->createMask(); 344 gridSource_->computeGridGlobalDimension(domListSrcP, axisListSrcP, gridSource_->axis_domain_order); 322 323 for (int idx = 0; idx < axisListSrcP.size(); ++idx) 324 { 325 CAxis* axis = CAxis::createAxis(); 326 if (axisIndex != idx) axis->axis_ref.setValue(axisListSrcP[idx]->getId()); 327 else axis->axis_ref.setValue(axisListDestP[idx]->getId()); 328 axis->solveRefInheritance(true); 329 axis->checkAttributesOnClient(); 330 axisSrc.push_back(axis); 331 } 332 333 for (int idx = 0; idx < domListSrcP.size(); ++idx) 334 { 335 CDomain* domain = CDomain::createDomain(); 336 if (domainIndex != idx) domain->domain_ref.setValue(domListSrcP[idx]->getId()); 337 else domain->domain_ref.setValue(domListDestP[idx]->getId()); 338 domain->solveRefInheritance(true); 339 domain->checkAttributesOnClient(); 340 domainSrc.push_back(domain); 341 } 342 343 gridSource_ = CGrid::createGrid(domainSrc, axisSrc, gridDestination_->axis_domain_order); 344 gridSource_->computeGridGlobalDimension(domainSrc, axisSrc, gridDestination_->axis_domain_order); 345 346 tempGrids_.push_back(gridSource_); 345 347 } 346 348 … … 353 355 -) Make current grid destination become grid source in the next transformation 354 356 */ 355 void CGridTransformation::computeAll( )357 void CGridTransformation::computeAll(const std::vector<CArray<double,1>* >& dataAuxInputs) 356 358 { 357 359 if (nbAlgos_ < 1) return; 360 if (!auxInputs_.empty() && !dynamicalTransformation_) { dynamicalTransformation_ = true; return; } 361 if (dynamicalTransformation_) GlobalIndexMap().swap(currentGridIndexToOriginalGridIndex_); // Reset map 358 362 359 363 CContext* context = CContext::getCurrent(); … … 373 377 374 378 // First of all, select an algorithm 375 selectAlgo(elementPositionInGrid, transType, transformationOrder, algoTypes_[std::distance(itb, it)]); 376 algo = algoTransformation_.back(); 379 if (!dynamicalTransformation_ || (algoTransformation_.size() < listAlgos_.size())) 380 { 381 selectAlgo(elementPositionInGrid, transType, transformationOrder, algoTypes_[std::distance(itb, it)]); 382 algo = algoTransformation_.back(); 383 } 384 else 385 algo = algoTransformation_[std::distance(itb, it)]; 377 386 378 387 if (0 != algo) // Only registered transformation can be executed 379 388 { 389 algo->computeIndexSourceMapping(dataAuxInputs); 390 380 391 // Recalculate the distribution of grid destination 381 392 CDistributionClient distributionClientDest(client->clientRank, gridDestination_); … … 398 409 399 410 // Now grid destination becomes grid source in a new transformation 400 if (nbAgloTransformation != (nbAlgos_-1)) setUpGrid(elementPositionInGrid, transType );411 if (nbAgloTransformation != (nbAlgos_-1)) setUpGrid(elementPositionInGrid, transType, nbAgloTransformation); 401 412 } 402 413 else … … 741 752 int sourceRank = itMapRecv->first; 742 753 int numGlobalIndex = (itMapRecv->second).size(); 754 localIndexToReceiveOnGridDest_[sourceRank].resize(numGlobalIndex); 743 755 for (int i = 0; i < numGlobalIndex; ++i) 744 756 { … … 754 766 } 755 767 } 756 localIndexToReceiveOnGridDest_[sourceRank] .push_back(tmpVec);768 localIndexToReceiveOnGridDest_[sourceRank][i] = tmpVec; 757 769 } 758 770 }
Note: See TracChangeset
for help on using the changeset viewer.