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/smoother/gsrb.cpp

    rd24c2f rac6d04  
    1111#include <config.h>
    1212#endif
     13
     14#include <mpi.h>
    1315
    1416#include <sstream>
     
    3234
    3335  for (i=begin.X(); i<end.X(); ++i)
    34     for (j=begin.Y(); j<end.Y(); ++j)
    35       for (k=begin.Z()+((i+j+off)%2); k<end.Z(); k+=2) {
     36    for (j=begin.Y(); j<end.Y(); ++j) {
     37
     38      int z_begin = begin.Z() + (i + j + begin.Z() + off) % 2;
     39
     40#ifdef DEBUG
     41      int off_sum = MG::GetComm()->LevelSum(rhs, z_begin - begin.Z());
     42      assert(z_begin - begin.Z() == 0 || z_begin - begin.Z() == 1);
     43      assert(off_sum == 0 || off_sum == MG::GetComm()->Size(rhs));
     44#endif /* DEBUG */
     45
     46      for (k=z_begin; k<end.Z(); k+=2) {
    3647
    3748        temp = prefactor * rhs.GetVal(i,j,k);
     
    4556
    4657      }
     58    }
    4759}
    4860
    4961void GaussSeidelRB::Compute(Grid& sol, Grid& rhs)
    5062{
    51 #ifdef DEBUG_MATRIX_CHECKS
    52   sol.IsConsistent();
    53   rhs.IsConsistent();
    54 #endif
    55 
    56 #ifdef DEBUG
    57   sol.IsCompatible(rhs);
    58 #endif
    59 
    6063  const Stencil& mat = MG::GetDiscretization()->GetStencil();
    6164  const vmg_float prefactor_inv = 1.0 / MG::GetDiscretization()->OperatorPrefactor(sol);
    6265  const vmg_float diag_inv = 1.0 / mat.GetDiag();
    63   const int off = rhs.Global().BeginLocal().Sum() - rhs.Local().HasHalo1().Sum();
     66  const int off = rhs.Global().LocalBegin().Sum() - rhs.Local().HaloSize1().Sum();
     67  const LocalIndices& local = rhs.Local();
    6468  Comm& comm = *MG::GetComm();
    6569
     
    7377  // Smooth part not depending on ghost cells
    7478  ComputePartial(sol, rhs, mat,
    75                  rhs.Local().Begin()+1, rhs.Local().End()-1,
     79                 local.Begin()+1, local.End()-1,
    7680                 prefactor_inv, diag_inv, off+1);
    7781
    7882  // Finish asynchronous communication
    79   comm.CommToGhostsAsyncFinish();
     83  comm.CommToGhostsAsyncFinish(sol);
    8084
    8185  /*
     
    8488
    8589  ComputePartial(sol, rhs, mat,
    86                  rhs.Local().Begin(),
    87                  Index(rhs.Local().Begin().X()+1, rhs.Local().End().Y(), rhs.Local().End().Z()),
     90                 local.Begin(),
     91                 Index(local.Begin().X()+1, local.End().Y(), local.End().Z()),
    8892                 prefactor_inv, diag_inv, off+1);
    8993
    9094  ComputePartial(sol, rhs, mat,
    91                  Index(rhs.Local().End().X()-1, rhs.Local().Begin().Y(), rhs.Local().Begin().Z()),
    92                  rhs.Local().End(),
     95                 Index(local.End().X()-1, local.Begin().Y(), local.Begin().Z()),
     96                 local.End(),
    9397                 prefactor_inv, diag_inv, off+1);
    9498
    9599  ComputePartial(sol, rhs, mat,
    96                  Index(rhs.Local().Begin().X()+1, rhs.Local().Begin().Y(), rhs.Local().Begin().Z()),
    97                  Index(rhs.Local().End().X()-1, rhs.Local().Begin().Y()+1, rhs.Local().End().Z()),
     100                 Index(local.Begin().X()+1, local.Begin().Y(), local.Begin().Z()),
     101                 Index(local.End().X()-1, local.Begin().Y()+1, local.End().Z()),
    98102                 prefactor_inv, diag_inv, off+1);
    99103
    100104  ComputePartial(sol, rhs, mat,
    101                  Index(rhs.Local().Begin().X()+1, rhs.Local().End().Y()-1, rhs.Local().Begin().Z()),
    102                  Index(rhs.Local().End().X()-1, rhs.Local().End().Y(), rhs.Local().End().Z()),
     105                 Index(local.Begin().X()+1, local.End().Y()-1, local.Begin().Z()),
     106                 Index(local.End().X()-1, local.End().Y(), local.End().Z()),
    103107                 prefactor_inv, diag_inv, off+1);
    104108
    105109  ComputePartial(sol, rhs, mat,
    106                  Index(rhs.Local().Begin().X()+1, rhs.Local().Begin().Y()+1, rhs.Local().Begin().Z()),
    107                  Index(rhs.Local().End().X()-1, rhs.Local().End().Y()-1, rhs.Local().Begin().Z()+1),
     110                 Index(local.Begin().X()+1, local.Begin().Y()+1, local.Begin().Z()),
     111                 Index(local.End().X()-1, local.End().Y()-1, local.Begin().Z()+1),
    108112                 prefactor_inv, diag_inv, off+1);
    109113
    110114  ComputePartial(sol, rhs, mat,
    111                  Index(rhs.Local().Begin().X()+1, rhs.Local().Begin().Y()+1, rhs.Local().End().Z()-1),
    112                  Index(rhs.Local().End().X()-1, rhs.Local().End().Y()-1, rhs.Local().End().Z()),
     115                 Index(local.Begin().X()+1, local.Begin().Y()+1, local.End().Z()-1),
     116                 Index(local.End().X()-1, local.End().Y()-1, local.End().Z()),
    113117                 prefactor_inv, diag_inv, off+1);
    114118
     
    122126  // Smooth part not depending on ghost cells
    123127  ComputePartial(sol, rhs, mat,
    124                  rhs.Local().Begin()+1, rhs.Local().End()-1,
     128                 local.Begin()+1, local.End()-1,
    125129                 prefactor_inv, diag_inv, off);
    126130
    127131  // Finish asynchronous communication
    128   comm.CommToGhostsAsyncFinish();
     132  comm.CommToGhostsAsyncFinish(sol);
    129133
    130134  /*
     
    133137
    134138  ComputePartial(sol, rhs, mat,
    135                  rhs.Local().Begin(),
    136                  Index(rhs.Local().Begin().X()+1, rhs.Local().End().Y(), rhs.Local().End().Z()),
     139                 local.Begin(),
     140                 Index(local.Begin().X()+1, local.End().Y(), local.End().Z()),
    137141                 prefactor_inv, diag_inv, off);
    138142
    139143  ComputePartial(sol, rhs, mat,
    140                  Index(rhs.Local().End().X()-1, rhs.Local().Begin().Y(), rhs.Local().Begin().Z()),
    141                  rhs.Local().End(),
     144                 Index(local.End().X()-1, local.Begin().Y(), local.Begin().Z()),
     145                 local.End(),
    142146                 prefactor_inv, diag_inv, off);
    143147
    144148  ComputePartial(sol, rhs, mat,
    145                  Index(rhs.Local().Begin().X()+1, rhs.Local().Begin().Y(), rhs.Local().Begin().Z()),
    146                  Index(rhs.Local().End().X()-1, rhs.Local().Begin().Y()+1, rhs.Local().End().Z()),
     149                 Index(local.Begin().X()+1, local.Begin().Y(), local.Begin().Z()),
     150                 Index(local.End().X()-1, local.Begin().Y()+1, local.End().Z()),
    147151                 prefactor_inv, diag_inv, off);
    148152
    149153  ComputePartial(sol, rhs, mat,
    150                  Index(rhs.Local().Begin().X()+1, rhs.Local().End().Y()-1, rhs.Local().Begin().Z()),
    151                  Index(rhs.Local().End().X()-1, rhs.Local().End().Y(), rhs.Local().End().Z()),
     154                 Index(local.Begin().X()+1, local.End().Y()-1, local.Begin().Z()),
     155                 Index(local.End().X()-1, local.End().Y(), local.End().Z()),
    152156                 prefactor_inv, diag_inv, off);
    153157
    154158  ComputePartial(sol, rhs, mat,
    155                  Index(rhs.Local().Begin().X()+1, rhs.Local().Begin().Y()+1, rhs.Local().Begin().Z()),
    156                  Index(rhs.Local().End().X()-1, rhs.Local().End().Y()-1, rhs.Local().Begin().Z()+1),
     159                 Index(local.Begin().X()+1, local.Begin().Y()+1, local.Begin().Z()),
     160                 Index(local.End().X()-1, local.End().Y()-1, local.Begin().Z()+1),
    157161                 prefactor_inv, diag_inv, off);
    158162
    159163  ComputePartial(sol, rhs, mat,
    160                  Index(rhs.Local().Begin().X()+1, rhs.Local().Begin().Y()+1, rhs.Local().End().Z()-1),
    161                  Index(rhs.Local().End().X()-1, rhs.Local().End().Y()-1, rhs.Local().End().Z()),
     164                 Index(local.Begin().X()+1, local.Begin().Y()+1, local.End().Z()-1),
     165                 Index(local.End().X()-1, local.End().Y()-1, local.End().Z()),
    162166                 prefactor_inv, diag_inv, off);
    163167}
Note: See TracChangeset for help on using the changeset viewer.