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