Actual source code: fmg.c

  1: #define PETSCKSP_DLL

  3: /*
  4:      Full multigrid using either additive or multiplicative V or W cycle
  5: */
 6:  #include src/ksp/pc/impls/mg/mgimpl.h

  8: EXTERN PetscErrorCode PCMGMCycle_Private(PC_MG **,PetscTruth*);

 12: PetscErrorCode PCMGFCycle_Private(PC_MG **mg)
 13: {
 15:   PetscInt       i,l = mg[0]->levels;
 16:   PetscScalar    zero = 0.0;

 19:   /* restrict the RHS through all levels to coarsest. */
 20:   for (i=l-1; i>0; i--){
 21:     MatRestrict(mg[i]->restrct,mg[i]->b,mg[i-1]->b);
 22:   }
 23: 
 24:   /* work our way up through the levels */
 25:   VecSet(mg[0]->x,zero);
 26:   for (i=0; i<l-1; i++) {
 27:     PCMGMCycle_Private(&mg[i],PETSC_NULL);
 28:     MatInterpolate(mg[i+1]->interpolate,mg[i]->x,mg[i+1]->x);
 29:   }
 30:   PCMGMCycle_Private(&mg[l-1],PETSC_NULL);
 31:   return(0);
 32: }

 36: PetscErrorCode PCMGKCycle_Private(PC_MG **mg)
 37: {
 39:   PetscInt       i,l = mg[0]->levels;
 40:   PetscScalar    zero = 0.0;

 43:   /* restrict the RHS through all levels to coarsest. */
 44:   for (i=l-1; i>0; i--){
 45:     MatRestrict(mg[i]->restrct,mg[i]->b,mg[i-1]->b);
 46:   }
 47: 
 48:   /* work our way up through the levels */
 49:   VecSet(mg[0]->x,zero);
 50:   for (i=0; i<l-1; i++) {
 51:     if (mg[i]->eventsolve) {PetscLogEventBegin(mg[i]->eventsolve,0,0,0,0);}
 52:     KSPSolve(mg[i]->smoothd,mg[i]->b,mg[i]->x);
 53:     if (mg[i]->eventsolve) {PetscLogEventEnd(mg[i]->eventsolve,0,0,0,0);}
 54:     MatInterpolate(mg[i+1]->interpolate,mg[i]->x,mg[i+1]->x);
 55:   }
 56:   if (mg[l-1]->eventsolve) {PetscLogEventBegin(mg[l-1]->eventsolve,0,0,0,0);}
 57:   KSPSolve(mg[l-1]->smoothd,mg[l-1]->b,mg[l-1]->x);
 58:   if (mg[l-1]->eventsolve) {PetscLogEventEnd(mg[l-1]->eventsolve,0,0,0,0);}

 60:   return(0);
 61: }