Ignore:
Timestamp:
03/23/16 16:10:45 (8 years ago)
Author:
mhnguyen
Message:

Implementing dynamic interpolation on axis

+) Change grid transformation to make it more flexible
+) Make some small improvements

Test
+) On Curie
+) All test pass

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/transformation/grid_transformation.cpp

    r824 r827  
    2323CGridTransformation::CGridTransformation(CGrid* destination, CGrid* source) 
    2424: gridSource_(source), gridDestination_(destination), originalGridSource_(source), 
    25   algoTypes_(), nbAlgos_(0), currentGridIndexToOriginalGridIndex_() 
     25  algoTypes_(), nbAlgos_(0), currentGridIndexToOriginalGridIndex_(), tempGrids_(), 
     26  auxInputs_(), dynamicalTransformation_(false) 
    2627 
    2728{ 
     
    6869    if (!isSpecialTransformation(transType)) ++nbAlgos_; 
    6970  } 
    70  
    71   if (1<nbAlgos_)  // Only when there are more than 1 algorithm, will we create temporary grid source 
    72   { 
    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   } 
    9871} 
    9972 
    10073CGridTransformation::~CGridTransformation() 
    10174{ 
    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(); 
    10477  for (it = itb; it != ite; ++it) delete (*it); 
    10578} 
     
    181154        algoTypes_.push_back(false); 
    182155        ++transformationOrder; 
     156        std::vector<StdString> auxInput = (it->second)->checkAuxInputs(); 
     157        for (int idx = 0; idx < auxInput.size(); ++idx) auxInputs_.push_back(auxInput[idx]); 
    183158      } 
    184159    } 
     
    208183        algoTypes_.push_back(true); 
    209184        ++transformationOrder; 
     185        std::vector<StdString> auxInput = (it->second)->checkAuxInputs(); 
     186        for (int idx = 0; idx < auxInput.size(); ++idx) auxInputs_.push_back(auxInput[idx]); 
    210187      } 
    211188    } 
     
    313290  \param [in] transType transformation type 
    314291*/ 
    315 void CGridTransformation::setUpGrid(int elementPositionInGrid, ETranformationType transType) 
    316 { 
     292void 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 
    317300  std::vector<CAxis*> axisListDestP = gridDestination_->getAxis(); 
    318   std::vector<CAxis*> axisListSrcP = gridSource_->getAxis(); 
     301  std::vector<CAxis*> axisListSrcP = gridSource_->getAxis(), axisSrc; 
    319302 
    320303  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; 
    324307  switch (transType) 
    325308  { 
     
    327310    case TRANS_ZOOM_DOMAIN: 
    328311      domainIndex = elementPosition2DomainPositionInGrid_[elementPositionInGrid]; 
    329       domListSrcP[domainIndex]->clearAllAttributes(); 
    330       domListSrcP[domainIndex]->duplicateAttributes(domListDestP[domainIndex]); 
    331312      break; 
    332313 
     
    335316    case TRANS_INVERSE_AXIS: 
    336317      axisIndex =  elementPosition2AxisPositionInGrid_[elementPositionInGrid]; 
    337       axisListSrcP[axisIndex]->clearAllAttributes(); 
    338       axisListSrcP[axisIndex]->duplicateAttributes(axisListDestP[axisIndex]); 
    339318      break; 
    340319    default: 
    341320      break; 
    342321  } 
    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_); 
    345347} 
    346348 
     
    353355  -) Make current grid destination become grid source in the next transformation 
    354356*/ 
    355 void CGridTransformation::computeAll() 
     357void CGridTransformation::computeAll(const std::vector<CArray<double,1>* >& dataAuxInputs) 
    356358{ 
    357359  if (nbAlgos_ < 1) return; 
     360  if (!auxInputs_.empty() && !dynamicalTransformation_) { dynamicalTransformation_ = true; return; } 
     361  if (dynamicalTransformation_) GlobalIndexMap().swap(currentGridIndexToOriginalGridIndex_);  // Reset map 
    358362 
    359363  CContext* context = CContext::getCurrent(); 
     
    373377 
    374378    // 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)]; 
    377386 
    378387    if (0 != algo) // Only registered transformation can be executed 
    379388    { 
     389      algo->computeIndexSourceMapping(dataAuxInputs); 
     390 
    380391      // Recalculate the distribution of grid destination 
    381392      CDistributionClient distributionClientDest(client->clientRank, gridDestination_); 
     
    398409 
    399410        // 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); 
    401412      } 
    402413      else 
     
    741752    int sourceRank = itMapRecv->first; 
    742753    int numGlobalIndex = (itMapRecv->second).size(); 
     754    localIndexToReceiveOnGridDest_[sourceRank].resize(numGlobalIndex); 
    743755    for (int i = 0; i < numGlobalIndex; ++i) 
    744756    { 
     
    754766        } 
    755767      } 
    756       localIndexToReceiveOnGridDest_[sourceRank].push_back(tmpVec); 
     768      localIndexToReceiveOnGridDest_[sourceRank][i] = tmpVec; 
    757769    } 
    758770  } 
Note: See TracChangeset for help on using the changeset viewer.