xref: /petsc/src/snes/impls/fas/fasgalerkin.c (revision 75d4ebe3a78e655905b048a7ef0b0a8c45565957)
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