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

Implementing the first prototype of filter

+) Create new class filter
+) Implement class for specific algorithm
+) Implement inversing algorithm

Test
+) On Curie
+) Grid with one axis: passed

File:
1 edited

Legend:

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

    r600 r619  
    1414#include "array_new.hpp" 
    1515#include "client_server_mapping_distributed.hpp" 
     16#include "invert_algorithm.hpp" 
     17#include "visitable.hpp" 
    1618 
    1719namespace xios { 
     
    2426      , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false), clientDistribution_(0), isIndexSent(false) 
    2527      , serverDistribution_(0), serverDistributionDescription_(0), clientServerMap_(0), writtenDataSize_(0), globalDim_() 
    26       , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true) 
     28      , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), algorithms_(), transformations_(), isTransformed_(false) 
    2729   { 
    2830     setVirtualDomainGroup(); 
     
    3537      , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false), clientDistribution_(0), isIndexSent(false) 
    3638      , serverDistribution_(0), serverDistributionDescription_(0), clientServerMap_(0), writtenDataSize_(0), globalDim_() 
    37       , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true) 
     39      , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), algorithms_(), transformations_(), isTransformed_(false) 
    3840   { 
    3941     setVirtualDomainGroup(); 
     
    5153    if (0 != serverDistribution_) delete serverDistribution_; 
    5254    if (0 != serverDistributionDescription_) delete serverDistributionDescription_; 
     55    for (std::vector<CGenericAlgorithm*>::iterator it = algorithms_.begin(); it != algorithms_.end(); ++it) delete *it; 
    5356   } 
    5457 
     
    10931096        pAxis->solveRefInheritance(apply); 
    10941097        pAxis->solveBaseReference(); 
     1098        pAxis->solveInheritanceTransformation(); 
    10951099        if ((!pAxis->axis_ref.isEmpty()) && (pAxis->name.isEmpty())) 
    10961100          pAxis->name.setValue(pAxis->getBaseAxisReference()->getId()); 
    10971101      } 
    10981102    } 
     1103  } 
     1104 
     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() 
     1151  { 
     1152    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_; 
     1168  } 
     1169 
     1170  void CGrid::transformGrid(CGrid* transformedGrid) 
     1171  { 
     1172    if (transformedGrid->isTransformed()) return; 
     1173    transformedGrid->setTransformed(); 
     1174    if (axis_domain_order.numElements() != transformedGrid->axis_domain_order.numElements()) 
     1175    { 
     1176      ERROR("CGrid::transformGrid(CGrid* transformedGrid)", 
     1177           << "Two grids have different dimension size" 
     1178           << "Dimension of grid source " <<this->getId() << " is " << axis_domain_order.numElements() << std::endl 
     1179           << "Dimension of grid destination " <<transformedGrid->getId() << " is " << transformedGrid->axis_domain_order.numElements()); 
     1180    } 
     1181    else 
     1182    { 
     1183      int ssize = axis_domain_order.numElements(); 
     1184      for (int i = 0; i < ssize; ++i) 
     1185        if (axis_domain_order(i) != (transformedGrid->axis_domain_order)(i)) 
     1186          ERROR("CGrid::transformGrid(CGrid* transformedGrid)", 
     1187                << "Grids " <<this->getId() <<" and " << transformedGrid->getId() 
     1188                << " don't have elements in the same order"); 
     1189    } 
     1190 
     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; 
    10991209  } 
    11001210 
Note: See TracChangeset for help on using the changeset viewer.