Also look at https://petsc.org/release/manualpages/KSP/KSPSetPCSide/#kspsetpcside and https://petsc.org/release/manualpages/KSP/KSPSetNormType/#kspsetnormtype in PETSc different Krylov solvers have different default values for this.
> On Jul 2, 2023, at 1:47 AM, 王赫萌 <[email protected]> wrote: > > Dear PETSc Team, > > Sorry to bother! My name is Hemeng Wang, and I am currently learning the use > of PETSc software package. I am confused while calculating the norm of > residue. > > I calculated residue norm by myself with: > ``` > PetscCall(VecNorm(b, NORM_2, &norm_b)); // (main.c, line 74) > > PetscCall(VecDuplicate(b, &u)); // (main.c, line 105) > PetscCall(MatMult(A, x, u)); > PetscCall(VecAXPY(b, -1.0, u)); > PetscCall(VecNorm(b, NORM_2, &norm_delta)); > ``` > and check the (norm_delta) / (norm_b). It seems not the `atol` which set by > `KSPSetTolerances()`. > (I set atol as 1e-12, but got 5e-7 finally) > (options: -ksp_type cg -pc_type gamg -ksp_converged_reason -ksp_norm_type > unpreconditioned -ksp_monitor_true_residual) > > I also check the soure code of `KSPSolve_CG` in > `petsc/src/ksp/ksp/impls/cg/cg.c`. And could not figure out where is the > difference. > > I will really really appreciated if someone can explain the calculation of > `resid norm` in petsc. And where is my mistake. > > To provide you with more context, here are the source code about my > implementation. And the output of my test. > > main.c > Main code of my program > > mmio.h mmloader.h > Headers for matrix read > > Makefile > For compiling, same as sample provided > > task.sh > A script for running program in `slurm` > > slurm-4803840.out > Output of my test > > Thank you very much for your time and attention. I greatly appreciate your > support and look forward to hearing from you soon. > Best regards, > Hemeng Wang > > <main.c><Makefile><mmio.h><mmloader.h><slurm-4803840.out><task.sh>
