xref: /petsc/src/ksp/pc/impls/mg/smg.c (revision 01a79839fc82a7dabb7a87cd2a8bb532c6bfa88d)
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 pc,PC_MG_Levels **mglevels)
11 {
12   PetscErrorCode ierr;
13   PetscInt       i,l = mglevels[0]->levels;
14 
15   PetscFunctionBegin;
16   /* compute RHS on each level */
17   for (i=l-1; i>0; i--) {
18     if (mglevels[i]->eventinterprestrict) {ierr = PetscLogEventBegin(mglevels[i]->eventinterprestrict,0,0,0,0);CHKERRQ(ierr);}
19     ierr = MatRestrict(mglevels[i]->restrct,mglevels[i]->b,mglevels[i-1]->b);CHKERRQ(ierr);
20     if (mglevels[i]->eventinterprestrict) {ierr = PetscLogEventEnd(mglevels[i]->eventinterprestrict,0,0,0,0);CHKERRQ(ierr);}
21   }
22   /* solve separately on each level */
23   for (i=0; i<l; i++) {
24     ierr = VecSet(mglevels[i]->x,0.0);CHKERRQ(ierr);
25     if (mglevels[i]->eventsmoothsolve) {ierr = PetscLogEventBegin(mglevels[i]->eventsmoothsolve,0,0,0,0);CHKERRQ(ierr);}
26     ierr = KSPSolve(mglevels[i]->smoothd,mglevels[i]->b,mglevels[i]->x);CHKERRQ(ierr);
27     if (mglevels[i]->eventsmoothsolve) {ierr = PetscLogEventEnd(mglevels[i]->eventsmoothsolve,0,0,0,0);CHKERRQ(ierr);}
28   }
29   for (i=1; i<l; i++) {
30     if (mglevels[i]->eventinterprestrict) {ierr = PetscLogEventBegin(mglevels[i]->eventinterprestrict,0,0,0,0);CHKERRQ(ierr);}
31     ierr = MatInterpolateAdd(mglevels[i]->interpolate,mglevels[i-1]->x,mglevels[i]->x,mglevels[i]->x);CHKERRQ(ierr);
32     if (mglevels[i]->eventinterprestrict) {ierr = PetscLogEventEnd(mglevels[i]->eventinterprestrict,0,0,0,0);CHKERRQ(ierr);}
33   }
34   PetscFunctionReturn(0);
35 }
36