16273346dSPeter Brune #include "../src/snes/impls/fas/fasimpls.h" 26273346dSPeter Brune 36273346dSPeter Brune #undef __FUNCT__ 46273346dSPeter Brune #define __FUNCT__ "SNESFASGalerkinDefaultFunction" 56273346dSPeter Brune /* 66273346dSPeter Brune SNESFASGalerkinDefaultFunction 76273346dSPeter Brune 86273346dSPeter Brune */ 96273346dSPeter Brune PetscErrorCode SNESFASGalerkinDefaultFunction(SNES snes, Vec X, Vec F, void * ctx) { 106273346dSPeter Brune /* the Galerkin FAS function evalutation is defined as 116273346dSPeter Brune F^l(x^l) = I^l_0F^0(P^0_lx^l) 126273346dSPeter Brune */ 136273346dSPeter Brune SNES fassnes; 146273346dSPeter Brune SNES_FAS * fas; 156273346dSPeter Brune SNES_FAS * prevfas; 166273346dSPeter Brune SNES prevsnes; 17*75d4ebe3SPeter Brune Vec b_temp; 186273346dSPeter Brune PetscErrorCode ierr; 196273346dSPeter Brune PetscFunctionBegin; 206273346dSPeter Brune /* prolong to the fine level and evaluate there. */ 216273346dSPeter Brune fassnes = (SNES)ctx; 226273346dSPeter Brune fas = (SNES_FAS *)fassnes->data; 236273346dSPeter Brune prevsnes = fas->previous; 246273346dSPeter Brune prevfas = (SNES_FAS *)prevsnes->data; 256273346dSPeter Brune /* interpolate down the solution */ 266273346dSPeter Brune ierr = MatInterpolate(prevfas->interpolate, X, prevfas->Xg);CHKERRQ(ierr); 27*75d4ebe3SPeter Brune /* the RHS we care about is at the coarsest level */ 28*75d4ebe3SPeter Brune b_temp = prevsnes->vec_rhs; 29*75d4ebe3SPeter Brune prevsnes->vec_rhs = PETSC_NULL; 306273346dSPeter Brune ierr = SNESComputeFunction(prevsnes, prevfas->Xg, prevfas->Fg);CHKERRQ(ierr); 31*75d4ebe3SPeter Brune prevsnes->vec_rhs = b_temp; 326273346dSPeter Brune /* restrict up the function */ 336273346dSPeter Brune ierr = MatRestrict(prevfas->restrct, prevfas->Fg, F);CHKERRQ(ierr); 346273346dSPeter Brune PetscFunctionReturn(0); 356273346dSPeter Brune } 36