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 pc,PC_MG_Levels **mglevels)
11: {
12: PC_MG *mg = (PC_MG*)pc->data;
14: PetscInt i,l = mglevels[0]->levels;
17: /* compute RHS on each level */
18: for (i=l-1; i>0; i--) {
19: if (mg->eventinterprestrict) {PetscLogEventBegin(mg->eventinterprestrict,0,0,0,0);}
20: MatRestrict(mglevels[i]->restrct,mglevels[i]->b,mglevels[i-1]->b);
21: if (mg->eventinterprestrict) {PetscLogEventEnd(mg->eventinterprestrict,0,0,0,0);}
22: }
23: /* solve separately on each level */
24: for (i=0; i<l; i++) {
25: VecSet(mglevels[i]->x,0.0);
26: if (mg->eventsmoothsolve) {PetscLogEventBegin(mg->eventsmoothsolve,0,0,0,0);}
27: KSPSolve(mglevels[i]->smoothd,mglevels[i]->b,mglevels[i]->x);
28: if (mg->eventsmoothsolve) {PetscLogEventEnd(mg->eventsmoothsolve,0,0,0,0);}
29: }
30: for (i=1; i<l; i++) {
31: if (mg->eventinterprestrict) {PetscLogEventBegin(mg->eventinterprestrict,0,0,0,0);}
32: MatInterpolateAdd(mglevels[i]->interpolate,mglevels[i-1]->x,mglevels[i]->x,mglevels[i]->x);
33: if (mg->eventinterprestrict) {PetscLogEventEnd(mg->eventinterprestrict,0,0,0,0);}
34: }
35: return(0);
36: }