Changeset 622 for XIOS/trunk/src/filter/grid_transformation.cpp
- Timestamp:
- 06/22/15 13:36:27 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/filter/grid_transformation.cpp
r621 r622 1 1 #include "grid_transformation.hpp" 2 2 #include "axis_inverse.hpp" 3 #include "axis_zoom.hpp" 4 #include "context.hpp" 5 #include "context_client.hpp" 3 6 #include "transformation_mapping.hpp" 4 #include "transformation_enum.hpp" 7 5 8 #include "axis_algorithm_transformation.hpp" 6 9 7 10 namespace xios { 8 11 CGridTransformation::CGridTransformation(CGrid* destination, CGrid* source) 9 : gridSource_(source), gridDestination_(destination) 12 : gridSource_(source), gridDestination_(destination), originalGridSource_(source), 13 globalIndexOfCurrentGridSource_(0), globalIndexOfOriginalGridSource_(0) 10 14 { 11 15 //Verify the compatibity between two grids … … 26 30 } 27 31 32 std::vector<CAxis*> axisSrcTmp = gridSource_->getAxis(), axisSrc; 33 std::vector<CDomain*> domainSrcTmp = gridSource_->getDomains(), domainSrc; 34 for (int idx = 0; idx < axisSrcTmp.size(); ++idx) 35 { 36 CAxis* axis = CAxis::createAxis(); 37 axisSrcTmp[idx]->duplicateAttributes(axis); 38 axisSrc.push_back(axis); 39 } 40 41 for (int idx = 0; idx < domainSrcTmp.size(); ++idx) 42 { 43 CDomain* domain = CDomain::createDomain(); 44 domainSrcTmp[idx]->duplicateAttributes(domain); 45 domainSrc.push_back(domain); 46 } 47 48 gridSource_ = CGrid::createGrid(domainSrc, axisSrc, gridDestination_->axis_domain_order); 28 49 gridSourceDimensionSize_ = gridSource_->getGlobalDimension(); 29 50 gridDestinationDimensionSize_ = gridDestination_->getGlobalDimension(); 51 52 initializeMappingOfOriginalGridSource(); 30 53 initializeAlgorithms(); 31 54 } 32 55 56 void CGridTransformation::initializeMappingOfOriginalGridSource() 57 { 58 CContext* context = CContext::getCurrent(); 59 CContextClient* client=context->client; 60 61 CDistributionClient distribution(client->clientRank, originalGridSource_); 62 const CArray<size_t,1>& globalIndexGridDestSendToServer = distribution.getGlobalDataIndexSendToServer(); 63 64 globalIndexOfCurrentGridSource_ = new CArray<size_t,1>(globalIndexGridDestSendToServer.numElements()); 65 globalIndexOfOriginalGridSource_ = new CArray<size_t,1>(globalIndexGridDestSendToServer.numElements()); 66 *globalIndexOfCurrentGridSource_ = globalIndexGridDestSendToServer; 67 *globalIndexOfOriginalGridSource_ = globalIndexGridDestSendToServer; 68 } 69 33 70 CGridTransformation::~CGridTransformation() 34 71 { 35 std::map<int, std::vector<CGenericAlgorithmTransformation*> >::const_iterator itb = algoTransformation_.begin(), it, 36 ite = algoTransformation_.end(); 37 for (it = itb; it != ite; ++it) 38 for (int idx = 0; idx < (it->second).size(); ++idx) 39 delete (it->second)[idx]; 72 std::list<CGenericAlgorithmTransformation*>::const_iterator itb = algoTransformation_.begin(), it, 73 ite = algoTransformation_.end(); 74 for (it = itb; it != ite; ++it) delete (*it); 40 75 41 76 std::map<int, std::vector<CArray<int,1>* > >::const_iterator itMapRecv, iteMapRecv; … … 52 87 iteMap = localIndexToSendFromGridSource_.end(); 53 88 for (; itMap != iteMap; ++itMap) delete (itMap->second); 89 90 if (0 != globalIndexOfCurrentGridSource_) delete globalIndexOfCurrentGridSource_; 91 if (0 != globalIndexOfOriginalGridSource_) delete globalIndexOfOriginalGridSource_; 54 92 } 55 93 … … 86 124 for (int i = 0; i < axisListDestP.size(); ++i) 87 125 { 126 elementPosition2AxisPositionInGrid_[axisPositionInGrid[i]] = i; 88 127 if (axisListDestP[i]->hasTransformation()) 89 128 { 90 CGenericAlgorithmTransformation* algo = 0;91 129 CAxis::TransMapTypes trans = axisListDestP[i]->getAllTransformations(); 92 130 CAxis::TransMapTypes::const_iterator itb = trans.begin(), it, 93 131 ite = trans.end(); 94 std::vector<ETranformationType> algoAxis;132 int transformationOrder = 0; 95 133 for (it = itb; it != ite; ++it) 96 134 { 97 algoAxis.push_back(it->first); 135 listAlgos_.push_back(std::make_pair(axisPositionInGrid[i], std::make_pair(it->first, transformationOrder))); 136 ++transformationOrder; 98 137 } 99 algo = new CAxisAlgorithmTransformation(axisListDestP[i], axisListSrcP[i], algoAxis);100 algoTransformation_[axisPositionInGrid[i]].push_back(algo);101 138 } 102 139 } … … 108 145 109 146 } 147 148 void CGridTransformation::selectAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) 149 { 150 selectAxisAlgo(elementPositionInGrid, transType, transformationOrder); 151 } 152 153 void CGridTransformation::selectAxisAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) 154 { 155 std::vector<CAxis*> axisListDestP = gridDestination_->getAxis(); 156 std::vector<CAxis*> axisListSrcP = gridSource_->getAxis(); 157 158 int axisIndex = elementPosition2AxisPositionInGrid_[elementPositionInGrid]; 159 CAxis::TransMapTypes trans = axisListDestP[axisIndex]->getAllTransformations(); 160 CAxis::TransMapTypes::const_iterator it = trans.begin(); 161 162 for (int i = 0; i < transformationOrder; ++i, ++it) {} // Find the correct transformation 163 164 CZoomAxis* zoomAxis = 0; 165 CGenericAlgorithmTransformation* algo = 0; 166 switch (transType) 167 { 168 case TRANS_ZOOM_AXIS: 169 zoomAxis = dynamic_cast<CZoomAxis*> (it->second); 170 algo = new CAxisZoom(axisListDestP[axisIndex], axisListSrcP[axisIndex], zoomAxis); 171 break; 172 case TRANS_INVERSE_AXIS: 173 algo = new CAxisInverse(axisListDestP[axisIndex], axisListSrcP[axisIndex]); 174 break; 175 default: 176 break; 177 } 178 algoTransformation_.push_back(algo); 179 180 } 181 182 void CGridTransformation::selectDomainAlgo(int elementPositionInGrid, ETranformationType transType, int transformationOrder) 183 { 184 185 } 186 187 void CGridTransformation::setUpGrid(int elementPositionInGrid, ETranformationType transType) 188 { 189 std::vector<CAxis*> axisListDestP = gridDestination_->getAxis(); 190 std::vector<CAxis*> axisListSrcP = gridSource_->getAxis(); 191 192 int axisIndex; 193 switch (transType) 194 { 195 case TRANS_ZOOM_AXIS: 196 case TRANS_INVERSE_AXIS: 197 axisIndex = elementPosition2AxisPositionInGrid_[elementPositionInGrid]; 198 axisListDestP[axisIndex]->duplicateAttributes(axisListSrcP[axisIndex]); 199 break; 200 default: 201 break; 202 } 203 } 204 205 void CGridTransformation::computeAll() 206 { 207 CContext* context = CContext::getCurrent(); 208 CContextClient* client=context->client; 209 210 ListAlgoType::const_iterator itb = listAlgos_.begin(), 211 ite = listAlgos_.end(), it; 212 CGenericAlgorithmTransformation* algo = 0; 213 for (it = itb; it != ite; ++it) 214 { 215 std::map<size_t, std::set<size_t> > globaIndexMapFromDestToSource; 216 int elementPositionInGrid = it->first; 217 ETranformationType transType = (it->second).first; 218 int transformationOrder = (it->second).second; 219 220 // First of all, select an algorithm 221 selectAlgo(elementPositionInGrid, transType, transformationOrder); 222 algo = algoTransformation_.back(); 223 224 // Recalculate the distribution of grid destination 225 CDistributionClient distributionClientDest(client->clientRank, gridDestination_); 226 const CArray<size_t,1>& globalIndexGridDestSendToServer = distributionClientDest.getGlobalDataIndexSendToServer(); 227 228 // ComputeTransformation of global index of each element 229 std::vector<int> gridDestinationDimensionSize = gridDestination_->getGlobalDimension(); 230 int elementPosition = it->first; 231 algo->computeGlobalSourceIndex(elementPosition, 232 gridDestinationDimensionSize, 233 globalIndexGridDestSendToServer, 234 globaIndexMapFromDestToSource); 235 236 // Compute transformation of global indexes among grids 237 computeTransformationFromOriginalGridSource(globaIndexMapFromDestToSource); 238 239 // Now grid destination becomes grid source in a new transformation 240 setUpGrid(elementPositionInGrid, transType); 241 } 242 243 std::cout << "global index destination 0 " << *globalIndexOfCurrentGridSource_ << std::endl; 244 std::cout << "global index destination 1 " << *globalIndexOfOriginalGridSource_ << std::endl; 245 computeFinalTransformationMapping(); 246 } 247 110 248 111 249 /*! … … 116 254 void CGridTransformation::computeTransformation() 117 255 { 118 const CArray<size_t,1>& globalIndexGridDestSendToServer = gridDestination_->getDistributionClient()->getGlobalDataIndexSendToServer(); 119 std::map<int, std::vector<CGenericAlgorithmTransformation*> >::const_iterator itbMap, itMap, iteMap; 120 itbMap = algoTransformation_.begin(); 121 iteMap = algoTransformation_.end(); 122 123 std::vector<CGenericAlgorithmTransformation*>::const_iterator itbVec, itVec, iteVec; 124 125 for (itMap = itbMap; itMap != iteMap; ++itMap) 126 { 127 int elementPosition = itMap->first; 128 itbVec = (itMap->second).begin(); 129 iteVec = (itMap->second).end(); 130 for (itVec = itbVec; itVec != iteVec; ++itVec) 131 { 132 (*itVec)->computeGlobalSourceIndex(elementPosition, 133 gridDestinationDimensionSize_, 134 globalIndexGridDestSendToServer, 135 globaIndexMapFromDestToSource_); 136 } 137 } 256 // const CArray<size_t,1>& globalIndexGridDestSendToServer = gridDestination_->getDistributionClient()->getGlobalDataIndexSendToServer(); 257 // std::list<std::pair<int,CGenericAlgorithmTransformation*> >::const_iterator itbMap, itMap, iteMap; 258 // itbMap = algoTransformation_.begin(); 259 // iteMap = algoTransformation_.end(); 260 // 261 // std::vector<CGenericAlgorithmTransformation*>::const_iterator itbVec, itVec, iteVec; 262 // 263 // for (itMap = itbMap; itMap != iteMap; ++itMap) 264 // { 265 // int elementPosition = itMap->first; 266 // itbVec = (itMap->second).begin(); 267 // iteVec = (itMap->second).end(); 268 // for (itVec = itbVec; itVec != iteVec; ++itVec) 269 // { 270 // (*itVec)->computeGlobalSourceIndex(elementPosition, 271 // gridDestinationDimensionSize_, 272 // globalIndexGridDestSendToServer, 273 // globaIndexMapFromDestToSource_); 274 // } 275 // } 276 } 277 278 /*! 279 A transformation from a grid source to grid destination often passes several intermediate grids, which play a role of 280 temporary grid source and/or grid destination. This function makes sure that global index of original grid source are mapped correctly to 281 the final grid destination 282 */ 283 void CGridTransformation::computeTransformationFromOriginalGridSource(const std::map<size_t, std::set<size_t> >& globaIndexMapFromDestToSource) 284 { 285 CContext* context = CContext::getCurrent(); 286 CContextClient* client=context->client; 287 288 CTransformationMapping transformationMap(gridDestination_, gridSource_); 289 290 // Then compute transformation mapping among clients 291 transformationMap.computeTransformationMapping(globaIndexMapFromDestToSource); 292 293 const std::map<int,std::vector<std::vector<size_t> > >& globalIndexToReceive = transformationMap.getGlobalIndexReceivedOnGridDestMapping(); 294 const std::map<int,std::vector<size_t> >& globalIndexToSend = transformationMap.getGlobalIndexSendToGridDestMapping(); 295 296 // Sending global index of original grid source 297 std::map<int,std::vector<size_t> >::const_iterator itbSend = globalIndexToSend.begin(), itSend, 298 iteSend = globalIndexToSend.end(); 299 CArray<size_t,1>::const_iterator itbArr = globalIndexOfCurrentGridSource_->begin(), itArr, 300 iteArr = globalIndexOfCurrentGridSource_->end(); 301 int sendBuffSize = 0; 302 for (itSend = itbSend; itSend != iteSend; ++itSend) sendBuffSize += (itSend->second).size(); 303 304 unsigned long* sendBuff, *currentSendBuff; 305 if (0 != sendBuffSize) sendBuff = new unsigned long [sendBuffSize]; 306 int currentBuffPosition = 0; 307 for (itSend = itbSend; itSend != iteSend; ++itSend) 308 { 309 int destRank = itSend->first; 310 const std::vector<size_t>& globalIndexOfCurrentGridSourceToSend = itSend->second; 311 int countSize = globalIndexOfCurrentGridSourceToSend.size(); 312 for (int idx = 0; idx < (countSize); ++idx) 313 { 314 itArr = std::find(itbArr, iteArr, globalIndexOfCurrentGridSourceToSend[idx]); 315 if (iteArr != itArr) 316 { 317 int index = std::distance(itbArr, itArr); 318 sendBuff[idx+currentBuffPosition] = (*globalIndexOfOriginalGridSource_)(index); 319 } 320 } 321 currentSendBuff = sendBuff + currentBuffPosition; 322 MPI_Send(currentSendBuff, countSize, MPI_UNSIGNED_LONG, destRank, 14, client->intraComm); 323 currentBuffPosition += countSize; 324 } 325 326 // Receiving global index of grid source sending from current grid source 327 std::map<int,std::vector<std::vector<size_t> > >::const_iterator itbRecv = globalIndexToReceive.begin(), itRecv, 328 iteRecv = globalIndexToReceive.end(); 329 int recvBuffSize = 0; 330 for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) recvBuffSize += (itRecv->second).size(); 331 332 unsigned long* recvBuff, *currentRecvBuff; 333 if (0 != recvBuffSize) recvBuff = new unsigned long [recvBuffSize]; 334 int currentRecvBuffPosition = 0; 335 for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) 336 { 337 MPI_Status status; 338 int srcRank = itRecv->first; 339 int countSize = (itRecv->second).size(); 340 currentRecvBuff = recvBuff + currentRecvBuffPosition; 341 MPI_Recv(currentRecvBuff, countSize, MPI_UNSIGNED_LONG, srcRank, 14, client->intraComm, &status); 342 currentRecvBuffPosition += countSize; 343 } 344 345 int nbCurrentGridSource = 0; 346 for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) 347 { 348 int ssize = (itRecv->second).size(); 349 for (int idx = 0; idx < ssize; ++idx) 350 { 351 nbCurrentGridSource += (itRecv->second)[idx].size(); 352 } 353 } 354 355 globalIndexOfCurrentGridSource_->resize(nbCurrentGridSource); 356 globalIndexOfOriginalGridSource_->resize(nbCurrentGridSource); 357 int k = 0; 358 currentRecvBuff = recvBuff; 359 for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) 360 { 361 int countSize = (itRecv->second).size(); 362 for (int idx = 0; idx < countSize; ++idx, ++currentRecvBuff) 363 { 364 int ssize = (itRecv->second)[idx].size(); 365 for (int i = 0; i < ssize; ++i) 366 { 367 (*globalIndexOfCurrentGridSource_)(k) = (itRecv->second)[idx][i]; 368 (*globalIndexOfOriginalGridSource_)(k) = *currentRecvBuff; 369 ++k; 370 } 371 } 372 } 373 374 if (0 != sendBuffSize) delete [] sendBuff; 375 if (0 != recvBuffSize) delete [] recvBuff; 138 376 } 139 377 … … 143 381 of two grids. Then local index mapping between data on each grid will be found out thanks to these global indexes 144 382 */ 145 void CGridTransformation::computeTransformationMapping() 146 { 147 CTransformationMapping transformationMap(gridDestination_, gridSource_); 148 149 // First of all, need to compute global index mapping representing transformation algorithms 150 computeTransformation(); 383 void CGridTransformation::computeFinalTransformationMapping() 384 { 385 CContext* context = CContext::getCurrent(); 386 CContextClient* client=context->client; 387 388 CTransformationMapping transformationMap(gridDestination_, originalGridSource_); 389 390 std::map<size_t, std::set<size_t> > globaIndexMapFromDestToSource; 391 392 int nb = globalIndexOfCurrentGridSource_->numElements(); 393 for (int idx = 0; idx < nb; ++idx) 394 { 395 globaIndexMapFromDestToSource[(*globalIndexOfCurrentGridSource_)(idx)].insert((*globalIndexOfOriginalGridSource_)(idx)); 396 } 151 397 152 398 // Then compute transformation mapping among clients 153 transformationMap.computeTransformationMapping(globaIndexMapFromDestToSource _);399 transformationMap.computeTransformationMapping(globaIndexMapFromDestToSource); 154 400 155 401 const std::map<int,std::vector<std::vector<size_t> > >& globalIndexToReceive = transformationMap.getGlobalIndexReceivedOnGridDestMapping(); 156 402 const std::map<int,std::vector<size_t> >& globalIndexToSend = transformationMap.getGlobalIndexSendToGridDestMapping(); 157 403 158 CArray<int, 1> localIndexOnClientDest = gridDestination_->getDistributionClient()->getLocalDataIndexOnClient(); 159 CArray<size_t,1> globalIndexOnClientDest = gridDestination_->getDistributionClient()->getGlobalDataIndexSendToServer(); 160 161 CArray<int, 1> localIndexOnClientSrc = gridSource_->getDistributionClient()->getLocalDataIndexOnClient(); 162 CArray<size_t,1> globalIndexOnClientSrc = gridSource_->getDistributionClient()->getGlobalDataIndexSendToServer(); 163 404 CDistributionClient distributionClientDest(client->clientRank, gridDestination_); 405 CDistributionClient distributionClientSrc(client->clientRank, gridSource_); 406 407 CArray<int, 1> localIndexOnClientDest = distributionClientDest.getLocalDataIndexOnClient(); //gridDestination_->getDistributionClient()->getLocalDataIndexOnClient(); 408 CArray<size_t,1> globalIndexOnClientDest = distributionClientDest.getGlobalDataIndexSendToServer(); //gridDestination_->getDistributionClient()->getGlobalDataIndexSendToServer(); 409 410 std::cout << "dest: local index " << localIndexOnClientDest << std::endl; 411 std::cout << "dest: global index " << globalIndexOnClientDest << std::endl; 412 CArray<int, 1> localIndexOnClientSrc = distributionClientSrc.getLocalDataIndexOnClient(); //gridSource_->getDistributionClient()->getLocalDataIndexOnClient(); 413 CArray<size_t,1> globalIndexOnClientSrc = distributionClientSrc.getGlobalDataIndexSendToServer(); //gridSource_->getDistributionClient()->getGlobalDataIndexSendToServer(); 414 std::cout << "src: local index " << localIndexOnClientSrc << std::endl; 415 std::cout << "src: global index " << globalIndexOnClientSrc << std::endl; 164 416 std::vector<size_t>::const_iterator itbVec, itVec, iteVec; 165 417 CArray<size_t, 1>::iterator itbArr, itArr, iteArr;
Note: See TracChangeset
for help on using the changeset viewer.