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 /* 52 SNESFASGalerkinDefaultFunction 53 54 */ 55 PetscErrorCode SNESFASGalerkinDefaultFunction(SNES snes, Vec X, Vec F, void * ctx) 56 { 57 /* the Galerkin FAS function evalutation is defined as 58 F^l(x^l) = I^l_0F^0(P^0_lx^l) 59 */ 60 SNES fassnes; 61 SNES_FAS *fas; 62 SNES_FAS *prevfas; 63 SNES prevsnes; 64 Vec b_temp; 65 PetscErrorCode ierr; 66 67 PetscFunctionBegin; 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 ierr = MatInterpolate(prevfas->interpolate, X, prevfas->Xg);CHKERRQ(ierr); 75 /* the RHS we care about is at the coarsest level */ 76 b_temp = prevsnes->vec_rhs; 77 prevsnes->vec_rhs = NULL; 78 ierr = SNESComputeFunction(prevsnes, prevfas->Xg, prevfas->Fg);CHKERRQ(ierr); 79 prevsnes->vec_rhs = b_temp; 80 /* restrict up the function */ 81 ierr = MatRestrict(prevfas->restrct, prevfas->Fg, F);CHKERRQ(ierr); 82 PetscFunctionReturn(0); 83 } 84