Ignore:
Timestamp:
10/21/16 13:40:33 (8 years ago)
Author:
mhnguyen
Message:

Correcting various bugs relating to transformation

+) Fix the order of transformation selection
+) Correct domain transformation selection
+) Reorganize test_remap

Test
+) On Curie
+) All tests pass

File:
1 edited

Legend:

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

    r941 r978  
    100100  CDomain::TransMapTypes trans = domainListDestP[domainIndex]->getAllTransformations(); 
    101101  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   
    103103 
    104104  CGenericAlgorithmTransformation* algo = 0; 
     
    118118 
    119119/*! 
     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*/ 
     123std::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/*! 
    120158  If there are more than one transformation, a new temporary grid will be created and it will play the role of grid destination. 
    121159This new created one keeps a pointer to the real transformed element of grid destination and generate new copies of other elements from grid source. 
     
    123161  \param [in] transType transformation type 
    124162*/ 
    125 void CGridTransformation::setUpGridDestination(int elementPositionInGrid, ETranformationType transType, AlgoType algoType) 
     163void CGridTransformation::setUpGridDestination(int elementPositionInGrid, ETranformationType transType) 
    126164{ 
    127165  if (isSpecialTransformation(transType)) return; 
     
    130168  { 
    131169    tempGridDests_.resize(0); 
     170  } 
     171 
     172  if (1 == getNbAlgo())  
     173  { 
     174    tmpGridDestination_ = gridDestination_; 
     175    return; 
    132176  } 
    133177 
     
    144188  CArray<int,1> axisDomainOrderDst = gridDestination_->axis_domain_order; 
    145189 
    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()); 
    162194  for (int idx = 0; idx < axisDomainOrderDst.numElements(); ++idx) 
    163195  { 
    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; 
    178215    } 
    179216    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); 
    190240  tempGridDests_.push_back(tmpGridDestination_); 
    191241} 
     
    198248  \param [in] transType transformation type 
    199249*/ 
    200 void CGridTransformation::setUpGridSource(int elementPositionInGrid, AlgoType algoType) 
     250void CGridTransformation::setUpGridSource(int elementPositionInGrid) 
    201251{ 
    202252  if (!tempGridSrcs_.empty() && (getNbAlgo()-1) == tempGridSrcs_.size()) 
     
    214264  std::vector<CDomain*> domListSrcP = gridSource_->getDomains(), domainSrc; 
    215265 
    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_); 
    234271 
    235272  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) 
    243279      { 
    244280        CDomain* domain = CDomain::createDomain(); 
    245         domain->domain_ref.setValue(domListDestP[domainListIndex]->getId()); 
     281        domain->domain_ref.setValue(domListDestP[elementIndex]->getId()); 
    246282        domain->solveRefInheritance(true); 
    247283        domain->checkAttributesOnClient(); 
    248284        domainSrc.push_back(domain); 
    249285      } 
    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) 
    257287      { 
    258288        CAxis* axis = CAxis::createAxis(); 
    259         axis->axis_ref.setValue(axisListDestP[axisListIndex]->getId()); 
     289        axis->axis_ref.setValue(axisListDestP[elementIndex]->getId()); 
    260290        axis->solveRefInheritance(true); 
    261291        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      } 
    270294      else 
    271295      { 
    272296        CScalar* scalar = CScalar::createScalar(); 
    273         scalar->scalar_ref.setValue(scalarListDestP[scalarListIndex]->getId()); 
     297        scalar->scalar_ref.setValue(scalarListDestP[elementIndex]->getId()); 
    274298        scalar->solveRefInheritance(true); 
    275299        scalar->checkAttributesOnClient(); 
    276300        scalarSrc.push_back(scalar); 
    277301      } 
    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      } 
    279321    } 
    280322  } 
     
    323365    int elementPositionInGrid = it->first; 
    324366    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)]; 
    326369    SourceDestinationIndexMap globaIndexWeightFromSrcToDst; 
    327     AlgoType algoType = algoTypes_[std::distance(itb, it)]; 
     370     
    328371 
    329372    // Create a temporary grid destination which contains transformed element of grid destination and 
    330373    // non-transformed elements to grid source 
    331     setUpGridDestination(elementPositionInGrid, transType, algoType); 
     374    setUpGridDestination(elementPositionInGrid, transType); 
    332375 
    333376    // First of all, select an algorithm 
     
    359402      { 
    360403        // 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); 
    362405      } 
    363406      ++nbAgloTransformation; 
Note: See TracChangeset for help on using the changeset viewer.