xref: /petsc/src/snes/impls/fas/fasgalerkin.c (revision 4e8208cbcbc709572b8abe32f33c78b69c819375)
1a7b5fb5fSBarry Smith #include <../src/snes/impls/fas/fasimpls.h> /*I  "petscsnes.h"  I*/
2ab8d36c9SPeter Brune 
3ab8d36c9SPeter Brune /*@
4ab8d36c9SPeter Brune   SNESFASGetGalerkin - Gets if the coarse problems are formed by projection to the fine problem
5ab8d36c9SPeter Brune 
6420bcc1bSBarry Smith   Not Collective but the result would be the same on all MPI processes
7f6dfbefdSBarry Smith 
8ab8d36c9SPeter Brune   Input Parameter:
9f6dfbefdSBarry Smith . snes - the `SNESFAS` nonlinear solver context
10ab8d36c9SPeter Brune 
11e4094ef1SJacob Faibussowitsch   Output Parameter:
12f6dfbefdSBarry Smith . flg - `PETSC_TRUE` if the coarse problem is formed by projection
13ab8d36c9SPeter Brune 
14ab8d36c9SPeter Brune   Level: advanced
15ab8d36c9SPeter Brune 
16420bcc1bSBarry Smith .seealso: [](ch_snes), `SNES`, `SNESFAS`, `SNESFASSetLevels()`, `SNESFASSetGalerkin()`
17ab8d36c9SPeter Brune @*/
SNESFASGetGalerkin(SNES snes,PetscBool * flg)18d71ae5a4SJacob Faibussowitsch PetscErrorCode SNESFASGetGalerkin(SNES snes, PetscBool *flg)
19d71ae5a4SJacob Faibussowitsch {
20f833ba53SLisandro Dalcin   SNES_FAS *fas;
215fd66863SKarl Rupp 
22ab8d36c9SPeter Brune   PetscFunctionBegin;
23f833ba53SLisandro Dalcin   PetscValidHeaderSpecificType(snes, SNES_CLASSID, 1, SNESFAS);
24f833ba53SLisandro Dalcin   fas  = (SNES_FAS *)snes->data;
25ab8d36c9SPeter Brune   *flg = fas->galerkin;
263ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
27ab8d36c9SPeter Brune }
28ab8d36c9SPeter Brune 
29ab8d36c9SPeter Brune /*@
30ab8d36c9SPeter Brune   SNESFASSetGalerkin - Sets coarse problems as formed by projection to the fine problem
31ab8d36c9SPeter Brune 
32420bcc1bSBarry Smith   Logically Collective
33f6dfbefdSBarry Smith 
34d8d19677SJose E. Roman   Input Parameters:
35f6dfbefdSBarry Smith + snes - the `SNESFAS` nonlinear solver context
36f6dfbefdSBarry Smith - flg  - `PETSC_TRUE` to use the projection process
37ab8d36c9SPeter Brune 
38ab8d36c9SPeter Brune   Level: advanced
39ab8d36c9SPeter Brune 
40420bcc1bSBarry Smith .seealso: [](ch_snes), `SNES`, `SNESFAS`, `SNESFASSetLevels()`, `SNESFASGetGalerkin()`
41ab8d36c9SPeter Brune @*/
SNESFASSetGalerkin(SNES snes,PetscBool flg)42d71ae5a4SJacob Faibussowitsch PetscErrorCode SNESFASSetGalerkin(SNES snes, PetscBool flg)
43d71ae5a4SJacob Faibussowitsch {
44f833ba53SLisandro Dalcin   SNES_FAS *fas;
455fd66863SKarl Rupp 
46ab8d36c9SPeter Brune   PetscFunctionBegin;
47f833ba53SLisandro Dalcin   PetscValidHeaderSpecificType(snes, SNES_CLASSID, 1, SNESFAS);
48f833ba53SLisandro Dalcin   fas           = (SNES_FAS *)snes->data;
49ab8d36c9SPeter Brune   fas->galerkin = flg;
509566063dSJacob Faibussowitsch   if (fas->next) PetscCall(SNESFASSetGalerkin(fas->next, flg));
513ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
52ab8d36c9SPeter Brune }
536273346dSPeter Brune 
5425acbd8eSLisandro Dalcin /*@C
5525acbd8eSLisandro Dalcin   SNESFASGalerkinFunctionDefault - Computes the Galerkin FAS function
566273346dSPeter Brune 
57c3339decSBarry Smith   Collective
58f6dfbefdSBarry Smith 
5925acbd8eSLisandro Dalcin   Input Parameters:
60f6dfbefdSBarry Smith + snes - the `SNESFAS` nonlinear solver context
6125acbd8eSLisandro Dalcin . X    - input vector
62f6dfbefdSBarry Smith - ctx  - the application context
6325acbd8eSLisandro Dalcin 
6425acbd8eSLisandro Dalcin   Output Parameter:
6525acbd8eSLisandro Dalcin . F - output vector
6625acbd8eSLisandro Dalcin 
6720f4b53cSBarry Smith   Level: developer
6820f4b53cSBarry Smith 
69f6dfbefdSBarry Smith   Note:
70da81f932SPierre Jolivet   The Galerkin FAS function evaluation is defined as
71b44f4de4SBarry Smith 
72b44f4de4SBarry Smith   $$
73b44f4de4SBarry Smith   F^l(x^l) = I^l_0 F^0(P^0_l x^l)
74b44f4de4SBarry Smith   $$
7525acbd8eSLisandro Dalcin 
76420bcc1bSBarry Smith .seealso: [](ch_snes), `SNES`, `SNESFAS`, `SNESFASGetGalerkin()`, `SNESFASSetGalerkin()`
7725acbd8eSLisandro Dalcin @*/
SNESFASGalerkinFunctionDefault(SNES snes,Vec X,Vec F,PetscCtx ctx)78*2a8381b2SBarry Smith PetscErrorCode SNESFASGalerkinFunctionDefault(SNES snes, Vec X, Vec F, PetscCtx ctx)
79d71ae5a4SJacob Faibussowitsch {
806273346dSPeter Brune   SNES      fassnes;
816273346dSPeter Brune   SNES_FAS *fas;
826273346dSPeter Brune   SNES_FAS *prevfas;
836273346dSPeter Brune   SNES      prevsnes;
8475d4ebe3SPeter Brune   Vec       b_temp;
850adebc6cSBarry Smith 
866273346dSPeter Brune   PetscFunctionBegin;
876273346dSPeter Brune   /* prolong to the fine level and evaluate there. */
886273346dSPeter Brune   fassnes  = (SNES)ctx;
896273346dSPeter Brune   fas      = (SNES_FAS *)fassnes->data;
906273346dSPeter Brune   prevsnes = fas->previous;
916273346dSPeter Brune   prevfas  = (SNES_FAS *)prevsnes->data;
926273346dSPeter Brune   /* interpolate down the solution */
939566063dSJacob Faibussowitsch   PetscCall(MatInterpolate(prevfas->interpolate, X, prevfas->Xg));
9475d4ebe3SPeter Brune   /* the RHS we care about is at the coarsest level */
9575d4ebe3SPeter Brune   b_temp            = prevsnes->vec_rhs;
960298fd71SBarry Smith   prevsnes->vec_rhs = NULL;
979566063dSJacob Faibussowitsch   PetscCall(SNESComputeFunction(prevsnes, prevfas->Xg, prevfas->Fg));
9875d4ebe3SPeter Brune   prevsnes->vec_rhs = b_temp;
996273346dSPeter Brune   /* restrict up the function */
1009566063dSJacob Faibussowitsch   PetscCall(MatRestrict(prevfas->restrct, prevfas->Fg, F));
1013ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1026273346dSPeter Brune }
103