Changeset 619 for XIOS/trunk/src/node/grid.cpp
- Timestamp:
- 06/22/15 13:36:12 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/node/grid.cpp
r600 r619 14 14 #include "array_new.hpp" 15 15 #include "client_server_mapping_distributed.hpp" 16 #include "invert_algorithm.hpp" 17 #include "visitable.hpp" 16 18 17 19 namespace xios { … … 24 26 , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false), clientDistribution_(0), isIndexSent(false) 25 27 , serverDistribution_(0), serverDistributionDescription_(0), clientServerMap_(0), writtenDataSize_(0), globalDim_() 26 , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true) 28 , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), algorithms_(), transformations_(), isTransformed_(false) 27 29 { 28 30 setVirtualDomainGroup(); … … 35 37 , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false), clientDistribution_(0), isIndexSent(false) 36 38 , serverDistribution_(0), serverDistributionDescription_(0), clientServerMap_(0), writtenDataSize_(0), globalDim_() 37 , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true) 39 , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), algorithms_(), transformations_(), isTransformed_(false) 38 40 { 39 41 setVirtualDomainGroup(); … … 51 53 if (0 != serverDistribution_) delete serverDistribution_; 52 54 if (0 != serverDistributionDescription_) delete serverDistributionDescription_; 55 for (std::vector<CGenericAlgorithm*>::iterator it = algorithms_.begin(); it != algorithms_.end(); ++it) delete *it; 53 56 } 54 57 … … 1093 1096 pAxis->solveRefInheritance(apply); 1094 1097 pAxis->solveBaseReference(); 1098 pAxis->solveInheritanceTransformation(); 1095 1099 if ((!pAxis->axis_ref.isEmpty()) && (pAxis->name.isEmpty())) 1096 1100 pAxis->name.setValue(pAxis->getBaseAxisReference()->getId()); 1097 1101 } 1098 1102 } 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; 1099 1209 } 1100 1210
Note: See TracChangeset
for help on using the changeset viewer.