Ignore:
Timestamp:
06/15/17 16:17:01 (7 years ago)
Author:
mhnguyen
Message:

Non-continuous zoom on axis
Zoomed points are defined by array index of zoom_axis

+) Update axis with new type of zoom

Test
+) On Curie
+) Work
+) Update test_complete with this new zoom.

File:
1 edited

Legend:

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

    r930 r1169  
    3434} 
    3535 
     36CDistributionServer::CDistributionServer(int rank,  
     37                                        const std::vector<CArray<int,1> >& globalIndexElements, 
     38                                        const CArray<int,1>& elementOrder, 
     39                                        const std::vector<int>& nZoomBeginServer, 
     40                                        const std::vector<int>& nZoomSizeServer, 
     41                                        const std::vector<int>& nZoomBeginGlobal, 
     42                                        const std::vector<int>& nGlobal) 
     43  : CDistribution(rank, nGlobal.size()), nGlobal_(nGlobal), nZoomBeginGlobal_(nZoomBeginGlobal), 
     44    nZoomSize_(nZoomSizeServer), nZoomBegin_(nZoomBeginServer), globalLocalIndexMap_() 
     45{ 
     46  createGlobalIndex(globalIndexElements, elementOrder); 
     47} 
     48 
    3649CDistributionServer::~CDistributionServer() 
    3750{ 
     
    89102 
    90103/*! 
     104  Create global index on server side 
     105  Like the similar function on client side, this function serves on creating global index 
     106for data written by the server. The global index is used to calculating local index of data 
     107written on each server 
     108  \param[in] globalIndexElement global index on server side of each element of grid (scalar, axis, domain) 
     109  \param[in] elementOrder the order of elements of grid (e.x: domain->axis or domain->scalar) 
     110*/ 
     111void CDistributionServer::createGlobalIndex(const std::vector<CArray<int,1> >& globalIndexElements, 
     112                                            const CArray<int,1>& elementOrder) 
     113{ 
     114  int numElement = elementOrder.numElements(), elementIdx = 0;   
     115  std::vector<int> indexMap(numElement); 
     116  for (int i = 0; i < numElement; ++i) 
     117  { 
     118    indexMap[i] = elementIdx; 
     119    if (2 == elementOrder(i)) 
     120    {       
     121      elementIdx += 2; 
     122    } 
     123    else 
     124      ++elementIdx; 
     125  } 
     126 
     127  std::vector<size_t> elementGlobalSize(numElement); 
     128  size_t globalSize = 1; 
     129  for (int i = 0; i < numElement; ++i) 
     130  { 
     131    int elementType = elementOrder(i); 
     132    elementGlobalSize[i] = globalSize; 
     133    if (2 == elementType) // domain 
     134    { 
     135      globalSize *= nGlobal_[indexMap[i]+1] * nGlobal_[indexMap[i]]; 
     136    } 
     137    else // axis or scalar 
     138    { 
     139      globalSize *= nGlobal_[indexMap[i]]; 
     140    } 
     141  }  
     142 
     143  size_t ssize = 1; 
     144  for (int i = 0; i < globalIndexElements.size(); ++i) ssize *= globalIndexElements[i].numElements(); 
     145  this->globalIndex_.resize(ssize); 
     146  globalLocalIndexMap_.rehash(std::ceil(ssize/globalLocalIndexMap_.max_load_factor())); 
     147 
     148  std::vector<int> idxLoop(numElement,0); 
     149  std::vector<int> currentIndex(numElement); 
     150  int innerLoopSize = globalIndexElements[0].numElements(); 
     151 
     152  size_t idx = 0; 
     153  while (idx<ssize) 
     154  { 
     155    for (int i = 0; i < numElement-1; ++i) 
     156    { 
     157      if (idxLoop[i] == globalIndexElements[i].numElements()) 
     158      { 
     159        idxLoop[i] = 0; 
     160        ++idxLoop[i+1]; 
     161      } 
     162    } 
     163 
     164    for (int i = 1; i < numElement; ++i)  currentIndex[i] = globalIndexElements[i](idxLoop[i]); 
     165 
     166    size_t mulDim, globalIndex; 
     167    for (int i = 0; i < innerLoopSize; ++i) 
     168    {       
     169      globalIndex = 0; 
     170      currentIndex[0] = globalIndexElements[0](i); 
     171 
     172      for (int k = 0; k < numElement; ++k) 
     173      {      
     174        globalIndex += (currentIndex[k])*elementGlobalSize[k]; 
     175      } 
     176      globalLocalIndexMap_[globalIndex] = idx; 
     177      this->globalIndex_(idx) = globalIndex; 
     178      ++idx; 
     179    } 
     180    idxLoop[0] += innerLoopSize; 
     181  } 
     182} 
     183 
     184/*! 
    91185  Compute local index for writing data on server 
    92186  \param [in] globalIndex global index received from client 
Note: See TracChangeset for help on using the changeset viewer.