xref: /petsc/src/ksp/pc/impls/mg/smg.c (revision fcca9d3d5c45103cafcd0f6bc9babe194d935ced)
1 /*$Id: smg.c,v 1.24 2001/08/07 03:03:36 balay Exp $*/
2 /*
3      Additive Multigrid V Cycle routine
4 */
5 #include "src/ksp/pc/impls/mg/mgimpl.h"
6 
7 /*
8        MGACycle_Private - Given an MG structure created with MGCreate() runs
9                   one cycle down through the levels and back up. Applys
10                   the smoothers in an additive manner.
11 
12     Iput Parameters:
13 .   mg - structure created with  MGCreate().
14 
15 */
16 #undef __FUNCT__
17 #define __FUNCT__ "MGACycle_Private"
18 int MGACycle_Private(MG *mg)
19 {
20   int    i,l = mg[0]->levels,ierr;
21   PetscScalar zero = 0.0;
22 
23   PetscFunctionBegin;
24   /* compute RHS on each level */
25   for (i=l-1; i>0; i--) {
26     ierr = MatRestrict(mg[i]->restrct,mg[i]->b,mg[i-1]->b);CHKERRQ(ierr);
27   }
28   /* solve seperately on each level */
29   for (i=0; i<l; i++) {
30     ierr = VecSet(&zero,mg[i]->x);CHKERRQ(ierr);
31     if (mg[i]->eventsolve) {ierr = PetscLogEventBegin(mg[i]->eventsolve,0,0,0,0);CHKERRQ(ierr);}
32     ierr = KSPSetRhs(mg[i]->smoothd,mg[i]->b);CHKERRQ(ierr);
33     ierr = KSPSetSolution(mg[i]->smoothd,mg[i]->x);CHKERRQ(ierr);
34     ierr = KSPSolve(mg[i]->smoothd);CHKERRQ(ierr);
35     if (mg[i]->eventsolve) {ierr = PetscLogEventEnd(mg[i]->eventsolve,0,0,0,0);CHKERRQ(ierr);}
36   }
37   for (i=1; i<l; i++) {
38     ierr = MatInterpolateAdd(mg[i]->interpolate,mg[i-1]->x,mg[i]->x,mg[i]->x);CHKERRQ(ierr);
39   }
40   PetscFunctionReturn(0);
41 }
42