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