|
|
|
@ -95,59 +95,65 @@
|
|
|
|
|
return
|
|
|
|
|
end function psb_isaperm
|
|
|
|
|
|
|
|
|
|
function psb_iblsrch(key,n,v) result(ipos)
|
|
|
|
|
use psb_i_sort_mod, psb_protect_name => psb_iblsrch
|
|
|
|
|
|
|
|
|
|
subroutine psb_imsort_u(x,nout,dir)
|
|
|
|
|
use psb_i_sort_mod, psb_protect_name => psb_imsort_u
|
|
|
|
|
use psb_error_mod
|
|
|
|
|
implicit none
|
|
|
|
|
integer(psb_ipk_) :: ipos, key, n
|
|
|
|
|
integer(psb_ipk_) :: v(:)
|
|
|
|
|
integer(psb_ipk_), intent(inout) :: x(:)
|
|
|
|
|
integer(psb_ipk_), intent(out) :: nout
|
|
|
|
|
integer(psb_ipk_), optional, intent(in) :: dir
|
|
|
|
|
|
|
|
|
|
integer(psb_ipk_) :: n, k
|
|
|
|
|
integer(psb_ipk_) :: err_act
|
|
|
|
|
|
|
|
|
|
integer(psb_ipk_) :: ierr(5)
|
|
|
|
|
character(len=20) :: name
|
|
|
|
|
|
|
|
|
|
name='psb_msort_u'
|
|
|
|
|
call psb_erractionsave(err_act)
|
|
|
|
|
|
|
|
|
|
n = size(x)
|
|
|
|
|
|
|
|
|
|
call psb_msort(x,dir=dir)
|
|
|
|
|
nout = min(1,n)
|
|
|
|
|
do k=2,n
|
|
|
|
|
if (x(k) /= x(nout)) then
|
|
|
|
|
nout = nout + 1
|
|
|
|
|
x(nout) = x(k)
|
|
|
|
|
endif
|
|
|
|
|
enddo
|
|
|
|
|
|
|
|
|
|
integer(psb_ipk_) :: lb, ub, m
|
|
|
|
|
|
|
|
|
|
if (n < 5) then
|
|
|
|
|
! don't bother with binary search for very
|
|
|
|
|
! small vectors
|
|
|
|
|
ipos = 0
|
|
|
|
|
do
|
|
|
|
|
if (ipos == n) return
|
|
|
|
|
if (key < v(ipos+1)) return
|
|
|
|
|
ipos = ipos + 1
|
|
|
|
|
end do
|
|
|
|
|
else
|
|
|
|
|
lb = 1
|
|
|
|
|
ub = n
|
|
|
|
|
ipos = -1
|
|
|
|
|
|
|
|
|
|
do while (lb <= ub)
|
|
|
|
|
m = (lb+ub)/2
|
|
|
|
|
if (key==v(m)) then
|
|
|
|
|
ipos = m
|
|
|
|
|
return
|
|
|
|
|
else if (key < v(m)) then
|
|
|
|
|
ub = m-1
|
|
|
|
|
else
|
|
|
|
|
lb = m + 1
|
|
|
|
|
end if
|
|
|
|
|
enddo
|
|
|
|
|
if (v(ub) > key) then
|
|
|
|
|
!!$ write(0,*) 'Check: ',ub,v(ub),key
|
|
|
|
|
ub = ub - 1
|
|
|
|
|
end if
|
|
|
|
|
ipos = ub
|
|
|
|
|
endif
|
|
|
|
|
return
|
|
|
|
|
end function psb_iblsrch
|
|
|
|
|
|
|
|
|
|
9999 call psb_error_handler(err_act)
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
end subroutine psb_imsort_u
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function psb_ibsrch(key,n,v) result(ipos)
|
|
|
|
|
use psb_i_sort_mod, psb_protect_name => psb_ibsrch
|
|
|
|
|
implicit none
|
|
|
|
|
integer(psb_ipk_) :: ipos, key, n
|
|
|
|
|
integer(psb_ipk_) :: ipos, n
|
|
|
|
|
integer(psb_ipk_) :: key
|
|
|
|
|
integer(psb_ipk_) :: v(:)
|
|
|
|
|
|
|
|
|
|
integer(psb_ipk_) :: lb, ub, m
|
|
|
|
|
integer(psb_ipk_) :: lb, ub, m, i
|
|
|
|
|
|
|
|
|
|
ipos = -1
|
|
|
|
|
if (n<5) then
|
|
|
|
|
do i=1,n
|
|
|
|
|
if (key.eq.v(i)) then
|
|
|
|
|
ipos = i
|
|
|
|
|
return
|
|
|
|
|
end if
|
|
|
|
|
enddo
|
|
|
|
|
return
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
lb = 1
|
|
|
|
|
ub = n
|
|
|
|
|
ipos = -1
|
|
|
|
|
|
|
|
|
|
do while (lb.le.ub)
|
|
|
|
|
m = (lb+ub)/2
|
|
|
|
@ -166,7 +172,8 @@
|
|
|
|
|
function psb_issrch(key,n,v) result(ipos)
|
|
|
|
|
use psb_i_sort_mod, psb_protect_name => psb_issrch
|
|
|
|
|
implicit none
|
|
|
|
|
integer(psb_ipk_) :: ipos, key, n
|
|
|
|
|
integer(psb_ipk_) :: ipos, n
|
|
|
|
|
integer(psb_ipk_) :: key
|
|
|
|
|
integer(psb_ipk_) :: v(:)
|
|
|
|
|
|
|
|
|
|
integer(psb_ipk_) :: i
|
|
|
|
@ -182,56 +189,6 @@
|
|
|
|
|
return
|
|
|
|
|
end function psb_issrch
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subroutine psb_imsort_u(x,nout,dir)
|
|
|
|
|
use psb_i_sort_mod, psb_protect_name => psb_imsort_u
|
|
|
|
|
use psb_error_mod
|
|
|
|
|
implicit none
|
|
|
|
|
integer(psb_ipk_), intent(inout) :: x(:)
|
|
|
|
|
integer(psb_ipk_), intent(out) :: nout
|
|
|
|
|
integer(psb_ipk_), optional, intent(in) :: dir
|
|
|
|
|
|
|
|
|
|
integer(psb_ipk_) :: dir_, n, err_act, k
|
|
|
|
|
|
|
|
|
|
integer(psb_ipk_) :: ierr(5)
|
|
|
|
|
character(len=20) :: name
|
|
|
|
|
|
|
|
|
|
name='psb_msort_u'
|
|
|
|
|
call psb_erractionsave(err_act)
|
|
|
|
|
|
|
|
|
|
if (present(dir)) then
|
|
|
|
|
dir_ = dir
|
|
|
|
|
else
|
|
|
|
|
dir_= psb_sort_up_
|
|
|
|
|
end if
|
|
|
|
|
select case(dir_)
|
|
|
|
|
case( psb_sort_up_, psb_sort_down_, psb_asort_up_, psb_asort_down_)
|
|
|
|
|
! OK keep going
|
|
|
|
|
case default
|
|
|
|
|
ierr(1) = 3; ierr(2) = dir_;
|
|
|
|
|
call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr)
|
|
|
|
|
goto 9999
|
|
|
|
|
end select
|
|
|
|
|
|
|
|
|
|
n = size(x)
|
|
|
|
|
|
|
|
|
|
call psb_imsort(x,dir=dir_)
|
|
|
|
|
nout = min(1,n)
|
|
|
|
|
do k=2,n
|
|
|
|
|
if (x(k) /= x(nout)) then
|
|
|
|
|
nout = nout + 1
|
|
|
|
|
x(nout) = x(k)
|
|
|
|
|
endif
|
|
|
|
|
enddo
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
9999 call psb_error_handler(err_act)
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
end subroutine psb_imsort_u
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subroutine psb_imsort(x,ix,dir,flag)
|
|
|
|
|
use psb_i_sort_mod, psb_protect_name => psb_imsort
|
|
|
|
|
use psb_error_mod
|
|
|
|
|