Ignore:
Timestamp:
07/10/17 15:16:17 (7 years ago)
Author:
mhnguyen
Message:

Porting non-continuous axis zoom to dev branch

+) Port axis zoom
+) Resolve some merge conflicts
+) Revert some codes

Test
+) On Curie
+) Ok

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_olga/src/distribution_server.cpp

    r1144 r1202  
    2222} 
    2323 
     24CDistributionServer::CDistributionServer(int rank,  
     25                                        const std::vector<CArray<int,1> >& globalIndexElements, 
     26                                        const CArray<int,1>& elementOrder, 
     27                                        const std::vector<int>& nZoomBegin, 
     28                                        const std::vector<int>& nZoomSize, 
     29                                        const std::vector<int>& nZoomBeginGlobal, 
     30                                        const std::vector<int>& nGlobal) 
     31  : CDistribution(rank, nGlobal.size()), nGlobal_(nGlobal), nZoomBeginGlobal_(nZoomBeginGlobal), 
     32    nZoomSize_(nZoomSize), nZoomBegin_(nZoomBegin), globalLocalIndexMap_() 
     33{ 
     34  createGlobalIndex(globalIndexElements, elementOrder); 
     35} 
     36 
    2437CDistributionServer::~CDistributionServer() 
    2538{ 
     
    7083      this->globalIndex_(idx) = globalIndex; 
    7184 
     85      ++idx; 
     86    } 
     87    idxLoop[0] += innerLoopSize; 
     88  } 
     89} 
     90 
     91/*! 
     92  Create global index on server side 
     93  Like the similar function on client side, this function serves on creating global index 
     94for data written by the server. The global index is used to calculating local index of data 
     95written on each server 
     96  \param[in] globalIndexElement global index on server side of each element of grid (scalar, axis, domain) 
     97  \param[in] elementOrder the order of elements of grid (e.x: domain->axis or domain->scalar) 
     98*/ 
     99void CDistributionServer::createGlobalIndex(const std::vector<CArray<int,1> >& globalIndexElements, 
     100                                            const CArray<int,1>& elementOrder) 
     101{ 
     102  int numElement = elementOrder.numElements(), elementIdx = 0;   
     103  std::vector<int> indexMap(numElement); 
     104  for (int i = 0; i < numElement; ++i) 
     105  { 
     106    indexMap[i] = elementIdx; 
     107    if (2 == elementOrder(i)) 
     108    {       
     109      elementIdx += 2; 
     110    } 
     111    else 
     112      ++elementIdx; 
     113  } 
     114 
     115  std::vector<size_t> elementGlobalSize(numElement); 
     116  size_t globalSize = 1; 
     117  for (int i = 0; i < numElement; ++i) 
     118  { 
     119    int elementType = elementOrder(i); 
     120    elementGlobalSize[i] = globalSize; 
     121    if (2 == elementType) // domain 
     122    { 
     123      globalSize *= nGlobal_[indexMap[i]+1] * nGlobal_[indexMap[i]]; 
     124    } 
     125    else // axis or scalar 
     126    { 
     127      globalSize *= nGlobal_[indexMap[i]]; 
     128    } 
     129  }  
     130 
     131  size_t ssize = 1; 
     132  for (int i = 0; i < globalIndexElements.size(); ++i) ssize *= globalIndexElements[i].numElements(); 
     133  this->globalIndex_.resize(ssize); 
     134  globalLocalIndexMap_.rehash(std::ceil(ssize/globalLocalIndexMap_.max_load_factor())); 
     135 
     136  std::vector<int> idxLoop(numElement,0); 
     137  std::vector<int> currentIndex(numElement); 
     138  int innerLoopSize = globalIndexElements[0].numElements(); 
     139 
     140  size_t idx = 0; 
     141  while (idx<ssize) 
     142  { 
     143    for (int i = 0; i < numElement-1; ++i) 
     144    { 
     145      if (idxLoop[i] == globalIndexElements[i].numElements()) 
     146      { 
     147        idxLoop[i] = 0; 
     148        ++idxLoop[i+1]; 
     149      } 
     150    } 
     151 
     152    for (int i = 1; i < numElement; ++i)  currentIndex[i] = globalIndexElements[i](idxLoop[i]); 
     153 
     154    size_t mulDim, globalIndex; 
     155    for (int i = 0; i < innerLoopSize; ++i) 
     156    {       
     157      globalIndex = 0; 
     158      currentIndex[0] = globalIndexElements[0](i); 
     159 
     160      for (int k = 0; k < numElement; ++k) 
     161      {      
     162        globalIndex += (currentIndex[k])*elementGlobalSize[k]; 
     163      } 
     164      globalLocalIndexMap_[globalIndex] = idx; 
     165      this->globalIndex_(idx) = globalIndex; 
    72166      ++idx; 
    73167    } 
Note: See TracChangeset for help on using the changeset viewer.