xref: /petsc/src/ksp/pc/impls/mg/smg.c (revision 9ef679b9b397ea7f8b0ffa0e16e2dbe668d3f68d)
1 
2 /*
3      Additive Multigrid V Cycle routine
4 */
5 #include <petsc/private/pcmgimpl.h>
6 
7 PetscErrorCode PCMGACycle_Private(PC pc,PC_MG_Levels **mglevels,PetscBool transpose)
8 {
9   PetscErrorCode ierr;
10   PetscInt       i,l = mglevels[0]->levels;
11 
12   PetscFunctionBegin;
13   /* compute RHS on each level */
14   for (i=l-1; i>0; i--) {
15     if (mglevels[i]->eventinterprestrict) {ierr = PetscLogEventBegin(mglevels[i]->eventinterprestrict,0,0,0,0);CHKERRQ(ierr);}
16     if (!transpose) {
17       ierr = MatRestrict(mglevels[i]->restrct,mglevels[i]->b,mglevels[i-1]->b);CHKERRQ(ierr);
18     } else {
19       ierr = MatRestrict(mglevels[i]->interpolate,mglevels[i]->b,mglevels[i-1]->b);CHKERRQ(ierr);
20     }
21     if (mglevels[i]->eventinterprestrict) {ierr = PetscLogEventEnd(mglevels[i]->eventinterprestrict,0,0,0,0);CHKERRQ(ierr);}
22   }
23   /* solve separately on each level */
24   for (i=0; i<l; i++) {
25     ierr = VecSet(mglevels[i]->x,0.0);CHKERRQ(ierr);
26     if (mglevels[i]->eventsmoothsolve) {ierr = PetscLogEventBegin(mglevels[i]->eventsmoothsolve,0,0,0,0);CHKERRQ(ierr);}
27     if (!transpose) {
28       ierr = KSPSolve(mglevels[i]->smoothd,mglevels[i]->b,mglevels[i]->x);CHKERRQ(ierr);
29       ierr = KSPCheckSolve(mglevels[i]->smoothd,pc,mglevels[i]->x);CHKERRQ(ierr);
30     } else {
31       ierr = KSPSolveTranspose(mglevels[i]->smoothu,mglevels[i]->b,mglevels[i]->x);CHKERRQ(ierr);
32       ierr = KSPCheckSolve(mglevels[i]->smoothu,pc,mglevels[i]->x);CHKERRQ(ierr);
33     }
34     if (mglevels[i]->eventsmoothsolve) {ierr = PetscLogEventEnd(mglevels[i]->eventsmoothsolve,0,0,0,0);CHKERRQ(ierr);}
35   }
36   for (i=1; i<l; i++) {
37     if (mglevels[i]->eventinterprestrict) {ierr = PetscLogEventBegin(mglevels[i]->eventinterprestrict,0,0,0,0);CHKERRQ(ierr);}
38     if (!transpose) {
39       ierr = MatInterpolateAdd(mglevels[i]->interpolate,mglevels[i-1]->x,mglevels[i]->x,mglevels[i]->x);CHKERRQ(ierr);
40     } else {
41       ierr = MatInterpolateAdd(mglevels[i]->restrct,mglevels[i-1]->x,mglevels[i]->x,mglevels[i]->x);CHKERRQ(ierr);
42     }
43     if (mglevels[i]->eventinterprestrict) {ierr = PetscLogEventEnd(mglevels[i]->eventinterprestrict,0,0,0,0);CHKERRQ(ierr);}
44   }
45   PetscFunctionReturn(0);
46 }
47