On Sun, Jul 2, 2023 at 8:05 AM Matthew Knepley <knep...@gmail.com> wrote:
> On Sun, Jul 2, 2023 at 7:53 AM 王赫萌 <wanghem...@163.com> wrote: > >> Thanks for your reply! >> So sorry that I made a mistake in the description. >> I set the tolerances by: >> PetscCall(KSPSetTolerances(ksp, 1e-12, DBL_MIN, PETSC_DEFAULT, >> PETSC_DEFAULT)); >> and got (by passing `-ksp_norm_type unpreconditioned >> -ksp_monitor_true_residual`) >> 74 KSP unpreconditioned resid norm 7.256655641876e-08 true resid norm >> 7.256655641876e-08 ||r(i)||/||b|| 9.975738158726e-13 >> I'm wondering why the ` ||r(i)||/||b||` is different with mine which >> calculated by: >> ``` >> PetscCall(VecNorm(b, NORM_2, &norm_b)); // (main.c, line 74) (which is >> 72743.044439) >> 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)); // (which is 0.039608) >> ``` >> and (norm_delta) / (norm_b) = 5.44496e-07 which is higher and different >> with the rtol I set (1e-12). >> Sorry again for the waste of your time. I would really appreciated if you >> could help me again! >> > > 1) 7.256655641876e-08 / 72743.044439 = 9.975738158726e-13 so ||r_i||/||b|| > is correct in the output > > 2) You are asking why you calculate a different residual? I will have to > run your code. > I built your code, but you did not send the matrix and rhs. I suggest using PetscCall(VecAXPY(u, -1.0, b)); instead so that you do not change b, and keep the residual in u. Thanks, Matt Thanks, Matt > Thanks, > > Matt > > >> Best regards! >> Hemeng Wang >> >> >> ---- Replied Message ---- >> From Matthew Knepley<knep...@gmail.com> <knep...@gmail.com> >> Date 7/2/2023 18:51 >> To 王赫萌<wanghem...@163.com> <wanghem...@163.com> >> Cc petsc-users@mcs.anl.gov<petsc-users@mcs.anl.gov> >> <petsc-users@mcs.anl.gov> >> Subject Re: [petsc-users] Question about residue norm in PETSc >> On Sun, Jul 2, 2023 at 2:24 AM 王赫萌 <wanghem...@163.com> 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) >>> >> >> If you are using the default convergence test, there is an absolute >> tolerance (atol) _and_ a relative tolerance (rtol). It seems likely you hit >> the relative tolerance. You can check this using >> >> -ksp_converged_reason >> >> You could make rtol really small if you want to just see the atol >> >> -ksp_rtol 1e-20 >> >> Thanks, >> >> Matt >> >> >>> 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 >>> >>> >> >> -- >> What most experimenters take for granted before they begin their >> experiments is infinitely more interesting than any results to which their >> experiments lead. >> -- Norbert Wiener >> >> https://www.cse.buffalo.edu/~knepley/ >> <http://www.cse.buffalo.edu/~knepley/> >> > > > -- > What most experimenters take for granted before they begin their > experiments is infinitely more interesting than any results to which their > experiments lead. > -- Norbert Wiener > > https://www.cse.buffalo.edu/~knepley/ > <http://www.cse.buffalo.edu/~knepley/> > -- What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead. -- Norbert Wiener https://www.cse.buffalo.edu/~knepley/ <http://www.cse.buffalo.edu/~knepley/>