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: }