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