xref: /petsc/src/snes/tutorials/ex6.c (revision d5b43468fb8780a8feea140ccd6fa3e6a50411cc)
1c4421ceaSFande Kong 
2c4421ceaSFande Kong static char help[] = "Newton method to solve u'' + u^{2} = f, sequentially.\n\
3c4421ceaSFande Kong This example employs a user-defined reasonview routine.\n\n";
4c4421ceaSFande Kong 
5c4421ceaSFande Kong #include <petscsnes.h>
6c4421ceaSFande Kong 
7c4421ceaSFande Kong /*
8c4421ceaSFande Kong    User-defined routines
9c4421ceaSFande Kong */
10c4421ceaSFande Kong PETSC_EXTERN PetscErrorCode FormJacobian(SNES, Vec, Mat, Mat, void *);
11c4421ceaSFande Kong PETSC_EXTERN PetscErrorCode FormFunction(SNES, Vec, Vec, void *);
12c4421ceaSFande Kong PETSC_EXTERN PetscErrorCode FormInitialGuess(Vec);
13c4421ceaSFande Kong PETSC_EXTERN PetscErrorCode MySNESConvergedReasonView(SNES, void *);
14c4421ceaSFande Kong PETSC_EXTERN PetscErrorCode MyKSPConvergedReasonView(KSP, void *);
15c4421ceaSFande Kong 
16c4421ceaSFande Kong /*
17c4421ceaSFande Kong    User-defined context for monitoring
18c4421ceaSFande Kong */
19c4421ceaSFande Kong typedef struct {
20c4421ceaSFande Kong   PetscViewer viewer;
21c4421ceaSFande Kong } ReasonViewCtx;
22c4421ceaSFande Kong 
23d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
24d71ae5a4SJacob Faibussowitsch {
25c4421ceaSFande Kong   SNES          snes;       /* SNES context */
26c4421ceaSFande Kong   KSP           ksp;        /* KSP context */
27c4421ceaSFande Kong   Vec           x, r, F, U; /* vectors */
28c4421ceaSFande Kong   Mat           J;          /* Jacobian matrix */
29c4421ceaSFande Kong   ReasonViewCtx monP;       /* monitoring context */
30c4421ceaSFande Kong   PetscInt      its, n = 5, i;
31c4421ceaSFande Kong   PetscMPIInt   size;
32c4421ceaSFande Kong   PetscScalar   h, xp, v;
33c4421ceaSFande Kong   MPI_Comm      comm;
34c4421ceaSFande Kong 
35327415f7SBarry Smith   PetscFunctionBeginUser;
369566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
379566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
38be096a46SBarry Smith   PetscCheck(size == 1, PETSC_COMM_SELF, PETSC_ERR_WRONG_MPI_SIZE, "This is a uniprocessor example only!");
399566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL));
40c4421ceaSFande Kong   h    = 1.0 / (n - 1);
41c4421ceaSFande Kong   comm = PETSC_COMM_WORLD;
42c4421ceaSFande Kong   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
43c4421ceaSFande Kong      Create nonlinear solver context
44c4421ceaSFande Kong      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
45c4421ceaSFande Kong 
469566063dSJacob Faibussowitsch   PetscCall(SNESCreate(comm, &snes));
47c4421ceaSFande Kong 
48c4421ceaSFande Kong   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
49c4421ceaSFande Kong      Create vector data structures; set function evaluation routine
50c4421ceaSFande Kong      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
51c4421ceaSFande Kong   /*
52c4421ceaSFande Kong      Note that we form 1 vector from scratch and then duplicate as needed.
53c4421ceaSFande Kong   */
549566063dSJacob Faibussowitsch   PetscCall(VecCreate(comm, &x));
559566063dSJacob Faibussowitsch   PetscCall(VecSetSizes(x, PETSC_DECIDE, n));
569566063dSJacob Faibussowitsch   PetscCall(VecSetFromOptions(x));
579566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(x, &r));
589566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(x, &F));
599566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(x, &U));
60c4421ceaSFande Kong 
61c4421ceaSFande Kong   /*
62c4421ceaSFande Kong      Set function evaluation routine and vector
63c4421ceaSFande Kong   */
649566063dSJacob Faibussowitsch   PetscCall(SNESSetFunction(snes, r, FormFunction, (void *)F));
65c4421ceaSFande Kong 
66c4421ceaSFande Kong   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
67c4421ceaSFande Kong      Create matrix data structure; set Jacobian evaluation routine
68c4421ceaSFande Kong      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
69c4421ceaSFande Kong 
709566063dSJacob Faibussowitsch   PetscCall(MatCreate(comm, &J));
719566063dSJacob Faibussowitsch   PetscCall(MatSetSizes(J, PETSC_DECIDE, PETSC_DECIDE, n, n));
729566063dSJacob Faibussowitsch   PetscCall(MatSetFromOptions(J));
739566063dSJacob Faibussowitsch   PetscCall(MatSeqAIJSetPreallocation(J, 3, NULL));
74c4421ceaSFande Kong 
75c4421ceaSFande Kong   /*
76c4421ceaSFande Kong      Set Jacobian matrix data structure and default Jacobian evaluation
77c4421ceaSFande Kong      routine. User can override with:
78c4421ceaSFande Kong      -snes_fd : default finite differencing approximation of Jacobian
79c4421ceaSFande Kong      -snes_mf : matrix-free Newton-Krylov method with no preconditioning
80c4421ceaSFande Kong                 (unless user explicitly sets preconditioner)
81c4421ceaSFande Kong      -snes_mf_operator : form preconditioning matrix as set by the user,
82c4421ceaSFande Kong                          but use matrix-free approx for Jacobian-vector
83c4421ceaSFande Kong                          products within Newton-Krylov method
84c4421ceaSFande Kong   */
85c4421ceaSFande Kong 
869566063dSJacob Faibussowitsch   PetscCall(SNESSetJacobian(snes, J, J, FormJacobian, NULL));
87c4421ceaSFande Kong 
88c4421ceaSFande Kong   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
89c4421ceaSFande Kong      Customize nonlinear solver; set runtime options
90c4421ceaSFande Kong    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
91c4421ceaSFande Kong 
92c4421ceaSFande Kong   /*
93c4421ceaSFande Kong      Set an optional user-defined reasonview routine
94c4421ceaSFande Kong   */
959566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIGetStdout(comm, &monP.viewer));
96*d5b43468SJose E. Roman   /* Just make sure we can not repeat adding the same function
97c4421ceaSFande Kong    * PETSc will be able to igore the repeated function
98c4421ceaSFande Kong    */
9948a46eb9SPierre Jolivet   for (i = 0; i < 4; i++) PetscCall(SNESConvergedReasonViewSet(snes, MySNESConvergedReasonView, &monP, 0));
1009566063dSJacob Faibussowitsch   PetscCall(SNESGetKSP(snes, &ksp));
101*d5b43468SJose E. Roman   /* Just make sure we can not repeat adding the same function
102c4421ceaSFande Kong    * PETSc will be able to igore the repeated function
103c4421ceaSFande Kong    */
10448a46eb9SPierre Jolivet   for (i = 0; i < 4; i++) PetscCall(KSPConvergedReasonViewSet(ksp, MyKSPConvergedReasonView, &monP, 0));
105c4421ceaSFande Kong   /*
106c4421ceaSFande Kong      Set SNES/KSP/KSP/PC runtime options, e.g.,
107c4421ceaSFande Kong          -snes_view -snes_monitor -ksp_type <ksp> -pc_type <pc>
108c4421ceaSFande Kong   */
1099566063dSJacob Faibussowitsch   PetscCall(SNESSetFromOptions(snes));
110c4421ceaSFande Kong 
111c4421ceaSFande Kong   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
112c4421ceaSFande Kong      Initialize application:
113c4421ceaSFande Kong      Store right-hand-side of PDE and exact solution
114c4421ceaSFande Kong    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
115c4421ceaSFande Kong 
116c4421ceaSFande Kong   xp = 0.0;
117c4421ceaSFande Kong   for (i = 0; i < n; i++) {
118c4421ceaSFande Kong     v = 6.0 * xp + PetscPowScalar(xp + 1.e-12, 6.0); /* +1.e-12 is to prevent 0^6 */
1199566063dSJacob Faibussowitsch     PetscCall(VecSetValues(F, 1, &i, &v, INSERT_VALUES));
120c4421ceaSFande Kong     v = xp * xp * xp;
1219566063dSJacob Faibussowitsch     PetscCall(VecSetValues(U, 1, &i, &v, INSERT_VALUES));
122c4421ceaSFande Kong     xp += h;
123c4421ceaSFande Kong   }
124c4421ceaSFande Kong 
125c4421ceaSFande Kong   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
126c4421ceaSFande Kong      Evaluate initial guess; then solve nonlinear system
127c4421ceaSFande Kong    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
128c4421ceaSFande Kong   /*
129c4421ceaSFande Kong      Note: The user should initialize the vector, x, with the initial guess
130c4421ceaSFande Kong      for the nonlinear solver prior to calling SNESSolve().  In particular,
131c4421ceaSFande Kong      to employ an initial guess of zero, the user should explicitly set
132c4421ceaSFande Kong      this vector to zero by calling VecSet().
133c4421ceaSFande Kong   */
1349566063dSJacob Faibussowitsch   PetscCall(FormInitialGuess(x));
1359566063dSJacob Faibussowitsch   PetscCall(SNESSolve(snes, NULL, x));
1369566063dSJacob Faibussowitsch   PetscCall(SNESGetIterationNumber(snes, &its));
137c4421ceaSFande Kong 
138c4421ceaSFande Kong   /*
139c4421ceaSFande Kong      Free work space.  All PETSc objects should be destroyed when they
140c4421ceaSFande Kong      are no longer needed.
141c4421ceaSFande Kong   */
1429371c9d4SSatish Balay   PetscCall(VecDestroy(&x));
1439371c9d4SSatish Balay   PetscCall(VecDestroy(&r));
1449371c9d4SSatish Balay   PetscCall(VecDestroy(&U));
1459371c9d4SSatish Balay   PetscCall(VecDestroy(&F));
1469371c9d4SSatish Balay   PetscCall(MatDestroy(&J));
1479371c9d4SSatish Balay   PetscCall(SNESDestroy(&snes));
1489566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
149b122ec5aSJacob Faibussowitsch   return 0;
150c4421ceaSFande Kong }
151f6dfbefdSBarry Smith 
152c4421ceaSFande Kong /*
153c4421ceaSFande Kong    FormInitialGuess - Computes initial guess.
154c4421ceaSFande Kong 
155c4421ceaSFande Kong    Input/Output Parameter:
156c4421ceaSFande Kong .  x - the solution vector
157c4421ceaSFande Kong */
158d71ae5a4SJacob Faibussowitsch PetscErrorCode FormInitialGuess(Vec x)
159d71ae5a4SJacob Faibussowitsch {
160c4421ceaSFande Kong   PetscScalar pfive = .50;
1619566063dSJacob Faibussowitsch   PetscCall(VecSet(x, pfive));
162c4421ceaSFande Kong   return 0;
163c4421ceaSFande Kong }
164f6dfbefdSBarry Smith 
165c4421ceaSFande Kong /*
166c4421ceaSFande Kong    FormFunction - Evaluates nonlinear function, F(x).
167c4421ceaSFande Kong 
168c4421ceaSFande Kong    Input Parameters:
169c4421ceaSFande Kong .  snes - the SNES context
170c4421ceaSFande Kong .  x - input vector
171c4421ceaSFande Kong .  ctx - optional user-defined context, as set by SNESSetFunction()
172c4421ceaSFande Kong 
173c4421ceaSFande Kong    Output Parameter:
174c4421ceaSFande Kong .  f - function vector
175c4421ceaSFande Kong 
176c4421ceaSFande Kong    Note:
177c4421ceaSFande Kong    The user-defined context can contain any application-specific data
178c4421ceaSFande Kong    needed for the function evaluation (such as various parameters, work
179c4421ceaSFande Kong    vectors, and grid information).  In this program the context is just
180c4421ceaSFande Kong    a vector containing the right-hand-side of the discretized PDE.
181c4421ceaSFande Kong  */
182c4421ceaSFande Kong 
183d71ae5a4SJacob Faibussowitsch PetscErrorCode FormFunction(SNES snes, Vec x, Vec f, void *ctx)
184d71ae5a4SJacob Faibussowitsch {
185c4421ceaSFande Kong   Vec                g = (Vec)ctx;
186c4421ceaSFande Kong   const PetscScalar *xx, *gg;
187c4421ceaSFande Kong   PetscScalar       *ff, d;
188c4421ceaSFande Kong   PetscInt           i, n;
189c4421ceaSFande Kong 
190c4421ceaSFande Kong   /*
191c4421ceaSFande Kong      Get pointers to vector data.
192c4421ceaSFande Kong        - For default PETSc vectors, VecGetArray() returns a pointer to
193c4421ceaSFande Kong          the data array.  Otherwise, the routine is implementation dependent.
194c4421ceaSFande Kong        - You MUST call VecRestoreArray() when you no longer need access to
195c4421ceaSFande Kong          the array.
196c4421ceaSFande Kong   */
1979566063dSJacob Faibussowitsch   PetscCall(VecGetArrayRead(x, &xx));
1989566063dSJacob Faibussowitsch   PetscCall(VecGetArray(f, &ff));
1999566063dSJacob Faibussowitsch   PetscCall(VecGetArrayRead(g, &gg));
200c4421ceaSFande Kong 
201c4421ceaSFande Kong   /*
202c4421ceaSFande Kong      Compute function
203c4421ceaSFande Kong   */
2049566063dSJacob Faibussowitsch   PetscCall(VecGetSize(x, &n));
2059371c9d4SSatish Balay   d     = (PetscReal)(n - 1);
2069371c9d4SSatish Balay   d     = d * d;
207c4421ceaSFande Kong   ff[0] = xx[0];
208c4421ceaSFande Kong   for (i = 1; i < n - 1; i++) ff[i] = d * (xx[i - 1] - 2.0 * xx[i] + xx[i + 1]) + xx[i] * xx[i] - gg[i];
209c4421ceaSFande Kong   ff[n - 1] = xx[n - 1] - 1.0;
210c4421ceaSFande Kong 
211c4421ceaSFande Kong   /*
212c4421ceaSFande Kong      Restore vectors
213c4421ceaSFande Kong   */
2149566063dSJacob Faibussowitsch   PetscCall(VecRestoreArrayRead(x, &xx));
2159566063dSJacob Faibussowitsch   PetscCall(VecRestoreArray(f, &ff));
2169566063dSJacob Faibussowitsch   PetscCall(VecRestoreArrayRead(g, &gg));
217c4421ceaSFande Kong   return 0;
218c4421ceaSFande Kong }
219c4421ceaSFande Kong /* ------------------------------------------------------------------- */
220c4421ceaSFande Kong /*
221c4421ceaSFande Kong    FormJacobian - Evaluates Jacobian matrix.
222c4421ceaSFande Kong 
223c4421ceaSFande Kong    Input Parameters:
224c4421ceaSFande Kong .  snes - the SNES context
225c4421ceaSFande Kong .  x - input vector
226c4421ceaSFande Kong .  dummy - optional user-defined context (not used here)
227c4421ceaSFande Kong 
228c4421ceaSFande Kong    Output Parameters:
229c4421ceaSFande Kong .  jac - Jacobian matrix
230c4421ceaSFande Kong .  B - optionally different preconditioning matrix
231c4421ceaSFande Kong 
232c4421ceaSFande Kong */
233c4421ceaSFande Kong 
234d71ae5a4SJacob Faibussowitsch PetscErrorCode FormJacobian(SNES snes, Vec x, Mat jac, Mat B, void *dummy)
235d71ae5a4SJacob Faibussowitsch {
236c4421ceaSFande Kong   const PetscScalar *xx;
237c4421ceaSFande Kong   PetscScalar        A[3], d;
238c4421ceaSFande Kong   PetscInt           i, n, j[3];
239c4421ceaSFande Kong 
240c4421ceaSFande Kong   /*
241c4421ceaSFande Kong      Get pointer to vector data
242c4421ceaSFande Kong   */
2439566063dSJacob Faibussowitsch   PetscCall(VecGetArrayRead(x, &xx));
244c4421ceaSFande Kong 
245c4421ceaSFande Kong   /*
246c4421ceaSFande Kong      Compute Jacobian entries and insert into matrix.
247c4421ceaSFande Kong       - Note that in this case we set all elements for a particular
248c4421ceaSFande Kong         row at once.
249c4421ceaSFande Kong   */
2509566063dSJacob Faibussowitsch   PetscCall(VecGetSize(x, &n));
2519371c9d4SSatish Balay   d = (PetscReal)(n - 1);
2529371c9d4SSatish Balay   d = d * d;
253c4421ceaSFande Kong 
254c4421ceaSFande Kong   /*
255c4421ceaSFande Kong      Interior grid points
256c4421ceaSFande Kong   */
257c4421ceaSFande Kong   for (i = 1; i < n - 1; i++) {
2589371c9d4SSatish Balay     j[0] = i - 1;
2599371c9d4SSatish Balay     j[1] = i;
2609371c9d4SSatish Balay     j[2] = i + 1;
2619371c9d4SSatish Balay     A[0] = A[2] = d;
2629371c9d4SSatish Balay     A[1]        = -2.0 * d + 2.0 * xx[i];
2639566063dSJacob Faibussowitsch     PetscCall(MatSetValues(B, 1, &i, 3, j, A, INSERT_VALUES));
264c4421ceaSFande Kong   }
265c4421ceaSFande Kong 
266c4421ceaSFande Kong   /*
267c4421ceaSFande Kong      Boundary points
268c4421ceaSFande Kong   */
2699371c9d4SSatish Balay   i    = 0;
2709371c9d4SSatish Balay   A[0] = 1.0;
271c4421ceaSFande Kong 
2729566063dSJacob Faibussowitsch   PetscCall(MatSetValues(B, 1, &i, 1, &i, A, INSERT_VALUES));
273c4421ceaSFande Kong 
2749371c9d4SSatish Balay   i    = n - 1;
2759371c9d4SSatish Balay   A[0] = 1.0;
276c4421ceaSFande Kong 
2779566063dSJacob Faibussowitsch   PetscCall(MatSetValues(B, 1, &i, 1, &i, A, INSERT_VALUES));
278c4421ceaSFande Kong 
279c4421ceaSFande Kong   /*
280c4421ceaSFande Kong      Restore vector
281c4421ceaSFande Kong   */
2829566063dSJacob Faibussowitsch   PetscCall(VecRestoreArrayRead(x, &xx));
283c4421ceaSFande Kong 
284c4421ceaSFande Kong   /*
285c4421ceaSFande Kong      Assemble matrix
286c4421ceaSFande Kong   */
2879566063dSJacob Faibussowitsch   PetscCall(MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY));
2889566063dSJacob Faibussowitsch   PetscCall(MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY));
289c4421ceaSFande Kong   if (jac != B) {
2909566063dSJacob Faibussowitsch     PetscCall(MatAssemblyBegin(jac, MAT_FINAL_ASSEMBLY));
2919566063dSJacob Faibussowitsch     PetscCall(MatAssemblyEnd(jac, MAT_FINAL_ASSEMBLY));
292c4421ceaSFande Kong   }
293c4421ceaSFande Kong   return 0;
294c4421ceaSFande Kong }
295c4421ceaSFande Kong 
296d71ae5a4SJacob Faibussowitsch PetscErrorCode MySNESConvergedReasonView(SNES snes, void *ctx)
297d71ae5a4SJacob Faibussowitsch {
298c4421ceaSFande Kong   ReasonViewCtx      *monP   = (ReasonViewCtx *)ctx;
299c4421ceaSFande Kong   PetscViewer         viewer = monP->viewer;
300c4421ceaSFande Kong   SNESConvergedReason reason;
301c4421ceaSFande Kong   const char         *strreason;
302c4421ceaSFande Kong 
3039566063dSJacob Faibussowitsch   PetscCall(SNESGetConvergedReason(snes, &reason));
3049566063dSJacob Faibussowitsch   PetscCall(SNESGetConvergedReasonString(snes, &strreason));
3059566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "Customized SNES converged reason view\n"));
3069566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIAddTab(viewer, 1));
307c4421ceaSFande Kong   if (reason > 0) {
3089566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Converged due to %s\n", strreason));
309c4421ceaSFande Kong   } else if (reason <= 0) {
3109566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Did not converge due to %s\n", strreason));
311c4421ceaSFande Kong   }
3129566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIISubtractTab(viewer, 1));
313c4421ceaSFande Kong   return 0;
314c4421ceaSFande Kong }
315c4421ceaSFande Kong 
316d71ae5a4SJacob Faibussowitsch PetscErrorCode MyKSPConvergedReasonView(KSP ksp, void *ctx)
317d71ae5a4SJacob Faibussowitsch {
318c4421ceaSFande Kong   ReasonViewCtx     *monP   = (ReasonViewCtx *)ctx;
319c4421ceaSFande Kong   PetscViewer        viewer = monP->viewer;
320c4421ceaSFande Kong   KSPConvergedReason reason;
321c4421ceaSFande Kong   const char        *reasonstr;
322c4421ceaSFande Kong 
3239566063dSJacob Faibussowitsch   PetscCall(KSPGetConvergedReason(ksp, &reason));
3249566063dSJacob Faibussowitsch   PetscCall(KSPGetConvergedReasonString(ksp, &reasonstr));
3259566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIAddTab(viewer, 2));
3269566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "Customized KSP converged reason view\n"));
3279566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIAddTab(viewer, 1));
328c4421ceaSFande Kong   if (reason > 0) {
3299566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Converged due to %s\n", reasonstr));
330c4421ceaSFande Kong   } else if (reason <= 0) {
3319566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Did not converge due to %s\n", reasonstr));
332c4421ceaSFande Kong   }
3339566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIISubtractTab(viewer, 3));
334c4421ceaSFande Kong   return 0;
335c4421ceaSFande Kong }
336c4421ceaSFande Kong 
337c4421ceaSFande Kong /*TEST
338c4421ceaSFande Kong 
339c4421ceaSFande Kong    test:
340c4421ceaSFande Kong       suffix: 1
341c4421ceaSFande Kong       nsize: 1
342bc44df21SStefano Zampini       filter: sed -e "s/CONVERGED_ATOL/CONVERGED_RTOL/g"
343c4421ceaSFande Kong 
344c4421ceaSFande Kong    test:
345c4421ceaSFande Kong       suffix: 2
346c4421ceaSFande Kong       nsize: 1
347c4421ceaSFande Kong       args: -ksp_converged_reason_view_cancel
348bc44df21SStefano Zampini       filter: sed -e "s/CONVERGED_ATOL/CONVERGED_RTOL/g"
349c4421ceaSFande Kong 
350c4421ceaSFande Kong    test:
351c4421ceaSFande Kong       suffix: 3
352c4421ceaSFande Kong       nsize: 1
353c4421ceaSFande Kong       args: -ksp_converged_reason_view_cancel -ksp_converged_reason
354bc44df21SStefano Zampini       filter: sed -e "s/CONVERGED_ATOL/CONVERGED_RTOL/g"
355c4421ceaSFande Kong 
356c4421ceaSFande Kong    test:
357c4421ceaSFande Kong       suffix: 4
358c4421ceaSFande Kong       nsize: 1
359c4421ceaSFande Kong       args: -snes_converged_reason_view_cancel
360bc44df21SStefano Zampini       filter: sed -e "s/CONVERGED_ATOL/CONVERGED_RTOL/g"
361c4421ceaSFande Kong 
362c4421ceaSFande Kong    test:
363c4421ceaSFande Kong       suffix: 5
364c4421ceaSFande Kong       nsize: 1
365c4421ceaSFande Kong       args: -snes_converged_reason_view_cancel -snes_converged_reason
366bc44df21SStefano Zampini       filter: sed -e "s/CONVERGED_ATOL/CONVERGED_RTOL/g"
367c4421ceaSFande Kong 
368c4421ceaSFande Kong TEST*/
369