Ignore:
Timestamp:
03/23/16 16:10:45 (8 years ago)
Author:
mhnguyen
Message:

Implementing dynamic interpolation on axis

+) Change grid transformation to make it more flexible
+) Make some small improvements

Test
+) On Curie
+) All test pass

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/transformation/axis_algorithm_transformation.cpp

    r668 r827  
    2929} 
    3030 
    31 void CAxisAlgorithmTransformation::computeIndexSourceMapping() 
     31void CAxisAlgorithmTransformation::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs) 
    3232{ 
    3333} 
     
    4545void CAxisAlgorithmTransformation::computeGlobalGridIndexFromGlobalIndexElement(int axisDestGlobalIndex, 
    4646                                                                          const std::vector<int>& axisSrcGlobalIndex, 
     47                                                                          const std::vector<int>& destGlobalIndexPositionInGrid, 
    4748                                                                          int axisPositionInGrid, 
    4849                                                                          const std::vector<int>& gridDestGlobalDim, 
     
    5253                                                                          std::vector<std::vector<size_t> >& globalIndexSrcGrid) 
    5354{ 
     55  bool hasDestGlobalIndexPos = !destGlobalIndexPositionInGrid.empty(); 
    5456  int globalDim = gridDestGlobalDim.size(); 
    5557 
     
    6264  { 
    6365    if (axisPositionInGrid == i) gridAxisGlobalDim[i] = 1; 
    64     else gridAxisGlobalDim[i] = gridDestGlobalDim[i]; 
     66    else 
     67    { 
     68      if (!hasDestGlobalIndexPos) gridAxisGlobalDim[i] = gridDestGlobalDim[i]; 
     69      else gridAxisGlobalDim[i] = 1; 
     70    } 
    6571    ssize *= gridAxisGlobalDim[i]; 
    6672  } 
     
    8086    } 
    8187 
    82     for (int i = 0; i < globalDim; ++i) currentIndex[i] = idxLoop[i]; 
     88    int j = 0; 
     89    for (int i = 0; i < globalDim; ++i) 
     90    { 
     91      if (!hasDestGlobalIndexPos) currentIndex[i] = idxLoop[i]; 
     92      else 
     93      { 
     94        if (axisPositionInGrid == i) currentIndex[i] = axisDestGlobalIndex; 
     95        else 
     96        { 
     97          currentIndex[i] = destGlobalIndexPositionInGrid[j]; 
     98          ++j; 
     99        } 
     100      } 
     101    } 
     102 
    83103    currentIndex[axisPositionInGrid] = axisDestGlobalIndex; 
    84104 
     
    118138    } 
    119139 
    120     for (int i = 0; i < globalDim; ++i) currentIndex[i] = idxLoop[i]; 
     140    int j = 0; 
     141    for (int i = 0; i < globalDim; ++i) 
     142    { 
     143      if (!hasDestGlobalIndexPos) currentIndex[i] = idxLoop[i]; 
     144      else 
     145      { 
     146        if (axisPositionInGrid == i) currentIndex[i] = axisDestGlobalIndex; 
     147        else 
     148        { 
     149          currentIndex[i] = destGlobalIndexPositionInGrid[j]; 
     150          ++j; 
     151        } 
     152      } 
     153    } 
    121154    currentIndex[axisPositionInGrid] = axisDestGlobalIndex; 
    122155 
     
    150183    ++idx; 
    151184  } 
    152 } 
    153 } 
     185 
     186 
     187 
     188//  int globalDim = gridDestGlobalDim.size(); 
     189// 
     190//  std::vector<size_t> currentIndex(globalDim); 
     191//  std::vector<int> gridAxisGlobalDim(globalDim); 
     192//  std::vector<int> idxLoop(globalDim, 0); 
     193// 
     194//  size_t ssize = 1, idx = 0, realGlobalIndexSize = 0; 
     195//  for (int i = 0; i< globalDim; ++i) 
     196//  { 
     197//    if (axisPositionInGrid == i) gridAxisGlobalDim[i] = 1; 
     198//    else gridAxisGlobalDim[i] = gridDestGlobalDim[i]; 
     199//    ssize *= gridAxisGlobalDim[i]; 
     200//  } 
     201// 
     202//  std::vector<size_t>::const_iterator itbArr = globalIndexGridDestSendToServer.begin(), itArr, 
     203//                                      iteArr = globalIndexGridDestSendToServer.end(); 
     204// 
     205//  while (idx < ssize) 
     206//  { 
     207//    for (int i = 0; i < globalDim-1; ++i) 
     208//    { 
     209//      if (idxLoop[i] == gridAxisGlobalDim[i]) 
     210//      { 
     211//        idxLoop[i] = 0; 
     212//        ++idxLoop[i+1]; 
     213//      } 
     214//    } 
     215// 
     216//    for (int i = 0; i < globalDim; ++i) currentIndex[i] = idxLoop[i]; 
     217//    currentIndex[axisPositionInGrid] = axisDestGlobalIndex; 
     218// 
     219//    size_t globIndex = currentIndex[0]; 
     220//    size_t mulDim = 1; 
     221//    for (int k = 1; k < globalDim; ++k) 
     222//    { 
     223//      mulDim *= gridDestGlobalDim[k-1]; 
     224//      globIndex += (currentIndex[k])*mulDim; 
     225//    } 
     226// 
     227//    if (std::binary_search(itbArr, iteArr, globIndex)) ++realGlobalIndexSize; 
     228//    ++idxLoop[0]; 
     229//    ++idx; 
     230//  } 
     231// 
     232//  if (globalIndexDestGrid.numElements() != realGlobalIndexSize) 
     233//    globalIndexDestGrid.resize(realGlobalIndexSize); 
     234// 
     235//  if (realGlobalIndexSize != globalIndexSrcGrid.size()) globalIndexSrcGrid.resize(realGlobalIndexSize); 
     236//  for (int i = 0; i < globalIndexSrcGrid.size(); ++i) 
     237//    if (globalIndexSrcGrid[i].size() != axisSrcGlobalIndex.size()) 
     238//      globalIndexSrcGrid[i].resize(axisSrcGlobalIndex.size()); 
     239// 
     240//  size_t realGlobalIndex = 0; 
     241//  idx = 0; 
     242//  idxLoop.assign(globalDim, 0); 
     243//  while (idx < ssize) 
     244//  { 
     245//    for (int i = 0; i < globalDim-1; ++i) 
     246//    { 
     247//      if (idxLoop[i] == gridAxisGlobalDim[i]) 
     248//      { 
     249//        idxLoop[i] = 0; 
     250//        ++idxLoop[i+1]; 
     251//      } 
     252//    } 
     253// 
     254//    for (int i = 0; i < globalDim; ++i) currentIndex[i] = idxLoop[i]; 
     255//    currentIndex[axisPositionInGrid] = axisDestGlobalIndex; 
     256// 
     257//    size_t globIndex = currentIndex[0]; 
     258//    size_t mulDim = 1; 
     259//    for (int k = 1; k < globalDim; ++k) 
     260//    { 
     261//      mulDim *= gridDestGlobalDim[k-1]; 
     262//      globIndex += (currentIndex[k])*mulDim; 
     263//    } 
     264// 
     265//    if (std::binary_search(itbArr, iteArr, globIndex)) 
     266//    { 
     267//      globalIndexDestGrid(realGlobalIndex) = globIndex; 
     268//      for (int i = 0; i < globalIndexSrcGrid[realGlobalIndex].size(); ++i) 
     269//      { 
     270//        currentIndex[axisPositionInGrid] = axisSrcGlobalIndex[i]; 
     271//        globIndex = currentIndex[0]; 
     272//        mulDim = 1; 
     273//        for (int k = 1; k < globalDim; ++k) 
     274//        { 
     275//          mulDim *= gridDestGlobalDim[k-1]; 
     276//          globIndex += (currentIndex[k])*mulDim; 
     277//        } 
     278//        (globalIndexSrcGrid[realGlobalIndex])[i] = globIndex; 
     279//      } 
     280//      ++realGlobalIndex; 
     281//    } 
     282// 
     283//    ++idxLoop[0]; 
     284//    ++idx; 
     285//  } 
     286} 
     287} 
Note: See TracChangeset for help on using the changeset viewer.