1a7b5fb5fSBarry Smith #include <../src/snes/impls/fas/fasimpls.h> /*I "petscsnes.h" I*/ 2ab8d36c9SPeter Brune 3ab8d36c9SPeter Brune /*@ 4ab8d36c9SPeter Brune SNESFASGetGalerkin - Gets if the coarse problems are formed by projection to the fine problem 5ab8d36c9SPeter Brune 6ab8d36c9SPeter Brune Input Parameter: 7ab8d36c9SPeter Brune . snes - the nonlinear solver context 8ab8d36c9SPeter Brune 9ab8d36c9SPeter Brune Output parameter: 10ab8d36c9SPeter Brune . flg - the status of the galerkin problem 11ab8d36c9SPeter Brune 12ab8d36c9SPeter Brune Level: advanced 13ab8d36c9SPeter Brune 14ab8d36c9SPeter Brune .keywords: FAS, galerkin 15ab8d36c9SPeter Brune 16ab8d36c9SPeter Brune .seealso: SNESFASSetLevels(), SNESFASSetGalerkin() 17ab8d36c9SPeter Brune @*/ 180adebc6cSBarry Smith PetscErrorCode SNESFASGetGalerkin(SNES snes, PetscBool *flg) 190adebc6cSBarry Smith { 20ab8d36c9SPeter Brune SNES_FAS * fas = (SNES_FAS*)snes->data; 215fd66863SKarl Rupp 22ab8d36c9SPeter Brune PetscFunctionBegin; 23ab8d36c9SPeter Brune *flg = fas->galerkin; 24ab8d36c9SPeter Brune PetscFunctionReturn(0); 25ab8d36c9SPeter Brune } 26ab8d36c9SPeter Brune 27ab8d36c9SPeter Brune /*@ 28ab8d36c9SPeter Brune SNESFASSetGalerkin - Sets coarse problems as formed by projection to the fine problem 29ab8d36c9SPeter Brune 30ab8d36c9SPeter Brune Input Parameter: 31ab8d36c9SPeter Brune . snes - the nonlinear solver context 32ab8d36c9SPeter Brune . flg - the status of the galerkin problem 33ab8d36c9SPeter Brune 34ab8d36c9SPeter Brune Level: advanced 35ab8d36c9SPeter Brune 36ab8d36c9SPeter Brune .keywords: FAS, galerkin 37ab8d36c9SPeter Brune 38ab8d36c9SPeter Brune .seealso: SNESFASSetLevels(), SNESFASGetGalerkin() 39ab8d36c9SPeter Brune @*/ 400adebc6cSBarry Smith PetscErrorCode SNESFASSetGalerkin(SNES snes, PetscBool flg) 410adebc6cSBarry Smith { 42ab8d36c9SPeter Brune SNES_FAS * fas = (SNES_FAS*)snes->data; 43ab8d36c9SPeter Brune PetscErrorCode ierr; 445fd66863SKarl Rupp 45ab8d36c9SPeter Brune PetscFunctionBegin; 46ab8d36c9SPeter Brune fas->galerkin = flg; 47ab8d36c9SPeter Brune if (fas->next) {ierr = SNESFASSetGalerkin(fas->next, flg);CHKERRQ(ierr);} 48ab8d36c9SPeter Brune PetscFunctionReturn(0); 49ab8d36c9SPeter Brune } 506273346dSPeter Brune 51*25acbd8eSLisandro Dalcin /*@C 52*25acbd8eSLisandro Dalcin SNESFASGalerkinFunctionDefault - Computes the Galerkin FAS function 536273346dSPeter Brune 54*25acbd8eSLisandro Dalcin Input Parameters: 55*25acbd8eSLisandro Dalcin . snes - the nonlinear solver context 56*25acbd8eSLisandro Dalcin . X - input vector 57*25acbd8eSLisandro Dalcin . ctx - the FAS context 58*25acbd8eSLisandro Dalcin 59*25acbd8eSLisandro Dalcin Output Parameter: 60*25acbd8eSLisandro Dalcin . F - output vector 61*25acbd8eSLisandro Dalcin 62*25acbd8eSLisandro Dalcin Notes: 63*25acbd8eSLisandro Dalcin The Galerkin FAS function evalutation is defined as 64*25acbd8eSLisandro Dalcin $ F^l(x^l) = I^l_0 F^0(P^0_l x^l) 65*25acbd8eSLisandro Dalcin 66*25acbd8eSLisandro Dalcin Level: developer 67*25acbd8eSLisandro Dalcin 68*25acbd8eSLisandro Dalcin .keywords: FAS, galerkin 69*25acbd8eSLisandro Dalcin 70*25acbd8eSLisandro Dalcin .seealso: SNESFASGetGalerkin(), SNESFASSetGalerkin() 71*25acbd8eSLisandro Dalcin @*/ 72*25acbd8eSLisandro Dalcin PetscErrorCode SNESFASGalerkinFunctionDefault(SNES snes, Vec X, Vec F, void *ctx) 730adebc6cSBarry Smith { 746273346dSPeter Brune SNES fassnes; 756273346dSPeter Brune SNES_FAS *fas; 766273346dSPeter Brune SNES_FAS *prevfas; 776273346dSPeter Brune SNES prevsnes; 7875d4ebe3SPeter Brune Vec b_temp; 796273346dSPeter Brune PetscErrorCode ierr; 800adebc6cSBarry Smith 816273346dSPeter Brune PetscFunctionBegin; 826273346dSPeter Brune /* prolong to the fine level and evaluate there. */ 836273346dSPeter Brune fassnes = (SNES)ctx; 846273346dSPeter Brune fas = (SNES_FAS*)fassnes->data; 856273346dSPeter Brune prevsnes = fas->previous; 866273346dSPeter Brune prevfas = (SNES_FAS*)prevsnes->data; 876273346dSPeter Brune /* interpolate down the solution */ 886273346dSPeter Brune ierr = MatInterpolate(prevfas->interpolate, X, prevfas->Xg);CHKERRQ(ierr); 8975d4ebe3SPeter Brune /* the RHS we care about is at the coarsest level */ 9075d4ebe3SPeter Brune b_temp = prevsnes->vec_rhs; 910298fd71SBarry Smith prevsnes->vec_rhs = NULL; 926273346dSPeter Brune ierr = SNESComputeFunction(prevsnes, prevfas->Xg, prevfas->Fg);CHKERRQ(ierr); 9375d4ebe3SPeter Brune prevsnes->vec_rhs = b_temp; 946273346dSPeter Brune /* restrict up the function */ 956273346dSPeter Brune ierr = MatRestrict(prevfas->restrct, prevfas->Fg, F);CHKERRQ(ierr); 966273346dSPeter Brune PetscFunctionReturn(0); 976273346dSPeter Brune } 98