diff --git a/mlprec/impl/aggregator/mld_c_soc1_map_bld.f90 b/mlprec/impl/aggregator/mld_c_soc1_map_bld.f90 index 3e28e2f4..50720f18 100644 --- a/mlprec/impl/aggregator/mld_c_soc1_map_bld.f90 +++ b/mlprec/impl/aggregator/mld_c_soc1_map_bld.f90 @@ -87,7 +87,7 @@ subroutine mld_c_soc1_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) integer(psb_ipk_), allocatable :: ils(:), neigh(:), irow(:), icol(:),& & ideg(:), idxs(:), tmpaggr(:) complex(psb_spk_), allocatable :: val(:), diag(:) - integer(psb_ipk_) :: icnt,nlp,k,n,ia,isz,nr, naggr,i,j,m, nz, ilg, ii, ip + integer(psb_ipk_) :: icnt,nlp,k,n,ia,isz,nr, nc, naggr,i,j,m, nz, ilg, ii, ip type(psb_c_csr_sparse_mat) :: acsr real(psb_spk_) :: cpling, tcl logical :: disjoint @@ -109,8 +109,9 @@ subroutine mld_c_soc1_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) ncol = desc_a%get_local_cols() nr = a%get_nrows() + nc = a%get_ncols() allocate(ilaggr(nr),neigh(nr),ideg(nr),idxs(nr),& - & icol(nr),val(nr),stat=info) + & icol(nc),val(nc),stat=info) if(info /= psb_success_) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/2*nr,izero,izero,izero,izero/),& @@ -147,9 +148,20 @@ subroutine mld_c_soc1_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) icnt = 0 step1: do ii=1, nr i = idxs(ii) - + if ((i<1).or.(i>nr)) then + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + if (ilaggr(i) == -(nr+1)) then nz = (acsr%irp(i+1)-acsr%irp(i)) + if ((nz<0).or.(nz>size(icol))) then + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + icol(1:nz) = acsr%ja(acsr%irp(i):acsr%irp(i+1)-1) val(1:nz) = acsr%val(acsr%irp(i):acsr%irp(i+1)-1) !!$ call a%csget(i,i,nz,irow,icol,val,info,chksz=.false.) diff --git a/mlprec/impl/aggregator/mld_c_soc2_map_bld.f90 b/mlprec/impl/aggregator/mld_c_soc2_map_bld.f90 index 231963ba..91fa785f 100644 --- a/mlprec/impl/aggregator/mld_c_soc2_map_bld.f90 +++ b/mlprec/impl/aggregator/mld_c_soc2_map_bld.f90 @@ -110,7 +110,7 @@ subroutine mld_c_soc2_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) nr = a%get_nrows() nc = a%get_ncols() - allocate(ilaggr(nr),neigh(nr),ideg(nr),idxs(nr),icol(nr),stat=info) + allocate(ilaggr(nr),neigh(nr),ideg(nr),idxs(nr),icol(nc),stat=info) if(info /= psb_success_) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/2*nr,izero,izero,izero,izero/),& diff --git a/mlprec/impl/aggregator/mld_d_soc1_map_bld.f90 b/mlprec/impl/aggregator/mld_d_soc1_map_bld.f90 index 4e84da4d..e3a956df 100644 --- a/mlprec/impl/aggregator/mld_d_soc1_map_bld.f90 +++ b/mlprec/impl/aggregator/mld_d_soc1_map_bld.f90 @@ -87,7 +87,7 @@ subroutine mld_d_soc1_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) integer(psb_ipk_), allocatable :: ils(:), neigh(:), irow(:), icol(:),& & ideg(:), idxs(:), tmpaggr(:) real(psb_dpk_), allocatable :: val(:), diag(:) - integer(psb_ipk_) :: icnt,nlp,k,n,ia,isz,nr, naggr,i,j,m, nz, ilg, ii, ip + integer(psb_ipk_) :: icnt,nlp,k,n,ia,isz,nr, nc, naggr,i,j,m, nz, ilg, ii, ip type(psb_d_csr_sparse_mat) :: acsr real(psb_dpk_) :: cpling, tcl logical :: disjoint @@ -109,8 +109,9 @@ subroutine mld_d_soc1_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) ncol = desc_a%get_local_cols() nr = a%get_nrows() + nc = a%get_ncols() allocate(ilaggr(nr),neigh(nr),ideg(nr),idxs(nr),& - & icol(nr),val(nr),stat=info) + & icol(nc),val(nc),stat=info) if(info /= psb_success_) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/2*nr,izero,izero,izero,izero/),& @@ -147,9 +148,20 @@ subroutine mld_d_soc1_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) icnt = 0 step1: do ii=1, nr i = idxs(ii) - + if ((i<1).or.(i>nr)) then + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + if (ilaggr(i) == -(nr+1)) then nz = (acsr%irp(i+1)-acsr%irp(i)) + if ((nz<0).or.(nz>size(icol))) then + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + icol(1:nz) = acsr%ja(acsr%irp(i):acsr%irp(i+1)-1) val(1:nz) = acsr%val(acsr%irp(i):acsr%irp(i+1)-1) !!$ call a%csget(i,i,nz,irow,icol,val,info,chksz=.false.) diff --git a/mlprec/impl/aggregator/mld_d_soc2_map_bld.f90 b/mlprec/impl/aggregator/mld_d_soc2_map_bld.f90 index 5397e77f..777e8e32 100644 --- a/mlprec/impl/aggregator/mld_d_soc2_map_bld.f90 +++ b/mlprec/impl/aggregator/mld_d_soc2_map_bld.f90 @@ -110,7 +110,7 @@ subroutine mld_d_soc2_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) nr = a%get_nrows() nc = a%get_ncols() - allocate(ilaggr(nr),neigh(nr),ideg(nr),idxs(nr),icol(nr),stat=info) + allocate(ilaggr(nr),neigh(nr),ideg(nr),idxs(nr),icol(nc),stat=info) if(info /= psb_success_) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/2*nr,izero,izero,izero,izero/),& diff --git a/mlprec/impl/aggregator/mld_s_soc1_map_bld.f90 b/mlprec/impl/aggregator/mld_s_soc1_map_bld.f90 index 74cffe30..fe1de847 100644 --- a/mlprec/impl/aggregator/mld_s_soc1_map_bld.f90 +++ b/mlprec/impl/aggregator/mld_s_soc1_map_bld.f90 @@ -87,7 +87,7 @@ subroutine mld_s_soc1_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) integer(psb_ipk_), allocatable :: ils(:), neigh(:), irow(:), icol(:),& & ideg(:), idxs(:), tmpaggr(:) real(psb_spk_), allocatable :: val(:), diag(:) - integer(psb_ipk_) :: icnt,nlp,k,n,ia,isz,nr, naggr,i,j,m, nz, ilg, ii, ip + integer(psb_ipk_) :: icnt,nlp,k,n,ia,isz,nr, nc, naggr,i,j,m, nz, ilg, ii, ip type(psb_s_csr_sparse_mat) :: acsr real(psb_spk_) :: cpling, tcl logical :: disjoint @@ -109,8 +109,9 @@ subroutine mld_s_soc1_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) ncol = desc_a%get_local_cols() nr = a%get_nrows() + nc = a%get_ncols() allocate(ilaggr(nr),neigh(nr),ideg(nr),idxs(nr),& - & icol(nr),val(nr),stat=info) + & icol(nc),val(nc),stat=info) if(info /= psb_success_) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/2*nr,izero,izero,izero,izero/),& @@ -147,9 +148,20 @@ subroutine mld_s_soc1_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) icnt = 0 step1: do ii=1, nr i = idxs(ii) - + if ((i<1).or.(i>nr)) then + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + if (ilaggr(i) == -(nr+1)) then nz = (acsr%irp(i+1)-acsr%irp(i)) + if ((nz<0).or.(nz>size(icol))) then + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + icol(1:nz) = acsr%ja(acsr%irp(i):acsr%irp(i+1)-1) val(1:nz) = acsr%val(acsr%irp(i):acsr%irp(i+1)-1) !!$ call a%csget(i,i,nz,irow,icol,val,info,chksz=.false.) diff --git a/mlprec/impl/aggregator/mld_s_soc2_map_bld.f90 b/mlprec/impl/aggregator/mld_s_soc2_map_bld.f90 index aa566431..49f2ab5c 100644 --- a/mlprec/impl/aggregator/mld_s_soc2_map_bld.f90 +++ b/mlprec/impl/aggregator/mld_s_soc2_map_bld.f90 @@ -110,7 +110,7 @@ subroutine mld_s_soc2_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) nr = a%get_nrows() nc = a%get_ncols() - allocate(ilaggr(nr),neigh(nr),ideg(nr),idxs(nr),icol(nr),stat=info) + allocate(ilaggr(nr),neigh(nr),ideg(nr),idxs(nr),icol(nc),stat=info) if(info /= psb_success_) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/2*nr,izero,izero,izero,izero/),& diff --git a/mlprec/impl/aggregator/mld_z_soc1_map_bld.f90 b/mlprec/impl/aggregator/mld_z_soc1_map_bld.f90 index acb53d76..29c16647 100644 --- a/mlprec/impl/aggregator/mld_z_soc1_map_bld.f90 +++ b/mlprec/impl/aggregator/mld_z_soc1_map_bld.f90 @@ -87,7 +87,7 @@ subroutine mld_z_soc1_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) integer(psb_ipk_), allocatable :: ils(:), neigh(:), irow(:), icol(:),& & ideg(:), idxs(:), tmpaggr(:) complex(psb_dpk_), allocatable :: val(:), diag(:) - integer(psb_ipk_) :: icnt,nlp,k,n,ia,isz,nr, naggr,i,j,m, nz, ilg, ii, ip + integer(psb_ipk_) :: icnt,nlp,k,n,ia,isz,nr, nc, naggr,i,j,m, nz, ilg, ii, ip type(psb_z_csr_sparse_mat) :: acsr real(psb_dpk_) :: cpling, tcl logical :: disjoint @@ -109,8 +109,9 @@ subroutine mld_z_soc1_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) ncol = desc_a%get_local_cols() nr = a%get_nrows() + nc = a%get_ncols() allocate(ilaggr(nr),neigh(nr),ideg(nr),idxs(nr),& - & icol(nr),val(nr),stat=info) + & icol(nc),val(nc),stat=info) if(info /= psb_success_) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/2*nr,izero,izero,izero,izero/),& @@ -147,9 +148,20 @@ subroutine mld_z_soc1_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) icnt = 0 step1: do ii=1, nr i = idxs(ii) - + if ((i<1).or.(i>nr)) then + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + if (ilaggr(i) == -(nr+1)) then nz = (acsr%irp(i+1)-acsr%irp(i)) + if ((nz<0).or.(nz>size(icol))) then + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + icol(1:nz) = acsr%ja(acsr%irp(i):acsr%irp(i+1)-1) val(1:nz) = acsr%val(acsr%irp(i):acsr%irp(i+1)-1) !!$ call a%csget(i,i,nz,irow,icol,val,info,chksz=.false.) diff --git a/mlprec/impl/aggregator/mld_z_soc2_map_bld.f90 b/mlprec/impl/aggregator/mld_z_soc2_map_bld.f90 index 5c96240e..255cb8d6 100644 --- a/mlprec/impl/aggregator/mld_z_soc2_map_bld.f90 +++ b/mlprec/impl/aggregator/mld_z_soc2_map_bld.f90 @@ -110,7 +110,7 @@ subroutine mld_z_soc2_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) nr = a%get_nrows() nc = a%get_ncols() - allocate(ilaggr(nr),neigh(nr),ideg(nr),idxs(nr),icol(nr),stat=info) + allocate(ilaggr(nr),neigh(nr),ideg(nr),idxs(nr),icol(nc),stat=info) if(info /= psb_success_) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/2*nr,izero,izero,izero,izero/),&