Actual source code: smg.c
1: #define PETSCKSP_DLL
3: /*
4: Additive Multigrid V Cycle routine
5: */
6: #include ../src/ksp/pc/impls/mg/mgimpl.h
10: PetscErrorCode PCMGACycle_Private(PC_MG **mg)
11: {
13: PetscInt i,l = mg[0]->levels;
16: /* compute RHS on each level */
17: for (i=l-1; i>0; i--) {
18: if (mg[i]->eventinterprestrict) {PetscLogEventBegin(mg[i]->eventinterprestrict,0,0,0,0);}
19: MatRestrict(mg[i]->restrct,mg[i]->b,mg[i-1]->b);
20: if (mg[i]->eventinterprestrict) {PetscLogEventEnd(mg[i]->eventinterprestrict,0,0,0,0);}
21: }
22: /* solve separately on each level */
23: for (i=0; i<l; i++) {
24: VecSet(mg[i]->x,0.0);
25: if (mg[i]->eventsmoothsolve) {PetscLogEventBegin(mg[i]->eventsmoothsolve,0,0,0,0);}
26: KSPSolve(mg[i]->smoothd,mg[i]->b,mg[i]->x);
27: if (mg[i]->eventsmoothsolve) {PetscLogEventEnd(mg[i]->eventsmoothsolve,0,0,0,0);}
28: }
29: for (i=1; i<l; i++) {
30: if (mg[i]->eventinterprestrict) {PetscLogEventBegin(mg[i]->eventinterprestrict,0,0,0,0);}
31: MatInterpolateAdd(mg[i]->interpolate,mg[i-1]->x,mg[i]->x,mg[i]->x);
32: if (mg[i]->eventinterprestrict) {PetscLogEventEnd(mg[i]->eventinterprestrict,0,0,0,0);}
33: }
34: return(0);
35: }