Actual source code: fasgalerkin.c
petsc-3.14.6 2021-03-30
1: #include <../src/snes/impls/fas/fasimpls.h>
3: /*@
4: SNESFASGetGalerkin - Gets if the coarse problems are formed by projection to the fine problem
6: Input Parameter:
7: . snes - the nonlinear solver context
9: Output parameter:
10: . flg - the status of the galerkin problem
12: Level: advanced
14: .seealso: SNESFASSetLevels(), SNESFASSetGalerkin()
15: @*/
16: PetscErrorCode SNESFASGetGalerkin(SNES snes, PetscBool *flg)
17: {
18: SNES_FAS *fas;
22: fas = (SNES_FAS*)snes->data;
23: *flg = fas->galerkin;
24: return(0);
25: }
27: /*@
28: SNESFASSetGalerkin - Sets coarse problems as formed by projection to the fine problem
30: Input Parameter:
31: + snes - the nonlinear solver context
32: - flg - the status of the galerkin problem
34: Level: advanced
36: .seealso: SNESFASSetLevels(), SNESFASGetGalerkin()
37: @*/
38: PetscErrorCode SNESFASSetGalerkin(SNES snes, PetscBool flg)
39: {
40: SNES_FAS *fas;
45: fas = (SNES_FAS*)snes->data;
46: fas->galerkin = flg;
47: if (fas->next) {SNESFASSetGalerkin(fas->next, flg);}
48: return(0);
49: }
51: /*@C
52: SNESFASGalerkinFunctionDefault - Computes the Galerkin FAS function
54: Input Parameters:
55: + snes - the nonlinear solver context
56: . X - input vector
57: - ctx - the FAS context
59: Output Parameter:
60: . F - output vector
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)
66: Level: developer
68: .seealso: SNESFASGetGalerkin(), SNESFASSetGalerkin()
69: @*/
70: PetscErrorCode SNESFASGalerkinFunctionDefault(SNES snes, Vec X, Vec F, void *ctx)
71: {
72: SNES fassnes;
73: SNES_FAS *fas;
74: SNES_FAS *prevfas;
75: SNES prevsnes;
76: Vec b_temp;
80: /* prolong to the fine level and evaluate there. */
81: fassnes = (SNES)ctx;
82: fas = (SNES_FAS*)fassnes->data;
83: prevsnes = fas->previous;
84: prevfas = (SNES_FAS*)prevsnes->data;
85: /* interpolate down the solution */
86: MatInterpolate(prevfas->interpolate, X, prevfas->Xg);
87: /* the RHS we care about is at the coarsest level */
88: b_temp = prevsnes->vec_rhs;
89: prevsnes->vec_rhs = NULL;
90: SNESComputeFunction(prevsnes, prevfas->Xg, prevfas->Fg);
91: prevsnes->vec_rhs = b_temp;
92: /* restrict up the function */
93: MatRestrict(prevfas->restrct, prevfas->Fg, F);
94: return(0);
95: }