Actual source code: fasgalerkin.c

petsc-3.3-p7 2013-05-11
  1: #include "../src/snes/impls/fas/fasimpls.h" /*I  "petscsnesfas.h"  I*/

  5: /*@
  6:    SNESFASGetGalerkin - Gets if the coarse problems are formed by projection to the fine problem

  8:    Input Parameter:
  9: .  snes - the nonlinear solver context

 11:    Output parameter:
 12: .  flg - the status of the galerkin problem

 14:    Level: advanced

 16: .keywords: FAS, galerkin

 18: .seealso: SNESFASSetLevels(), SNESFASSetGalerkin()
 19: @*/
 20: PetscErrorCode SNESFASGetGalerkin(SNES snes, PetscBool *flg) {
 21:   SNES_FAS * fas = (SNES_FAS *)snes->data;
 23:   *flg = fas->galerkin;
 24:   return(0);
 25: }

 29: /*@
 30:    SNESFASSetGalerkin - Sets coarse problems as formed by projection to the fine problem

 32:    Input Parameter:
 33: .  snes - the nonlinear solver context
 34: .  flg - the status of the galerkin problem

 36:    Level: advanced

 38: .keywords: FAS, galerkin

 40: .seealso: SNESFASSetLevels(), SNESFASGetGalerkin()
 41: @*/
 42: PetscErrorCode SNESFASSetGalerkin(SNES snes, PetscBool flg) {
 43:   SNES_FAS * fas = (SNES_FAS *)snes->data;
 46:   fas->galerkin = flg;
 47:   if (fas->next) {SNESFASSetGalerkin(fas->next, flg);}
 48:   return(0);
 49: }

 53: /*
 54: SNESFASGalerkinDefaultFunction

 56:  */
 57: PetscErrorCode SNESFASGalerkinDefaultFunction(SNES snes, Vec X, Vec F, void * ctx) {
 58:   /* the Galerkin FAS function evalutation is defined as
 59:    F^l(x^l) = I^l_0F^0(P^0_lx^l)
 60:    */
 61:   SNES       fassnes;
 62:   SNES_FAS * fas;
 63:   SNES_FAS * prevfas;
 64:   SNES       prevsnes;
 65:   Vec b_temp;
 68:   /* prolong to the fine level and evaluate there. */
 69:   fassnes = (SNES)ctx;
 70:   fas     = (SNES_FAS *)fassnes->data;
 71:   prevsnes = fas->previous;
 72:   prevfas = (SNES_FAS *)prevsnes->data;
 73:   /* interpolate down the solution */
 74:   MatInterpolate(prevfas->interpolate, X, prevfas->Xg);
 75:   /* the RHS we care about is at the coarsest level */
 76:   b_temp = prevsnes->vec_rhs;
 77:   prevsnes->vec_rhs = PETSC_NULL;
 78:   SNESComputeFunction(prevsnes, prevfas->Xg, prevfas->Fg);
 79:   prevsnes->vec_rhs = b_temp;
 80:   /* restrict up the function */
 81:   MatRestrict(prevfas->restrct, prevfas->Fg, F);
 82:   return(0);
 83: }