Ignore:
Timestamp:
Apr 10, 2012, 1:55:49 PM (14 years ago)
Author:
Julian Iseringhausen <isering@…>
Children:
a40eea
Parents:
d24c2f
Message:

Merge recent changes of the vmg library into ScaFaCos.

Includes a fix for the communication problems on Jugene.

git-svn-id: https://svn.version.fz-juelich.de/scafacos/trunk@1666 5161e1c8-67bf-11de-9fd5-51895aff932f

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/interface/interface.cpp

    rd24c2f rac6d04  
    2323                              const int& coarseningSteps, const vmg_float& alpha)
    2424{
    25   Index size_factor_max = 1;
    26   int num_cells;
     25  int i;
     26  Index num_cells = Helper::intpow(2, levelMax);
     27  Index size_factor;
    2728
    2829  const Vector box_center = box_offset + 0.5 * box_size;
    2930
    30   for (int i=levelMax; i>=levelMin; --i) {
     31  for (i=0; i<coarseningSteps; ++i) {
    3132
    3233    global.push_back(GlobalIndices());
    3334    extent.push_back(SpatialExtent());
    3435
    35     num_cells = Helper::intpow(2, i);
     36    for (int j=0; j<3; ++j)
     37      size_factor[j] = (bc[j] == Periodic ? 1 : Helper::intpow(2, static_cast<int>(log(pow(alpha, i+1)) / log(2.0) + 1.0)));
    3638
    37     extent.back().SizeFactor() = 1;
    38     extent.back().Size() = box_size;
    39     extent.back().Begin() = box_offset;
    40     extent.back().End() = box_offset + box_size;
    41     extent.back().MeshWidth() = box_size / num_cells;
     39    extent.back().Size() = box_size * static_cast<Vector>(size_factor);
     40    extent.back().Begin() = box_center - 0.5 * extent.back().Size();
     41    extent.back().End() = extent.back().Begin() + extent.back().Size();
     42    extent.back().MeshWidth() = pow(2.0, i-levelMax);
    4243
    43     global.back().SizeGlobal() = num_cells + 1;
    44     global.back().SizeLocal() = num_cells + 1;
    45     global.back().BeginFinest() = 0;
    46     global.back().BeginLocal() = 0;
    47     global.back().EndLocal() = num_cells + 1;
     44    num_cells = Helper::intpow(2,levelMax-i) * size_factor;
    4845
    49     if (i == levelMax) {
    50       global.back().SizeFinest() = num_cells + 1;
    51       global.back().EndFinest() = num_cells + 1;
    52       global.back().BoundaryType() = GlobalMax;
     46    global.back().GlobalSize() = num_cells + 1;
     47    global.back().LocalSize() = num_cells + 1;
     48    global.back().LocalBegin() = 0;
     49    global.back().LocalEnd() = num_cells + 1;
     50
     51    global.back().FinestAbsSize() = Helper::intpow(2,i) * num_cells + 1;
     52    global.back().FinestAbsBegin() = ((global.back().FinestAbsSize()-1) * (1-size_factor)) / (2*size_factor);
     53    global.back().FinestAbsEnd() = global.back().FinestAbsBegin() + global.back().FinestAbsSize();
     54
     55    if (i==0)
     56      global.back().GlobalFinerBegin() = (num_cells - Helper::intpow(2, levelMax-i))/2;
     57    else
     58      global.back().GlobalFinerBegin() = (global.back().FinestAbsSize() - (++global.rbegin())->FinestAbsSize()) / Helper::intpow(2,i+1);
     59
     60    global.back().GlobalFinerEnd() = global.back().GlobalSize() - global.back().GlobalFinerBegin();
     61    global.back().GlobalFinerSize() = global.back().GlobalFinerEnd() - global.back().GlobalFinerBegin();
     62
     63    global.back().LocalFinerBegin() = global.back().GlobalFinerBegin();
     64    global.back().LocalFinerEnd() = global.back().GlobalFinerEnd();
     65    global.back().LocalFinerSize() = global.back().GlobalFinerSize();
     66  }
     67
     68  while (global.size() == 0 || global.back().GlobalSize().Min() > Helper::intpow(2, levelMin)+1) {
     69
     70    if (global.size() > 0)
     71      num_cells /= 2;
     72
     73    global.push_back(GlobalIndices());
     74    extent.push_back(SpatialExtent());
     75
     76    if (global.size() == 1) {
     77      extent.back().Size() = box_size;
     78      extent.back().Begin() = box_offset;
     79      extent.back().End() = box_offset + box_size;
     80      extent.back().MeshWidth() = box_size / static_cast<Vector>(num_cells);
    5381    }else {
    54       global.back().SizeFinest() = (++global.rbegin())->SizeFinest();
    55       global.back().EndFinest() = (++global.rbegin())->SizeFinest();
    56       global.back().BoundaryType() = GlobalCoarsened;
     82      extent.back().Size() = (++extent.rbegin())->Size();
     83      extent.back().Begin() = (++extent.rbegin())->Begin();
     84      extent.back().End() = (++extent.rbegin())->End();
     85      extent.back().MeshWidth() = 2.0 * (++extent.rbegin())->MeshWidth();
    5786    }
     87
     88    global.back().GlobalSize() = num_cells + 1;
     89    global.back().LocalSize() = num_cells + 1;
     90    global.back().LocalBegin() = 0;
     91    global.back().LocalEnd() = num_cells + 1;
     92
     93    if (global.size() == 1) {
     94      global.back().FinestAbsBegin() = 0;
     95      global.back().FinestAbsEnd() = global.back().GlobalSize();
     96      global.back().FinestAbsSize() = global.back().GlobalSize();
     97    }else {
     98      global.back().FinestAbsBegin() = (++global.rbegin())->FinestAbsBegin();
     99      global.back().FinestAbsEnd() = (++global.rbegin())->FinestAbsEnd();
     100      global.back().FinestAbsSize() = (++global.rbegin())->FinestAbsSize();
     101    }
     102
     103    global.back().GlobalFinerBegin() = 0;
     104    global.back().GlobalFinerEnd() = global.back().GlobalSize();
     105    global.back().GlobalFinerSize() = global.back().GlobalSize();
     106
     107    global.back().LocalFinerBegin() = global.back().GlobalFinerBegin();
     108    global.back().LocalFinerEnd() = global.back().GlobalFinerEnd();
     109    global.back().LocalFinerSize() = global.back().GlobalFinerSize();
    58110
    59111  }
    60112
    61   for (int i=0; i<3; ++i)
     113  for (i=0; i<3; ++i)
    62114    if (bc[i] == Periodic)
    63115      for (unsigned int j=0; j<global.size(); ++j) {
    64         global[j].SizeGlobal()[i] -= 1;
    65         global[j].SizeFinest()[i] -= Helper::intpow(2, j);
    66         global[j].SizeLocal()[i] -= 1;
    67         global[j].EndLocal()[i] -= 1;
    68         global[j].EndFinest()[i] -= Helper::intpow(2, j);
     116        global[j].GlobalSize()[i] -= 1;
     117        global[j].FinestAbsSize()[i] -= Helper::intpow(2, j);
     118        global[j].FinestAbsEnd()[i] -= Helper::intpow(2, j);
     119        global[j].LocalSize()[i] -= 1;
     120        global[j].LocalEnd()[i] -= 1;
     121        global[j].GlobalFinerSize()[i] -= 1;
     122        global[j].GlobalFinerEnd()[i] -= 1;
     123        global[j].LocalFinerSize()[i] -= 1;
     124        global[j].LocalFinerEnd()[i] -= 1;
    69125      }
    70126
    71127  levelMin = levelMax - global.size() + 1;
     128
     129  global.back().BoundaryType() = GlobalCoarsened;
     130
     131  for (i=global.size()-2; i>=0; --i) {
     132    if (global[i].FinestAbsSize().Product() >= global[i+1].FinestAbsSize().Product()) {
     133      global[i].BoundaryType() = GlobalCoarsened;
     134    }else {
     135      global[i].BoundaryType() = LocallyRefined;
     136      global[i+1].BoundaryType() = GlobalMax;
     137      break;
     138    }
     139  }
     140
     141  for (; i>=0; --i)
     142    global[i].BoundaryType() = LocallyRefined;
     143
     144  if (global.front().BoundaryType() != LocallyRefined &&
     145      global.front().BoundaryType() != GlobalMax)
     146    global.front().BoundaryType() = GlobalMax;
     147
    72148}
Note: See TracChangeset for help on using the changeset viewer.