Ignore:
Timestamp:
06/22/15 13:36:17 (9 years ago)
Author:
mhnguyen
Message:

Implementing generic transformation algorithm (local commit)

+) Implement 3 important classes:

-gridTransformation to read transformation info from grid and interface with the rest of XIOS
-transformationMapping to be in charge of sending/receiving transformation info among clients
-transformationAlgorithm to represent various algorithms

+) Make some change on field to use the new classes

Test
+) Only test_new_features with inversed axis

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/node/grid.cpp

    r619 r620  
    1414#include "array_new.hpp" 
    1515#include "client_server_mapping_distributed.hpp" 
    16 #include "invert_algorithm.hpp" 
    17 #include "visitable.hpp" 
    1816 
    1917namespace xios { 
     
    2624      , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false), clientDistribution_(0), isIndexSent(false) 
    2725      , serverDistribution_(0), serverDistributionDescription_(0), clientServerMap_(0), writtenDataSize_(0), globalDim_() 
    28       , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), algorithms_(), transformations_(), isTransformed_(false) 
     26      , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), transformations_(0), isTransformed_(false) 
     27      , axisPositionInGrid_() 
    2928   { 
    3029     setVirtualDomainGroup(); 
     
    3736      , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false), clientDistribution_(0), isIndexSent(false) 
    3837      , serverDistribution_(0), serverDistributionDescription_(0), clientServerMap_(0), writtenDataSize_(0), globalDim_() 
    39       , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), algorithms_(), transformations_(), isTransformed_(false) 
     38      , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), transformations_(0), isTransformed_(false) 
     39      , axisPositionInGrid_() 
    4040   { 
    4141     setVirtualDomainGroup(); 
     
    5353    if (0 != serverDistribution_) delete serverDistribution_; 
    5454    if (0 != serverDistributionDescription_) delete serverDistributionDescription_; 
    55     for (std::vector<CGenericAlgorithm*>::iterator it = algorithms_.begin(); it != algorithms_.end(); ++it) delete *it; 
     55    if (0 != transformations_) delete transformations_; 
    5656   } 
    5757 
     
    324324      { 
    325325        int idx = 0; 
    326         std::vector<int> axisPositionMap; 
     326        axisPositionInGrid_.resize(0); 
    327327        for (int i = 0; i < axis_domain_order.numElements(); ++i) 
    328328        { 
    329329          if (false == axis_domain_order(i)) 
    330330          { 
    331             axisPositionMap.push_back(idx); 
     331            axisPositionInGrid_.push_back(idx); 
    332332            ++idx; 
    333333          } 
     
    339339        { 
    340340          if (sendAtt) 
    341             axisListP[i]->sendCheckedAttributes(globalDim_,axisPositionMap[i]); 
     341            axisListP[i]->sendCheckedAttributes(globalDim_,axisPositionInGrid_[i]); 
    342342          else 
    343             axisListP[i]->checkAttributesOnClient(globalDim_,axisPositionMap[i]); 
     343            axisListP[i]->checkAttributesOnClient(globalDim_,axisPositionInGrid_[i]); 
    344344          ++idx; 
    345345        } 
     
    347347      } 
    348348   } 
     349 
     350   std::vector<int> CGrid::getAxisPositionInGrid() const 
     351   { 
     352     return axisPositionInGrid_; 
     353   } 
     354 
    349355 
    350356   //--------------------------------------------------------------- 
     
    759765  { 
    760766    return serverDistribution_; 
     767  } 
     768 
     769  const CDistributionClient* CGrid::getDistributionClient() const 
     770  { 
     771    return clientDistribution_; 
    761772  } 
    762773 
     
    11031114  } 
    11041115 
    1105   CGrid::EElementType CGrid::getGridElementType() 
    1106   { 
    1107     EElementType gridType = GRID_ONLY_AXIS; 
    1108     int numElements = axis_domain_order.numElements(); 
    1109     if (1 == numElements) 
    1110     { 
    1111       if (true == axis_domain_order(0)) gridType = GRID_ONLY_DOMAIN; 
    1112     } 
    1113     else gridType = GRID_AXIS_DOMAIN; 
    1114   } 
    1115  
    1116   void CGrid::solveTransformations() 
    1117   { 
    1118     std::vector<CAxis*> axisPtr = getAxis(); 
    1119     for (std::vector<CAxis*>::iterator it = axisPtr.begin(); it != axisPtr.end(); ++it) 
    1120     { 
    1121       std::vector<ETransformationType> axisTransformation = (*it)->getTransformations(); 
    1122       std::vector<ETransformationType>::iterator itTrans  = axisTransformation.begin(), 
    1123                                                  iteTrans = axisTransformation.end(); 
    1124       for (;itTrans != iteTrans; ++ itTrans) 
    1125         transformations_.push_back(*itTrans); 
    1126     } 
    1127   } 
    1128  
    1129   void CGrid::setTransformationAlgorithms() 
    1130   { 
    1131     std::vector<ETransformationType>::iterator itTrans  = transformations_.begin(), 
    1132                                                iteTrans = transformations_.end(); 
    1133     std::set<ETransformationType> tmp; 
    1134     for (; itTrans != iteTrans; ++itTrans) 
    1135     { 
    1136       if (tmp.end() == tmp.find(*itTrans)) 
    1137       { 
    1138         switch (*itTrans) { 
    1139         case eInverse: 
    1140           algorithms_.push_back(new CInvertAlgorithm()); 
    1141           break; 
    1142         default: 
    1143           break; 
    1144         } 
    1145       } 
    1146       tmp.insert(*itTrans); 
    1147     } 
    1148   } 
    1149  
    1150   std::vector<ETransformationType> CGrid::getTransformations() 
     1116  bool CGrid::isTransformed() 
     1117  { 
     1118    return isTransformed_; 
     1119  } 
     1120 
     1121  void CGrid::setTransformed() 
     1122  { 
     1123    isTransformed_ = true; 
     1124  } 
     1125 
     1126  CGridTransformation* CGrid::getTransformations() 
    11511127  { 
    11521128    return transformations_; 
    1153   } 
    1154  
    1155   bool CGrid::isTransformed() 
    1156   { 
    1157     return isTransformed_; 
    1158   } 
    1159  
    1160   void CGrid::setTransformed() 
    1161   { 
    1162     isTransformed_ = true; 
    1163   } 
    1164  
    1165   const std::vector<CGenericAlgorithm*>& CGrid::getTransformationAlgo() 
    1166   { 
    1167     return algorithms_; 
    11681129  } 
    11691130 
     
    11891150    } 
    11901151 
    1191     EElementType gridType = getGridElementType(); 
    1192     CGenericTransformation* gTransform = 0; 
    1193     switch (gridType) { 
    1194     case GRID_ONLY_AXIS: 
    1195       gTransform = new CAxisTransformation(this->getAxis(), transformedGrid->getAxis()); 
    1196       break; 
    1197     case GRID_ONLY_DOMAIN: 
    1198       break; 
    1199     case GRID_AXIS_DOMAIN: 
    1200       break; 
    1201     default: 
    1202       break; 
    1203     } 
    1204  
    1205     transformedGrid->solveTransformations(); 
    1206     transformedGrid->setTransformationAlgorithms(); 
    1207     gTransform->apply(transformedGrid->algorithms_); 
    1208     if (0 != gTransform) delete gTransform; 
     1152    transformations_ = new CGridTransformation(transformedGrid, this); 
     1153    transformations_->computeTransformationMapping(); 
     1154    std::cout << "send index " << *(transformations_->getLocalIndexToSendFromGridSource()[0]) << std::endl; 
     1155    std::cout << "receive index " << *(transformations_->getLocalIndexToReceiveOnGridDest()[0][0]) << std::endl; 
    12091156  } 
    12101157 
Note: See TracChangeset for help on using the changeset viewer.