xref: /petsc/src/snes/tutorials/ex6.c (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
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 
239371c9d4SSatish Balay int main(int argc, char **argv) {
24c4421ceaSFande Kong   SNES          snes;       /* SNES context */
25c4421ceaSFande Kong   KSP           ksp;        /* KSP context */
26c4421ceaSFande Kong   Vec           x, r, F, U; /* vectors */
27c4421ceaSFande Kong   Mat           J;          /* Jacobian matrix */
28c4421ceaSFande Kong   ReasonViewCtx monP;       /* monitoring context */
29c4421ceaSFande Kong   PetscInt      its, n = 5, i;
30c4421ceaSFande Kong   PetscMPIInt   size;
31c4421ceaSFande Kong   PetscScalar   h, xp, v;
32c4421ceaSFande Kong   MPI_Comm      comm;
33c4421ceaSFande Kong 
34327415f7SBarry Smith   PetscFunctionBeginUser;
359566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
369566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
37be096a46SBarry Smith   PetscCheck(size == 1, PETSC_COMM_SELF, PETSC_ERR_WRONG_MPI_SIZE, "This is a uniprocessor example only!");
389566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL));
39c4421ceaSFande Kong   h    = 1.0 / (n - 1);
40c4421ceaSFande Kong   comm = PETSC_COMM_WORLD;
41c4421ceaSFande Kong   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
42c4421ceaSFande Kong      Create nonlinear solver context
43c4421ceaSFande Kong      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
44c4421ceaSFande Kong 
459566063dSJacob Faibussowitsch   PetscCall(SNESCreate(comm, &snes));
46c4421ceaSFande Kong 
47c4421ceaSFande Kong   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
48c4421ceaSFande Kong      Create vector data structures; set function evaluation routine
49c4421ceaSFande Kong      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
50c4421ceaSFande Kong   /*
51c4421ceaSFande Kong      Note that we form 1 vector from scratch and then duplicate as needed.
52c4421ceaSFande Kong   */
539566063dSJacob Faibussowitsch   PetscCall(VecCreate(comm, &x));
549566063dSJacob Faibussowitsch   PetscCall(VecSetSizes(x, PETSC_DECIDE, n));
559566063dSJacob Faibussowitsch   PetscCall(VecSetFromOptions(x));
569566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(x, &r));
579566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(x, &F));
589566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(x, &U));
59c4421ceaSFande Kong 
60c4421ceaSFande Kong   /*
61c4421ceaSFande Kong      Set function evaluation routine and vector
62c4421ceaSFande Kong   */
639566063dSJacob Faibussowitsch   PetscCall(SNESSetFunction(snes, r, FormFunction, (void *)F));
64c4421ceaSFande Kong 
65c4421ceaSFande Kong   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
66c4421ceaSFande Kong      Create matrix data structure; set Jacobian evaluation routine
67c4421ceaSFande Kong      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
68c4421ceaSFande Kong 
699566063dSJacob Faibussowitsch   PetscCall(MatCreate(comm, &J));
709566063dSJacob Faibussowitsch   PetscCall(MatSetSizes(J, PETSC_DECIDE, PETSC_DECIDE, n, n));
719566063dSJacob Faibussowitsch   PetscCall(MatSetFromOptions(J));
729566063dSJacob Faibussowitsch   PetscCall(MatSeqAIJSetPreallocation(J, 3, NULL));
73c4421ceaSFande Kong 
74c4421ceaSFande Kong   /*
75c4421ceaSFande Kong      Set Jacobian matrix data structure and default Jacobian evaluation
76c4421ceaSFande Kong      routine. User can override with:
77c4421ceaSFande Kong      -snes_fd : default finite differencing approximation of Jacobian
78c4421ceaSFande Kong      -snes_mf : matrix-free Newton-Krylov method with no preconditioning
79c4421ceaSFande Kong                 (unless user explicitly sets preconditioner)
80c4421ceaSFande Kong      -snes_mf_operator : form preconditioning matrix as set by the user,
81c4421ceaSFande Kong                          but use matrix-free approx for Jacobian-vector
82c4421ceaSFande Kong                          products within Newton-Krylov method
83c4421ceaSFande Kong   */
84c4421ceaSFande Kong 
859566063dSJacob Faibussowitsch   PetscCall(SNESSetJacobian(snes, J, J, FormJacobian, NULL));
86c4421ceaSFande Kong 
87c4421ceaSFande Kong   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
88c4421ceaSFande Kong      Customize nonlinear solver; set runtime options
89c4421ceaSFande Kong    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
90c4421ceaSFande Kong 
91c4421ceaSFande Kong   /*
92c4421ceaSFande Kong      Set an optional user-defined reasonview routine
93c4421ceaSFande Kong   */
949566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIGetStdout(comm, &monP.viewer));
95c4421ceaSFande Kong   /* Just make sure we can not repeat addding the same function
96c4421ceaSFande Kong    * PETSc will be able to igore the repeated function
97c4421ceaSFande Kong    */
98*48a46eb9SPierre Jolivet   for (i = 0; i < 4; i++) PetscCall(SNESConvergedReasonViewSet(snes, MySNESConvergedReasonView, &monP, 0));
999566063dSJacob Faibussowitsch   PetscCall(SNESGetKSP(snes, &ksp));
100c4421ceaSFande Kong   /* Just make sure we can not repeat addding the same function
101c4421ceaSFande Kong    * PETSc will be able to igore the repeated function
102c4421ceaSFande Kong    */
103*48a46eb9SPierre Jolivet   for (i = 0; i < 4; i++) PetscCall(KSPConvergedReasonViewSet(ksp, MyKSPConvergedReasonView, &monP, 0));
104c4421ceaSFande Kong   /*
105c4421ceaSFande Kong      Set SNES/KSP/KSP/PC runtime options, e.g.,
106c4421ceaSFande Kong          -snes_view -snes_monitor -ksp_type <ksp> -pc_type <pc>
107c4421ceaSFande Kong   */
1089566063dSJacob Faibussowitsch   PetscCall(SNESSetFromOptions(snes));
109c4421ceaSFande Kong 
110c4421ceaSFande Kong   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
111c4421ceaSFande Kong      Initialize application:
112c4421ceaSFande Kong      Store right-hand-side of PDE and exact solution
113c4421ceaSFande Kong    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
114c4421ceaSFande Kong 
115c4421ceaSFande Kong   xp = 0.0;
116c4421ceaSFande Kong   for (i = 0; i < n; i++) {
117c4421ceaSFande Kong     v = 6.0 * xp + PetscPowScalar(xp + 1.e-12, 6.0); /* +1.e-12 is to prevent 0^6 */
1189566063dSJacob Faibussowitsch     PetscCall(VecSetValues(F, 1, &i, &v, INSERT_VALUES));
119c4421ceaSFande Kong     v = xp * xp * xp;
1209566063dSJacob Faibussowitsch     PetscCall(VecSetValues(U, 1, &i, &v, INSERT_VALUES));
121c4421ceaSFande Kong     xp += h;
122c4421ceaSFande Kong   }
123c4421ceaSFande Kong 
124c4421ceaSFande Kong   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
125c4421ceaSFande Kong      Evaluate initial guess; then solve nonlinear system
126c4421ceaSFande Kong    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
127c4421ceaSFande Kong   /*
128c4421ceaSFande Kong      Note: The user should initialize the vector, x, with the initial guess
129c4421ceaSFande Kong      for the nonlinear solver prior to calling SNESSolve().  In particular,
130c4421ceaSFande Kong      to employ an initial guess of zero, the user should explicitly set
131c4421ceaSFande Kong      this vector to zero by calling VecSet().
132c4421ceaSFande Kong   */
1339566063dSJacob Faibussowitsch   PetscCall(FormInitialGuess(x));
1349566063dSJacob Faibussowitsch   PetscCall(SNESSolve(snes, NULL, x));
1359566063dSJacob Faibussowitsch   PetscCall(SNESGetIterationNumber(snes, &its));
136c4421ceaSFande Kong 
137c4421ceaSFande Kong   /*
138c4421ceaSFande Kong      Free work space.  All PETSc objects should be destroyed when they
139c4421ceaSFande Kong      are no longer needed.
140c4421ceaSFande Kong   */
1419371c9d4SSatish Balay   PetscCall(VecDestroy(&x));
1429371c9d4SSatish Balay   PetscCall(VecDestroy(&r));
1439371c9d4SSatish Balay   PetscCall(VecDestroy(&U));
1449371c9d4SSatish Balay   PetscCall(VecDestroy(&F));
1459371c9d4SSatish Balay   PetscCall(MatDestroy(&J));
1469371c9d4SSatish Balay   PetscCall(SNESDestroy(&snes));
1479566063dSJacob Faibussowitsch   /*PetscCall(PetscViewerDestroy(&monP.viewer));*/
1489566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
149b122ec5aSJacob Faibussowitsch   return 0;
150c4421ceaSFande Kong }
151c4421ceaSFande Kong /* ------------------------------------------------------------------- */
152c4421ceaSFande Kong /*
153c4421ceaSFande Kong    FormInitialGuess - Computes initial guess.
154c4421ceaSFande Kong 
155c4421ceaSFande Kong    Input/Output Parameter:
156c4421ceaSFande Kong .  x - the solution vector
157c4421ceaSFande Kong */
1589371c9d4SSatish Balay PetscErrorCode FormInitialGuess(Vec x) {
159c4421ceaSFande Kong   PetscScalar pfive = .50;
1609566063dSJacob Faibussowitsch   PetscCall(VecSet(x, pfive));
161c4421ceaSFande Kong   return 0;
162c4421ceaSFande Kong }
163c4421ceaSFande Kong /* ------------------------------------------------------------------- */
164c4421ceaSFande Kong /*
165c4421ceaSFande Kong    FormFunction - Evaluates nonlinear function, F(x).
166c4421ceaSFande Kong 
167c4421ceaSFande Kong    Input Parameters:
168c4421ceaSFande Kong .  snes - the SNES context
169c4421ceaSFande Kong .  x - input vector
170c4421ceaSFande Kong .  ctx - optional user-defined context, as set by SNESSetFunction()
171c4421ceaSFande Kong 
172c4421ceaSFande Kong    Output Parameter:
173c4421ceaSFande Kong .  f - function vector
174c4421ceaSFande Kong 
175c4421ceaSFande Kong    Note:
176c4421ceaSFande Kong    The user-defined context can contain any application-specific data
177c4421ceaSFande Kong    needed for the function evaluation (such as various parameters, work
178c4421ceaSFande Kong    vectors, and grid information).  In this program the context is just
179c4421ceaSFande Kong    a vector containing the right-hand-side of the discretized PDE.
180c4421ceaSFande Kong  */
181c4421ceaSFande Kong 
1829371c9d4SSatish Balay PetscErrorCode FormFunction(SNES snes, Vec x, Vec f, void *ctx) {
183c4421ceaSFande Kong   Vec                g = (Vec)ctx;
184c4421ceaSFande Kong   const PetscScalar *xx, *gg;
185c4421ceaSFande Kong   PetscScalar       *ff, d;
186c4421ceaSFande Kong   PetscInt           i, n;
187c4421ceaSFande Kong 
188c4421ceaSFande Kong   /*
189c4421ceaSFande Kong      Get pointers to vector data.
190c4421ceaSFande Kong        - For default PETSc vectors, VecGetArray() returns a pointer to
191c4421ceaSFande Kong          the data array.  Otherwise, the routine is implementation dependent.
192c4421ceaSFande Kong        - You MUST call VecRestoreArray() when you no longer need access to
193c4421ceaSFande Kong          the array.
194c4421ceaSFande Kong   */
1959566063dSJacob Faibussowitsch   PetscCall(VecGetArrayRead(x, &xx));
1969566063dSJacob Faibussowitsch   PetscCall(VecGetArray(f, &ff));
1979566063dSJacob Faibussowitsch   PetscCall(VecGetArrayRead(g, &gg));
198c4421ceaSFande Kong 
199c4421ceaSFande Kong   /*
200c4421ceaSFande Kong      Compute function
201c4421ceaSFande Kong   */
2029566063dSJacob Faibussowitsch   PetscCall(VecGetSize(x, &n));
2039371c9d4SSatish Balay   d     = (PetscReal)(n - 1);
2049371c9d4SSatish Balay   d     = d * d;
205c4421ceaSFande Kong   ff[0] = xx[0];
206c4421ceaSFande 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];
207c4421ceaSFande Kong   ff[n - 1] = xx[n - 1] - 1.0;
208c4421ceaSFande Kong 
209c4421ceaSFande Kong   /*
210c4421ceaSFande Kong      Restore vectors
211c4421ceaSFande Kong   */
2129566063dSJacob Faibussowitsch   PetscCall(VecRestoreArrayRead(x, &xx));
2139566063dSJacob Faibussowitsch   PetscCall(VecRestoreArray(f, &ff));
2149566063dSJacob Faibussowitsch   PetscCall(VecRestoreArrayRead(g, &gg));
215c4421ceaSFande Kong   return 0;
216c4421ceaSFande Kong }
217c4421ceaSFande Kong /* ------------------------------------------------------------------- */
218c4421ceaSFande Kong /*
219c4421ceaSFande Kong    FormJacobian - Evaluates Jacobian matrix.
220c4421ceaSFande Kong 
221c4421ceaSFande Kong    Input Parameters:
222c4421ceaSFande Kong .  snes - the SNES context
223c4421ceaSFande Kong .  x - input vector
224c4421ceaSFande Kong .  dummy - optional user-defined context (not used here)
225c4421ceaSFande Kong 
226c4421ceaSFande Kong    Output Parameters:
227c4421ceaSFande Kong .  jac - Jacobian matrix
228c4421ceaSFande Kong .  B - optionally different preconditioning matrix
229c4421ceaSFande Kong 
230c4421ceaSFande Kong */
231c4421ceaSFande Kong 
2329371c9d4SSatish Balay PetscErrorCode FormJacobian(SNES snes, Vec x, Mat jac, Mat B, void *dummy) {
233c4421ceaSFande Kong   const PetscScalar *xx;
234c4421ceaSFande Kong   PetscScalar        A[3], d;
235c4421ceaSFande Kong   PetscInt           i, n, j[3];
236c4421ceaSFande Kong 
237c4421ceaSFande Kong   /*
238c4421ceaSFande Kong      Get pointer to vector data
239c4421ceaSFande Kong   */
2409566063dSJacob Faibussowitsch   PetscCall(VecGetArrayRead(x, &xx));
241c4421ceaSFande Kong 
242c4421ceaSFande Kong   /*
243c4421ceaSFande Kong      Compute Jacobian entries and insert into matrix.
244c4421ceaSFande Kong       - Note that in this case we set all elements for a particular
245c4421ceaSFande Kong         row at once.
246c4421ceaSFande Kong   */
2479566063dSJacob Faibussowitsch   PetscCall(VecGetSize(x, &n));
2489371c9d4SSatish Balay   d = (PetscReal)(n - 1);
2499371c9d4SSatish Balay   d = d * d;
250c4421ceaSFande Kong 
251c4421ceaSFande Kong   /*
252c4421ceaSFande Kong      Interior grid points
253c4421ceaSFande Kong   */
254c4421ceaSFande Kong   for (i = 1; i < n - 1; i++) {
2559371c9d4SSatish Balay     j[0] = i - 1;
2569371c9d4SSatish Balay     j[1] = i;
2579371c9d4SSatish Balay     j[2] = i + 1;
2589371c9d4SSatish Balay     A[0] = A[2] = d;
2599371c9d4SSatish Balay     A[1]        = -2.0 * d + 2.0 * xx[i];
2609566063dSJacob Faibussowitsch     PetscCall(MatSetValues(B, 1, &i, 3, j, A, INSERT_VALUES));
261c4421ceaSFande Kong   }
262c4421ceaSFande Kong 
263c4421ceaSFande Kong   /*
264c4421ceaSFande Kong      Boundary points
265c4421ceaSFande Kong   */
2669371c9d4SSatish Balay   i    = 0;
2679371c9d4SSatish Balay   A[0] = 1.0;
268c4421ceaSFande Kong 
2699566063dSJacob Faibussowitsch   PetscCall(MatSetValues(B, 1, &i, 1, &i, A, INSERT_VALUES));
270c4421ceaSFande Kong 
2719371c9d4SSatish Balay   i    = n - 1;
2729371c9d4SSatish Balay   A[0] = 1.0;
273c4421ceaSFande Kong 
2749566063dSJacob Faibussowitsch   PetscCall(MatSetValues(B, 1, &i, 1, &i, A, INSERT_VALUES));
275c4421ceaSFande Kong 
276c4421ceaSFande Kong   /*
277c4421ceaSFande Kong      Restore vector
278c4421ceaSFande Kong   */
2799566063dSJacob Faibussowitsch   PetscCall(VecRestoreArrayRead(x, &xx));
280c4421ceaSFande Kong 
281c4421ceaSFande Kong   /*
282c4421ceaSFande Kong      Assemble matrix
283c4421ceaSFande Kong   */
2849566063dSJacob Faibussowitsch   PetscCall(MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY));
2859566063dSJacob Faibussowitsch   PetscCall(MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY));
286c4421ceaSFande Kong   if (jac != B) {
2879566063dSJacob Faibussowitsch     PetscCall(MatAssemblyBegin(jac, MAT_FINAL_ASSEMBLY));
2889566063dSJacob Faibussowitsch     PetscCall(MatAssemblyEnd(jac, MAT_FINAL_ASSEMBLY));
289c4421ceaSFande Kong   }
290c4421ceaSFande Kong   return 0;
291c4421ceaSFande Kong }
292c4421ceaSFande Kong 
2939371c9d4SSatish Balay PetscErrorCode MySNESConvergedReasonView(SNES snes, void *ctx) {
294c4421ceaSFande Kong   ReasonViewCtx      *monP   = (ReasonViewCtx *)ctx;
295c4421ceaSFande Kong   PetscViewer         viewer = monP->viewer;
296c4421ceaSFande Kong   SNESConvergedReason reason;
297c4421ceaSFande Kong   const char         *strreason;
298c4421ceaSFande Kong 
2999566063dSJacob Faibussowitsch   PetscCall(SNESGetConvergedReason(snes, &reason));
3009566063dSJacob Faibussowitsch   PetscCall(SNESGetConvergedReasonString(snes, &strreason));
3019566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "Customized SNES converged reason view\n"));
3029566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIAddTab(viewer, 1));
303c4421ceaSFande Kong   if (reason > 0) {
3049566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Converged due to %s\n", strreason));
305c4421ceaSFande Kong   } else if (reason <= 0) {
3069566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Did not converge due to %s\n", strreason));
307c4421ceaSFande Kong   }
3089566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIISubtractTab(viewer, 1));
309c4421ceaSFande Kong   return 0;
310c4421ceaSFande Kong }
311c4421ceaSFande Kong 
3129371c9d4SSatish Balay PetscErrorCode MyKSPConvergedReasonView(KSP ksp, void *ctx) {
313c4421ceaSFande Kong   ReasonViewCtx     *monP   = (ReasonViewCtx *)ctx;
314c4421ceaSFande Kong   PetscViewer        viewer = monP->viewer;
315c4421ceaSFande Kong   KSPConvergedReason reason;
316c4421ceaSFande Kong   const char        *reasonstr;
317c4421ceaSFande Kong 
3189566063dSJacob Faibussowitsch   PetscCall(KSPGetConvergedReason(ksp, &reason));
3199566063dSJacob Faibussowitsch   PetscCall(KSPGetConvergedReasonString(ksp, &reasonstr));
3209566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIAddTab(viewer, 2));
3219566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "Customized KSP converged reason view\n"));
3229566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIAddTab(viewer, 1));
323c4421ceaSFande Kong   if (reason > 0) {
3249566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Converged due to %s\n", reasonstr));
325c4421ceaSFande Kong   } else if (reason <= 0) {
3269566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Did not converge due to %s\n", reasonstr));
327c4421ceaSFande Kong   }
3289566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIISubtractTab(viewer, 3));
329c4421ceaSFande Kong   return 0;
330c4421ceaSFande Kong }
331c4421ceaSFande Kong 
332c4421ceaSFande Kong /*TEST
333c4421ceaSFande Kong 
334c4421ceaSFande Kong    test:
335c4421ceaSFande Kong       suffix: 1
336c4421ceaSFande Kong       nsize: 1
337bc44df21SStefano Zampini       filter: sed -e "s/CONVERGED_ATOL/CONVERGED_RTOL/g"
338c4421ceaSFande Kong 
339c4421ceaSFande Kong    test:
340c4421ceaSFande Kong       suffix: 2
341c4421ceaSFande Kong       nsize: 1
342c4421ceaSFande Kong       args: -ksp_converged_reason_view_cancel
343bc44df21SStefano Zampini       filter: sed -e "s/CONVERGED_ATOL/CONVERGED_RTOL/g"
344c4421ceaSFande Kong 
345c4421ceaSFande Kong    test:
346c4421ceaSFande Kong       suffix: 3
347c4421ceaSFande Kong       nsize: 1
348c4421ceaSFande Kong       args: -ksp_converged_reason_view_cancel -ksp_converged_reason
349bc44df21SStefano Zampini       filter: sed -e "s/CONVERGED_ATOL/CONVERGED_RTOL/g"
350c4421ceaSFande Kong 
351c4421ceaSFande Kong    test:
352c4421ceaSFande Kong       suffix: 4
353c4421ceaSFande Kong       nsize: 1
354c4421ceaSFande Kong       args: -snes_converged_reason_view_cancel
355bc44df21SStefano Zampini       filter: sed -e "s/CONVERGED_ATOL/CONVERGED_RTOL/g"
356c4421ceaSFande Kong 
357c4421ceaSFande Kong    test:
358c4421ceaSFande Kong       suffix: 5
359c4421ceaSFande Kong       nsize: 1
360c4421ceaSFande Kong       args: -snes_converged_reason_view_cancel -snes_converged_reason
361bc44df21SStefano Zampini       filter: sed -e "s/CONVERGED_ATOL/CONVERGED_RTOL/g"
362c4421ceaSFande Kong 
363c4421ceaSFande Kong TEST*/
364