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