xref: /petsc/src/ksp/pc/impls/mg/smg.c (revision 45bfc511327f17f9664eea9fee8d9f549538c00a)
1 #define PETSCKSP_DLL
2 
3 /*
4      Additive Multigrid V Cycle routine
5 */
6 #include "src/ksp/pc/impls/mg/mgimpl.h"
7 
8 /*
9        MGACycle_Private - Given an MG structure created with MGCreate() runs
10                   one cycle down through the levels and back up. Applys
11                   the smoothers in an additive manner.
12 
13     Iput Parameters:
14 .   mg - structure created with  MGCreate().
15 
16 */
17 #undef __FUNCT__
18 #define __FUNCT__ "MGACycle_Private"
19 PetscErrorCode MGACycle_Private(MG *mg)
20 {
21   PetscErrorCode ierr;
22   PetscInt       i,l = mg[0]->levels;
23   PetscScalar    zero = 0.0;
24 
25   PetscFunctionBegin;
26   /* compute RHS on each level */
27   for (i=l-1; i>0; i--) {
28     ierr = MatRestrict(mg[i]->restrct,mg[i]->b,mg[i-1]->b);CHKERRQ(ierr);
29   }
30   /* solve seperately on each level */
31   for (i=0; i<l; i++) {
32     ierr = VecSet(&zero,mg[i]->x);CHKERRQ(ierr);
33     if (mg[i]->eventsolve) {ierr = PetscLogEventBegin(mg[i]->eventsolve,0,0,0,0);CHKERRQ(ierr);}
34     ierr = KSPSolve(mg[i]->smoothd,mg[i]->b,mg[i]->x);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