xref: /petsc/src/snes/impls/fas/fasgalerkin.c (revision a7b5fb5f7cb42c18903bd3d6423cc78f00b39ba3)
1*a7b5fb5fSBarry Smith #include <../src/snes/impls/fas/fasimpls.h> /*I  "petscsnes.h"  I*/
2ab8d36c9SPeter Brune 
3ab8d36c9SPeter Brune #undef __FUNCT__
4ab8d36c9SPeter Brune #define __FUNCT__ "SNESFASGetGalerkin"
5ab8d36c9SPeter Brune /*@
6ab8d36c9SPeter Brune    SNESFASGetGalerkin - Gets if the coarse problems are formed by projection to the fine problem
7ab8d36c9SPeter Brune 
8ab8d36c9SPeter Brune    Input Parameter:
9ab8d36c9SPeter Brune .  snes - the nonlinear solver context
10ab8d36c9SPeter Brune 
11ab8d36c9SPeter Brune    Output parameter:
12ab8d36c9SPeter Brune .  flg - the status of the galerkin problem
13ab8d36c9SPeter Brune 
14ab8d36c9SPeter Brune    Level: advanced
15ab8d36c9SPeter Brune 
16ab8d36c9SPeter Brune .keywords: FAS, galerkin
17ab8d36c9SPeter Brune 
18ab8d36c9SPeter Brune .seealso: SNESFASSetLevels(), SNESFASSetGalerkin()
19ab8d36c9SPeter Brune @*/
200adebc6cSBarry Smith PetscErrorCode SNESFASGetGalerkin(SNES snes, PetscBool *flg)
210adebc6cSBarry Smith {
22ab8d36c9SPeter Brune   SNES_FAS * fas = (SNES_FAS*)snes->data;
235fd66863SKarl Rupp 
24ab8d36c9SPeter Brune   PetscFunctionBegin;
25ab8d36c9SPeter Brune   *flg = fas->galerkin;
26ab8d36c9SPeter Brune   PetscFunctionReturn(0);
27ab8d36c9SPeter Brune }
28ab8d36c9SPeter Brune 
29ab8d36c9SPeter Brune #undef __FUNCT__
30ab8d36c9SPeter Brune #define __FUNCT__ "SNESFASSetGalerkin"
31ab8d36c9SPeter Brune /*@
32ab8d36c9SPeter Brune    SNESFASSetGalerkin - Sets coarse problems as formed by projection to the fine problem
33ab8d36c9SPeter Brune 
34ab8d36c9SPeter Brune    Input Parameter:
35ab8d36c9SPeter Brune .  snes - the nonlinear solver context
36ab8d36c9SPeter Brune .  flg - the status of the galerkin problem
37ab8d36c9SPeter Brune 
38ab8d36c9SPeter Brune    Level: advanced
39ab8d36c9SPeter Brune 
40ab8d36c9SPeter Brune .keywords: FAS, galerkin
41ab8d36c9SPeter Brune 
42ab8d36c9SPeter Brune .seealso: SNESFASSetLevels(), SNESFASGetGalerkin()
43ab8d36c9SPeter Brune @*/
440adebc6cSBarry Smith PetscErrorCode SNESFASSetGalerkin(SNES snes, PetscBool flg)
450adebc6cSBarry Smith {
46ab8d36c9SPeter Brune   SNES_FAS       * fas = (SNES_FAS*)snes->data;
47ab8d36c9SPeter Brune   PetscErrorCode ierr;
485fd66863SKarl Rupp 
49ab8d36c9SPeter Brune   PetscFunctionBegin;
50ab8d36c9SPeter Brune   fas->galerkin = flg;
51ab8d36c9SPeter Brune   if (fas->next) {ierr = SNESFASSetGalerkin(fas->next, flg);CHKERRQ(ierr);}
52ab8d36c9SPeter Brune   PetscFunctionReturn(0);
53ab8d36c9SPeter Brune }
546273346dSPeter Brune 
556273346dSPeter Brune #undef __FUNCT__
566273346dSPeter Brune #define __FUNCT__ "SNESFASGalerkinDefaultFunction"
576273346dSPeter Brune /*
586273346dSPeter Brune SNESFASGalerkinDefaultFunction
596273346dSPeter Brune 
606273346dSPeter Brune  */
610adebc6cSBarry Smith PetscErrorCode SNESFASGalerkinDefaultFunction(SNES snes, Vec X, Vec F, void * ctx)
620adebc6cSBarry Smith {
636273346dSPeter Brune   /* the Galerkin FAS function evalutation is defined as
646273346dSPeter Brune    F^l(x^l) = I^l_0F^0(P^0_lx^l)
656273346dSPeter Brune    */
666273346dSPeter Brune   SNES           fassnes;
676273346dSPeter Brune   SNES_FAS       *fas;
686273346dSPeter Brune   SNES_FAS       *prevfas;
696273346dSPeter Brune   SNES           prevsnes;
7075d4ebe3SPeter Brune   Vec            b_temp;
716273346dSPeter Brune   PetscErrorCode ierr;
720adebc6cSBarry Smith 
736273346dSPeter Brune   PetscFunctionBegin;
746273346dSPeter Brune   /* prolong to the fine level and evaluate there. */
756273346dSPeter Brune   fassnes  = (SNES)ctx;
766273346dSPeter Brune   fas      = (SNES_FAS*)fassnes->data;
776273346dSPeter Brune   prevsnes = fas->previous;
786273346dSPeter Brune   prevfas  = (SNES_FAS*)prevsnes->data;
796273346dSPeter Brune   /* interpolate down the solution */
806273346dSPeter Brune   ierr = MatInterpolate(prevfas->interpolate, X, prevfas->Xg);CHKERRQ(ierr);
8175d4ebe3SPeter Brune   /* the RHS we care about is at the coarsest level */
8275d4ebe3SPeter Brune   b_temp            = prevsnes->vec_rhs;
830298fd71SBarry Smith   prevsnes->vec_rhs = NULL;
846273346dSPeter Brune   ierr              = SNESComputeFunction(prevsnes, prevfas->Xg, prevfas->Fg);CHKERRQ(ierr);
8575d4ebe3SPeter Brune   prevsnes->vec_rhs = b_temp;
866273346dSPeter Brune   /* restrict up the function */
876273346dSPeter Brune   ierr = MatRestrict(prevfas->restrct, prevfas->Fg, F);CHKERRQ(ierr);
886273346dSPeter Brune   PetscFunctionReturn(0);
896273346dSPeter Brune }
90