Actual source code: fasgalerkin.c
petsc-3.3-p7 2013-05-11
1: #include "../src/snes/impls/fas/fasimpls.h" /*I "petscsnesfas.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: SNES_FAS * fas = (SNES_FAS *)snes->data;
23: *flg = fas->galerkin;
24: return(0);
25: }
29: /*@
30: SNESFASSetGalerkin - Sets coarse problems as formed by projection to the fine problem
32: Input Parameter:
33: . snes - the nonlinear solver context
34: . flg - the status of the galerkin problem
36: Level: advanced
38: .keywords: FAS, galerkin
40: .seealso: SNESFASSetLevels(), SNESFASGetGalerkin()
41: @*/
42: PetscErrorCode SNESFASSetGalerkin(SNES snes, PetscBool flg) {
43: SNES_FAS * fas = (SNES_FAS *)snes->data;
46: fas->galerkin = flg;
47: if (fas->next) {SNESFASSetGalerkin(fas->next, flg);}
48: return(0);
49: }
53: /*
54: SNESFASGalerkinDefaultFunction
56: */
57: PetscErrorCode SNESFASGalerkinDefaultFunction(SNES snes, Vec X, Vec F, void * ctx) {
58: /* the Galerkin FAS function evalutation is defined as
59: F^l(x^l) = I^l_0F^0(P^0_lx^l)
60: */
61: SNES fassnes;
62: SNES_FAS * fas;
63: SNES_FAS * prevfas;
64: SNES prevsnes;
65: Vec b_temp;
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: MatInterpolate(prevfas->interpolate, X, prevfas->Xg);
75: /* the RHS we care about is at the coarsest level */
76: b_temp = prevsnes->vec_rhs;
77: prevsnes->vec_rhs = PETSC_NULL;
78: SNESComputeFunction(prevsnes, prevfas->Xg, prevfas->Fg);
79: prevsnes->vec_rhs = b_temp;
80: /* restrict up the function */
81: MatRestrict(prevfas->restrct, prevfas->Fg, F);
82: return(0);
83: }