From 486c0338c5ee8bd029dd895b8013601960a4aef1 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Mon, 8 Jul 2019 12:59:27 +0100 Subject: [PATCH] Minimize memory requirements in borderline cases --- base/serial/impl/psb_c_coo_impl.f90 | 23 ++++++++++++++++++----- base/serial/impl/psb_d_coo_impl.f90 | 23 ++++++++++++++++++----- base/serial/impl/psb_s_coo_impl.f90 | 23 ++++++++++++++++++----- base/serial/impl/psb_z_coo_impl.f90 | 23 ++++++++++++++++++----- 4 files changed, 72 insertions(+), 20 deletions(-) diff --git a/base/serial/impl/psb_c_coo_impl.f90 b/base/serial/impl/psb_c_coo_impl.f90 index 695e3583..3d0db0b3 100644 --- a/base/serial/impl/psb_c_coo_impl.f90 +++ b/base/serial/impl/psb_c_coo_impl.f90 @@ -3416,21 +3416,26 @@ subroutine psb_c_fix_coo_inner(nr,nc,nzin,dupl,ia,ja,val,nzout,info,idir) dupl_ = dupl - - allocate(iaux(max(nr,nc,nzin)+2),stat=info) + allocate(iaux(nzin+2),stat=info) if (info /= psb_success_) then info = psb_err_alloc_dealloc_ call psb_errpush(info,name) goto 9999 end if - - allocate(ias(nzin),jas(nzin),vs(nzin),ix2(max(nr,nc,nzin)+2), stat=info) - use_buffers = (info == 0) select case(idir_) case(psb_row_major_) ! Row major order + + if (nr <= nzin) then + ! Avoid strange situations with large indices + allocate(ias(nzin),jas(nzin),vs(nzin),ix2(nzin+2), stat=info) + use_buffers = (info == 0) + else + use_buffers = .false. + end if + if (use_buffers) then if (.not.( (ia(1) < 1).or.(ia(1)> nr)) ) then iaux(:) = 0 @@ -3752,6 +3757,14 @@ subroutine psb_c_fix_coo_inner(nr,nc,nzin,dupl,ia,ja,val,nzout,info,idir) case(psb_col_major_) + if (nc <= nzin) then + ! Avoid strange situations with large indices + allocate(ias(nzin),jas(nzin),vs(nzin),ix2(nzin+2), stat=info) + use_buffers = (info == 0) + else + use_buffers = .false. + end if + if (use_buffers) then iaux(:) = 0 if (.not.( (ja(1) < 1).or.(ja(1)> nc)) ) then diff --git a/base/serial/impl/psb_d_coo_impl.f90 b/base/serial/impl/psb_d_coo_impl.f90 index 47c0b107..89aa8b97 100644 --- a/base/serial/impl/psb_d_coo_impl.f90 +++ b/base/serial/impl/psb_d_coo_impl.f90 @@ -3416,21 +3416,26 @@ subroutine psb_d_fix_coo_inner(nr,nc,nzin,dupl,ia,ja,val,nzout,info,idir) dupl_ = dupl - - allocate(iaux(max(nr,nc,nzin)+2),stat=info) + allocate(iaux(nzin+2),stat=info) if (info /= psb_success_) then info = psb_err_alloc_dealloc_ call psb_errpush(info,name) goto 9999 end if - - allocate(ias(nzin),jas(nzin),vs(nzin),ix2(max(nr,nc,nzin)+2), stat=info) - use_buffers = (info == 0) select case(idir_) case(psb_row_major_) ! Row major order + + if (nr <= nzin) then + ! Avoid strange situations with large indices + allocate(ias(nzin),jas(nzin),vs(nzin),ix2(nzin+2), stat=info) + use_buffers = (info == 0) + else + use_buffers = .false. + end if + if (use_buffers) then if (.not.( (ia(1) < 1).or.(ia(1)> nr)) ) then iaux(:) = 0 @@ -3752,6 +3757,14 @@ subroutine psb_d_fix_coo_inner(nr,nc,nzin,dupl,ia,ja,val,nzout,info,idir) case(psb_col_major_) + if (nc <= nzin) then + ! Avoid strange situations with large indices + allocate(ias(nzin),jas(nzin),vs(nzin),ix2(nzin+2), stat=info) + use_buffers = (info == 0) + else + use_buffers = .false. + end if + if (use_buffers) then iaux(:) = 0 if (.not.( (ja(1) < 1).or.(ja(1)> nc)) ) then diff --git a/base/serial/impl/psb_s_coo_impl.f90 b/base/serial/impl/psb_s_coo_impl.f90 index b80a8a99..d327e12e 100644 --- a/base/serial/impl/psb_s_coo_impl.f90 +++ b/base/serial/impl/psb_s_coo_impl.f90 @@ -3416,21 +3416,26 @@ subroutine psb_s_fix_coo_inner(nr,nc,nzin,dupl,ia,ja,val,nzout,info,idir) dupl_ = dupl - - allocate(iaux(max(nr,nc,nzin)+2),stat=info) + allocate(iaux(nzin+2),stat=info) if (info /= psb_success_) then info = psb_err_alloc_dealloc_ call psb_errpush(info,name) goto 9999 end if - - allocate(ias(nzin),jas(nzin),vs(nzin),ix2(max(nr,nc,nzin)+2), stat=info) - use_buffers = (info == 0) select case(idir_) case(psb_row_major_) ! Row major order + + if (nr <= nzin) then + ! Avoid strange situations with large indices + allocate(ias(nzin),jas(nzin),vs(nzin),ix2(nzin+2), stat=info) + use_buffers = (info == 0) + else + use_buffers = .false. + end if + if (use_buffers) then if (.not.( (ia(1) < 1).or.(ia(1)> nr)) ) then iaux(:) = 0 @@ -3752,6 +3757,14 @@ subroutine psb_s_fix_coo_inner(nr,nc,nzin,dupl,ia,ja,val,nzout,info,idir) case(psb_col_major_) + if (nc <= nzin) then + ! Avoid strange situations with large indices + allocate(ias(nzin),jas(nzin),vs(nzin),ix2(nzin+2), stat=info) + use_buffers = (info == 0) + else + use_buffers = .false. + end if + if (use_buffers) then iaux(:) = 0 if (.not.( (ja(1) < 1).or.(ja(1)> nc)) ) then diff --git a/base/serial/impl/psb_z_coo_impl.f90 b/base/serial/impl/psb_z_coo_impl.f90 index e1883e03..d5ee9740 100644 --- a/base/serial/impl/psb_z_coo_impl.f90 +++ b/base/serial/impl/psb_z_coo_impl.f90 @@ -3416,21 +3416,26 @@ subroutine psb_z_fix_coo_inner(nr,nc,nzin,dupl,ia,ja,val,nzout,info,idir) dupl_ = dupl - - allocate(iaux(max(nr,nc,nzin)+2),stat=info) + allocate(iaux(nzin+2),stat=info) if (info /= psb_success_) then info = psb_err_alloc_dealloc_ call psb_errpush(info,name) goto 9999 end if - - allocate(ias(nzin),jas(nzin),vs(nzin),ix2(max(nr,nc,nzin)+2), stat=info) - use_buffers = (info == 0) select case(idir_) case(psb_row_major_) ! Row major order + + if (nr <= nzin) then + ! Avoid strange situations with large indices + allocate(ias(nzin),jas(nzin),vs(nzin),ix2(nzin+2), stat=info) + use_buffers = (info == 0) + else + use_buffers = .false. + end if + if (use_buffers) then if (.not.( (ia(1) < 1).or.(ia(1)> nr)) ) then iaux(:) = 0 @@ -3752,6 +3757,14 @@ subroutine psb_z_fix_coo_inner(nr,nc,nzin,dupl,ia,ja,val,nzout,info,idir) case(psb_col_major_) + if (nc <= nzin) then + ! Avoid strange situations with large indices + allocate(ias(nzin),jas(nzin),vs(nzin),ix2(nzin+2), stat=info) + use_buffers = (info == 0) + else + use_buffers = .false. + end if + if (use_buffers) then iaux(:) = 0 if (.not.( (ja(1) < 1).or.(ja(1)> nc)) ) then