xref: /petsc/src/snes/impls/fas/fasgalerkin.c (revision 25acbd8e0ce0c09b12279c1204b0b73554190117)
1a7b5fb5fSBarry Smith #include <../src/snes/impls/fas/fasimpls.h> /*I  "petscsnes.h"  I*/
2ab8d36c9SPeter Brune 
3ab8d36c9SPeter Brune /*@
4ab8d36c9SPeter Brune    SNESFASGetGalerkin - Gets if the coarse problems are formed by projection to the fine problem
5ab8d36c9SPeter Brune 
6ab8d36c9SPeter Brune    Input Parameter:
7ab8d36c9SPeter Brune .  snes - the nonlinear solver context
8ab8d36c9SPeter Brune 
9ab8d36c9SPeter Brune    Output parameter:
10ab8d36c9SPeter Brune .  flg - the status of the galerkin problem
11ab8d36c9SPeter Brune 
12ab8d36c9SPeter Brune    Level: advanced
13ab8d36c9SPeter Brune 
14ab8d36c9SPeter Brune .keywords: FAS, galerkin
15ab8d36c9SPeter Brune 
16ab8d36c9SPeter Brune .seealso: SNESFASSetLevels(), SNESFASSetGalerkin()
17ab8d36c9SPeter Brune @*/
180adebc6cSBarry Smith PetscErrorCode SNESFASGetGalerkin(SNES snes, PetscBool *flg)
190adebc6cSBarry Smith {
20ab8d36c9SPeter Brune   SNES_FAS * fas = (SNES_FAS*)snes->data;
215fd66863SKarl Rupp 
22ab8d36c9SPeter Brune   PetscFunctionBegin;
23ab8d36c9SPeter Brune   *flg = fas->galerkin;
24ab8d36c9SPeter Brune   PetscFunctionReturn(0);
25ab8d36c9SPeter Brune }
26ab8d36c9SPeter Brune 
27ab8d36c9SPeter Brune /*@
28ab8d36c9SPeter Brune    SNESFASSetGalerkin - Sets coarse problems as formed by projection to the fine problem
29ab8d36c9SPeter Brune 
30ab8d36c9SPeter Brune    Input Parameter:
31ab8d36c9SPeter Brune .  snes - the nonlinear solver context
32ab8d36c9SPeter Brune .  flg - the status of the galerkin problem
33ab8d36c9SPeter Brune 
34ab8d36c9SPeter Brune    Level: advanced
35ab8d36c9SPeter Brune 
36ab8d36c9SPeter Brune .keywords: FAS, galerkin
37ab8d36c9SPeter Brune 
38ab8d36c9SPeter Brune .seealso: SNESFASSetLevels(), SNESFASGetGalerkin()
39ab8d36c9SPeter Brune @*/
400adebc6cSBarry Smith PetscErrorCode SNESFASSetGalerkin(SNES snes, PetscBool flg)
410adebc6cSBarry Smith {
42ab8d36c9SPeter Brune   SNES_FAS       * fas = (SNES_FAS*)snes->data;
43ab8d36c9SPeter Brune   PetscErrorCode ierr;
445fd66863SKarl Rupp 
45ab8d36c9SPeter Brune   PetscFunctionBegin;
46ab8d36c9SPeter Brune   fas->galerkin = flg;
47ab8d36c9SPeter Brune   if (fas->next) {ierr = SNESFASSetGalerkin(fas->next, flg);CHKERRQ(ierr);}
48ab8d36c9SPeter Brune   PetscFunctionReturn(0);
49ab8d36c9SPeter Brune }
506273346dSPeter Brune 
51*25acbd8eSLisandro Dalcin /*@C
52*25acbd8eSLisandro Dalcin    SNESFASGalerkinFunctionDefault - Computes the Galerkin FAS function
536273346dSPeter Brune 
54*25acbd8eSLisandro Dalcin    Input Parameters:
55*25acbd8eSLisandro Dalcin .  snes - the nonlinear solver context
56*25acbd8eSLisandro Dalcin .  X - input vector
57*25acbd8eSLisandro Dalcin .  ctx - the FAS context
58*25acbd8eSLisandro Dalcin 
59*25acbd8eSLisandro Dalcin    Output Parameter:
60*25acbd8eSLisandro Dalcin .  F - output vector
61*25acbd8eSLisandro Dalcin 
62*25acbd8eSLisandro Dalcin    Notes:
63*25acbd8eSLisandro Dalcin    The Galerkin FAS function evalutation is defined as
64*25acbd8eSLisandro Dalcin $  F^l(x^l) = I^l_0 F^0(P^0_l x^l)
65*25acbd8eSLisandro Dalcin 
66*25acbd8eSLisandro Dalcin    Level: developer
67*25acbd8eSLisandro Dalcin 
68*25acbd8eSLisandro Dalcin .keywords: FAS, galerkin
69*25acbd8eSLisandro Dalcin 
70*25acbd8eSLisandro Dalcin .seealso: SNESFASGetGalerkin(), SNESFASSetGalerkin()
71*25acbd8eSLisandro Dalcin @*/
72*25acbd8eSLisandro Dalcin PetscErrorCode SNESFASGalerkinFunctionDefault(SNES snes, Vec X, Vec F, void *ctx)
730adebc6cSBarry Smith {
746273346dSPeter Brune   SNES           fassnes;
756273346dSPeter Brune   SNES_FAS       *fas;
766273346dSPeter Brune   SNES_FAS       *prevfas;
776273346dSPeter Brune   SNES           prevsnes;
7875d4ebe3SPeter Brune   Vec            b_temp;
796273346dSPeter Brune   PetscErrorCode ierr;
800adebc6cSBarry Smith 
816273346dSPeter Brune   PetscFunctionBegin;
826273346dSPeter Brune   /* prolong to the fine level and evaluate there. */
836273346dSPeter Brune   fassnes  = (SNES)ctx;
846273346dSPeter Brune   fas      = (SNES_FAS*)fassnes->data;
856273346dSPeter Brune   prevsnes = fas->previous;
866273346dSPeter Brune   prevfas  = (SNES_FAS*)prevsnes->data;
876273346dSPeter Brune   /* interpolate down the solution */
886273346dSPeter Brune   ierr = MatInterpolate(prevfas->interpolate, X, prevfas->Xg);CHKERRQ(ierr);
8975d4ebe3SPeter Brune   /* the RHS we care about is at the coarsest level */
9075d4ebe3SPeter Brune   b_temp            = prevsnes->vec_rhs;
910298fd71SBarry Smith   prevsnes->vec_rhs = NULL;
926273346dSPeter Brune   ierr              = SNESComputeFunction(prevsnes, prevfas->Xg, prevfas->Fg);CHKERRQ(ierr);
9375d4ebe3SPeter Brune   prevsnes->vec_rhs = b_temp;
946273346dSPeter Brune   /* restrict up the function */
956273346dSPeter Brune   ierr = MatRestrict(prevfas->restrct, prevfas->Fg, F);CHKERRQ(ierr);
966273346dSPeter Brune   PetscFunctionReturn(0);
976273346dSPeter Brune }
98