|
|
@ -51,27 +51,50 @@ module psb_update_mod
|
|
|
|
contains
|
|
|
|
contains
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subroutine psb_d_srch_upd(nz,ia,ja,val,nza,a,gtl,ng,&
|
|
|
|
subroutine psb_d_srch_upd(nz,ia,ja,val,nza,a,&
|
|
|
|
& imin,imax,jmin,jmax,nzl,info)
|
|
|
|
& imin,imax,jmin,jmax,nzl,info,gtl,ng)
|
|
|
|
implicit none
|
|
|
|
implicit none
|
|
|
|
|
|
|
|
|
|
|
|
type(psb_dspmat_type), intent(inout) :: a
|
|
|
|
type(psb_dspmat_type), intent(inout) :: a
|
|
|
|
integer, intent(in) :: nz, imin,imax,jmin,jmax,nzl,ng
|
|
|
|
integer, intent(in) :: nz, imin,imax,jmin,jmax,nzl
|
|
|
|
integer, intent(in) :: ia(*),ja(*),gtl(*)
|
|
|
|
integer, intent(in) :: ia(*),ja(*)
|
|
|
|
integer, intent(inout) :: nza
|
|
|
|
integer, intent(inout) :: nza
|
|
|
|
real(kind(1.d0)), intent(in) :: val(*)
|
|
|
|
real(kind(1.d0)), intent(in) :: val(*)
|
|
|
|
integer, intent(out) :: info
|
|
|
|
integer, intent(out) :: info
|
|
|
|
|
|
|
|
integer, intent(in), optional :: ng,gtl(*)
|
|
|
|
|
|
|
|
|
|
|
|
info = 0
|
|
|
|
info = 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (present(gtl)) then
|
|
|
|
|
|
|
|
if (.not.present(ng)) then
|
|
|
|
|
|
|
|
info = -1
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
select case(toupper(a%fida))
|
|
|
|
select case(toupper(a%fida))
|
|
|
|
case ('CSR')
|
|
|
|
case ('CSR')
|
|
|
|
!!$ write(0,*) 'Calling csr_srch_upd'
|
|
|
|
!!$ write(0,*) 'Calling csr_srch_upd'
|
|
|
|
call csr_srch_upd(nz,ia,ja,val,nza,a,gtl,ng,&
|
|
|
|
call csr_srch_upd(nz,ia,ja,val,nza,a,&
|
|
|
|
|
|
|
|
& imin,imax,jmin,jmax,nzl,info,gtl,ng)
|
|
|
|
|
|
|
|
!!$ write(0,*) 'From csr_srch_upd:',info
|
|
|
|
|
|
|
|
case ('COO')
|
|
|
|
|
|
|
|
call coo_srch_upd(nz,ia,ja,val,nza,a,&
|
|
|
|
|
|
|
|
& imin,imax,jmin,jmax,nzl,info,gtl,ng)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case default
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
info = -9
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end select
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
select case(toupper(a%fida))
|
|
|
|
|
|
|
|
case ('CSR')
|
|
|
|
|
|
|
|
!!$ write(0,*) 'Calling csr_srch_upd'
|
|
|
|
|
|
|
|
call csr_srch_upd(nz,ia,ja,val,nza,a,&
|
|
|
|
& imin,imax,jmin,jmax,nzl,info)
|
|
|
|
& imin,imax,jmin,jmax,nzl,info)
|
|
|
|
!!$ write(0,*) 'From csr_srch_upd:',info
|
|
|
|
!!$ write(0,*) 'From csr_srch_upd:',info
|
|
|
|
case ('COO')
|
|
|
|
case ('COO')
|
|
|
|
call coo_srch_upd(nz,ia,ja,val,nza,a,gtl,ng,&
|
|
|
|
call coo_srch_upd(nz,ia,ja,val,nza,a,&
|
|
|
|
& imin,imax,jmin,jmax,nzl,info)
|
|
|
|
& imin,imax,jmin,jmax,nzl,info)
|
|
|
|
|
|
|
|
|
|
|
|
case default
|
|
|
|
case default
|
|
|
@ -79,30 +102,54 @@ contains
|
|
|
|
info = -9
|
|
|
|
info = -9
|
|
|
|
|
|
|
|
|
|
|
|
end select
|
|
|
|
end select
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
|
|
end subroutine psb_d_srch_upd
|
|
|
|
end subroutine psb_d_srch_upd
|
|
|
|
|
|
|
|
|
|
|
|
subroutine psb_z_srch_upd(nz,ia,ja,val,nza,a,gtl,ng,&
|
|
|
|
subroutine psb_z_srch_upd(nz,ia,ja,val,nza,a,&
|
|
|
|
& imin,imax,jmin,jmax,nzl,info)
|
|
|
|
& imin,imax,jmin,jmax,nzl,info,gtl,ng)
|
|
|
|
implicit none
|
|
|
|
implicit none
|
|
|
|
|
|
|
|
|
|
|
|
type(psb_zspmat_type), intent(inout) :: a
|
|
|
|
type(psb_zspmat_type), intent(inout) :: a
|
|
|
|
integer, intent(in) :: nz, imin,imax,jmin,jmax,nzl,ng
|
|
|
|
integer, intent(in) :: nz, imin,imax,jmin,jmax,nzl
|
|
|
|
integer, intent(in) :: ia(*),ja(*),gtl(*)
|
|
|
|
integer, intent(in) :: ia(*),ja(*)
|
|
|
|
integer, intent(inout) :: nza
|
|
|
|
integer, intent(inout) :: nza
|
|
|
|
complex(kind(1.d0)), intent(in) :: val(*)
|
|
|
|
complex(kind(1.d0)), intent(in) :: val(*)
|
|
|
|
integer, intent(out) :: info
|
|
|
|
integer, intent(out) :: info
|
|
|
|
|
|
|
|
integer, intent(in), optional :: ng,gtl(*)
|
|
|
|
|
|
|
|
|
|
|
|
info = 0
|
|
|
|
info = 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (present(gtl)) then
|
|
|
|
|
|
|
|
if (.not.present(ng)) then
|
|
|
|
|
|
|
|
info = -1
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
select case(toupper(a%fida))
|
|
|
|
|
|
|
|
case ('CSR')
|
|
|
|
|
|
|
|
!!$ write(0,*) 'Calling csr_srch_upd'
|
|
|
|
|
|
|
|
call csr_srch_upd(nz,ia,ja,val,nza,a,&
|
|
|
|
|
|
|
|
& imin,imax,jmin,jmax,nzl,info,gtl,ng)
|
|
|
|
|
|
|
|
!!$ write(0,*) 'From csr_srch_upd:',info
|
|
|
|
|
|
|
|
case ('COO')
|
|
|
|
|
|
|
|
call coo_srch_upd(nz,ia,ja,val,nza,a,&
|
|
|
|
|
|
|
|
& imin,imax,jmin,jmax,nzl,info,gtl,ng)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case default
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
info = -9
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end select
|
|
|
|
|
|
|
|
else
|
|
|
|
select case(toupper(a%fida))
|
|
|
|
select case(toupper(a%fida))
|
|
|
|
case ('CSR')
|
|
|
|
case ('CSR')
|
|
|
|
!!$ write(0,*) 'Calling csr_srch_upd'
|
|
|
|
!!$ write(0,*) 'Calling csr_srch_upd'
|
|
|
|
call csr_srch_upd(nz,ia,ja,val,nza,a,gtl,ng,&
|
|
|
|
call csr_srch_upd(nz,ia,ja,val,nza,a,&
|
|
|
|
& imin,imax,jmin,jmax,nzl,info)
|
|
|
|
& imin,imax,jmin,jmax,nzl,info)
|
|
|
|
!!$ write(0,*) 'From csr_srch_upd:',info
|
|
|
|
!!$ write(0,*) 'From csr_srch_upd:',info
|
|
|
|
case ('COO')
|
|
|
|
case ('COO')
|
|
|
|
call coo_srch_upd(nz,ia,ja,val,nza,a,gtl,ng,&
|
|
|
|
call coo_srch_upd(nz,ia,ja,val,nza,a,&
|
|
|
|
& imin,imax,jmin,jmax,nzl,info)
|
|
|
|
& imin,imax,jmin,jmax,nzl,info)
|
|
|
|
|
|
|
|
|
|
|
|
case default
|
|
|
|
case default
|
|
|
@ -110,20 +157,23 @@ contains
|
|
|
|
info = -9
|
|
|
|
info = -9
|
|
|
|
|
|
|
|
|
|
|
|
end select
|
|
|
|
end select
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
|
|
end subroutine psb_z_srch_upd
|
|
|
|
end subroutine psb_z_srch_upd
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subroutine d_csr_srch_upd(nz,ia,ja,val,nza,a,gtl,ng,&
|
|
|
|
subroutine d_csr_srch_upd(nz,ia,ja,val,nza,a,&
|
|
|
|
& imin,imax,jmin,jmax,nzl,info)
|
|
|
|
& imin,imax,jmin,jmax,nzl,info,gtl,ng)
|
|
|
|
implicit none
|
|
|
|
implicit none
|
|
|
|
|
|
|
|
|
|
|
|
type(psb_dspmat_type), intent(inout) :: a
|
|
|
|
type(psb_dspmat_type), intent(inout) :: a
|
|
|
|
integer, intent(in) :: nz, imin,imax,jmin,jmax,nzl,ng
|
|
|
|
integer, intent(in) :: nz, imin,imax,jmin,jmax,nzl
|
|
|
|
integer, intent(in) :: ia(*),ja(*),gtl(*)
|
|
|
|
integer, intent(in) :: ia(*),ja(*)
|
|
|
|
integer, intent(inout) :: nza
|
|
|
|
integer, intent(inout) :: nza
|
|
|
|
real(kind(1.d0)), intent(in) :: val(*)
|
|
|
|
real(kind(1.d0)), intent(in) :: val(*)
|
|
|
|
integer, intent(out) :: info
|
|
|
|
integer, intent(out) :: info
|
|
|
|
|
|
|
|
integer, intent(in), optional :: ng,gtl(*)
|
|
|
|
|
|
|
|
|
|
|
|
integer :: i,ir,ic,check_flag, ilr, ilc, ip, &
|
|
|
|
integer :: i,ir,ic,check_flag, ilr, ilc, ip, &
|
|
|
|
& i1,i2,nc,lb,ub,m,nnz,dupl
|
|
|
|
& i1,i2,nc,lb,ub,m,nnz,dupl
|
|
|
|
|
|
|
|
|
|
|
@ -131,6 +181,13 @@ contains
|
|
|
|
|
|
|
|
|
|
|
|
dupl = psb_sp_getifld(psb_dupl_,a,info)
|
|
|
|
dupl = psb_sp_getifld(psb_dupl_,a,info)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (present(gtl)) then
|
|
|
|
|
|
|
|
if (.not.present(ng)) then
|
|
|
|
|
|
|
|
info = -1
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
select case(dupl)
|
|
|
|
select case(dupl)
|
|
|
|
case(psb_dupl_ovwrt_,psb_dupl_err_)
|
|
|
|
case(psb_dupl_ovwrt_,psb_dupl_err_)
|
|
|
|
! Overwrite.
|
|
|
|
! Overwrite.
|
|
|
@ -217,18 +274,102 @@ contains
|
|
|
|
info = -3
|
|
|
|
info = -3
|
|
|
|
write(0,*) 'Duplicate handling: ',dupl
|
|
|
|
write(0,*) 'Duplicate handling: ',dupl
|
|
|
|
end select
|
|
|
|
end select
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
select case(dupl)
|
|
|
|
|
|
|
|
case(psb_dupl_ovwrt_,psb_dupl_err_)
|
|
|
|
|
|
|
|
! Overwrite.
|
|
|
|
|
|
|
|
! Cannot test for error, should have been caught earlier.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ilr = -1
|
|
|
|
|
|
|
|
ilc = -1
|
|
|
|
|
|
|
|
do i=1, nz
|
|
|
|
|
|
|
|
ir = ia(i)
|
|
|
|
|
|
|
|
ic = ja(i)
|
|
|
|
|
|
|
|
i1 = a%ia2(ir)
|
|
|
|
|
|
|
|
i2 = a%ia2(ir+1)
|
|
|
|
|
|
|
|
nc=i2-i1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (.true.) then
|
|
|
|
|
|
|
|
call issrch(ip,ic,nc,a%ia1(i1:i2-1))
|
|
|
|
|
|
|
|
if (ip>0) then
|
|
|
|
|
|
|
|
a%aspk(i1+ip-1) = val(i)
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
write(0,*)'Was searching ',ic,' in: ',i1,i2,' : ',a%ia1(i1:i2-1)
|
|
|
|
|
|
|
|
info = i
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
!!$
|
|
|
|
|
|
|
|
ip = -1
|
|
|
|
|
|
|
|
lb = i1
|
|
|
|
|
|
|
|
ub = i2-1
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
|
|
if (lb > ub) exit
|
|
|
|
|
|
|
|
m = (lb+ub)/2
|
|
|
|
|
|
|
|
!!$ write(0,*) 'Debug: ',lb,m,ub
|
|
|
|
|
|
|
|
if (ic == a%ia1(m)) then
|
|
|
|
|
|
|
|
ip = m
|
|
|
|
|
|
|
|
lb = ub + 1
|
|
|
|
|
|
|
|
else if (ic < a%ia1(m)) then
|
|
|
|
|
|
|
|
ub = m-1
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
lb = m + 1
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
enddo
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (ip>0) then
|
|
|
|
|
|
|
|
a%aspk(ip) = val(i)
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
write(0,*)'Was searching ',ic,' in: ',i1,i2,' : ',a%ia1(i1:i2-1)
|
|
|
|
|
|
|
|
info = i
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case(psb_dupl_add_)
|
|
|
|
|
|
|
|
! Add
|
|
|
|
|
|
|
|
ilr = -1
|
|
|
|
|
|
|
|
ilc = -1
|
|
|
|
|
|
|
|
do i=1, nz
|
|
|
|
|
|
|
|
ir = ia(i)
|
|
|
|
|
|
|
|
ic = ja(i)
|
|
|
|
|
|
|
|
i1 = a%ia2(ir)
|
|
|
|
|
|
|
|
i2 = a%ia2(ir+1)
|
|
|
|
|
|
|
|
nc = i2-i1
|
|
|
|
|
|
|
|
call issrch(ip,ic,nc,a%ia1(i1:i2-1))
|
|
|
|
|
|
|
|
if (ip>0) then
|
|
|
|
|
|
|
|
a%aspk(i1+ip-1) = a%aspk(i1+ip-1) + val(i)
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
info = i
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case default
|
|
|
|
|
|
|
|
info = -3
|
|
|
|
|
|
|
|
write(0,*) 'Duplicate handling: ',dupl
|
|
|
|
|
|
|
|
end select
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
|
|
end subroutine d_csr_srch_upd
|
|
|
|
end subroutine d_csr_srch_upd
|
|
|
|
|
|
|
|
|
|
|
|
subroutine d_coo_srch_upd(nz,ia,ja,val,nza,a,gtl,ng,&
|
|
|
|
subroutine d_coo_srch_upd(nz,ia,ja,val,nza,a,&
|
|
|
|
& imin,imax,jmin,jmax,nzl,info)
|
|
|
|
& imin,imax,jmin,jmax,nzl,info,gtl,ng)
|
|
|
|
implicit none
|
|
|
|
implicit none
|
|
|
|
|
|
|
|
|
|
|
|
type(psb_dspmat_type), intent(inout) :: a
|
|
|
|
type(psb_dspmat_type), intent(inout) :: a
|
|
|
|
integer, intent(in) :: nz, imin,imax,jmin,jmax,nzl,ng
|
|
|
|
integer, intent(in) :: nz, imin,imax,jmin,jmax,nzl
|
|
|
|
integer, intent(in) :: ia(*),ja(*),gtl(*)
|
|
|
|
integer, intent(in) :: ia(*),ja(*)
|
|
|
|
integer, intent(inout) :: nza
|
|
|
|
integer, intent(inout) :: nza
|
|
|
|
real(kind(1.d0)), intent(in) :: val(*)
|
|
|
|
real(kind(1.d0)), intent(in) :: val(*)
|
|
|
|
integer, intent(out) :: info
|
|
|
|
integer, intent(out) :: info
|
|
|
|
|
|
|
|
integer, intent(in), optional :: ng,gtl(*)
|
|
|
|
integer :: i,ir,ic,check_flag, ilr, ilc, ip, &
|
|
|
|
integer :: i,ir,ic,check_flag, ilr, ilc, ip, &
|
|
|
|
& i1,i2,nc,lb,ub,m,nnz,dupl,isrt
|
|
|
|
& i1,i2,nc,lb,ub,m,nnz,dupl,isrt
|
|
|
|
|
|
|
|
|
|
|
@ -246,6 +387,12 @@ contains
|
|
|
|
nnz = psb_sp_getifld(psb_nnz_,a,info)
|
|
|
|
nnz = psb_sp_getifld(psb_nnz_,a,info)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (present(gtl)) then
|
|
|
|
|
|
|
|
if (.not.present(ng)) then
|
|
|
|
|
|
|
|
info = -1
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
select case(dupl)
|
|
|
|
select case(dupl)
|
|
|
|
case(psb_dupl_ovwrt_,psb_dupl_err_)
|
|
|
|
case(psb_dupl_ovwrt_,psb_dupl_err_)
|
|
|
|
! Overwrite.
|
|
|
|
! Overwrite.
|
|
|
@ -320,20 +467,92 @@ contains
|
|
|
|
write(0,*) 'Duplicate handling: ',dupl
|
|
|
|
write(0,*) 'Duplicate handling: ',dupl
|
|
|
|
end select
|
|
|
|
end select
|
|
|
|
|
|
|
|
|
|
|
|
end subroutine d_coo_srch_upd
|
|
|
|
else
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
select case(dupl)
|
|
|
|
|
|
|
|
case(psb_dupl_ovwrt_,psb_dupl_err_)
|
|
|
|
|
|
|
|
! Overwrite.
|
|
|
|
|
|
|
|
! Cannot test for error, should have been caught earlier.
|
|
|
|
|
|
|
|
do i=1, nz
|
|
|
|
|
|
|
|
ir = ia(i)
|
|
|
|
|
|
|
|
ic = ja(i)
|
|
|
|
|
|
|
|
if (ir /= ilr) then
|
|
|
|
|
|
|
|
call ibsrch(i1,ir,nnz,a%ia1)
|
|
|
|
|
|
|
|
i2 = i1
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
|
|
if (i2+1 > nnz) exit
|
|
|
|
|
|
|
|
if (a%ia1(i2+1) /= a%ia1(i2)) exit
|
|
|
|
|
|
|
|
i2 = i2 + 1
|
|
|
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
|
|
if (i1-1 < 1) exit
|
|
|
|
|
|
|
|
if (a%ia1(i1-1) /= a%ia1(i1)) exit
|
|
|
|
|
|
|
|
i1 = i1 - 1
|
|
|
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
ilr = ir
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
nc = i2-i1+1
|
|
|
|
|
|
|
|
call issrch(ip,ic,nc,a%ia2(i1:i2))
|
|
|
|
|
|
|
|
if (ip>0) then
|
|
|
|
|
|
|
|
a%aspk(i1+ip-1) = val(i)
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
info = i
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case(psb_dupl_add_)
|
|
|
|
|
|
|
|
! Add
|
|
|
|
|
|
|
|
do i=1, nz
|
|
|
|
|
|
|
|
ir = ia(i)
|
|
|
|
|
|
|
|
ic = ja(i)
|
|
|
|
|
|
|
|
if (ir /= ilr) then
|
|
|
|
|
|
|
|
call ibsrch(i1,ir,nnz,a%ia1)
|
|
|
|
|
|
|
|
i2 = i1
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
|
|
if (i2+1 > nnz) exit
|
|
|
|
|
|
|
|
if (a%ia1(i2+1) /= a%ia1(i2)) exit
|
|
|
|
|
|
|
|
i2 = i2 + 1
|
|
|
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
|
|
if (i1-1 < 1) exit
|
|
|
|
|
|
|
|
if (a%ia1(i1-1) /= a%ia1(i1)) exit
|
|
|
|
|
|
|
|
i1 = i1 - 1
|
|
|
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
ilr = ir
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
nc = i2-i1+1
|
|
|
|
|
|
|
|
call issrch(ip,ic,nc,a%ia2(i1:i2))
|
|
|
|
|
|
|
|
if (ip>0) then
|
|
|
|
|
|
|
|
a%aspk(i1+ip-1) = a%aspk(i1+ip-1) + val(i)
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
info = i
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
|
|
|
|
subroutine z_csr_srch_upd(nz,ia,ja,val,nza,a,gtl,ng,&
|
|
|
|
case default
|
|
|
|
& imin,imax,jmin,jmax,nzl,info)
|
|
|
|
info = -3
|
|
|
|
|
|
|
|
write(0,*) 'Duplicate handling: ',dupl
|
|
|
|
|
|
|
|
end select
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end subroutine d_coo_srch_upd
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subroutine z_csr_srch_upd(nz,ia,ja,val,nza,a,&
|
|
|
|
|
|
|
|
& imin,imax,jmin,jmax,nzl,info,gtl,ng)
|
|
|
|
implicit none
|
|
|
|
implicit none
|
|
|
|
|
|
|
|
|
|
|
|
type(psb_zspmat_type), intent(inout) :: a
|
|
|
|
type(psb_zspmat_type), intent(inout) :: a
|
|
|
|
integer, intent(in) :: nz, imin,imax,jmin,jmax,nzl,ng
|
|
|
|
integer, intent(in) :: nz, imin,imax,jmin,jmax,nzl
|
|
|
|
integer, intent(in) :: ia(*),ja(*),gtl(*)
|
|
|
|
integer, intent(in) :: ia(*),ja(*)
|
|
|
|
integer, intent(inout) :: nza
|
|
|
|
integer, intent(inout) :: nza
|
|
|
|
complex(kind(1.d0)), intent(in) :: val(*)
|
|
|
|
complex(kind(1.d0)), intent(in) :: val(*)
|
|
|
|
integer, intent(out) :: info
|
|
|
|
integer, intent(out) :: info
|
|
|
|
|
|
|
|
integer, intent(in), optional :: ng,gtl(*)
|
|
|
|
|
|
|
|
|
|
|
|
integer :: i,ir,ic,check_flag, ilr, ilc, ip, &
|
|
|
|
integer :: i,ir,ic,check_flag, ilr, ilc, ip, &
|
|
|
|
& i1,i2,nc,lb,ub,m,nnz,dupl
|
|
|
|
& i1,i2,nc,lb,ub,m,nnz,dupl
|
|
|
|
|
|
|
|
|
|
|
@ -341,6 +560,13 @@ contains
|
|
|
|
|
|
|
|
|
|
|
|
dupl = psb_sp_getifld(psb_dupl_,a,info)
|
|
|
|
dupl = psb_sp_getifld(psb_dupl_,a,info)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (present(gtl)) then
|
|
|
|
|
|
|
|
if (.not.present(ng)) then
|
|
|
|
|
|
|
|
info = -1
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
select case(dupl)
|
|
|
|
select case(dupl)
|
|
|
|
case(psb_dupl_ovwrt_,psb_dupl_err_)
|
|
|
|
case(psb_dupl_ovwrt_,psb_dupl_err_)
|
|
|
|
! Overwrite.
|
|
|
|
! Overwrite.
|
|
|
@ -427,18 +653,102 @@ contains
|
|
|
|
info = -3
|
|
|
|
info = -3
|
|
|
|
write(0,*) 'Duplicate handling: ',dupl
|
|
|
|
write(0,*) 'Duplicate handling: ',dupl
|
|
|
|
end select
|
|
|
|
end select
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
select case(dupl)
|
|
|
|
|
|
|
|
case(psb_dupl_ovwrt_,psb_dupl_err_)
|
|
|
|
|
|
|
|
! Overwrite.
|
|
|
|
|
|
|
|
! Cannot test for error, should have been caught earlier.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ilr = -1
|
|
|
|
|
|
|
|
ilc = -1
|
|
|
|
|
|
|
|
do i=1, nz
|
|
|
|
|
|
|
|
ir = ia(i)
|
|
|
|
|
|
|
|
ic = ja(i)
|
|
|
|
|
|
|
|
i1 = a%ia2(ir)
|
|
|
|
|
|
|
|
i2 = a%ia2(ir+1)
|
|
|
|
|
|
|
|
nc=i2-i1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (.true.) then
|
|
|
|
|
|
|
|
call issrch(ip,ic,nc,a%ia1(i1:i2-1))
|
|
|
|
|
|
|
|
if (ip>0) then
|
|
|
|
|
|
|
|
a%aspk(i1+ip-1) = val(i)
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
write(0,*)'Was searching ',ic,' in: ',i1,i2,' : ',a%ia1(i1:i2-1)
|
|
|
|
|
|
|
|
info = i
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
!!$
|
|
|
|
|
|
|
|
ip = -1
|
|
|
|
|
|
|
|
lb = i1
|
|
|
|
|
|
|
|
ub = i2-1
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
|
|
if (lb > ub) exit
|
|
|
|
|
|
|
|
m = (lb+ub)/2
|
|
|
|
|
|
|
|
!!$ write(0,*) 'Debug: ',lb,m,ub
|
|
|
|
|
|
|
|
if (ic == a%ia1(m)) then
|
|
|
|
|
|
|
|
ip = m
|
|
|
|
|
|
|
|
lb = ub + 1
|
|
|
|
|
|
|
|
else if (ic < a%ia1(m)) then
|
|
|
|
|
|
|
|
ub = m-1
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
lb = m + 1
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
enddo
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (ip>0) then
|
|
|
|
|
|
|
|
a%aspk(ip) = val(i)
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
write(0,*)'Was searching ',ic,' in: ',i1,i2,' : ',a%ia1(i1:i2-1)
|
|
|
|
|
|
|
|
info = i
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case(psb_dupl_add_)
|
|
|
|
|
|
|
|
! Add
|
|
|
|
|
|
|
|
ilr = -1
|
|
|
|
|
|
|
|
ilc = -1
|
|
|
|
|
|
|
|
do i=1, nz
|
|
|
|
|
|
|
|
ir = ia(i)
|
|
|
|
|
|
|
|
ic = ja(i)
|
|
|
|
|
|
|
|
i1 = a%ia2(ir)
|
|
|
|
|
|
|
|
i2 = a%ia2(ir+1)
|
|
|
|
|
|
|
|
nc = i2-i1
|
|
|
|
|
|
|
|
call issrch(ip,ic,nc,a%ia1(i1:i2-1))
|
|
|
|
|
|
|
|
if (ip>0) then
|
|
|
|
|
|
|
|
a%aspk(i1+ip-1) = a%aspk(i1+ip-1) + val(i)
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
info = i
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case default
|
|
|
|
|
|
|
|
info = -3
|
|
|
|
|
|
|
|
write(0,*) 'Duplicate handling: ',dupl
|
|
|
|
|
|
|
|
end select
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
|
|
end subroutine z_csr_srch_upd
|
|
|
|
end subroutine z_csr_srch_upd
|
|
|
|
|
|
|
|
|
|
|
|
subroutine z_coo_srch_upd(nz,ia,ja,val,nza,a,gtl,ng,&
|
|
|
|
subroutine z_coo_srch_upd(nz,ia,ja,val,nza,a,&
|
|
|
|
& imin,imax,jmin,jmax,nzl,info)
|
|
|
|
& imin,imax,jmin,jmax,nzl,info,gtl,ng)
|
|
|
|
implicit none
|
|
|
|
implicit none
|
|
|
|
|
|
|
|
|
|
|
|
type(psb_zspmat_type), intent(inout) :: a
|
|
|
|
type(psb_zspmat_type), intent(inout) :: a
|
|
|
|
integer, intent(in) :: nz, imin,imax,jmin,jmax,nzl,ng
|
|
|
|
integer, intent(in) :: nz, imin,imax,jmin,jmax,nzl
|
|
|
|
integer, intent(in) :: ia(*),ja(*),gtl(*)
|
|
|
|
integer, intent(in) :: ia(*),ja(*)
|
|
|
|
integer, intent(inout) :: nza
|
|
|
|
integer, intent(inout) :: nza
|
|
|
|
complex(kind(1.d0)), intent(in) :: val(*)
|
|
|
|
complex(kind(1.d0)), intent(in) :: val(*)
|
|
|
|
integer, intent(out) :: info
|
|
|
|
integer, intent(out) :: info
|
|
|
|
|
|
|
|
integer, intent(in), optional :: ng,gtl(*)
|
|
|
|
integer :: i,ir,ic,check_flag, ilr, ilc, ip, &
|
|
|
|
integer :: i,ir,ic,check_flag, ilr, ilc, ip, &
|
|
|
|
& i1,i2,nc,lb,ub,m,nnz,dupl,isrt
|
|
|
|
& i1,i2,nc,lb,ub,m,nnz,dupl,isrt
|
|
|
|
|
|
|
|
|
|
|
@ -456,6 +766,12 @@ contains
|
|
|
|
nnz = psb_sp_getifld(psb_nnz_,a,info)
|
|
|
|
nnz = psb_sp_getifld(psb_nnz_,a,info)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (present(gtl)) then
|
|
|
|
|
|
|
|
if (.not.present(ng)) then
|
|
|
|
|
|
|
|
info = -1
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
select case(dupl)
|
|
|
|
select case(dupl)
|
|
|
|
case(psb_dupl_ovwrt_,psb_dupl_err_)
|
|
|
|
case(psb_dupl_ovwrt_,psb_dupl_err_)
|
|
|
|
! Overwrite.
|
|
|
|
! Overwrite.
|
|
|
@ -476,7 +792,6 @@ contains
|
|
|
|
end do
|
|
|
|
end do
|
|
|
|
do
|
|
|
|
do
|
|
|
|
if (i1-1 < 1) exit
|
|
|
|
if (i1-1 < 1) exit
|
|
|
|
|
|
|
|
|
|
|
|
if (a%ia1(i1-1) /= a%ia1(i1)) exit
|
|
|
|
if (a%ia1(i1-1) /= a%ia1(i1)) exit
|
|
|
|
i1 = i1 - 1
|
|
|
|
i1 = i1 - 1
|
|
|
|
end do
|
|
|
|
end do
|
|
|
@ -531,8 +846,78 @@ contains
|
|
|
|
write(0,*) 'Duplicate handling: ',dupl
|
|
|
|
write(0,*) 'Duplicate handling: ',dupl
|
|
|
|
end select
|
|
|
|
end select
|
|
|
|
|
|
|
|
|
|
|
|
end subroutine z_coo_srch_upd
|
|
|
|
else
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
select case(dupl)
|
|
|
|
|
|
|
|
case(psb_dupl_ovwrt_,psb_dupl_err_)
|
|
|
|
|
|
|
|
! Overwrite.
|
|
|
|
|
|
|
|
! Cannot test for error, should have been caught earlier.
|
|
|
|
|
|
|
|
do i=1, nz
|
|
|
|
|
|
|
|
ir = ia(i)
|
|
|
|
|
|
|
|
ic = ja(i)
|
|
|
|
|
|
|
|
if (ir /= ilr) then
|
|
|
|
|
|
|
|
call ibsrch(i1,ir,nnz,a%ia1)
|
|
|
|
|
|
|
|
i2 = i1
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
|
|
if (i2+1 > nnz) exit
|
|
|
|
|
|
|
|
if (a%ia1(i2+1) /= a%ia1(i2)) exit
|
|
|
|
|
|
|
|
i2 = i2 + 1
|
|
|
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
|
|
if (i1-1 < 1) exit
|
|
|
|
|
|
|
|
if (a%ia1(i1-1) /= a%ia1(i1)) exit
|
|
|
|
|
|
|
|
i1 = i1 - 1
|
|
|
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
ilr = ir
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
nc = i2-i1+1
|
|
|
|
|
|
|
|
call issrch(ip,ic,nc,a%ia2(i1:i2))
|
|
|
|
|
|
|
|
if (ip>0) then
|
|
|
|
|
|
|
|
a%aspk(i1+ip-1) = val(i)
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
info = i
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case(psb_dupl_add_)
|
|
|
|
|
|
|
|
! Add
|
|
|
|
|
|
|
|
do i=1, nz
|
|
|
|
|
|
|
|
ir = ia(i)
|
|
|
|
|
|
|
|
ic = ja(i)
|
|
|
|
|
|
|
|
if (ir /= ilr) then
|
|
|
|
|
|
|
|
call ibsrch(i1,ir,nnz,a%ia1)
|
|
|
|
|
|
|
|
i2 = i1
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
|
|
if (i2+1 > nnz) exit
|
|
|
|
|
|
|
|
if (a%ia1(i2+1) /= a%ia1(i2)) exit
|
|
|
|
|
|
|
|
i2 = i2 + 1
|
|
|
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
|
|
if (i1-1 < 1) exit
|
|
|
|
|
|
|
|
if (a%ia1(i1-1) /= a%ia1(i1)) exit
|
|
|
|
|
|
|
|
i1 = i1 - 1
|
|
|
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
ilr = ir
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
nc = i2-i1+1
|
|
|
|
|
|
|
|
call issrch(ip,ic,nc,a%ia2(i1:i2))
|
|
|
|
|
|
|
|
if (ip>0) then
|
|
|
|
|
|
|
|
a%aspk(i1+ip-1) = a%aspk(i1+ip-1) + val(i)
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
info = i
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case default
|
|
|
|
|
|
|
|
info = -3
|
|
|
|
|
|
|
|
write(0,*) 'Duplicate handling: ',dupl
|
|
|
|
|
|
|
|
end select
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end subroutine z_coo_srch_upd
|
|
|
|
|
|
|
|
|
|
|
|
end module psb_update_mod
|
|
|
|
end module psb_update_mod
|
|
|
|
|
|
|
|
|
|
|
|