xref: /petsc/src/ksp/pc/impls/mg/smg.c (revision df48e8d96c19df54efdde2c76f874a16fcafd8fe)
1 #define PETSCKSP_DLL
2 
3 /*
4      Additive Multigrid V Cycle routine
5 */
6 #include "src/ksp/pc/impls/mg/mgimpl.h"
7 
8 #undef __FUNCT__
9 #define __FUNCT__ "PCMGACycle_Private"
10 PetscErrorCode PCMGACycle_Private(PC_MG **mg)
11 {
12   PetscErrorCode ierr;
13   PetscInt       i,l = mg[0]->levels;
14   PetscScalar    zero = 0.0;
15 
16   PetscFunctionBegin;
17   /* compute RHS on each level */
18   for (i=l-1; i>0; i--) {
19     ierr = MatRestrict(mg[i]->restrct,mg[i]->b,mg[i-1]->b);CHKERRQ(ierr);
20   }
21   /* solve seperately on each level */
22   for (i=0; i<l; i++) {
23     ierr = VecSet(mg[i]->x,zero);CHKERRQ(ierr);
24     if (mg[i]->eventsolve) {ierr = PetscLogEventBegin(mg[i]->eventsolve,0,0,0,0);CHKERRQ(ierr);}
25     ierr = KSPSolve(mg[i]->smoothd,mg[i]->b,mg[i]->x);CHKERRQ(ierr);
26     if (mg[i]->eventsolve) {ierr = PetscLogEventEnd(mg[i]->eventsolve,0,0,0,0);CHKERRQ(ierr);}
27   }
28   for (i=1; i<l; i++) {
29     ierr = MatInterpolateAdd(mg[i]->interpolate,mg[i-1]->x,mg[i]->x,mg[i]->x);CHKERRQ(ierr);
30   }
31   PetscFunctionReturn(0);
32 }
33