Changeset 668 for XIOS/trunk/src/transformation/grid_transformation.cpp
- Timestamp:
- 08/24/15 14:53:36 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/transformation/grid_transformation.cpp
r660 r668 22 22 CGridTransformation::CGridTransformation(CGrid* destination, CGrid* source) 23 23 : gridSource_(source), gridDestination_(destination), originalGridSource_(source), 24 globalIndexOfCurrentGridSource_( 0), globalIndexOfOriginalGridSource_(0), weightOfGlobalIndexOfOriginalGridSource_(0), algoTypes_()24 globalIndexOfCurrentGridSource_(), globalIndexOfOriginalGridSource_(), weightOfGlobalIndexOfOriginalGridSource_(0), algoTypes_() 25 25 { 26 26 //Verify the compatibity between two grids … … 77 77 78 78 CDistributionClient distribution(client->clientRank, originalGridSource_); 79 const CArray<size_t,1>& globalIndexGridDestSendToServer = distribution.getGlobalDataIndexSendToServer(); 80 81 globalIndexOfCurrentGridSource_.resize(globalIndexGridDestSendToServer.numElements()); 82 globalIndexOfOriginalGridSource_.resize(globalIndexGridDestSendToServer.numElements()); 83 weightOfGlobalIndexOfOriginalGridSource_.resize(globalIndexGridDestSendToServer.numElements()); 79 const std::vector<size_t>& globalIndexGridDestSendToServer = distribution.getGlobalDataIndexSendToServer(); 80 81 weightOfGlobalIndexOfOriginalGridSource_.resize(globalIndexGridDestSendToServer.size()); 84 82 globalIndexOfCurrentGridSource_ = globalIndexGridDestSendToServer; 85 83 globalIndexOfOriginalGridSource_ = globalIndexGridDestSendToServer; … … 362 360 // Recalculate the distribution of grid destination 363 361 CDistributionClient distributionClientDest(client->clientRank, gridDestination_); 364 const CArray<size_t,1>& globalIndexGridDestSendToServer = distributionClientDest.getGlobalDataIndexSendToServer();362 const std::vector<size_t>& globalIndexGridDestSendToServer = distributionClientDest.getGlobalDataIndexSendToServer(); 365 363 366 364 // ComputeTransformation of global index of each element … … 397 395 //First of all, retrieve info of local mask of grid destination 398 396 CDistributionClient distributionClientDest(client->clientRank, gridDestination_); 399 const CArray<int, 1>& localMaskIndexOnClientDest = distributionClientDest.getLocalMaskIndexOnClient();400 const CArray<size_t,1>& globalIndexOnClientDest = distributionClientDest.getGlobalDataIndexSendToServer();401 402 CArray<size_t, 1>::const_iterator itbArr, itArr, iteArr;397 const std::vector<int>& localMaskIndexOnClientDest = distributionClientDest.getLocalMaskIndexOnClient(); 398 const std::vector<size_t>& globalIndexOnClientDest = distributionClientDest.getGlobalDataIndexSendToServer(); 399 400 std::vector<size_t>::const_iterator itbArr, itArr, iteArr; 403 401 itbArr = globalIndexOnClientDest.begin(); 404 402 iteArr = globalIndexOnClientDest.end(); 405 403 406 404 // Then find out which index became invalid (become masked after being applied the algorithms, or demande some masked points from grid source) 407 int num = globalIndexOfOriginalGridSource_. numElements();405 int num = globalIndexOfOriginalGridSource_.size(); 408 406 const size_t sfmax = NumTraits<unsigned long>::sfmax(); 409 407 int maskIndexNum = 0; 410 408 for (int idx = 0; idx < num; ++idx) 411 409 { 412 if (sfmax == globalIndexOfOriginalGridSource_ (idx))413 { 414 size_t maskedGlobalIndex = globalIndexOfCurrentGridSource_ (idx);410 if (sfmax == globalIndexOfOriginalGridSource_[idx]) 411 { 412 size_t maskedGlobalIndex = globalIndexOfCurrentGridSource_[idx]; 415 413 itArr = std::find(itbArr, iteArr, maskedGlobalIndex); 416 414 if (iteArr != itArr) ++maskIndexNum; … … 422 420 for (int idx = 0; idx < num; ++idx) 423 421 { 424 if (sfmax == globalIndexOfOriginalGridSource_ (idx))425 { 426 size_t maskedGlobalIndex = globalIndexOfCurrentGridSource_ (idx);422 if (sfmax == globalIndexOfOriginalGridSource_[idx]) 423 { 424 size_t maskedGlobalIndex = globalIndexOfCurrentGridSource_[idx]; 427 425 itArr = std::find(itbArr, iteArr, maskedGlobalIndex); 428 426 if (iteArr != itArr) 429 427 { 430 428 int localIdx = std::distance(itbArr, itArr); 431 maskIndexToModify(maskIndexNum) = localMaskIndexOnClientDest (localIdx);429 maskIndexToModify(maskIndexNum) = localMaskIndexOnClientDest[localIdx]; 432 430 ++maskIndexNum; 433 431 } … … 459 457 std::map<int,std::vector<size_t> >::const_iterator itbSend = globalIndexToSend.begin(), itSend, 460 458 iteSend = globalIndexToSend.end(); 461 CArray<size_t,1>::const_iterator itbArr = globalIndexOfCurrentGridSource_.begin(), itArr,462 iteArr = globalIndexOfCurrentGridSource_.end();459 std::vector<size_t>::const_iterator itbArr = globalIndexOfCurrentGridSource_.begin(), itArr, 460 iteArr = globalIndexOfCurrentGridSource_.end(); 463 461 int sendBuffSize = 0; 464 462 for (itSend = itbSend; itSend != iteSend; ++itSend) sendBuffSize += (itSend->second).size(); … … 471 469 std::map<int, MPI_Request> requests; 472 470 471 std::vector<int> permutIndex(globalIndexOfCurrentGridSource_.size()); 472 typedef XIOSBinarySearchWithIndex<size_t> BinarySearch; 473 XIOSAlgorithms::fillInIndex(globalIndexOfCurrentGridSource_.size(), permutIndex); 474 XIOSAlgorithms::sortWithIndex<size_t>(globalIndexOfCurrentGridSource_, permutIndex); 475 BinarySearch searchCurrentSrc(globalIndexOfCurrentGridSource_); 476 std::vector<int>::iterator itbIndex = permutIndex.begin(), itIndex, 477 iteIndex = permutIndex.end(); 478 479 // Find out local index on grid destination (received) 473 480 int currentBuffPosition = 0; 474 481 for (itSend = itbSend; itSend != iteSend; ++itSend) … … 479 486 for (int idx = 0; idx < (countSize); ++idx) 480 487 { 481 itArr = std::find(itbArr, iteArr, globalIndexOfCurrentGridSourceToSend[idx]); 482 if (iteArr != itArr) 488 if (searchCurrentSrc.search(itbIndex, iteIndex, globalIndexOfCurrentGridSourceToSend[idx], itIndex)) 483 489 { 484 int index = std::distance(itbArr, itArr);485 sendBuff[idx+currentBuffPosition] = globalIndexOfOriginalGridSource_ (index);490 // int index = std::distance(itbArr, itArr); 491 sendBuff[idx+currentBuffPosition] = globalIndexOfOriginalGridSource_[*itIndex]; //[index]; 486 492 } 487 493 } … … 522 528 } 523 529 524 if (globalIndexOfCurrentGridSource_. numElements() != nbCurrentGridSource)530 if (globalIndexOfCurrentGridSource_.size() != nbCurrentGridSource) 525 531 { 526 532 globalIndexOfCurrentGridSource_.resize(nbCurrentGridSource); … … 539 545 for (int i = 0; i < ssize; ++i) 540 546 { 541 globalIndexOfCurrentGridSource_ (k)= ((itRecv->second)[idx][i]).first;547 globalIndexOfCurrentGridSource_[k] = ((itRecv->second)[idx][i]).first; 542 548 weightOfGlobalIndexOfOriginalGridSource_(k) = ((itRecv->second)[idx][i]).second; 543 globalIndexOfOriginalGridSource_ (k)= *currentRecvBuff;549 globalIndexOfOriginalGridSource_[k] = *currentRecvBuff; 544 550 ++k; 545 551 } … … 568 574 569 575 std::map<size_t, std::vector<std::pair<size_t,double> > > globaIndexWeightFromDestToSource; 570 int nb = globalIndexOfCurrentGridSource_. numElements();576 int nb = globalIndexOfCurrentGridSource_.size(); 571 577 const size_t sfmax = NumTraits<unsigned long>::sfmax(); 572 578 for (int idx = 0; idx < nb; ++idx) 573 579 { 574 if (sfmax != globalIndexOfOriginalGridSource_ (idx))575 globaIndexWeightFromDestToSource[globalIndexOfCurrentGridSource_ (idx)].push_back(make_pair(globalIndexOfOriginalGridSource_(idx), weightOfGlobalIndexOfOriginalGridSource_(idx))) ;580 if (sfmax != globalIndexOfOriginalGridSource_[idx]) 581 globaIndexWeightFromDestToSource[globalIndexOfCurrentGridSource_[idx]].push_back(make_pair(globalIndexOfOriginalGridSource_[idx], weightOfGlobalIndexOfOriginalGridSource_(idx))) ; 576 582 } 577 583 … … 585 591 CDistributionClient distributionClientSrc(client->clientRank, originalGridSource_); 586 592 587 const CArray<int, 1>& localIndexOnClientDest = distributionClientDest.getLocalDataIndexSendToServer(); 588 const CArray<size_t,1>& globalIndexOnClientDest = distributionClientDest.getGlobalDataIndexSendToServer(); 589 590 const CArray<int, 1>& localIndexOnClientSrc = distributionClientSrc.getLocalDataIndexOnClient(); 591 const CArray<size_t,1>& globalIndexOnClientSrc = distributionClientSrc.getGlobalDataIndexSendToServer(); 592 593 std::vector<size_t>::const_iterator itbVec, itVec, iteVec; 594 CArray<size_t, 1>::const_iterator itbArr, itArr, iteArr; 595 593 const std::vector<size_t>& globalIndexOnClientDest = distributionClientDest.getGlobalDataIndexSendToServer(); 594 const std::vector<size_t>& globalIndexOnClientSrc = distributionClientSrc.getGlobalDataIndexSendToServer(); 595 596 std::vector<size_t>::const_iterator itbArr, itArr, iteArr; 597 std::vector<int>::const_iterator itIndex, itbIndex, iteIndex; 596 598 std::map<int,std::vector<std::vector<std::pair<size_t,double> > > >::const_iterator itbMapRecv, itMapRecv, iteMapRecv; 597 599 600 std::vector<int> permutIndex; 601 typedef XIOSBinarySearchWithIndex<size_t> BinarySearch; 602 598 603 // Find out local index on grid destination (received) 604 XIOSAlgorithms::fillInIndex(globalIndexOnClientDest.size(), permutIndex); 605 XIOSAlgorithms::sortWithIndex<size_t>(globalIndexOnClientDest, permutIndex); 606 itbIndex = permutIndex.begin(); 607 iteIndex = permutIndex.end(); 608 BinarySearch searchClientDest(globalIndexOnClientDest); 599 609 itbMapRecv = globalIndexToReceive.begin(); 600 610 iteMapRecv = globalIndexToReceive.end(); 601 itbArr = globalIndexOnClientDest.begin();602 iteArr = globalIndexOnClientDest.end();603 611 for (itMapRecv = itbMapRecv; itMapRecv != iteMapRecv; ++itMapRecv) 604 612 { … … 613 621 size_t globalIndex = (itMapRecv->second)[i][idx].first; 614 622 double weight = (itMapRecv->second)[i][idx].second; 615 itArr = std::find(itbArr, iteArr, globalIndex); 616 if (iteArr != itArr) 623 if (searchClientDest.search(itbIndex, iteIndex, globalIndex, itIndex)) 617 624 { 618 int localIdx = std::distance(itbArr, itArr); 619 tmpVec.push_back(make_pair(localIdx, weight)); 625 tmpVec.push_back(make_pair(*itIndex, weight)); 620 626 } 621 627 } … … 626 632 // Find out local index on grid source (to send) 627 633 std::map<int,std::vector<size_t> >::const_iterator itbMap, itMap, iteMap; 634 XIOSAlgorithms::fillInIndex(globalIndexOnClientSrc.size(), permutIndex); 635 XIOSAlgorithms::sortWithIndex<size_t>(globalIndexOnClientSrc, permutIndex); 636 itbIndex = permutIndex.begin(); 637 iteIndex = permutIndex.end(); 638 BinarySearch searchClientSrc(globalIndexOnClientSrc); 628 639 itbMap = globalIndexToSend.begin(); 629 640 iteMap = globalIndexToSend.end(); 630 itbArr = globalIndexOnClientSrc.begin();631 iteArr = globalIndexOnClientSrc.end();632 641 for (itMap = itbMap; itMap != iteMap; ++itMap) 633 642 { … … 637 646 for (int idx = 0; idx < vecSize; ++idx) 638 647 { 639 itArr = std::find(itbArr, iteArr, itMap->second[idx]); 640 if (iteArr != itArr) 648 if (searchClientSrc.search(itbIndex, iteIndex, itMap->second[idx], itIndex)) 641 649 { 642 int localIdx = std::distance(itbArr, itArr); 643 localIndexToSendFromGridSource_[destRank](idx) = localIdx; 650 localIndexToSendFromGridSource_[destRank](idx) = *itIndex; 644 651 } 645 652 }
Note: See TracChangeset
for help on using the changeset viewer.