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