Actual source code: fasgalerkin.c
petsc-3.11.4 2019-09-28
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: .keywords: FAS, galerkin
16: .seealso: SNESFASSetLevels(), SNESFASSetGalerkin()
17: @*/
18: PetscErrorCode SNESFASGetGalerkin(SNES snes, PetscBool *flg)
19: {
20: SNES_FAS * 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: .keywords: FAS, galerkin
38: .seealso: SNESFASSetLevels(), SNESFASGetGalerkin()
39: @*/
40: PetscErrorCode SNESFASSetGalerkin(SNES snes, PetscBool flg)
41: {
42: SNES_FAS * 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: .keywords: FAS, galerkin
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;
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: MatInterpolate(prevfas->interpolate, X, prevfas->Xg);
89: /* the RHS we care about is at the coarsest level */
90: b_temp = prevsnes->vec_rhs;
91: prevsnes->vec_rhs = NULL;
92: SNESComputeFunction(prevsnes, prevfas->Xg, prevfas->Fg);
93: prevsnes->vec_rhs = b_temp;
94: /* restrict up the function */
95: MatRestrict(prevfas->restrct, prevfas->Fg, F);
96: return(0);
97: }