Changeset 49f8653 for src


Ignore:
Timestamp:
May 2, 2012, 1:36:54 PM (14 years ago)
Author:
Julian Iseringhausen <isering@…>
Children:
4e8206
Parents:
6fee21
Message:

Increase serial performance.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/comm/comm.cpp

    r6fee21 r49f8653  
    2727using namespace VMG;
    2828
    29 vmg_float Comm::ComputeResidualNorm(Multigrid& sol, Multigrid& rhs)
     29vmg_float Comm::ComputeResidualNorm(Multigrid& sol_mg, Multigrid& rhs_mg)
    3030{
    3131#ifdef DEBUG_MATRIX_CHECKS
     
    3535#endif
    3636
    37   Grid::iterator grid_iter;
    3837  Stencil::iterator stencil_iter;
    39   vmg_float val;
    4038  vmg_float norm = 0.0;
    4139
    42   const vmg_float prefactor = MG::GetDiscretization()->OperatorPrefactor(sol());
     40  const vmg_float prefactor = MG::GetDiscretization()->OperatorPrefactor(sol_mg());
    4341  const Stencil& A = MG::GetDiscretization()->GetStencil();
    4442
    45   this->CommToGhosts(sol());
     43  this->CommToGhosts(sol_mg());
    4644
    47   if (sol().Global().BoundaryType() == LocallyRefined)
    48     MG::GetDiscretization()->SetInnerBoundary(sol(), rhs(), sol(sol.Level()-1));
     45  if (sol_mg().Global().BoundaryType() == LocallyRefined)
     46    MG::GetDiscretization()->SetInnerBoundary(sol_mg(), rhs_mg(), sol_mg(sol_mg.Level()-1));
    4947
    50   for (grid_iter=rhs().Iterators().Local().Begin(); grid_iter!=rhs().Iterators().Local().End(); ++grid_iter) {
    51     val = rhs().GetVal(*grid_iter) - prefactor * A.GetDiag() * sol().GetVal(*grid_iter);
    52     for (stencil_iter=A.begin(); stencil_iter!=A.end(); ++stencil_iter)
    53       val -= prefactor * stencil_iter->Val() * sol().GetVal(grid_iter->X() + stencil_iter->Disp().X(),
    54                                                             grid_iter->Y() + stencil_iter->Disp().Y(),
    55                                                             grid_iter->Z() + stencil_iter->Disp().Z());
    56     norm += val*val;
    57   }
     48  const Grid& sol = sol_mg();
     49  const Grid& rhs = rhs_mg();
    5850
    59   norm = sqrt(sol().Extent().MeshWidth().Product() * GlobalSum(norm));
     51  for (int i=rhs.Local().Begin().X(); i<rhs.Local().End().X(); ++i)
     52    for (int j=rhs.Local().Begin().Y(); j<rhs.Local().End().Y(); ++j)
     53      for (int k=rhs.Local().Begin().Z(); k<rhs.Local().End().Z(); ++k) {
     54        vmg_float val = rhs.GetVal(i,j,k) - prefactor * A.GetDiag() * sol.GetVal(i,j,k);
     55        for (stencil_iter=A.begin(); stencil_iter!=A.end(); ++stencil_iter)
     56          val -= prefactor * stencil_iter->Val() * sol.GetVal(i + stencil_iter->Disp().X(),
     57                                                              j + stencil_iter->Disp().Y(),
     58                                                              k + stencil_iter->Disp().Z());
     59        norm = val*val;
     60      }
     61       
     62  norm = GlobalSum(norm);
     63  norm = std::sqrt(sol.Extent().MeshWidth().Product() * norm);
    6064
    6165  return norm;
Note: See TracChangeset for help on using the changeset viewer.