xref: /petsc/src/ts/tutorials/advection-diffusion-reaction/ex5adj.c (revision b122ec5aa1bd4469eb4e0673542fb7de3f411254)
1c4762a1bSJed Brown static char help[] = "Demonstrates adjoint sensitivity analysis for Reaction-Diffusion Equations.\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown /*
4c4762a1bSJed Brown   See ex5.c for details on the equation.
5c4762a1bSJed Brown   This code demonestrates the TSAdjoint interface to a system of time-dependent partial differential equations.
6c4762a1bSJed Brown   It computes the sensitivity of a component in the final solution, which locates in the center of the 2D domain, w.r.t. the initial conditions.
7c4762a1bSJed Brown   The user does not need to provide any additional functions. The required functions in the original simulation are reused in the adjoint run.
8c4762a1bSJed Brown 
9c4762a1bSJed Brown   Runtime options:
10c4762a1bSJed Brown     -forwardonly  - run the forward simulation without adjoint
11c4762a1bSJed Brown     -implicitform - provide IFunction and IJacobian to TS, if not set, RHSFunction and RHSJacobian will be used
12c4762a1bSJed Brown     -aijpc        - set the preconditioner matrix to be aij (the Jacobian matrix can be of a different type such as ELL)
13c4762a1bSJed Brown */
1460f0b76eSHong Zhang #include "reaction_diffusion.h"
15c4762a1bSJed Brown #include <petscdm.h>
16c4762a1bSJed Brown #include <petscdmda.h>
17c4762a1bSJed Brown 
18c4762a1bSJed Brown PetscErrorCode InitialConditions(DM,Vec);
19c4762a1bSJed Brown 
20c4762a1bSJed Brown PetscErrorCode InitializeLambda(DM da,Vec lambda,PetscReal x,PetscReal y)
21c4762a1bSJed Brown {
22c4762a1bSJed Brown    PetscInt i,j,Mx,My,xs,ys,xm,ym;
23c4762a1bSJed Brown    Field **l;
24c4762a1bSJed Brown    PetscFunctionBegin;
25c4762a1bSJed Brown 
265f80ce2aSJacob Faibussowitsch    CHKERRQ(DMDAGetInfo(da,PETSC_IGNORE,&Mx,&My,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE));
27c4762a1bSJed Brown    /* locate the global i index for x and j index for y */
28c4762a1bSJed Brown    i = (PetscInt)(x*(Mx-1));
29c4762a1bSJed Brown    j = (PetscInt)(y*(My-1));
305f80ce2aSJacob Faibussowitsch    CHKERRQ(DMDAGetCorners(da,&xs,&ys,NULL,&xm,&ym,NULL));
31c4762a1bSJed Brown 
32c4762a1bSJed Brown    if (xs <= i && i < xs+xm && ys <= j && j < ys+ym) {
33c4762a1bSJed Brown      /* the i,j vertex is on this process */
345f80ce2aSJacob Faibussowitsch      CHKERRQ(DMDAVecGetArray(da,lambda,&l));
35c4762a1bSJed Brown      l[j][i].u = 1.0;
36c4762a1bSJed Brown      l[j][i].v = 1.0;
375f80ce2aSJacob Faibussowitsch      CHKERRQ(DMDAVecRestoreArray(da,lambda,&l));
38c4762a1bSJed Brown    }
39c4762a1bSJed Brown    PetscFunctionReturn(0);
40c4762a1bSJed Brown }
41c4762a1bSJed Brown 
42c4762a1bSJed Brown int main(int argc,char **argv)
43c4762a1bSJed Brown {
44c4762a1bSJed Brown   TS        ts;                 /* ODE integrator */
45c4762a1bSJed Brown   Vec       x;                  /* solution */
46c4762a1bSJed Brown   DM        da;
47c4762a1bSJed Brown   AppCtx    appctx;
48c4762a1bSJed Brown   Vec       lambda[1];
49c4762a1bSJed Brown   PetscBool forwardonly = PETSC_FALSE,implicitform=PETSC_TRUE;
50c4762a1bSJed Brown 
51*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscInitialize(&argc,&argv,(char*)0,help));
525f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-forwardonly",&forwardonly,NULL));
535f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-implicitform",&implicitform,NULL));
54c4762a1bSJed Brown   appctx.aijpc = PETSC_FALSE;
555f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-aijpc",&appctx.aijpc,NULL));
56c4762a1bSJed Brown 
57c4762a1bSJed Brown   appctx.D1    = 8.0e-5;
58c4762a1bSJed Brown   appctx.D2    = 4.0e-5;
59c4762a1bSJed Brown   appctx.gamma = .024;
60c4762a1bSJed Brown   appctx.kappa = .06;
61c4762a1bSJed Brown 
62c4762a1bSJed Brown   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
63c4762a1bSJed Brown      Create distributed array (DMDA) to manage parallel grid and vectors
64c4762a1bSJed Brown   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
655f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDACreate2d(PETSC_COMM_WORLD,DM_BOUNDARY_PERIODIC,DM_BOUNDARY_PERIODIC,DMDA_STENCIL_STAR,64,64,PETSC_DECIDE,PETSC_DECIDE,2,1,NULL,NULL,&da));
665f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetFromOptions(da));
675f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetUp(da));
685f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDASetFieldName(da,0,"u"));
695f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDASetFieldName(da,1,"v"));
70c4762a1bSJed Brown 
71c4762a1bSJed Brown   /*  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
72c4762a1bSJed Brown      Extract global vectors from DMDA; then duplicate for remaining
73c4762a1bSJed Brown      vectors that are the same types
74c4762a1bSJed Brown    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
755f80ce2aSJacob Faibussowitsch   CHKERRQ(DMCreateGlobalVector(da,&x));
76c4762a1bSJed Brown 
77c4762a1bSJed Brown   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
78c4762a1bSJed Brown      Create timestepping solver context
79c4762a1bSJed Brown      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
805f80ce2aSJacob Faibussowitsch   CHKERRQ(TSCreate(PETSC_COMM_WORLD,&ts));
815f80ce2aSJacob Faibussowitsch   CHKERRQ(TSSetDM(ts,da));
825f80ce2aSJacob Faibussowitsch   CHKERRQ(TSSetProblemType(ts,TS_NONLINEAR));
835f80ce2aSJacob Faibussowitsch   CHKERRQ(TSSetEquationType(ts,TS_EQ_ODE_EXPLICIT)); /* less Jacobian evaluations when adjoint BEuler is used, otherwise no effect */
84c4762a1bSJed Brown   if (!implicitform) {
855f80ce2aSJacob Faibussowitsch     CHKERRQ(TSSetType(ts,TSRK));
865f80ce2aSJacob Faibussowitsch     CHKERRQ(TSSetRHSFunction(ts,NULL,RHSFunction,&appctx));
875f80ce2aSJacob Faibussowitsch     CHKERRQ(TSSetRHSJacobian(ts,NULL,NULL,RHSJacobian,&appctx));
88c4762a1bSJed Brown   } else {
895f80ce2aSJacob Faibussowitsch     CHKERRQ(TSSetType(ts,TSCN));
905f80ce2aSJacob Faibussowitsch     CHKERRQ(TSSetIFunction(ts,NULL,IFunction,&appctx));
91c4762a1bSJed Brown     if (appctx.aijpc) {
92c4762a1bSJed Brown       Mat                    A,B;
93c4762a1bSJed Brown 
945f80ce2aSJacob Faibussowitsch       CHKERRQ(DMSetMatType(da,MATSELL));
955f80ce2aSJacob Faibussowitsch       CHKERRQ(DMCreateMatrix(da,&A));
965f80ce2aSJacob Faibussowitsch       CHKERRQ(MatConvert(A,MATAIJ,MAT_INITIAL_MATRIX,&B));
97c4762a1bSJed Brown       /* FIXME do we need to change viewer to display matrix in natural ordering as DMCreateMatrix_DA does? */
985f80ce2aSJacob Faibussowitsch       CHKERRQ(TSSetIJacobian(ts,A,B,IJacobian,&appctx));
995f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&A));
1005f80ce2aSJacob Faibussowitsch       CHKERRQ(MatDestroy(&B));
101c4762a1bSJed Brown     } else {
1025f80ce2aSJacob Faibussowitsch       CHKERRQ(TSSetIJacobian(ts,NULL,NULL,IJacobian,&appctx));
103c4762a1bSJed Brown     }
104c4762a1bSJed Brown   }
105c4762a1bSJed Brown 
106c4762a1bSJed Brown   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
107c4762a1bSJed Brown      Set initial conditions
108c4762a1bSJed Brown    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1095f80ce2aSJacob Faibussowitsch   CHKERRQ(InitialConditions(da,x));
1105f80ce2aSJacob Faibussowitsch   CHKERRQ(TSSetSolution(ts,x));
111c4762a1bSJed Brown 
112c4762a1bSJed Brown   /*
113c4762a1bSJed Brown     Have the TS save its trajectory so that TSAdjointSolve() may be used
114c4762a1bSJed Brown   */
1155f80ce2aSJacob Faibussowitsch   if (!forwardonly) CHKERRQ(TSSetSaveTrajectory(ts));
116c4762a1bSJed Brown 
117c4762a1bSJed Brown   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
118c4762a1bSJed Brown      Set solver options
119c4762a1bSJed Brown    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1205f80ce2aSJacob Faibussowitsch   CHKERRQ(TSSetMaxTime(ts,200.0));
1215f80ce2aSJacob Faibussowitsch   CHKERRQ(TSSetTimeStep(ts,0.5));
1225f80ce2aSJacob Faibussowitsch   CHKERRQ(TSSetExactFinalTime(ts,TS_EXACTFINALTIME_MATCHSTEP));
1235f80ce2aSJacob Faibussowitsch   CHKERRQ(TSSetFromOptions(ts));
124c4762a1bSJed Brown 
125c4762a1bSJed Brown   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
126c4762a1bSJed Brown      Solve ODE system
127c4762a1bSJed Brown      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1285f80ce2aSJacob Faibussowitsch   CHKERRQ(TSSolve(ts,x));
129c4762a1bSJed Brown   if (!forwardonly) {
130c4762a1bSJed Brown     /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
131c4762a1bSJed Brown        Start the Adjoint model
132c4762a1bSJed Brown        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1335f80ce2aSJacob Faibussowitsch     CHKERRQ(VecDuplicate(x,&lambda[0]));
134c4762a1bSJed Brown     /*   Reset initial conditions for the adjoint integration */
1355f80ce2aSJacob Faibussowitsch     CHKERRQ(InitializeLambda(da,lambda[0],0.5,0.5));
1365f80ce2aSJacob Faibussowitsch     CHKERRQ(TSSetCostGradients(ts,1,lambda,NULL));
1375f80ce2aSJacob Faibussowitsch     CHKERRQ(TSAdjointSolve(ts));
1385f80ce2aSJacob Faibussowitsch     CHKERRQ(VecDestroy(&lambda[0]));
139c4762a1bSJed Brown   }
140c4762a1bSJed Brown   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
141c4762a1bSJed Brown      Free work space.  All PETSc objects should be destroyed when they
142c4762a1bSJed Brown      are no longer needed.
143c4762a1bSJed Brown    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
1445f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&x));
1455f80ce2aSJacob Faibussowitsch   CHKERRQ(TSDestroy(&ts));
1465f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&da));
147*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscFinalize());
148*b122ec5aSJacob Faibussowitsch   return 0;
149c4762a1bSJed Brown }
150c4762a1bSJed Brown 
151c4762a1bSJed Brown /* ------------------------------------------------------------------- */
152c4762a1bSJed Brown PetscErrorCode InitialConditions(DM da,Vec U)
153c4762a1bSJed Brown {
154c4762a1bSJed Brown   PetscInt       i,j,xs,ys,xm,ym,Mx,My;
155c4762a1bSJed Brown   Field          **u;
156c4762a1bSJed Brown   PetscReal      hx,hy,x,y;
157c4762a1bSJed Brown 
158c4762a1bSJed Brown   PetscFunctionBegin;
1595f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDAGetInfo(da,PETSC_IGNORE,&Mx,&My,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE,PETSC_IGNORE));
160c4762a1bSJed Brown 
161c4762a1bSJed Brown   hx = 2.5/(PetscReal)Mx;
162c4762a1bSJed Brown   hy = 2.5/(PetscReal)My;
163c4762a1bSJed Brown 
164c4762a1bSJed Brown   /*
165c4762a1bSJed Brown      Get pointers to vector data
166c4762a1bSJed Brown   */
1675f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDAVecGetArray(da,U,&u));
168c4762a1bSJed Brown 
169c4762a1bSJed Brown   /*
170c4762a1bSJed Brown      Get local grid boundaries
171c4762a1bSJed Brown   */
1725f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDAGetCorners(da,&xs,&ys,NULL,&xm,&ym,NULL));
173c4762a1bSJed Brown 
174c4762a1bSJed Brown   /*
175c4762a1bSJed Brown      Compute function over the locally owned part of the grid
176c4762a1bSJed Brown   */
177c4762a1bSJed Brown   for (j=ys; j<ys+ym; j++) {
178c4762a1bSJed Brown     y = j*hy;
179c4762a1bSJed Brown     for (i=xs; i<xs+xm; i++) {
180c4762a1bSJed Brown       x = i*hx;
18166baab88SBarry Smith       if (PetscApproximateGTE(x,1.0) && PetscApproximateLTE(x,1.5) && PetscApproximateGTE(y,1.0) && PetscApproximateLTE(y,1.5)) u[j][i].v = PetscPowReal(PetscSinReal(4.0*PETSC_PI*x),2.0)*PetscPowReal(PetscSinReal(4.0*PETSC_PI*y),2.0)/4.0;
182c4762a1bSJed Brown       else u[j][i].v = 0.0;
183c4762a1bSJed Brown 
184c4762a1bSJed Brown       u[j][i].u = 1.0 - 2.0*u[j][i].v;
185c4762a1bSJed Brown     }
186c4762a1bSJed Brown   }
187c4762a1bSJed Brown 
188c4762a1bSJed Brown   /*
189c4762a1bSJed Brown      Restore vectors
190c4762a1bSJed Brown   */
1915f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDAVecRestoreArray(da,U,&u));
192c4762a1bSJed Brown   PetscFunctionReturn(0);
193c4762a1bSJed Brown }
194c4762a1bSJed Brown 
195c4762a1bSJed Brown /*TEST
196c4762a1bSJed Brown 
197c4762a1bSJed Brown    build:
19860f0b76eSHong Zhang       depends: reaction_diffusion.c
199c4762a1bSJed Brown       requires: !complex !single
200c4762a1bSJed Brown 
201c4762a1bSJed Brown    test:
202c4762a1bSJed Brown       args: -ts_max_steps 10 -ts_monitor -ts_adjoint_monitor -da_grid_x 20 -da_grid_y 20
203c4762a1bSJed Brown       output_file: output/ex5adj_1.out
204c4762a1bSJed Brown 
205c4762a1bSJed Brown    test:
206c4762a1bSJed Brown       suffix: 2
207c4762a1bSJed Brown       nsize: 2
208c4762a1bSJed Brown       args: -ts_max_steps 10 -ts_dt 10 -ts_monitor -ts_adjoint_monitor -ksp_monitor_short -da_grid_x 20 -da_grid_y 20 -ts_trajectory_dirname Test-dir -ts_trajectory_file_template test-%06D.cp
209c4762a1bSJed Brown 
210c4762a1bSJed Brown    test:
211c4762a1bSJed Brown       suffix: 3
212c4762a1bSJed Brown       nsize: 2
213c4762a1bSJed Brown       args: -ts_max_steps 10 -ts_dt 10 -ts_adjoint_monitor_draw_sensi
214c4762a1bSJed Brown 
215c4762a1bSJed Brown    test:
216c4762a1bSJed Brown       suffix: 4
217c4762a1bSJed Brown       nsize: 2
218c4762a1bSJed Brown       args: -ts_max_steps 10 -ts_dt 10 -ts_monitor -ts_adjoint_monitor -ksp_monitor_short -da_grid_x 20 -da_grid_y 20 -snes_fd_color
219c4762a1bSJed Brown       output_file: output/ex5adj_2.out
220c4762a1bSJed Brown 
221c4762a1bSJed Brown    test:
222c4762a1bSJed Brown       suffix: 5
223c4762a1bSJed Brown       nsize: 2
224c4762a1bSJed Brown       args: -ts_max_steps 10 -implicitform 0 -ts_type rk -ts_rk_type 4 -ts_monitor -ts_adjoint_monitor -da_grid_x 20 -da_grid_y 20 -snes_fd_color
225c4762a1bSJed Brown       output_file: output/ex5adj_1.out
226c4762a1bSJed Brown 
227c4762a1bSJed Brown    test:
228c4762a1bSJed Brown       suffix: knl
229c4762a1bSJed Brown       args: -ts_max_steps 10 -ts_monitor -ts_adjoint_monitor -ts_trajectory_type memory -ts_trajectory_solution_only 0 -malloc_hbw -ts_trajectory_use_dram 1
230c4762a1bSJed Brown       output_file: output/ex5adj_3.out
231c4762a1bSJed Brown       requires: knl
232c4762a1bSJed Brown 
233c4762a1bSJed Brown    test:
234c4762a1bSJed Brown       suffix: sell
235c4762a1bSJed Brown       nsize: 4
236c4762a1bSJed Brown       args: -forwardonly -ts_max_steps 10 -ts_monitor -snes_monitor_short -dm_mat_type sell -pc_type none
237c4762a1bSJed Brown       output_file: output/ex5adj_sell_1.out
238c4762a1bSJed Brown 
239c4762a1bSJed Brown    test:
240c4762a1bSJed Brown       suffix: aijsell
241c4762a1bSJed Brown       nsize: 4
242c4762a1bSJed Brown       args: -forwardonly -ts_max_steps 10 -ts_monitor -snes_monitor_short -dm_mat_type aijsell -pc_type none
243c4762a1bSJed Brown       output_file: output/ex5adj_sell_1.out
244c4762a1bSJed Brown 
245c4762a1bSJed Brown    test:
246c4762a1bSJed Brown       suffix: sell2
247c4762a1bSJed Brown       nsize: 4
248c4762a1bSJed Brown       args: -forwardonly -ts_max_steps 10 -ts_monitor -snes_monitor_short -dm_mat_type sell -pc_type mg -pc_mg_levels 2 -mg_coarse_pc_type sor
249c4762a1bSJed Brown       output_file: output/ex5adj_sell_2.out
250c4762a1bSJed Brown 
251c4762a1bSJed Brown    test:
252c4762a1bSJed Brown       suffix: aijsell2
253c4762a1bSJed Brown       nsize: 4
254c4762a1bSJed Brown       args: -forwardonly -ts_max_steps 10 -ts_monitor -snes_monitor_short -dm_mat_type aijsell -pc_type mg -pc_mg_levels 2 -mg_coarse_pc_type sor
255c4762a1bSJed Brown       output_file: output/ex5adj_sell_2.out
256c4762a1bSJed Brown 
257c4762a1bSJed Brown    test:
258c4762a1bSJed Brown       suffix: sell3
259c4762a1bSJed Brown       nsize: 4
260c4762a1bSJed Brown       args: -forwardonly -ts_max_steps 10 -ts_monitor -snes_monitor_short -dm_mat_type sell -pc_type mg -pc_mg_levels 2 -mg_coarse_pc_type bjacobi -mg_levels_pc_type bjacobi
261c4762a1bSJed Brown       output_file: output/ex5adj_sell_3.out
262c4762a1bSJed Brown 
263c4762a1bSJed Brown    test:
264c4762a1bSJed Brown       suffix: sell4
265c4762a1bSJed Brown       nsize: 4
266c4762a1bSJed Brown       args: -forwardonly -implicitform -ts_max_steps 10 -ts_monitor -snes_monitor_short -dm_mat_type sell -pc_type mg -pc_mg_levels 2 -mg_coarse_pc_type bjacobi -mg_levels_pc_type bjacobi
267c4762a1bSJed Brown       output_file: output/ex5adj_sell_4.out
268c4762a1bSJed Brown 
269c4762a1bSJed Brown    test:
270c4762a1bSJed Brown       suffix: sell5
271c4762a1bSJed Brown       nsize: 4
272c4762a1bSJed Brown       args: -forwardonly -ts_max_steps 10 -ts_monitor -snes_monitor_short -dm_mat_type sell -aijpc
273c4762a1bSJed Brown       output_file: output/ex5adj_sell_5.out
274c4762a1bSJed Brown 
275c4762a1bSJed Brown    test:
276c4762a1bSJed Brown       suffix: aijsell5
277c4762a1bSJed Brown       nsize: 4
278c4762a1bSJed Brown       args: -forwardonly -ts_max_steps 10 -ts_monitor -snes_monitor_short -dm_mat_type aijsell
279c4762a1bSJed Brown       output_file: output/ex5adj_sell_5.out
280c4762a1bSJed Brown 
281c4762a1bSJed Brown    test:
282c4762a1bSJed Brown       suffix: sell6
283c4762a1bSJed Brown       args: -ts_max_steps 10 -ts_monitor -ts_adjoint_monitor -ts_trajectory_type memory -ts_trajectory_solution_only 0 -dm_mat_type sell -pc_type jacobi
284c4762a1bSJed Brown       output_file: output/ex5adj_sell_6.out
285c4762a1bSJed Brown 
286fcb023d4SJed Brown    test:
287fcb023d4SJed Brown       suffix: gamg1
28873f7197eSJed Brown       args: -pc_type gamg -pc_gamg_esteig_ksp_type gmres -pc_gamg_esteig_ksp_max_it 10 -pc_mg_levels 2 -ksp_monitor_short -ts_max_steps 2 -ts_monitor -ts_adjoint_monitor -ts_trajectory_type memory -ksp_rtol 1e-2 -pc_gamg_use_sa_esteig 0
28973f7197eSJed Brown       output_file: output/ex5adj_gamg.out
290fcb023d4SJed Brown 
29175f8e9bdSHong Zhang    test:
29275f8e9bdSHong Zhang       suffix: gamg2
29373f7197eSJed Brown       args: -pc_type gamg -pc_gamg_esteig_ksp_type gmres -pc_gamg_esteig_ksp_max_it 10 -pc_mg_levels 2 -ksp_monitor_short -ts_max_steps 2 -ts_monitor -ts_adjoint_monitor -ts_trajectory_type memory -ksp_use_explicittranspose -ksp_rtol 1e-2 -pc_gamg_use_sa_esteig 0
29473f7197eSJed Brown       output_file: output/ex5adj_gamg.out
295c4762a1bSJed Brown TEST*/
296