xref: /petsc/src/snes/impls/fas/fasgalerkin.c (revision 5e71baeff2f3138f93cd4f5927dfd596eb8325cc)
1 #include <../src/snes/impls/fas/fasimpls.h> /*I  "petscsnes.h"  I*/
2 
3 /*@
4    SNESFASGetGalerkin - Gets if the coarse problems are formed by projection to the fine problem
5 
6    Input Parameter:
7 .  snes - the nonlinear solver context
8 
9    Output parameter:
10 .  flg - the status of the galerkin problem
11 
12    Level: advanced
13 
14 .keywords: FAS, galerkin
15 
16 .seealso: SNESFASSetLevels(), SNESFASSetGalerkin()
17 @*/
18 PetscErrorCode SNESFASGetGalerkin(SNES snes, PetscBool *flg)
19 {
20   SNES_FAS * fas = (SNES_FAS*)snes->data;
21 
22   PetscFunctionBegin;
23   *flg = fas->galerkin;
24   PetscFunctionReturn(0);
25 }
26 
27 /*@
28    SNESFASSetGalerkin - Sets coarse problems as formed by projection to the fine problem
29 
30    Input Parameter:
31 .  snes - the nonlinear solver context
32 .  flg - the status of the galerkin problem
33 
34    Level: advanced
35 
36 .keywords: FAS, galerkin
37 
38 .seealso: SNESFASSetLevels(), SNESFASGetGalerkin()
39 @*/
40 PetscErrorCode SNESFASSetGalerkin(SNES snes, PetscBool flg)
41 {
42   SNES_FAS       * fas = (SNES_FAS*)snes->data;
43   PetscErrorCode ierr;
44 
45   PetscFunctionBegin;
46   fas->galerkin = flg;
47   if (fas->next) {ierr = SNESFASSetGalerkin(fas->next, flg);CHKERRQ(ierr);}
48   PetscFunctionReturn(0);
49 }
50 
51 /*
52 SNESFASGalerkinDefaultFunction
53 
54  */
55 PetscErrorCode SNESFASGalerkinDefaultFunction(SNES snes, Vec X, Vec F, void * ctx)
56 {
57   /* the Galerkin FAS function evalutation is defined as
58    F^l(x^l) = I^l_0F^0(P^0_lx^l)
59    */
60   SNES           fassnes;
61   SNES_FAS       *fas;
62   SNES_FAS       *prevfas;
63   SNES           prevsnes;
64   Vec            b_temp;
65   PetscErrorCode ierr;
66 
67   PetscFunctionBegin;
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   ierr = MatInterpolate(prevfas->interpolate, X, prevfas->Xg);CHKERRQ(ierr);
75   /* the RHS we care about is at the coarsest level */
76   b_temp            = prevsnes->vec_rhs;
77   prevsnes->vec_rhs = NULL;
78   ierr              = SNESComputeFunction(prevsnes, prevfas->Xg, prevfas->Fg);CHKERRQ(ierr);
79   prevsnes->vec_rhs = b_temp;
80   /* restrict up the function */
81   ierr = MatRestrict(prevfas->restrct, prevfas->Fg, F);CHKERRQ(ierr);
82   PetscFunctionReturn(0);
83 }
84