Actual source code: fasgalerkin.c
petsc-3.7.7 2017-09-25
1: #include <../src/snes/impls/fas/fasimpls.h> /*I "petscsnes.h" I*/
5: /*@
6: SNESFASGetGalerkin - Gets if the coarse problems are formed by projection to the fine problem
8: Input Parameter:
9: . snes - the nonlinear solver context
11: Output parameter:
12: . flg - the status of the galerkin problem
14: Level: advanced
16: .keywords: FAS, galerkin
18: .seealso: SNESFASSetLevels(), SNESFASSetGalerkin()
19: @*/
20: PetscErrorCode SNESFASGetGalerkin(SNES snes, PetscBool *flg)
21: {
22: SNES_FAS * fas = (SNES_FAS*)snes->data;
25: *flg = fas->galerkin;
26: return(0);
27: }
31: /*@
32: SNESFASSetGalerkin - Sets coarse problems as formed by projection to the fine problem
34: Input Parameter:
35: . snes - the nonlinear solver context
36: . flg - the status of the galerkin problem
38: Level: advanced
40: .keywords: FAS, galerkin
42: .seealso: SNESFASSetLevels(), SNESFASGetGalerkin()
43: @*/
44: PetscErrorCode SNESFASSetGalerkin(SNES snes, PetscBool flg)
45: {
46: SNES_FAS * fas = (SNES_FAS*)snes->data;
50: fas->galerkin = flg;
51: if (fas->next) {SNESFASSetGalerkin(fas->next, flg);}
52: return(0);
53: }
57: /*
58: SNESFASGalerkinDefaultFunction
60: */
61: PetscErrorCode SNESFASGalerkinDefaultFunction(SNES snes, Vec X, Vec F, void * ctx)
62: {
63: /* the Galerkin FAS function evalutation is defined as
64: F^l(x^l) = I^l_0F^0(P^0_lx^l)
65: */
66: SNES fassnes;
67: SNES_FAS *fas;
68: SNES_FAS *prevfas;
69: SNES prevsnes;
70: Vec b_temp;
74: /* prolong to the fine level and evaluate there. */
75: fassnes = (SNES)ctx;
76: fas = (SNES_FAS*)fassnes->data;
77: prevsnes = fas->previous;
78: prevfas = (SNES_FAS*)prevsnes->data;
79: /* interpolate down the solution */
80: MatInterpolate(prevfas->interpolate, X, prevfas->Xg);
81: /* the RHS we care about is at the coarsest level */
82: b_temp = prevsnes->vec_rhs;
83: prevsnes->vec_rhs = NULL;
84: SNESComputeFunction(prevsnes, prevfas->Xg, prevfas->Fg);
85: prevsnes->vec_rhs = b_temp;
86: /* restrict up the function */
87: MatRestrict(prevfas->restrct, prevfas->Fg, F);
88: return(0);
89: }