Ignore:
Timestamp:
08/24/15 14:53:36 (9 years ago)
Author:
mhnguyen
Message:

Implementing some code factoring

+) Replace some slow searching function by faster ones

Test
+) On Curie
+) test_client and test_complete are correct

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/distribution_server.cpp

    r653 r668  
    88 */ 
    99#include "distribution_server.hpp" 
     10#include "utils.hpp" 
    1011 
    1112namespace xios { 
     
    9192CArray<size_t,1> CDistributionServer::computeLocalIndex(const CArray<size_t,1>& globalIndex) 
    9293{ 
    93   CArray<size_t,1>::const_iterator itBegin = this->globalIndex_.begin(), 
    94                                    itEnd   = this->globalIndex_.end(), it; 
     94  int ssize = globalIndex.numElements(); 
     95  int nbGlobalIndex = this->globalIndex_.numElements(); 
    9596 
    96   int ssize = globalIndex.numElements(), idx = 0; 
     97  std::vector<int>::iterator it; 
     98  std::vector<int> permutIndex(nbGlobalIndex); 
     99  XIOSAlgorithms::fillInIndex(nbGlobalIndex, permutIndex); 
     100  XIOSAlgorithms::sortWithIndex<size_t, CArrayStorage>(this->globalIndex_, permutIndex); 
     101  typedef XIOSBinarySearchWithIndex<size_t, CArrayStorage> BinarySearch; 
     102  BinarySearch binarySearch(this->globalIndex_); 
     103 
    97104  CArray<size_t,1> localIndex(ssize); 
    98   it = itBegin; 
     105  int idx = 0; 
    99106  for (int i = 0; i < ssize; ++i) 
    100107  { 
    101     it = std::find(itBegin, itEnd, globalIndex(i)); 
    102 //    it = std::lower_bound(it, itEnd, globalIndex(i)); 
    103     if (itEnd != it) 
     108    if (binarySearch.search(permutIndex.begin(), permutIndex.end(), globalIndex(i), it)) 
    104109    { 
    105       localIndex(idx) = std::distance(itBegin, it); 
     110      localIndex(idx) = *it; 
    106111      ++idx; 
    107112    } 
     
    117122void CDistributionServer::computeLocalIndex(CArray<size_t,1>& globalIndex) 
    118123{ 
    119   CArray<size_t,1>::const_iterator itBegin = this->globalIndex_.begin(), 
    120                                    itEnd   = this->globalIndex_.end(), it; 
     124  int ssize = globalIndex.numElements(); 
     125  int nbGlobalIndex = this->globalIndex_.numElements(); 
    121126 
    122   int ssize = globalIndex.numElements(), idx = 0; 
     127  std::vector<int>::iterator it; 
     128  std::vector<int> permutIndex(nbGlobalIndex); 
     129  XIOSAlgorithms::fillInIndex(nbGlobalIndex, permutIndex); 
     130  XIOSAlgorithms::sortWithIndex<size_t, CArrayStorage>(this->globalIndex_, permutIndex); 
     131  typedef XIOSBinarySearchWithIndex<size_t, CArrayStorage> BinarySearch; 
     132  BinarySearch binarySearch(this->globalIndex_); 
     133 
    123134  CArray<size_t,1> localIndex(ssize); 
    124   it = itBegin; 
     135  int idx = 0; 
    125136  for (int i = 0; i < ssize; ++i) 
    126137  { 
    127     it = std::find(itBegin, itEnd, globalIndex(i)); 
    128 //    it = std::lower_bound(it, itEnd, globalIndex(i)); 
    129     if (itEnd != it) 
     138    if (binarySearch.search(permutIndex.begin(), permutIndex.end(), globalIndex(i), it)) 
    130139    { 
    131       localIndex(idx) = std::distance(itBegin, it); 
     140      localIndex(idx) = *it; 
    132141      ++idx; 
    133142    } 
Note: See TracChangeset for help on using the changeset viewer.