1 #include "../src/snes/impls/fas/fasimpls.h" 2 3 #undef __FUNCT__ 4 #define __FUNCT__ "SNESFASGalerkinDefaultFunction" 5 /* 6 SNESFASGalerkinDefaultFunction 7 8 9 */ 10 PetscErrorCode SNESFASGalerkinDefaultFunction(SNES snes, Vec X, Vec F, void * ctx) { 11 /* the Galerkin FAS function evalutation is defined as 12 F^l(x^l) = I^l_0F^0(P^0_lx^l) 13 */ 14 SNES fassnes; 15 SNES_FAS * fas; 16 SNES_FAS * prevfas; 17 SNES prevsnes; 18 PetscErrorCode ierr; 19 PetscFunctionBegin; 20 /* prolong to the fine level and evaluate there. */ 21 fassnes = (SNES)ctx; 22 fas = (SNES_FAS *)fassnes->data; 23 prevsnes = fas->previous; 24 prevfas = (SNES_FAS *)prevsnes->data; 25 /* interpolate down the solution */ 26 ierr = MatInterpolate(prevfas->interpolate, X, prevfas->Xg);CHKERRQ(ierr); 27 ierr = SNESComputeFunction(prevsnes, prevfas->Xg, prevfas->Fg);CHKERRQ(ierr); 28 /* restrict up the function */ 29 if (prevfas->inject) { 30 ierr = MatRestrict(prevfas->inject, prevfas->Fg, F);CHKERRQ(ierr); 31 } else { 32 ierr = MatRestrict(prevfas->restrct, prevfas->Fg, F);CHKERRQ(ierr); 33 } 34 PetscFunctionReturn(0); 35 } 36