Actual source code: fasgalerkin.c
petsc-3.7.1 2016-05-15
Report Typos and Errors

      1: #include <../src/snes/impls/fas/fasimpls.h> /*I  "petscsnes.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: {
     22:   SNES_FAS * fas = (SNES_FAS*)snes->data;

     25:   *flg = fas->galerkin;
     26:   return(0);
     27: }

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

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

     38:    Level: advanced

     40: .keywords: FAS, galerkin

     42: .seealso: SNESFASSetLevels(), SNESFASGetGalerkin()
     43: @*/
     44: PetscErrorCode SNESFASSetGalerkin(SNES snes, PetscBool flg)
     45: {
     46:   SNES_FAS       * fas = (SNES_FAS*)snes->data;

     50:   fas->galerkin = flg;
     51:   if (fas->next) {SNESFASSetGalerkin(fas->next, flg);}
     52:   return(0);
     53: }

     57: /*
     58: SNESFASGalerkinDefaultFunction

     60:  */
     61: PetscErrorCode SNESFASGalerkinDefaultFunction(SNES snes, Vec X, Vec F, void * ctx)
     62: {
     63:   /* the Galerkin FAS function evalutation is defined as
     64:    F^l(x^l) = I^l_0F^0(P^0_lx^l)
     65:    */
     66:   SNES           fassnes;
     67:   SNES_FAS       *fas;
     68:   SNES_FAS       *prevfas;
     69:   SNES           prevsnes;
     70:   Vec            b_temp;

     74:   /* prolong to the fine level and evaluate there. */
     75:   fassnes  = (SNES)ctx;
     76:   fas      = (SNES_FAS*)fassnes->data;
     77:   prevsnes = fas->previous;
     78:   prevfas  = (SNES_FAS*)prevsnes->data;
     79:   /* interpolate down the solution */
     80:   MatInterpolate(prevfas->interpolate, X, prevfas->Xg);
     81:   /* the RHS we care about is at the coarsest level */
     82:   b_temp            = prevsnes->vec_rhs;
     83:   prevsnes->vec_rhs = NULL;
     84:   SNESComputeFunction(prevsnes, prevfas->Xg, prevfas->Fg);
     85:   prevsnes->vec_rhs = b_temp;
     86:   /* restrict up the function */
     87:   MatRestrict(prevfas->restrct, prevfas->Fg, F);
     88:   return(0);
     89: }