Ignore:
Timestamp:
Nov 22, 2011, 9:22:10 PM (14 years ago)
Author:
Julian Iseringhausen <isering@…>
Children:
facba0
Parents:
66f24d
Message:

Major vmg update.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/grid/multigrid.cpp

    r66f24d rdfed1c  
    1212#endif
    1313
     14#include <iostream>
     15
    1416#include "base/helper.hpp"
    1517#include "base/index.hpp"
    1618#include "comm/comm.hpp"
     19#include "comm/domain_decomposition.hpp"
    1720#include "grid/grid.hpp"
    18 #include "grid/grid_indexing.hpp"
     21#include "grid/grid_properties.hpp"
    1922#include "grid/multigrid.hpp"
    2023#include "interface/interface.hpp"
     
    2427Multigrid::Multigrid(Comm* comm, const Interface* interface)
    2528{
    26   bool active;
    2729  Index points, remainder;
    28   Index procs_l;
    2930  LocalIndices local_l;
    30   GlobalIndices global_l;
    31 
    32   const Index& pos = comm->Pos();
    33   const Index& procs = comm->Procs();
    34   const Index points_min = 5 * procs;
     31  std::vector<GlobalIndices> global_separated;
     32
    3533  const std::vector<GlobalIndices>& global = interface->Global();
    3634  const std::vector<SpatialExtent>& extent = interface->Extent();
    3735
     36  comm->GetDomainDecomposition().Compute(comm, interface, global_separated);
     37
    3838  for (unsigned int i=0; i<global.size(); ++i) {
    3939
    40     procs_l = global[i].Size() / points_min;
    41 
    42     active = true;
    43     for (int j=0; j<3; ++j) {
    44       procs_l[j] = std::max(procs_l[j], 1);
    45       procs_l[j] = std::min(procs[j], procs_l[j]);
    46       active &= pos[j] < procs_l[j];
    47     }
    48 
     40    /*
     41     * Check if this level is the finest global level
     42     */
    4943    if (global[i].BoundaryType() == GlobalMax)
    5044      levelGlobalMax = interface->MaxLevel() - i;
    5145
    52     if (active) {
    53 
    54       // Set boundary type
    55       global_l.BoundaryType() = global[i].BoundaryType();
    56 
    57       // Compute global size
    58       global_l.Size() = global[i].Size() / procs_l;
    59       remainder = global[i].Size() % procs_l;
    60 
    61       for (int j=0; j<3; ++j)
    62         if (pos[j] < remainder[j])
    63           ++(global_l.Size()[j]);
    64 
    65       // Compute global begin
    66       global_l.Begin() = pos * global_l.Size();
    67 
    68       for (int j=0; j<3; ++j)
    69         if (pos[j] >= remainder[j])
    70           global_l.Begin()[j] += remainder[j];
    71 
    72       // Compute global end
    73       global_l.End() = global_l.Begin() + global_l.Size();
    74 
    75       // Set alignment
     46
     47    if (global_separated[i].SizeLocal().Product() > 0) {
     48
     49      /*
     50       * Initialize some properties with zero
     51       */
     52      local_l.HaloBegin1() = local_l.HaloEnd1() = 0;
     53      local_l.HaloBegin2() = local_l.HaloEnd2() = 0;
     54      local_l.BoundaryBegin1() = local_l.BoundaryEnd1() = 0;
     55      local_l.BoundaryBegin2() = local_l.BoundaryEnd2() = 0;
     56
     57      /*
     58       * Set boundary dependant properties
     59       */
    7660      for (int j=0; j<3; ++j) {
    77         global_l.AlignmentBegin()[j] = std::max(0, global[i].AlignmentBegin()[j] - global_l.Begin()[j]);
    78         global_l.AlignmentEnd()[j] = std::min(global_l.Size()[j], global[i].AlignmentEnd()[j] - global_l.Begin()[j]);
     61
     62        if (comm->BoundaryConditions()[j] == Dirichlet ||
     63            comm->BoundaryConditions()[j] == Open) {
     64
     65          local_l.SizeTotal()[j] = global_separated[i].SizeLocal()[j] +
     66            (global_separated[i].BoundaryType() == LocallyRefined ? 2 : 0);
     67
     68          /*
     69           * We have a boundary at the ends of the process grids
     70           * and halo grid points otherwise
     71           */
     72          if (global_separated[i].BeginLocal()[j] == 0) {
     73            local_l.BoundaryBegin1()[j] = 0;
     74            local_l.BoundaryEnd1()[j] = 1;
     75          }else {
     76            ++local_l.SizeTotal()[j];
     77            local_l.HaloBegin1()[j] = 0;
     78            local_l.HaloEnd1()[j] = 1;
     79          }
     80
     81          if (global_separated[i].EndLocal()[j] == global_separated[i].SizeGlobal()[j]) {
     82            local_l.BoundaryBegin2()[j] = local_l.SizeTotal()[j] - 1;
     83            local_l.BoundaryEnd2()[j] = local_l.SizeTotal()[j];
     84          }else {
     85            ++local_l.SizeTotal()[j];
     86            local_l.HaloBegin2()[j] = local_l.SizeTotal()[j] - 1;
     87            local_l.HaloEnd2()[j] = local_l.SizeTotal()[j];
     88          }
     89
     90        }else if (comm->BoundaryConditions()[j] == Periodic) {
     91
     92          local_l.SizeTotal()[j] = global_separated[i].SizeLocal()[j] + 2;
     93
     94          /*
     95           * No boundary
     96           */
     97          local_l.BoundaryBegin1()[j] = local_l.BoundaryEnd1()[j] = 0;
     98          local_l.BoundaryBegin2()[j] = local_l.BoundaryEnd2()[j] = 0;
     99
     100          /*
     101           * Halo grid points on all processes
     102           */
     103          local_l.HaloBegin1()[j] = 0;
     104          local_l.HaloEnd1()[j] = 1;
     105          local_l.HaloBegin2()[j] = local_l.SizeTotal()[j] - 1;
     106          local_l.HaloEnd2()[j] = local_l.SizeTotal()[j];
     107
     108        }
     109
    79110      }
    80111
    81       switch (comm->BoundaryConditions())
    82         {
    83         case Dirichlet:
    84           local_l = InitDirichlet(global_l, extent[i], pos, procs_l);
    85           break;
    86         case Periodic:
    87           local_l = InitPeriodic(global_l, extent[i], pos, procs_l);
    88           break;
    89         case Quasiperiodic:
    90           local_l = InitDirichlet(global_l, extent[i], pos, procs_l);
    91           break;
    92         }
    93 
    94       grids.push_back(new Grid(global_l, local_l, extent[i]));
     112      local_l.Begin() = 1;
     113      local_l.End() = local_l.SizeTotal() - 1;
     114
     115      local_l.Size() = local_l.End() - local_l.Begin();
     116
     117      if (i==0)
     118        local_l.AlignmentBegin() = (global_separated[i].SizeGlobal() - static_cast<int>( pow(2.0, interface->MaxLevel() ) + 0.5 ) - 1) / 2;
     119      else if (global_separated[i].BoundaryType() == LocallyRefined)
     120        local_l.AlignmentBegin() = (extent[i].Size() - extent[i-1].Size()) * pow(2.0, interface->MaxLevel()-i-1) + 0.5;
     121      else if (global_separated[i].BoundaryType() == GlobalMax)
     122        local_l.AlignmentBegin() = (extent[i].Size() - extent[i-1].Size()) * pow(2.0, interface->MaxLevel()-i-1) - 0.5;
     123      else
     124        local_l.AlignmentBegin() = 0;
     125
     126      local_l.AlignmentBegin() += local_l.Begin();
     127      local_l.AlignmentEnd() = local_l.AlignmentBegin() + global_separated[i].SizeLocal();
     128
     129      local_l.AlignmentBegin().Clamp(local_l.Begin(), local_l.End());
     130      local_l.AlignmentEnd().Clamp(local_l.Begin(), local_l.End());
     131
     132
     133      grids.push_back(new Grid(global_separated[i], local_l, extent[i], interface->MaxLevel()-i, this));
    95134
    96135    }else {
    97136
    98       global_l.Size() = 0;
    99       global_l.Begin() = 0;
    100       global_l.End() = 0;
    101       global_l.AlignmentBegin() = 0;
    102       global_l.AlignmentEnd() = 0;
    103       global_l.BoundaryType() = EmptyGrid;
     137      global_separated[i].SizeGlobal() = global[i].SizeGlobal();
     138      global_separated[i].BeginFinest() = global[i].BeginFinest();
     139      global_separated[i].EndFinest() = global[i].EndFinest();
     140      global_separated[i].SizeFinest() = global[i].SizeFinest();
     141      global_separated[i].SizeLocal() = 0;
     142      global_separated[i].BeginLocal() = 0;
     143      global_separated[i].EndLocal() = 0;
     144      global_separated[i].BoundaryType() = global[i].BoundaryType();
    104145
    105146      local_l.Size() = 0;
     
    118159      local_l.AlignmentEnd() = 0;
    119160
    120       grids.push_back(new Grid(global_l, local_l, extent[i]));
     161      grids.push_back(new Grid(global_separated[i], local_l, extent[i], interface->MaxLevel()-i, this));
    121162
    122163    }
     
    130171  levelIndex = 0;
    131172  levelCurrent = levelMax;
    132 }
    133 
    134 LocalIndices Multigrid::InitDirichlet(const GlobalIndices& global, const SpatialExtent& extent, const Index& pos, const Index& procs)
    135 {
    136   LocalIndices local;
    137 
    138   local.HaloBegin1() = local.HaloEnd1() = 0;
    139   local.HaloBegin2() = local.HaloEnd2() = 0;
    140   local.BoundaryBegin1() = local.BoundaryEnd1() = 0;
    141   local.BoundaryBegin2() = local.BoundaryEnd2() = 0;
    142 
    143   local.SizeTotal() = global.End() - global.Begin() + (global.BoundaryType() == LocallyRefined ? 2 : 0);
    144 
    145   for (int i=0; i<3; ++i) {
    146 
    147     if (pos[i] == 0) {
    148       local.BoundaryBegin1()[i] = 0;
    149       local.BoundaryEnd1()[i] = 1;
    150     }else {
    151       ++local.SizeTotal()[i];
    152       local.HaloBegin1()[i] = 0;
    153       local.HaloEnd1()[i] = 1;
    154     }
    155 
    156     if (pos[i] == procs[i]-1) {
    157       local.BoundaryBegin2()[i] = local.SizeTotal()[i] - 1;
    158       local.BoundaryEnd2()[i] = local.SizeTotal()[i];
    159     }else {
    160       ++local.SizeTotal()[i];
    161       local.HaloBegin2()[i] = local.SizeTotal()[i] - 1;
    162       local.HaloEnd2()[i] = local.SizeTotal()[i];
    163     }
    164 
    165   }
    166 
    167   local.Begin() = 1;
    168   local.End() = local.SizeTotal() - 1;
    169 
    170   local.Size() = local.End() - local.Begin();
    171 
    172   local.AlignmentBegin() = global.AlignmentBegin() + local.Begin();
    173   local.AlignmentEnd() = global.AlignmentEnd() - local.Begin();
    174 
    175   return local;
    176 }
    177 
    178 LocalIndices Multigrid::InitPeriodic(const GlobalIndices& global, const SpatialExtent& extent, const Index& pos, const Index& procs)
    179 {
    180   LocalIndices local;
    181 
    182   local.SizeTotal() = global.End() - global.Begin() + 2;
    183 
    184   local.BoundaryBegin1() = local.BoundaryEnd1() = 0;
    185   local.BoundaryBegin2() = local.BoundaryEnd2() = 0;
    186 
    187   local.HaloBegin1() = 0;
    188   local.HaloEnd1() = 1;
    189   local.HaloBegin2() = local.SizeTotal() - 1;
    190   local.HaloEnd2() = local.SizeTotal();
    191 
    192   local.Begin() = 1;
    193   local.End() = local.SizeTotal() - 1;
    194 
    195   local.Size() = local.End() - local.Begin();
    196 
    197   local.AlignmentBegin() = global.AlignmentBegin() + local.Begin();
    198   local.AlignmentEnd() = global.AlignmentEnd() + local.Begin();
    199 
    200   return local;
     173
    201174}
    202175
Note: See TracChangeset for help on using the changeset viewer.