xref: /petsc/src/snes/impls/fas/fasgalerkin.c (revision e5a36eccef3d6b83a2c625c30d0dfd5adb4001f2)
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 /*@C
52    SNESFASGalerkinFunctionDefault - Computes the Galerkin FAS function
53 
54    Input Parameters:
55 .  snes - the nonlinear solver context
56 .  X - input vector
57 .  ctx - the FAS context
58 
59    Output Parameter:
60 .  F - output vector
61 
62    Notes:
63    The Galerkin FAS function evalutation is defined as
64 $  F^l(x^l) = I^l_0 F^0(P^0_l x^l)
65 
66    Level: developer
67 
68 .keywords: FAS, galerkin
69 
70 .seealso: SNESFASGetGalerkin(), SNESFASSetGalerkin()
71 @*/
72 PetscErrorCode SNESFASGalerkinFunctionDefault(SNES snes, Vec X, Vec F, void *ctx)
73 {
74   SNES           fassnes;
75   SNES_FAS       *fas;
76   SNES_FAS       *prevfas;
77   SNES           prevsnes;
78   Vec            b_temp;
79   PetscErrorCode ierr;
80 
81   PetscFunctionBegin;
82   /* prolong to the fine level and evaluate there. */
83   fassnes  = (SNES)ctx;
84   fas      = (SNES_FAS*)fassnes->data;
85   prevsnes = fas->previous;
86   prevfas  = (SNES_FAS*)prevsnes->data;
87   /* interpolate down the solution */
88   ierr = MatInterpolate(prevfas->interpolate, X, prevfas->Xg);CHKERRQ(ierr);
89   /* the RHS we care about is at the coarsest level */
90   b_temp            = prevsnes->vec_rhs;
91   prevsnes->vec_rhs = NULL;
92   ierr              = SNESComputeFunction(prevsnes, prevfas->Xg, prevfas->Fg);CHKERRQ(ierr);
93   prevsnes->vec_rhs = b_temp;
94   /* restrict up the function */
95   ierr = MatRestrict(prevfas->restrct, prevfas->Fg, F);CHKERRQ(ierr);
96   PetscFunctionReturn(0);
97 }
98