@@ -29,10 +29,12 @@ subroutine solve_petsc_csr(n, ia, ja, aval, b, x, rtol, maxit)
2929 Vec :: bb, xx
3030 KSP :: ksp
3131 PC :: pc
32- integer :: ierr, i, row_nz, start_k
32+ integer :: ierr, i, row_nz, start_k, its
3333 integer , allocatable :: cols0(:), idx(:)
3434 real (8 ), allocatable :: vals(:)
3535 real (8 ), pointer :: xptr(:)
36+ KSPConvergedReason :: reason
37+ real (8 ) :: rnorm
3638
3739 if (size (ia) /= n+1 ) stop ' solve_petsc_csr: ia size mismatch'
3840 if (size (b) /= n .or. size (x) /= n) stop ' solve_petsc_csr: vector size mismatch'
@@ -71,12 +73,33 @@ subroutine solve_petsc_csr(n, ia, ja, aval, b, x, rtol, maxit)
7173 call KSPCreate(PETSC_COMM_SELF, ksp, ierr)
7274 call KSPSetOperators(ksp, A, A, ierr) ! 3-arg form (reuse automatically)
7375 call KSPGetPC(ksp, pc, ierr)
74- call PCSetType(pc, PCILU, ierr) ! Override at runtime with -pc_type
75- call KSPSetType(ksp, KSPCG, ierr) ! Use -ksp_type bcgs if not SPD
76+ call PCSetType(pc, PCJACOBI, ierr) ! Use Jacobi (diagonal) preconditioner to match linbcg
77+ call KSPSetType(ksp, KSPBCGS, ierr) ! Use BCGS to match linbcg behavior
78+
79+ ! Set convergence tolerances
80+ ! rtol = relative tolerance, atol = absolute tolerance (use default), dtol = divergence tolerance, maxits = max iterations
7681 call KSPSetTolerances(ksp, rtol, PETSC_DEFAULT_REAL, PETSC_DEFAULT_REAL, maxit, ierr)
82+
83+ ! Use unpreconditioned norm (matching linbcg with itol=1)
84+ call KSPSetNormType(ksp, KSP_NORM_UNPRECONDITIONED, ierr)
85+
86+ ! Allow command line override of solver options
7787 call KSPSetFromOptions(ksp, ierr)
7888
7989 call KSPSolve(ksp, bb, xx, ierr)
90+
91+ ! Check convergence
92+ call KSPGetConvergedReason(ksp, reason, ierr)
93+ call KSPGetIterationNumber(ksp, its, ierr)
94+ call KSPGetResidualNorm(ksp, rnorm, ierr)
95+
96+ if (reason < 0 ) then
97+ write (0 ,* ) " WARNING: PETSc solver diverged or failed!"
98+ write (0 ,* ) " Reason code:" , reason
99+ write (0 ,* ) " Iterations:" , its
100+ write (0 ,* ) " Residual norm:" , rnorm
101+ ! Don't stop - let the main code detect NaNs if needed
102+ end if
80103
81104 ! Extract solution
82105 call VecGetArrayF90(xx, xptr, ierr)
0 commit comments