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