From cddb5bd40c7bfc86a12a4a359cc9896cd415971f Mon Sep 17 00:00:00 2001 From: sfilippone Date: Fri, 12 Jun 2026 15:10:28 +0200 Subject: [PATCH] Improve stopping criterion handling --- linsolve/impl/psb_crgmres.f90 | 15 +++++++++++++-- linsolve/impl/psb_drgmres.f90 | 15 +++++++++++++-- linsolve/impl/psb_srgmres.f90 | 15 +++++++++++++-- linsolve/impl/psb_zrgmres.f90 | 15 +++++++++++++-- 4 files changed, 52 insertions(+), 8 deletions(-) diff --git a/linsolve/impl/psb_crgmres.f90 b/linsolve/impl/psb_crgmres.f90 index c4bb98605..90f8588d1 100644 --- a/linsolve/impl/psb_crgmres.f90 +++ b/linsolve/impl/psb_crgmres.f90 @@ -271,9 +271,20 @@ subroutine psb_crgmres_vect(a,prec,b,x,eps,desc_a,info,& select case(istop_) case(psb_istop_ani_) ani = psb_spnrmi(a,desc_a,info) - bni = psb_geamax(b,desc_a,info) + if (present(s1)) then + call psb_gemlt(cone,s1,b,czero,v(1),desc_a,info) + bni = psb_geamax(v(1),desc_a,info) + else + bni = psb_geamax(b,desc_a,info) + end if case(psb_istop_bn2_) - bn2 = psb_genrm2(b,desc_a,info) + if (present(s1)) then + call psb_gemlt(cone,s1,b,czero,v(1),desc_a,info) + bn2 = psb_genrm2(v(1),desc_a,info) + else + bn2 = psb_genrm2(b,desc_a,info) + end if + case(psb_istop_rn2_abs_) ! do nothing case(psb_istop_rrn2_) diff --git a/linsolve/impl/psb_drgmres.f90 b/linsolve/impl/psb_drgmres.f90 index a2306cede..32ab3b290 100644 --- a/linsolve/impl/psb_drgmres.f90 +++ b/linsolve/impl/psb_drgmres.f90 @@ -271,9 +271,20 @@ subroutine psb_drgmres_vect(a,prec,b,x,eps,desc_a,info,& select case(istop_) case(psb_istop_ani_) ani = psb_spnrmi(a,desc_a,info) - bni = psb_geamax(b,desc_a,info) + if (present(s1)) then + call psb_gemlt(done,s1,b,dzero,v(1),desc_a,info) + bni = psb_geamax(v(1),desc_a,info) + else + bni = psb_geamax(b,desc_a,info) + end if case(psb_istop_bn2_) - bn2 = psb_genrm2(b,desc_a,info) + if (present(s1)) then + call psb_gemlt(done,s1,b,dzero,v(1),desc_a,info) + bn2 = psb_genrm2(v(1),desc_a,info) + else + bn2 = psb_genrm2(b,desc_a,info) + end if + case(psb_istop_rn2_abs_) ! do nothing case(psb_istop_rrn2_) diff --git a/linsolve/impl/psb_srgmres.f90 b/linsolve/impl/psb_srgmres.f90 index 18cd85402..b986c6cc5 100644 --- a/linsolve/impl/psb_srgmres.f90 +++ b/linsolve/impl/psb_srgmres.f90 @@ -271,9 +271,20 @@ subroutine psb_srgmres_vect(a,prec,b,x,eps,desc_a,info,& select case(istop_) case(psb_istop_ani_) ani = psb_spnrmi(a,desc_a,info) - bni = psb_geamax(b,desc_a,info) + if (present(s1)) then + call psb_gemlt(sone,s1,b,szero,v(1),desc_a,info) + bni = psb_geamax(v(1),desc_a,info) + else + bni = psb_geamax(b,desc_a,info) + end if case(psb_istop_bn2_) - bn2 = psb_genrm2(b,desc_a,info) + if (present(s1)) then + call psb_gemlt(sone,s1,b,szero,v(1),desc_a,info) + bn2 = psb_genrm2(v(1),desc_a,info) + else + bn2 = psb_genrm2(b,desc_a,info) + end if + case(psb_istop_rn2_abs_) ! do nothing case(psb_istop_rrn2_) diff --git a/linsolve/impl/psb_zrgmres.f90 b/linsolve/impl/psb_zrgmres.f90 index 6e683dd4f..35b05f7b8 100644 --- a/linsolve/impl/psb_zrgmres.f90 +++ b/linsolve/impl/psb_zrgmres.f90 @@ -271,9 +271,20 @@ subroutine psb_zrgmres_vect(a,prec,b,x,eps,desc_a,info,& select case(istop_) case(psb_istop_ani_) ani = psb_spnrmi(a,desc_a,info) - bni = psb_geamax(b,desc_a,info) + if (present(s1)) then + call psb_gemlt(zone,s1,b,zzero,v(1),desc_a,info) + bni = psb_geamax(v(1),desc_a,info) + else + bni = psb_geamax(b,desc_a,info) + end if case(psb_istop_bn2_) - bn2 = psb_genrm2(b,desc_a,info) + if (present(s1)) then + call psb_gemlt(zone,s1,b,zzero,v(1),desc_a,info) + bn2 = psb_genrm2(v(1),desc_a,info) + else + bn2 = psb_genrm2(b,desc_a,info) + end if + case(psb_istop_rn2_abs_) ! do nothing case(psb_istop_rrn2_)