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 */ 9848a46eb9SPierre 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 */ 10348a46eb9SPierre 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(PetscFinalize()); 148b122ec5aSJacob Faibussowitsch return 0; 149c4421ceaSFande Kong } 150*f6dfbefdSBarry Smith 151c4421ceaSFande Kong /* 152c4421ceaSFande Kong FormInitialGuess - Computes initial guess. 153c4421ceaSFande Kong 154c4421ceaSFande Kong Input/Output Parameter: 155c4421ceaSFande Kong . x - the solution vector 156c4421ceaSFande Kong */ 1579371c9d4SSatish Balay PetscErrorCode FormInitialGuess(Vec x) { 158c4421ceaSFande Kong PetscScalar pfive = .50; 1599566063dSJacob Faibussowitsch PetscCall(VecSet(x, pfive)); 160c4421ceaSFande Kong return 0; 161c4421ceaSFande Kong } 162*f6dfbefdSBarry Smith 163c4421ceaSFande Kong /* 164c4421ceaSFande Kong FormFunction - Evaluates nonlinear function, F(x). 165c4421ceaSFande Kong 166c4421ceaSFande Kong Input Parameters: 167c4421ceaSFande Kong . snes - the SNES context 168c4421ceaSFande Kong . x - input vector 169c4421ceaSFande Kong . ctx - optional user-defined context, as set by SNESSetFunction() 170c4421ceaSFande Kong 171c4421ceaSFande Kong Output Parameter: 172c4421ceaSFande Kong . f - function vector 173c4421ceaSFande Kong 174c4421ceaSFande Kong Note: 175c4421ceaSFande Kong The user-defined context can contain any application-specific data 176c4421ceaSFande Kong needed for the function evaluation (such as various parameters, work 177c4421ceaSFande Kong vectors, and grid information). In this program the context is just 178c4421ceaSFande Kong a vector containing the right-hand-side of the discretized PDE. 179c4421ceaSFande Kong */ 180c4421ceaSFande Kong 1819371c9d4SSatish Balay PetscErrorCode FormFunction(SNES snes, Vec x, Vec f, void *ctx) { 182c4421ceaSFande Kong Vec g = (Vec)ctx; 183c4421ceaSFande Kong const PetscScalar *xx, *gg; 184c4421ceaSFande Kong PetscScalar *ff, d; 185c4421ceaSFande Kong PetscInt i, n; 186c4421ceaSFande Kong 187c4421ceaSFande Kong /* 188c4421ceaSFande Kong Get pointers to vector data. 189c4421ceaSFande Kong - For default PETSc vectors, VecGetArray() returns a pointer to 190c4421ceaSFande Kong the data array. Otherwise, the routine is implementation dependent. 191c4421ceaSFande Kong - You MUST call VecRestoreArray() when you no longer need access to 192c4421ceaSFande Kong the array. 193c4421ceaSFande Kong */ 1949566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(x, &xx)); 1959566063dSJacob Faibussowitsch PetscCall(VecGetArray(f, &ff)); 1969566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(g, &gg)); 197c4421ceaSFande Kong 198c4421ceaSFande Kong /* 199c4421ceaSFande Kong Compute function 200c4421ceaSFande Kong */ 2019566063dSJacob Faibussowitsch PetscCall(VecGetSize(x, &n)); 2029371c9d4SSatish Balay d = (PetscReal)(n - 1); 2039371c9d4SSatish Balay d = d * d; 204c4421ceaSFande Kong ff[0] = xx[0]; 205c4421ceaSFande 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]; 206c4421ceaSFande Kong ff[n - 1] = xx[n - 1] - 1.0; 207c4421ceaSFande Kong 208c4421ceaSFande Kong /* 209c4421ceaSFande Kong Restore vectors 210c4421ceaSFande Kong */ 2119566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(x, &xx)); 2129566063dSJacob Faibussowitsch PetscCall(VecRestoreArray(f, &ff)); 2139566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(g, &gg)); 214c4421ceaSFande Kong return 0; 215c4421ceaSFande Kong } 216c4421ceaSFande Kong /* ------------------------------------------------------------------- */ 217c4421ceaSFande Kong /* 218c4421ceaSFande Kong FormJacobian - Evaluates Jacobian matrix. 219c4421ceaSFande Kong 220c4421ceaSFande Kong Input Parameters: 221c4421ceaSFande Kong . snes - the SNES context 222c4421ceaSFande Kong . x - input vector 223c4421ceaSFande Kong . dummy - optional user-defined context (not used here) 224c4421ceaSFande Kong 225c4421ceaSFande Kong Output Parameters: 226c4421ceaSFande Kong . jac - Jacobian matrix 227c4421ceaSFande Kong . B - optionally different preconditioning matrix 228c4421ceaSFande Kong 229c4421ceaSFande Kong */ 230c4421ceaSFande Kong 2319371c9d4SSatish Balay PetscErrorCode FormJacobian(SNES snes, Vec x, Mat jac, Mat B, void *dummy) { 232c4421ceaSFande Kong const PetscScalar *xx; 233c4421ceaSFande Kong PetscScalar A[3], d; 234c4421ceaSFande Kong PetscInt i, n, j[3]; 235c4421ceaSFande Kong 236c4421ceaSFande Kong /* 237c4421ceaSFande Kong Get pointer to vector data 238c4421ceaSFande Kong */ 2399566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(x, &xx)); 240c4421ceaSFande Kong 241c4421ceaSFande Kong /* 242c4421ceaSFande Kong Compute Jacobian entries and insert into matrix. 243c4421ceaSFande Kong - Note that in this case we set all elements for a particular 244c4421ceaSFande Kong row at once. 245c4421ceaSFande Kong */ 2469566063dSJacob Faibussowitsch PetscCall(VecGetSize(x, &n)); 2479371c9d4SSatish Balay d = (PetscReal)(n - 1); 2489371c9d4SSatish Balay d = d * d; 249c4421ceaSFande Kong 250c4421ceaSFande Kong /* 251c4421ceaSFande Kong Interior grid points 252c4421ceaSFande Kong */ 253c4421ceaSFande Kong for (i = 1; i < n - 1; i++) { 2549371c9d4SSatish Balay j[0] = i - 1; 2559371c9d4SSatish Balay j[1] = i; 2569371c9d4SSatish Balay j[2] = i + 1; 2579371c9d4SSatish Balay A[0] = A[2] = d; 2589371c9d4SSatish Balay A[1] = -2.0 * d + 2.0 * xx[i]; 2599566063dSJacob Faibussowitsch PetscCall(MatSetValues(B, 1, &i, 3, j, A, INSERT_VALUES)); 260c4421ceaSFande Kong } 261c4421ceaSFande Kong 262c4421ceaSFande Kong /* 263c4421ceaSFande Kong Boundary points 264c4421ceaSFande Kong */ 2659371c9d4SSatish Balay i = 0; 2669371c9d4SSatish Balay A[0] = 1.0; 267c4421ceaSFande Kong 2689566063dSJacob Faibussowitsch PetscCall(MatSetValues(B, 1, &i, 1, &i, A, INSERT_VALUES)); 269c4421ceaSFande Kong 2709371c9d4SSatish Balay i = n - 1; 2719371c9d4SSatish Balay A[0] = 1.0; 272c4421ceaSFande Kong 2739566063dSJacob Faibussowitsch PetscCall(MatSetValues(B, 1, &i, 1, &i, A, INSERT_VALUES)); 274c4421ceaSFande Kong 275c4421ceaSFande Kong /* 276c4421ceaSFande Kong Restore vector 277c4421ceaSFande Kong */ 2789566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(x, &xx)); 279c4421ceaSFande Kong 280c4421ceaSFande Kong /* 281c4421ceaSFande Kong Assemble matrix 282c4421ceaSFande Kong */ 2839566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY)); 2849566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY)); 285c4421ceaSFande Kong if (jac != B) { 2869566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(jac, MAT_FINAL_ASSEMBLY)); 2879566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(jac, MAT_FINAL_ASSEMBLY)); 288c4421ceaSFande Kong } 289c4421ceaSFande Kong return 0; 290c4421ceaSFande Kong } 291c4421ceaSFande Kong 2929371c9d4SSatish Balay PetscErrorCode MySNESConvergedReasonView(SNES snes, void *ctx) { 293c4421ceaSFande Kong ReasonViewCtx *monP = (ReasonViewCtx *)ctx; 294c4421ceaSFande Kong PetscViewer viewer = monP->viewer; 295c4421ceaSFande Kong SNESConvergedReason reason; 296c4421ceaSFande Kong const char *strreason; 297c4421ceaSFande Kong 2989566063dSJacob Faibussowitsch PetscCall(SNESGetConvergedReason(snes, &reason)); 2999566063dSJacob Faibussowitsch PetscCall(SNESGetConvergedReasonString(snes, &strreason)); 3009566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Customized SNES converged reason view\n")); 3019566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIAddTab(viewer, 1)); 302c4421ceaSFande Kong if (reason > 0) { 3039566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Converged due to %s\n", strreason)); 304c4421ceaSFande Kong } else if (reason <= 0) { 3059566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Did not converge due to %s\n", strreason)); 306c4421ceaSFande Kong } 3079566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISubtractTab(viewer, 1)); 308c4421ceaSFande Kong return 0; 309c4421ceaSFande Kong } 310c4421ceaSFande Kong 3119371c9d4SSatish Balay PetscErrorCode MyKSPConvergedReasonView(KSP ksp, void *ctx) { 312c4421ceaSFande Kong ReasonViewCtx *monP = (ReasonViewCtx *)ctx; 313c4421ceaSFande Kong PetscViewer viewer = monP->viewer; 314c4421ceaSFande Kong KSPConvergedReason reason; 315c4421ceaSFande Kong const char *reasonstr; 316c4421ceaSFande Kong 3179566063dSJacob Faibussowitsch PetscCall(KSPGetConvergedReason(ksp, &reason)); 3189566063dSJacob Faibussowitsch PetscCall(KSPGetConvergedReasonString(ksp, &reasonstr)); 3199566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIAddTab(viewer, 2)); 3209566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Customized KSP converged reason view\n")); 3219566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIAddTab(viewer, 1)); 322c4421ceaSFande Kong if (reason > 0) { 3239566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Converged due to %s\n", reasonstr)); 324c4421ceaSFande Kong } else if (reason <= 0) { 3259566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Did not converge due to %s\n", reasonstr)); 326c4421ceaSFande Kong } 3279566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISubtractTab(viewer, 3)); 328c4421ceaSFande Kong return 0; 329c4421ceaSFande Kong } 330c4421ceaSFande Kong 331c4421ceaSFande Kong /*TEST 332c4421ceaSFande Kong 333c4421ceaSFande Kong test: 334c4421ceaSFande Kong suffix: 1 335c4421ceaSFande Kong nsize: 1 336bc44df21SStefano Zampini filter: sed -e "s/CONVERGED_ATOL/CONVERGED_RTOL/g" 337c4421ceaSFande Kong 338c4421ceaSFande Kong test: 339c4421ceaSFande Kong suffix: 2 340c4421ceaSFande Kong nsize: 1 341c4421ceaSFande Kong args: -ksp_converged_reason_view_cancel 342bc44df21SStefano Zampini filter: sed -e "s/CONVERGED_ATOL/CONVERGED_RTOL/g" 343c4421ceaSFande Kong 344c4421ceaSFande Kong test: 345c4421ceaSFande Kong suffix: 3 346c4421ceaSFande Kong nsize: 1 347c4421ceaSFande Kong args: -ksp_converged_reason_view_cancel -ksp_converged_reason 348bc44df21SStefano Zampini filter: sed -e "s/CONVERGED_ATOL/CONVERGED_RTOL/g" 349c4421ceaSFande Kong 350c4421ceaSFande Kong test: 351c4421ceaSFande Kong suffix: 4 352c4421ceaSFande Kong nsize: 1 353c4421ceaSFande Kong args: -snes_converged_reason_view_cancel 354bc44df21SStefano Zampini filter: sed -e "s/CONVERGED_ATOL/CONVERGED_RTOL/g" 355c4421ceaSFande Kong 356c4421ceaSFande Kong test: 357c4421ceaSFande Kong suffix: 5 358c4421ceaSFande Kong nsize: 1 359c4421ceaSFande Kong args: -snes_converged_reason_view_cancel -snes_converged_reason 360bc44df21SStefano Zampini filter: sed -e "s/CONVERGED_ATOL/CONVERGED_RTOL/g" 361c4421ceaSFande Kong 362c4421ceaSFande Kong TEST*/ 363