diff --git a/base/modules/auxil/psb_c_sort_mod.f90 b/base/modules/auxil/psb_c_sort_mod.f90 deleted file mode 100644 index 137c9eb5..00000000 --- a/base/modules/auxil/psb_c_sort_mod.f90 +++ /dev/null @@ -1,610 +0,0 @@ -! -! Parallel Sparse BLAS version 3.5 -! (C) Copyright 2006-2018 -! Salvatore Filippone -! Alfredo Buttari -! -! Redistribution and use in source and binary forms, with or without -! modification, are permitted provided that the following conditions -! are met: -! 1. Redistributions of source code must retain the above copyright -! notice, this list of conditions and the following disclaimer. -! 2. Redistributions in binary form must reproduce the above copyright -! notice, this list of conditions, and the following disclaimer in the -! documentation and/or other materials provided with the distribution. -! 3. The name of the PSBLAS group or the names of its contributors may -! not be used to endorse or promote products derived from this -! software without specific written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS -! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -! POSSIBILITY OF SUCH DAMAGE. -! -! -! -! Sorting routines -! References: -! D. Knuth -! The Art of Computer Programming, vol. 3 -! Addison-Wesley -! -! Aho, Hopcroft, Ullman -! Data Structures and Algorithms -! Addison-Wesley -! -module psb_c_sort_mod - use psb_const_mod - - - @INTE@ - - interface psb_msort_unique - subroutine psb_cmsort_u(x,nout,dir) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(out) :: nout - integer(psb_ipk_), optional, intent(in) :: dir - end subroutine psb_cmsort_u - end interface psb_msort_unique - - type psb_c_heap - integer(psb_ipk_) :: last, dir - complex(psb_spk_), allocatable :: keys(:) - contains - procedure, pass(heap) :: init => psb_c_init_heap - procedure, pass(heap) :: howmany => psb_c_howmany - procedure, pass(heap) :: insert => psb_c_insert_heap - procedure, pass(heap) :: get_first => psb_c_heap_get_first - procedure, pass(heap) :: dump => psb_c_dump_heap - procedure, pass(heap) :: free => psb_c_free_heap - end type psb_c_heap - - type psb_c_idx_heap - integer(psb_ipk_) :: last, dir - complex(psb_spk_), allocatable :: keys(:) - integer(psb_ipk_), allocatable :: idxs(:) - contains - procedure, pass(heap) :: init => psb_c_idx_init_heap - procedure, pass(heap) :: howmany => psb_c_idx_howmany - procedure, pass(heap) :: insert => psb_c_idx_insert_heap - procedure, pass(heap) :: get_first => psb_c_idx_heap_get_first - procedure, pass(heap) :: dump => psb_c_idx_dump_heap - procedure, pass(heap) :: free => psb_c_idx_free_heap - end type psb_c_idx_heap - - - interface psb_msort - subroutine psb_cmsort(x,ix,dir,flag) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag - integer(psb_ipk_), optional, intent(inout) :: ix(:) - end subroutine psb_cmsort - end interface psb_msort - - interface - subroutine psi_c_lmsort_up(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - complex(psb_spk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_c_lmsort_up - subroutine psi_c_lmsort_dw(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - complex(psb_spk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_c_lmsort_dw - subroutine psi_c_almsort_up(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - complex(psb_spk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_c_almsort_up - subroutine psi_c_almsort_dw(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - complex(psb_spk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_c_almsort_dw - end interface - interface - subroutine psi_c_amsort_up(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - complex(psb_spk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_c_amsort_up - subroutine psi_c_amsort_dw(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - complex(psb_spk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_c_amsort_dw - end interface - - - interface psb_qsort - subroutine psb_cqsort(x,ix,dir,flag) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag - integer(psb_ipk_), optional, intent(inout) :: ix(:) - end subroutine psb_cqsort - end interface psb_qsort - - interface psb_isort - subroutine psb_cisort(x,ix,dir,flag) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag - integer(psb_ipk_), optional, intent(inout) :: ix(:) - end subroutine psb_cisort - end interface psb_isort - - - interface psb_hsort - subroutine psb_chsort(x,ix,dir,flag) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag - integer(psb_ipk_), optional, intent(inout) :: ix(:) - end subroutine psb_chsort - end interface psb_hsort - - - interface - subroutine psi_c_insert_heap(key,last,heap,dir,info) - import - implicit none - - ! - ! Input: - ! key: the new value - ! last: pointer to the last occupied element in heap - ! heap: the heap - ! dir: sorting direction - - complex(psb_spk_), intent(in) :: key - complex(psb_spk_), intent(inout) :: heap(:) - integer(psb_ipk_), intent(in) :: dir - integer(psb_ipk_), intent(inout) :: last - integer(psb_ipk_), intent(out) :: info - end subroutine psi_c_insert_heap - end interface - - interface - subroutine psi_c_idx_insert_heap(key,index,last,heap,idxs,dir,info) - import - implicit none - - ! - ! Input: - ! key: the new value - ! last: pointer to the last occupied element in heap - ! heap: the heap - ! dir: sorting direction - - complex(psb_spk_), intent(in) :: key - complex(psb_spk_), intent(inout) :: heap(:) - integer(psb_ipk_), intent(in) :: index - integer(psb_ipk_), intent(in) :: dir - integer(psb_ipk_), intent(inout) :: idxs(:) - integer(psb_ipk_), intent(inout) :: last - integer(psb_ipk_), intent(out) :: info - end subroutine psi_c_idx_insert_heap - end interface - - - interface - subroutine psi_c_heap_get_first(key,last,heap,dir,info) - import - implicit none - complex(psb_spk_), intent(inout) :: key - integer(psb_ipk_), intent(inout) :: last - integer(psb_ipk_), intent(in) :: dir - complex(psb_spk_), intent(inout) :: heap(:) - integer(psb_ipk_), intent(out) :: info - end subroutine psi_c_heap_get_first - end interface - - interface - subroutine psi_c_idx_heap_get_first(key,index,last,heap,idxs,dir,info) - import - complex(psb_spk_), intent(inout) :: key - integer(psb_ipk_), intent(out) :: index - complex(psb_spk_), intent(inout) :: heap(:) - integer(psb_ipk_), intent(in) :: dir - integer(psb_ipk_), intent(inout) :: last - integer(psb_ipk_), intent(inout) :: idxs(:) - integer(psb_ipk_), intent(out) :: info - end subroutine psi_c_idx_heap_get_first - end interface - - interface - subroutine psi_clisrx_up(n,x,ix) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_clisrx_up - subroutine psi_clisrx_dw(n,x,ix) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_clisrx_dw - subroutine psi_clisr_up(n,x) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_clisr_up - subroutine psi_clisr_dw(n,x) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_clisr_dw - subroutine psi_calisrx_up(n,x,ix) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_calisrx_up - subroutine psi_calisrx_dw(n,x,ix) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_calisrx_dw - subroutine psi_calisr_up(n,x) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_calisr_up - subroutine psi_calisr_dw(n,x) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_calisr_dw - subroutine psi_caisrx_up(n,x,ix) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_caisrx_up - subroutine psi_caisrx_dw(n,x,ix) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_caisrx_dw - subroutine psi_caisr_up(n,x) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_caisr_up - subroutine psi_caisr_dw(n,x) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_caisr_dw - end interface - - interface - subroutine psi_clqsrx_up(n,x,ix) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_clqsrx_up - subroutine psi_clqsrx_dw(n,x,ix) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_clqsrx_dw - subroutine psi_clqsr_up(n,x) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_clqsr_up - subroutine psi_clqsr_dw(n,x) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_clqsr_dw - subroutine psi_calqsrx_up(n,x,ix) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_calqsrx_up - subroutine psi_calqsrx_dw(n,x,ix) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_calqsrx_dw - subroutine psi_calqsr_up(n,x) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_calqsr_up - subroutine psi_calqsr_dw(n,x) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_calqsr_dw - subroutine psi_caqsrx_up(n,x,ix) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_caqsrx_up - subroutine psi_caqsrx_dw(n,x,ix) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_caqsrx_dw - subroutine psi_caqsr_up(n,x) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_caqsr_up - subroutine psi_caqsr_dw(n,x) - import - complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_caqsr_dw - end interface - -contains - - subroutine psb_c_init_heap(heap,info,dir) - use psb_realloc_mod, only : psb_ensure_size - implicit none - class(psb_c_heap), intent(inout) :: heap - integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_), intent(in), optional :: dir - - info = psb_success_ - heap%last=0 - if (present(dir)) then - heap%dir = dir - else - heap%dir = psb_asort_up_ - endif - select case(heap%dir) - case (psb_asort_up_,psb_asort_down_) - ! ok, do nothing - case default - write(psb_err_unit,*) 'Invalid direction, defaulting to psb_asort_up_' - heap%dir = psb_asort_up_ - end select - call psb_ensure_size(psb_heap_resize,heap%keys,info) - - return - end subroutine psb_c_init_heap - - - function psb_c_howmany(heap) result(res) - implicit none - class(psb_c_heap), intent(in) :: heap - integer(psb_ipk_) :: res - res = heap%last - end function psb_c_howmany - - subroutine psb_c_insert_heap(key,heap,info) - use psb_realloc_mod, only : psb_ensure_size - implicit none - - complex(psb_spk_), intent(in) :: key - class(psb_c_heap), intent(inout) :: heap - integer(psb_ipk_), intent(out) :: info - - info = psb_success_ - if (heap%last < 0) then - write(psb_err_unit,*) 'Invalid last in heap ',heap%last - info = heap%last - return - endif - - call psb_ensure_size(heap%last+1,heap%keys,info,addsz=psb_heap_resize) - if (info /= psb_success_) then - write(psb_err_unit,*) 'Memory allocation failure in heap_insert' - info = -5 - return - end if - call psi_c_insert_heap(key,& - & heap%last,heap%keys,heap%dir,info) - - return - end subroutine psb_c_insert_heap - - subroutine psb_c_heap_get_first(key,heap,info) - implicit none - - class(psb_c_heap), intent(inout) :: heap - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_), intent(out) :: key - - - info = psb_success_ - - call psi_c_heap_get_first(key,& - & heap%last,heap%keys,heap%dir,info) - - return - end subroutine psb_c_heap_get_first - - subroutine psb_c_dump_heap(iout,heap,info) - - implicit none - class(psb_c_heap), intent(in) :: heap - integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_), intent(in) :: iout - - info = psb_success_ - if (iout < 0) then - write(psb_err_unit,*) 'Invalid file ' - info =-1 - return - end if - - write(iout,*) 'Heap direction ',heap%dir - write(iout,*) 'Heap size ',heap%last - if ((heap%last > 0).and.((.not.allocated(heap%keys)).or.& - & (size(heap%keys) 0).and.((.not.allocated(heap%keys)).or.& - & (size(heap%keys) 0).and.((.not.allocated(heap%idxs)).or.& - & (size(heap%idxs) psb_d_init_heap - procedure, pass(heap) :: howmany => psb_d_howmany - procedure, pass(heap) :: insert => psb_d_insert_heap - procedure, pass(heap) :: get_first => psb_d_heap_get_first - procedure, pass(heap) :: dump => psb_d_dump_heap - procedure, pass(heap) :: free => psb_d_free_heap - end type psb_d_heap - - type psb_d_idx_heap - integer(psb_ipk_) :: last, dir - real(psb_dpk_), allocatable :: keys(:) - integer(psb_ipk_), allocatable :: idxs(:) - contains - procedure, pass(heap) :: init => psb_d_idx_init_heap - procedure, pass(heap) :: howmany => psb_d_idx_howmany - procedure, pass(heap) :: insert => psb_d_idx_insert_heap - procedure, pass(heap) :: get_first => psb_d_idx_heap_get_first - procedure, pass(heap) :: dump => psb_d_idx_dump_heap - procedure, pass(heap) :: free => psb_d_idx_free_heap - end type psb_d_idx_heap - - - interface psb_msort - subroutine psb_dmsort(x,ix,dir,flag) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag - integer(psb_ipk_), optional, intent(inout) :: ix(:) - end subroutine psb_dmsort - end interface psb_msort - - - interface psb_bsrch - function psb_dbsrch(key,n,v) result(ipos) - import - integer(psb_ipk_) :: ipos, n - real(psb_dpk_) :: key - real(psb_dpk_) :: v(:) - end function psb_dbsrch - end interface psb_bsrch - - interface psb_ssrch - function psb_dssrch(key,n,v) result(ipos) - import - implicit none - integer(psb_ipk_) :: ipos, n - real(psb_dpk_) :: key - real(psb_dpk_) :: v(:) - end function psb_dssrch - end interface psb_ssrch - - interface - subroutine psi_d_msort_up(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - real(psb_dpk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_d_msort_up - subroutine psi_d_msort_dw(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - real(psb_dpk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_d_msort_dw - end interface - interface - subroutine psi_d_amsort_up(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - real(psb_dpk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_d_amsort_up - subroutine psi_d_amsort_dw(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - real(psb_dpk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_d_amsort_dw - end interface - - - interface psb_qsort - subroutine psb_dqsort(x,ix,dir,flag) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag - integer(psb_ipk_), optional, intent(inout) :: ix(:) - end subroutine psb_dqsort - end interface psb_qsort - - interface psb_isort - subroutine psb_disort(x,ix,dir,flag) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag - integer(psb_ipk_), optional, intent(inout) :: ix(:) - end subroutine psb_disort - end interface psb_isort - - - interface psb_hsort - subroutine psb_dhsort(x,ix,dir,flag) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag - integer(psb_ipk_), optional, intent(inout) :: ix(:) - end subroutine psb_dhsort - end interface psb_hsort - - - interface - subroutine psi_d_insert_heap(key,last,heap,dir,info) - import - implicit none - - ! - ! Input: - ! key: the new value - ! last: pointer to the last occupied element in heap - ! heap: the heap - ! dir: sorting direction - - real(psb_dpk_), intent(in) :: key - real(psb_dpk_), intent(inout) :: heap(:) - integer(psb_ipk_), intent(in) :: dir - integer(psb_ipk_), intent(inout) :: last - integer(psb_ipk_), intent(out) :: info - end subroutine psi_d_insert_heap - end interface - - interface - subroutine psi_d_idx_insert_heap(key,index,last,heap,idxs,dir,info) - import - implicit none - - ! - ! Input: - ! key: the new value - ! last: pointer to the last occupied element in heap - ! heap: the heap - ! dir: sorting direction - - real(psb_dpk_), intent(in) :: key - real(psb_dpk_), intent(inout) :: heap(:) - integer(psb_ipk_), intent(in) :: index - integer(psb_ipk_), intent(in) :: dir - integer(psb_ipk_), intent(inout) :: idxs(:) - integer(psb_ipk_), intent(inout) :: last - integer(psb_ipk_), intent(out) :: info - end subroutine psi_d_idx_insert_heap - end interface - - - interface - subroutine psi_d_heap_get_first(key,last,heap,dir,info) - import - implicit none - real(psb_dpk_), intent(inout) :: key - integer(psb_ipk_), intent(inout) :: last - integer(psb_ipk_), intent(in) :: dir - real(psb_dpk_), intent(inout) :: heap(:) - integer(psb_ipk_), intent(out) :: info - end subroutine psi_d_heap_get_first - end interface - - interface - subroutine psi_d_idx_heap_get_first(key,index,last,heap,idxs,dir,info) - import - real(psb_dpk_), intent(inout) :: key - integer(psb_ipk_), intent(out) :: index - real(psb_dpk_), intent(inout) :: heap(:) - integer(psb_ipk_), intent(in) :: dir - integer(psb_ipk_), intent(inout) :: last - integer(psb_ipk_), intent(inout) :: idxs(:) - integer(psb_ipk_), intent(out) :: info - end subroutine psi_d_idx_heap_get_first - end interface - - interface - subroutine psi_disrx_up(n,x,ix) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_disrx_up - subroutine psi_disrx_dw(n,x,ix) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_disrx_dw - subroutine psi_disr_up(n,x) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_disr_up - subroutine psi_disr_dw(n,x) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_disr_dw - subroutine psi_daisrx_up(n,x,ix) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_daisrx_up - subroutine psi_daisrx_dw(n,x,ix) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_daisrx_dw - subroutine psi_daisr_up(n,x) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_daisr_up - subroutine psi_daisr_dw(n,x) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_daisr_dw - end interface - - interface - subroutine psi_dqsrx_up(n,x,ix) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_dqsrx_up - subroutine psi_dqsrx_dw(n,x,ix) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_dqsrx_dw - subroutine psi_dqsr_up(n,x) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_dqsr_up - subroutine psi_dqsr_dw(n,x) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_dqsr_dw - subroutine psi_daqsrx_up(n,x,ix) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_daqsrx_up - subroutine psi_daqsrx_dw(n,x,ix) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_daqsrx_dw - subroutine psi_daqsr_up(n,x) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_daqsr_up - subroutine psi_daqsr_dw(n,x) - import - real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_daqsr_dw - end interface - -contains - - subroutine psb_d_init_heap(heap,info,dir) - use psb_realloc_mod, only : psb_ensure_size - implicit none - class(psb_d_heap), intent(inout) :: heap - integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_), intent(in), optional :: dir - - info = psb_success_ - heap%last=0 - if (present(dir)) then - heap%dir = dir - else - heap%dir = psb_sort_up_ - endif - select case(heap%dir) - case (psb_sort_up_,psb_sort_down_,psb_asort_up_,psb_asort_down_) - ! ok, do nothing - case default - write(psb_err_unit,*) 'Invalid direction, defaulting to psb_sort_up_' - heap%dir = psb_sort_up_ - end select - call psb_ensure_size(psb_heap_resize,heap%keys,info) - - return - end subroutine psb_d_init_heap - - - function psb_d_howmany(heap) result(res) - implicit none - class(psb_d_heap), intent(in) :: heap - integer(psb_ipk_) :: res - res = heap%last - end function psb_d_howmany - - subroutine psb_d_insert_heap(key,heap,info) - use psb_realloc_mod, only : psb_ensure_size - implicit none - - real(psb_dpk_), intent(in) :: key - class(psb_d_heap), intent(inout) :: heap - integer(psb_ipk_), intent(out) :: info - - info = psb_success_ - if (heap%last < 0) then - write(psb_err_unit,*) 'Invalid last in heap ',heap%last - info = heap%last - return - endif - - call psb_ensure_size(heap%last+1,heap%keys,info,addsz=psb_heap_resize) - if (info /= psb_success_) then - write(psb_err_unit,*) 'Memory allocation failure in heap_insert' - info = -5 - return - end if - call psi_d_insert_heap(key,& - & heap%last,heap%keys,heap%dir,info) - - return - end subroutine psb_d_insert_heap - - subroutine psb_d_heap_get_first(key,heap,info) - implicit none - - class(psb_d_heap), intent(inout) :: heap - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_), intent(out) :: key - - - info = psb_success_ - - call psi_d_heap_get_first(key,& - & heap%last,heap%keys,heap%dir,info) - - return - end subroutine psb_d_heap_get_first - - subroutine psb_d_dump_heap(iout,heap,info) - - implicit none - class(psb_d_heap), intent(in) :: heap - integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_), intent(in) :: iout - - info = psb_success_ - if (iout < 0) then - write(psb_err_unit,*) 'Invalid file ' - info =-1 - return - end if - - write(iout,*) 'Heap direction ',heap%dir - write(iout,*) 'Heap size ',heap%last - if ((heap%last > 0).and.((.not.allocated(heap%keys)).or.& - & (size(heap%keys) 0).and.((.not.allocated(heap%keys)).or.& - & (size(heap%keys) 0).and.((.not.allocated(heap%idxs)).or.& - & (size(heap%idxs) psb_s_init_heap - procedure, pass(heap) :: howmany => psb_s_howmany - procedure, pass(heap) :: insert => psb_s_insert_heap - procedure, pass(heap) :: get_first => psb_s_heap_get_first - procedure, pass(heap) :: dump => psb_s_dump_heap - procedure, pass(heap) :: free => psb_s_free_heap - end type psb_s_heap - - type psb_s_idx_heap - integer(psb_ipk_) :: last, dir - real(psb_spk_), allocatable :: keys(:) - integer(psb_ipk_), allocatable :: idxs(:) - contains - procedure, pass(heap) :: init => psb_s_idx_init_heap - procedure, pass(heap) :: howmany => psb_s_idx_howmany - procedure, pass(heap) :: insert => psb_s_idx_insert_heap - procedure, pass(heap) :: get_first => psb_s_idx_heap_get_first - procedure, pass(heap) :: dump => psb_s_idx_dump_heap - procedure, pass(heap) :: free => psb_s_idx_free_heap - end type psb_s_idx_heap - - - interface psb_msort - subroutine psb_smsort(x,ix,dir,flag) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag - integer(psb_ipk_), optional, intent(inout) :: ix(:) - end subroutine psb_smsort - end interface psb_msort - - - interface psb_bsrch - function psb_sbsrch(key,n,v) result(ipos) - import - integer(psb_ipk_) :: ipos, n - real(psb_spk_) :: key - real(psb_spk_) :: v(:) - end function psb_sbsrch - end interface psb_bsrch - - interface psb_ssrch - function psb_sssrch(key,n,v) result(ipos) - import - implicit none - integer(psb_ipk_) :: ipos, n - real(psb_spk_) :: key - real(psb_spk_) :: v(:) - end function psb_sssrch - end interface psb_ssrch - - interface - subroutine psi_s_msort_up(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - real(psb_spk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_s_msort_up - subroutine psi_s_msort_dw(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - real(psb_spk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_s_msort_dw - end interface - interface - subroutine psi_s_amsort_up(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - real(psb_spk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_s_amsort_up - subroutine psi_s_amsort_dw(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - real(psb_spk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_s_amsort_dw - end interface - - - interface psb_qsort - subroutine psb_sqsort(x,ix,dir,flag) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag - integer(psb_ipk_), optional, intent(inout) :: ix(:) - end subroutine psb_sqsort - end interface psb_qsort - - interface psb_isort - subroutine psb_sisort(x,ix,dir,flag) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag - integer(psb_ipk_), optional, intent(inout) :: ix(:) - end subroutine psb_sisort - end interface psb_isort - - - interface psb_hsort - subroutine psb_shsort(x,ix,dir,flag) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag - integer(psb_ipk_), optional, intent(inout) :: ix(:) - end subroutine psb_shsort - end interface psb_hsort - - - interface - subroutine psi_s_insert_heap(key,last,heap,dir,info) - import - implicit none - - ! - ! Input: - ! key: the new value - ! last: pointer to the last occupied element in heap - ! heap: the heap - ! dir: sorting direction - - real(psb_spk_), intent(in) :: key - real(psb_spk_), intent(inout) :: heap(:) - integer(psb_ipk_), intent(in) :: dir - integer(psb_ipk_), intent(inout) :: last - integer(psb_ipk_), intent(out) :: info - end subroutine psi_s_insert_heap - end interface - - interface - subroutine psi_s_idx_insert_heap(key,index,last,heap,idxs,dir,info) - import - implicit none - - ! - ! Input: - ! key: the new value - ! last: pointer to the last occupied element in heap - ! heap: the heap - ! dir: sorting direction - - real(psb_spk_), intent(in) :: key - real(psb_spk_), intent(inout) :: heap(:) - integer(psb_ipk_), intent(in) :: index - integer(psb_ipk_), intent(in) :: dir - integer(psb_ipk_), intent(inout) :: idxs(:) - integer(psb_ipk_), intent(inout) :: last - integer(psb_ipk_), intent(out) :: info - end subroutine psi_s_idx_insert_heap - end interface - - - interface - subroutine psi_s_heap_get_first(key,last,heap,dir,info) - import - implicit none - real(psb_spk_), intent(inout) :: key - integer(psb_ipk_), intent(inout) :: last - integer(psb_ipk_), intent(in) :: dir - real(psb_spk_), intent(inout) :: heap(:) - integer(psb_ipk_), intent(out) :: info - end subroutine psi_s_heap_get_first - end interface - - interface - subroutine psi_s_idx_heap_get_first(key,index,last,heap,idxs,dir,info) - import - real(psb_spk_), intent(inout) :: key - integer(psb_ipk_), intent(out) :: index - real(psb_spk_), intent(inout) :: heap(:) - integer(psb_ipk_), intent(in) :: dir - integer(psb_ipk_), intent(inout) :: last - integer(psb_ipk_), intent(inout) :: idxs(:) - integer(psb_ipk_), intent(out) :: info - end subroutine psi_s_idx_heap_get_first - end interface - - interface - subroutine psi_sisrx_up(n,x,ix) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_sisrx_up - subroutine psi_sisrx_dw(n,x,ix) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_sisrx_dw - subroutine psi_sisr_up(n,x) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_sisr_up - subroutine psi_sisr_dw(n,x) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_sisr_dw - subroutine psi_saisrx_up(n,x,ix) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_saisrx_up - subroutine psi_saisrx_dw(n,x,ix) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_saisrx_dw - subroutine psi_saisr_up(n,x) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_saisr_up - subroutine psi_saisr_dw(n,x) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_saisr_dw - end interface - - interface - subroutine psi_sqsrx_up(n,x,ix) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_sqsrx_up - subroutine psi_sqsrx_dw(n,x,ix) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_sqsrx_dw - subroutine psi_sqsr_up(n,x) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_sqsr_up - subroutine psi_sqsr_dw(n,x) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_sqsr_dw - subroutine psi_saqsrx_up(n,x,ix) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_saqsrx_up - subroutine psi_saqsrx_dw(n,x,ix) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_saqsrx_dw - subroutine psi_saqsr_up(n,x) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_saqsr_up - subroutine psi_saqsr_dw(n,x) - import - real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_saqsr_dw - end interface - -contains - - subroutine psb_s_init_heap(heap,info,dir) - use psb_realloc_mod, only : psb_ensure_size - implicit none - class(psb_s_heap), intent(inout) :: heap - integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_), intent(in), optional :: dir - - info = psb_success_ - heap%last=0 - if (present(dir)) then - heap%dir = dir - else - heap%dir = psb_sort_up_ - endif - select case(heap%dir) - case (psb_sort_up_,psb_sort_down_,psb_asort_up_,psb_asort_down_) - ! ok, do nothing - case default - write(psb_err_unit,*) 'Invalid direction, defaulting to psb_sort_up_' - heap%dir = psb_sort_up_ - end select - call psb_ensure_size(psb_heap_resize,heap%keys,info) - - return - end subroutine psb_s_init_heap - - - function psb_s_howmany(heap) result(res) - implicit none - class(psb_s_heap), intent(in) :: heap - integer(psb_ipk_) :: res - res = heap%last - end function psb_s_howmany - - subroutine psb_s_insert_heap(key,heap,info) - use psb_realloc_mod, only : psb_ensure_size - implicit none - - real(psb_spk_), intent(in) :: key - class(psb_s_heap), intent(inout) :: heap - integer(psb_ipk_), intent(out) :: info - - info = psb_success_ - if (heap%last < 0) then - write(psb_err_unit,*) 'Invalid last in heap ',heap%last - info = heap%last - return - endif - - call psb_ensure_size(heap%last+1,heap%keys,info,addsz=psb_heap_resize) - if (info /= psb_success_) then - write(psb_err_unit,*) 'Memory allocation failure in heap_insert' - info = -5 - return - end if - call psi_s_insert_heap(key,& - & heap%last,heap%keys,heap%dir,info) - - return - end subroutine psb_s_insert_heap - - subroutine psb_s_heap_get_first(key,heap,info) - implicit none - - class(psb_s_heap), intent(inout) :: heap - integer(psb_ipk_), intent(out) :: info - real(psb_spk_), intent(out) :: key - - - info = psb_success_ - - call psi_s_heap_get_first(key,& - & heap%last,heap%keys,heap%dir,info) - - return - end subroutine psb_s_heap_get_first - - subroutine psb_s_dump_heap(iout,heap,info) - - implicit none - class(psb_s_heap), intent(in) :: heap - integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_), intent(in) :: iout - - info = psb_success_ - if (iout < 0) then - write(psb_err_unit,*) 'Invalid file ' - info =-1 - return - end if - - write(iout,*) 'Heap direction ',heap%dir - write(iout,*) 'Heap size ',heap%last - if ((heap%last > 0).and.((.not.allocated(heap%keys)).or.& - & (size(heap%keys) 0).and.((.not.allocated(heap%keys)).or.& - & (size(heap%keys) 0).and.((.not.allocated(heap%idxs)).or.& - & (size(heap%idxs) psb_z_init_heap - procedure, pass(heap) :: howmany => psb_z_howmany - procedure, pass(heap) :: insert => psb_z_insert_heap - procedure, pass(heap) :: get_first => psb_z_heap_get_first - procedure, pass(heap) :: dump => psb_z_dump_heap - procedure, pass(heap) :: free => psb_z_free_heap - end type psb_z_heap - - type psb_z_idx_heap - integer(psb_ipk_) :: last, dir - complex(psb_dpk_), allocatable :: keys(:) - integer(psb_ipk_), allocatable :: idxs(:) - contains - procedure, pass(heap) :: init => psb_z_idx_init_heap - procedure, pass(heap) :: howmany => psb_z_idx_howmany - procedure, pass(heap) :: insert => psb_z_idx_insert_heap - procedure, pass(heap) :: get_first => psb_z_idx_heap_get_first - procedure, pass(heap) :: dump => psb_z_idx_dump_heap - procedure, pass(heap) :: free => psb_z_idx_free_heap - end type psb_z_idx_heap - - - interface psb_msort - subroutine psb_zmsort(x,ix,dir,flag) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag - integer(psb_ipk_), optional, intent(inout) :: ix(:) - end subroutine psb_zmsort - end interface psb_msort - - interface - subroutine psi_z_lmsort_up(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - complex(psb_dpk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_z_lmsort_up - subroutine psi_z_lmsort_dw(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - complex(psb_dpk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_z_lmsort_dw - subroutine psi_z_almsort_up(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - complex(psb_dpk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_z_almsort_up - subroutine psi_z_almsort_dw(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - complex(psb_dpk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_z_almsort_dw - end interface - interface - subroutine psi_z_amsort_up(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - complex(psb_dpk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_z_amsort_up - subroutine psi_z_amsort_dw(n,k,l,iret) - import - implicit none - integer(psb_ipk_) :: n, iret - complex(psb_dpk_) :: k(n) - integer(psb_ipk_) :: l(0:n+1) - end subroutine psi_z_amsort_dw - end interface - - - interface psb_qsort - subroutine psb_zqsort(x,ix,dir,flag) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag - integer(psb_ipk_), optional, intent(inout) :: ix(:) - end subroutine psb_zqsort - end interface psb_qsort - - interface psb_isort - subroutine psb_zisort(x,ix,dir,flag) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag - integer(psb_ipk_), optional, intent(inout) :: ix(:) - end subroutine psb_zisort - end interface psb_isort - - - interface psb_hsort - subroutine psb_zhsort(x,ix,dir,flag) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag - integer(psb_ipk_), optional, intent(inout) :: ix(:) - end subroutine psb_zhsort - end interface psb_hsort - - - interface - subroutine psi_z_insert_heap(key,last,heap,dir,info) - import - implicit none - - ! - ! Input: - ! key: the new value - ! last: pointer to the last occupied element in heap - ! heap: the heap - ! dir: sorting direction - - complex(psb_dpk_), intent(in) :: key - complex(psb_dpk_), intent(inout) :: heap(:) - integer(psb_ipk_), intent(in) :: dir - integer(psb_ipk_), intent(inout) :: last - integer(psb_ipk_), intent(out) :: info - end subroutine psi_z_insert_heap - end interface - - interface - subroutine psi_z_idx_insert_heap(key,index,last,heap,idxs,dir,info) - import - implicit none - - ! - ! Input: - ! key: the new value - ! last: pointer to the last occupied element in heap - ! heap: the heap - ! dir: sorting direction - - complex(psb_dpk_), intent(in) :: key - complex(psb_dpk_), intent(inout) :: heap(:) - integer(psb_ipk_), intent(in) :: index - integer(psb_ipk_), intent(in) :: dir - integer(psb_ipk_), intent(inout) :: idxs(:) - integer(psb_ipk_), intent(inout) :: last - integer(psb_ipk_), intent(out) :: info - end subroutine psi_z_idx_insert_heap - end interface - - - interface - subroutine psi_z_heap_get_first(key,last,heap,dir,info) - import - implicit none - complex(psb_dpk_), intent(inout) :: key - integer(psb_ipk_), intent(inout) :: last - integer(psb_ipk_), intent(in) :: dir - complex(psb_dpk_), intent(inout) :: heap(:) - integer(psb_ipk_), intent(out) :: info - end subroutine psi_z_heap_get_first - end interface - - interface - subroutine psi_z_idx_heap_get_first(key,index,last,heap,idxs,dir,info) - import - complex(psb_dpk_), intent(inout) :: key - integer(psb_ipk_), intent(out) :: index - complex(psb_dpk_), intent(inout) :: heap(:) - integer(psb_ipk_), intent(in) :: dir - integer(psb_ipk_), intent(inout) :: last - integer(psb_ipk_), intent(inout) :: idxs(:) - integer(psb_ipk_), intent(out) :: info - end subroutine psi_z_idx_heap_get_first - end interface - - interface - subroutine psi_zlisrx_up(n,x,ix) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zlisrx_up - subroutine psi_zlisrx_dw(n,x,ix) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zlisrx_dw - subroutine psi_zlisr_up(n,x) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zlisr_up - subroutine psi_zlisr_dw(n,x) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zlisr_dw - subroutine psi_zalisrx_up(n,x,ix) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zalisrx_up - subroutine psi_zalisrx_dw(n,x,ix) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zalisrx_dw - subroutine psi_zalisr_up(n,x) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zalisr_up - subroutine psi_zalisr_dw(n,x) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zalisr_dw - subroutine psi_zaisrx_up(n,x,ix) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zaisrx_up - subroutine psi_zaisrx_dw(n,x,ix) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zaisrx_dw - subroutine psi_zaisr_up(n,x) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zaisr_up - subroutine psi_zaisr_dw(n,x) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zaisr_dw - end interface - - interface - subroutine psi_zlqsrx_up(n,x,ix) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zlqsrx_up - subroutine psi_zlqsrx_dw(n,x,ix) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zlqsrx_dw - subroutine psi_zlqsr_up(n,x) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zlqsr_up - subroutine psi_zlqsr_dw(n,x) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zlqsr_dw - subroutine psi_zalqsrx_up(n,x,ix) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zalqsrx_up - subroutine psi_zalqsrx_dw(n,x,ix) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zalqsrx_dw - subroutine psi_zalqsr_up(n,x) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zalqsr_up - subroutine psi_zalqsr_dw(n,x) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zalqsr_dw - subroutine psi_zaqsrx_up(n,x,ix) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zaqsrx_up - subroutine psi_zaqsrx_dw(n,x,ix) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(inout) :: ix(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zaqsrx_dw - subroutine psi_zaqsr_up(n,x) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zaqsr_up - subroutine psi_zaqsr_dw(n,x) - import - complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), intent(in) :: n - end subroutine psi_zaqsr_dw - end interface - -contains - - subroutine psb_z_init_heap(heap,info,dir) - use psb_realloc_mod, only : psb_ensure_size - implicit none - class(psb_z_heap), intent(inout) :: heap - integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_), intent(in), optional :: dir - - info = psb_success_ - heap%last=0 - if (present(dir)) then - heap%dir = dir - else - heap%dir = psb_asort_up_ - endif - select case(heap%dir) - case (psb_asort_up_,psb_asort_down_) - ! ok, do nothing - case default - write(psb_err_unit,*) 'Invalid direction, defaulting to psb_asort_up_' - heap%dir = psb_asort_up_ - end select - call psb_ensure_size(psb_heap_resize,heap%keys,info) - - return - end subroutine psb_z_init_heap - - - function psb_z_howmany(heap) result(res) - implicit none - class(psb_z_heap), intent(in) :: heap - integer(psb_ipk_) :: res - res = heap%last - end function psb_z_howmany - - subroutine psb_z_insert_heap(key,heap,info) - use psb_realloc_mod, only : psb_ensure_size - implicit none - - complex(psb_dpk_), intent(in) :: key - class(psb_z_heap), intent(inout) :: heap - integer(psb_ipk_), intent(out) :: info - - info = psb_success_ - if (heap%last < 0) then - write(psb_err_unit,*) 'Invalid last in heap ',heap%last - info = heap%last - return - endif - - call psb_ensure_size(heap%last+1,heap%keys,info,addsz=psb_heap_resize) - if (info /= psb_success_) then - write(psb_err_unit,*) 'Memory allocation failure in heap_insert' - info = -5 - return - end if - call psi_z_insert_heap(key,& - & heap%last,heap%keys,heap%dir,info) - - return - end subroutine psb_z_insert_heap - - subroutine psb_z_heap_get_first(key,heap,info) - implicit none - - class(psb_z_heap), intent(inout) :: heap - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_), intent(out) :: key - - - info = psb_success_ - - call psi_z_heap_get_first(key,& - & heap%last,heap%keys,heap%dir,info) - - return - end subroutine psb_z_heap_get_first - - subroutine psb_z_dump_heap(iout,heap,info) - - implicit none - class(psb_z_heap), intent(in) :: heap - integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_), intent(in) :: iout - - info = psb_success_ - if (iout < 0) then - write(psb_err_unit,*) 'Invalid file ' - info =-1 - return - end if - - write(iout,*) 'Heap direction ',heap%dir - write(iout,*) 'Heap size ',heap%last - if ((heap%last > 0).and.((.not.allocated(heap%keys)).or.& - & (size(heap%keys) 0).and.((.not.allocated(heap%keys)).or.& - & (size(heap%keys) 0).and.((.not.allocated(heap%idxs)).or.& - & (size(heap%idxs)