!!$ !!$ Parallel Sparse BLAS version 3.4 !!$ (C) Copyright 2006, 2010, 2015 !!$ Salvatore Filippone University of Rome Tor Vergata !!$ Alfredo Buttari CNRS-IRIT, Toulouse !!$ !!$ 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. !!$ !!$ ! ! The merge-sort and quicksort routines are implemented in the ! serial/aux directory ! References: ! D. Knuth ! The Art of Computer Programming, vol. 3 ! Addison-Wesley ! ! Aho, Hopcroft, Ullman ! Data Structures and Algorithms ! Addison-Wesley ! module psb_sort_mod use psb_const_mod use psb_ip_reord_mod use psb_i_sort_mod use psb_s_sort_mod use psb_c_sort_mod use psb_d_sort_mod use psb_z_sort_mod !!$module psb_sort_mod !!$ use psb_const_mod !!$ !!$ !!$ type psb_int_heap !!$ integer(psb_ipk_) :: last, dir !!$ integer(psb_ipk_), allocatable :: keys(:) !!$ end type psb_int_heap !!$ type psb_int_idx_heap !!$ integer(psb_ipk_) :: last, dir !!$ integer(psb_ipk_), allocatable :: keys(:) !!$ integer(psb_ipk_), allocatable :: idxs(:) !!$ end type psb_int_idx_heap !!$ type psb_sreal_idx_heap !!$ integer(psb_ipk_) :: last, dir !!$ real(psb_spk_), allocatable :: keys(:) !!$ integer(psb_ipk_), allocatable :: idxs(:) !!$ end type psb_sreal_idx_heap !!$ type psb_dreal_idx_heap !!$ integer(psb_ipk_) :: last, dir !!$ real(psb_dpk_), allocatable :: keys(:) !!$ integer(psb_ipk_), allocatable :: idxs(:) !!$ end type psb_dreal_idx_heap !!$ type psb_scomplex_idx_heap !!$ integer(psb_ipk_) :: last, dir !!$ complex(psb_spk_), allocatable :: keys(:) !!$ integer(psb_ipk_), allocatable :: idxs(:) !!$ end type psb_scomplex_idx_heap !!$ type psb_dcomplex_idx_heap !!$ integer(psb_ipk_) :: last, dir !!$ complex(psb_dpk_), allocatable :: keys(:) !!$ integer(psb_ipk_), allocatable :: idxs(:) !!$ end type psb_dcomplex_idx_heap !!$ !!$ !!$ interface psb_iblsrch !!$ function psb_iblsrch(key,n,v) result(ipos) !!$ import :: psb_ipk_ !!$ integer(psb_ipk_) :: ipos, key, n !!$ integer(psb_ipk_) :: v(:) !!$ end function psb_iblsrch !!$ end interface !!$ !!$ interface psb_ibsrch !!$ function psb_ibsrch(key,n,v) result(ipos) !!$ import :: psb_ipk_ !!$ integer(psb_ipk_) :: ipos, key, n !!$ integer(psb_ipk_) :: v(:) !!$ end function psb_ibsrch !!$ end interface !!$ !!$ interface psb_issrch !!$ function psb_issrch(key,n,v) result(ipos) !!$ import :: psb_ipk_ !!$ implicit none !!$ integer(psb_ipk_) :: ipos, key, n !!$ integer(psb_ipk_) :: v(:) !!$ end function psb_issrch !!$ end interface !!$ !!$ interface psb_isaperm !!$ logical function psb_isaperm(n,eip) !!$ import :: psb_ipk_ !!$ integer(psb_ipk_), intent(in) :: n !!$ integer(psb_ipk_), intent(in) :: eip(n) !!$ end function psb_isaperm !!$ end interface !!$ !!$ !!$ interface psb_msort !!$ subroutine imsort(x,ix,dir,flag) !!$ import :: psb_ipk_ !!$ integer(psb_ipk_), intent(inout) :: x(:) !!$ integer(psb_ipk_), optional, intent(in) :: dir, flag !!$ integer(psb_ipk_), optional, intent(inout) :: ix(:) !!$ end subroutine imsort !!$ subroutine smsort(x,ix,dir,flag) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ real(psb_spk_), intent(inout) :: x(:) !!$ integer(psb_ipk_), optional, intent(in) :: dir, flag !!$ integer(psb_ipk_), optional, intent(inout) :: ix(:) !!$ end subroutine smsort !!$ subroutine dmsort(x,ix,dir,flag) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ real(psb_dpk_), intent(inout) :: x(:) !!$ integer(psb_ipk_), optional, intent(in) :: dir, flag !!$ integer(psb_ipk_), optional, intent(inout) :: ix(:) !!$ end subroutine dmsort !!$ subroutine camsort(x,ix,dir,flag) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ complex(psb_spk_), intent(inout) :: x(:) !!$ integer(psb_ipk_), optional, intent(in) :: dir, flag !!$ integer(psb_ipk_), optional, intent(inout) :: ix(:) !!$ end subroutine camsort !!$ subroutine zamsort(x,ix,dir,flag) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ complex(psb_dpk_), intent(inout) :: x(:) !!$ integer(psb_ipk_), optional, intent(in) :: dir, flag !!$ integer(psb_ipk_), optional, intent(inout) :: ix(:) !!$ end subroutine zamsort !!$ end interface !!$ !!$ !!$ interface psb_msort_unique !!$ subroutine imsort_u(x,nout,dir) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ integer(psb_ipk_), intent(inout) :: x(:) !!$ integer(psb_ipk_), intent(out) :: nout !!$ integer(psb_ipk_), optional, intent(in) :: dir !!$ end subroutine imsort_u !!$ end interface !!$ !!$ interface psb_qsort !!$ subroutine iqsort(x,ix,dir,flag) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ integer(psb_ipk_), intent(inout) :: x(:) !!$ integer(psb_ipk_), optional, intent(in) :: dir, flag !!$ integer(psb_ipk_), optional, intent(inout) :: ix(:) !!$ end subroutine iqsort !!$ subroutine sqsort(x,ix,dir,flag) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ real(psb_spk_), intent(inout) :: x(:) !!$ integer(psb_ipk_), optional, intent(in) :: dir, flag !!$ integer(psb_ipk_), optional, intent(inout) :: ix(:) !!$ end subroutine sqsort !!$ subroutine dqsort(x,ix,dir,flag) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ real(psb_dpk_), intent(inout) :: x(:) !!$ integer(psb_ipk_), optional, intent(in) :: dir, flag !!$ integer(psb_ipk_), optional, intent(inout) :: ix(:) !!$ end subroutine dqsort !!$ subroutine cqsort(x,ix,dir,flag) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ complex(psb_spk_), intent(inout) :: x(:) !!$ integer(psb_ipk_), optional, intent(in) :: dir, flag !!$ integer(psb_ipk_), optional, intent(inout) :: ix(:) !!$ end subroutine cqsort !!$ subroutine zqsort(x,ix,dir,flag) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ complex(psb_dpk_), intent(inout) :: x(:) !!$ integer(psb_ipk_), optional, intent(in) :: dir, flag !!$ integer(psb_ipk_), optional, intent(inout) :: ix(:) !!$ end subroutine zqsort !!$ end interface !!$ !!$ !!$ interface psb_hsort !!$ subroutine ihsort(x,ix,dir,flag) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ integer(psb_ipk_), intent(inout) :: x(:) !!$ integer(psb_ipk_), optional, intent(in) :: dir, flag !!$ integer(psb_ipk_), optional, intent(inout) :: ix(:) !!$ end subroutine ihsort !!$ subroutine shsort(x,ix,dir,flag) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ real(psb_spk_), intent(inout) :: x(:) !!$ integer(psb_ipk_), optional, intent(in) :: dir, flag !!$ integer(psb_ipk_), optional, intent(inout) :: ix(:) !!$ end subroutine shsort !!$ subroutine dhsort(x,ix,dir,flag) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ real(psb_dpk_), intent(inout) :: x(:) !!$ integer(psb_ipk_), optional, intent(in) :: dir, flag !!$ integer(psb_ipk_), optional, intent(inout) :: ix(:) !!$ end subroutine dhsort !!$ subroutine chsort(x,ix,dir,flag) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ complex(psb_spk_), intent(inout) :: x(:) !!$ integer(psb_ipk_), optional, intent(in) :: dir, flag !!$ integer(psb_ipk_), optional, intent(inout) :: ix(:) !!$ end subroutine chsort !!$ subroutine zhsort(x,ix,dir,flag) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ complex(psb_dpk_), intent(inout) :: x(:) !!$ integer(psb_ipk_), optional, intent(in) :: dir, flag !!$ integer(psb_ipk_), optional, intent(inout) :: ix(:) !!$ end subroutine zhsort !!$ end interface !!$ !!$ !!$ interface psb_howmany_heap !!$ function psb_howmany_int_heap(heap) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_int_heap !!$ type(psb_int_heap), intent(in) :: heap !!$ integer(psb_ipk_) :: psb_howmany_int_heap !!$ end function psb_howmany_int_heap !!$ function psb_howmany_sreal_idx_heap(heap) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_sreal_idx_heap !!$ type(psb_sreal_idx_heap), intent(in) :: heap !!$ integer(psb_ipk_) :: psb_howmany_sreal_idx_heap !!$ end function psb_howmany_sreal_idx_heap !!$ function psb_howmany_dreal_idx_heap(heap) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_dreal_idx_heap !!$ type(psb_dreal_idx_heap), intent(in) :: heap !!$ integer(psb_ipk_) :: psb_howmany_dreal_idx_heap !!$ end function psb_howmany_dreal_idx_heap !!$ function psb_howmany_int_idx_heap(heap) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_int_idx_heap !!$ type(psb_int_idx_heap), intent(in) :: heap !!$ integer(psb_ipk_) :: psb_howmany_int_idx_heap !!$ end function psb_howmany_int_idx_heap !!$ function psb_howmany_scomplex_idx_heap(heap) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_scomplex_idx_heap !!$ type(psb_scomplex_idx_heap), intent(in) :: heap !!$ integer(psb_ipk_) :: psb_howmany_scomplex_idx_heap !!$ end function psb_howmany_scomplex_idx_heap !!$ function psb_howmany_dcomplex_idx_heap(heap) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_dcomplex_idx_heap !!$ type(psb_dcomplex_idx_heap), intent(in) :: heap !!$ integer(psb_ipk_) :: psb_howmany_dcomplex_idx_heap !!$ end function psb_howmany_dcomplex_idx_heap !!$ end interface !!$ !!$ !!$ interface psb_init_heap !!$ subroutine psb_init_int_heap(heap,info,dir) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_int_heap !!$ type(psb_int_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ integer(psb_ipk_), intent(in), optional :: dir !!$ end subroutine psb_init_int_heap !!$ subroutine psb_init_sreal_idx_heap(heap,info,dir) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_sreal_idx_heap !!$ type(psb_sreal_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ integer(psb_ipk_), intent(in), optional :: dir !!$ end subroutine psb_init_sreal_idx_heap !!$ subroutine psb_init_int_idx_heap(heap,info,dir) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_int_idx_heap !!$ type(psb_int_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ integer(psb_ipk_), intent(in), optional :: dir !!$ end subroutine psb_init_int_idx_heap !!$ subroutine psb_init_scomplex_idx_heap(heap,info,dir) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_scomplex_idx_heap !!$ type(psb_scomplex_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ integer(psb_ipk_), intent(in), optional :: dir !!$ end subroutine psb_init_scomplex_idx_heap !!$ subroutine psb_init_dcomplex_idx_heap(heap,info,dir) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_dcomplex_idx_heap !!$ type(psb_dcomplex_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ integer(psb_ipk_), intent(in), optional :: dir !!$ end subroutine psb_init_dcomplex_idx_heap !!$ subroutine psb_init_dreal_idx_heap(heap,info,dir) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_dreal_idx_heap !!$ type(psb_dreal_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ integer(psb_ipk_), intent(in), optional :: dir !!$ end subroutine psb_init_dreal_idx_heap !!$ end interface !!$ !!$ !!$ interface psb_dump_heap !!$ subroutine psb_dump_int_heap(iout,heap,info) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_int_heap !!$ type(psb_int_heap), intent(in) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ integer(psb_ipk_), intent(in) :: iout !!$ end subroutine psb_dump_int_heap !!$ subroutine psb_dump_sreal_idx_heap(iout,heap,info) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_sreal_idx_heap !!$ type(psb_sreal_idx_heap), intent(in) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ integer(psb_ipk_), intent(in) :: iout !!$ end subroutine psb_dump_sreal_idx_heap !!$ subroutine psb_dump_dreal_idx_heap(iout,heap,info) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_dreal_idx_heap !!$ type(psb_dreal_idx_heap), intent(in) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ integer(psb_ipk_), intent(in) :: iout !!$ end subroutine psb_dump_dreal_idx_heap !!$ subroutine psb_dump_int_idx_heap(iout,heap,info) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_int_idx_heap !!$ type(psb_int_idx_heap), intent(in) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ integer(psb_ipk_), intent(in) :: iout !!$ end subroutine psb_dump_int_idx_heap !!$ subroutine psb_dump_scomplex_idx_heap(iout,heap,info) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_scomplex_idx_heap !!$ type(psb_scomplex_idx_heap), intent(in) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ integer(psb_ipk_), intent(in) :: iout !!$ end subroutine psb_dump_scomplex_idx_heap !!$ subroutine psb_dump_dcomplex_idx_heap(iout,heap,info) !!$ import :: psb_ipk_, psb_spk_, psb_dpk_ !!$ import :: psb_dcomplex_idx_heap !!$ type(psb_dcomplex_idx_heap), intent(in) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ integer(psb_ipk_), intent(in) :: iout !!$ end subroutine psb_dump_dcomplex_idx_heap !!$ end interface !!$ !!$ !!$ interface psb_insert_heap !!$ subroutine psb_insert_int_heap(key,heap,info) !!$ import :: psb_int_heap, psb_ipk_ !!$ integer(psb_ipk_), intent(in) :: key !!$ type(psb_int_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ end subroutine psb_insert_int_heap !!$ subroutine psb_insert_int_idx_heap(key,index,heap,info) !!$ import :: psb_dpk_, psb_int_idx_heap, psb_ipk_ !!$ integer(psb_ipk_), intent(in) :: key !!$ integer(psb_ipk_), intent(in) :: index !!$ type(psb_int_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ end subroutine psb_insert_int_idx_heap !!$ subroutine psb_insert_sreal_idx_heap(key,index,heap,info) !!$ import :: psb_spk_, psb_sreal_idx_heap, psb_ipk_ !!$ real(psb_spk_), intent(in) :: key !!$ integer(psb_ipk_), intent(in) :: index !!$ type(psb_sreal_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ end subroutine psb_insert_sreal_idx_heap !!$ subroutine psb_insert_dreal_idx_heap(key,index,heap,info) !!$ import :: psb_dpk_, psb_dreal_idx_heap, psb_ipk_ !!$ real(psb_dpk_), intent(in) :: key !!$ integer(psb_ipk_), intent(in) :: index !!$ type(psb_dreal_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ end subroutine psb_insert_dreal_idx_heap !!$ subroutine psb_insert_scomplex_idx_heap(key,index,heap,info) !!$ import :: psb_spk_, psb_scomplex_idx_heap, psb_ipk_ !!$ complex(psb_spk_), intent(in) :: key !!$ integer(psb_ipk_), intent(in) :: index !!$ type(psb_scomplex_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ end subroutine psb_insert_scomplex_idx_heap !!$ subroutine psb_insert_dcomplex_idx_heap(key,index,heap,info) !!$ import :: psb_dpk_, psb_dcomplex_idx_heap, psb_ipk_ !!$ complex(psb_dpk_), intent(in) :: key !!$ integer(psb_ipk_), intent(in) :: index !!$ type(psb_dcomplex_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ end subroutine psb_insert_dcomplex_idx_heap !!$ end interface !!$ !!$ interface psb_heap_get_first !!$ subroutine psb_int_heap_get_first(key,heap,info) !!$ import :: psb_int_heap, psb_ipk_ !!$ type(psb_int_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: key,info !!$ end subroutine psb_int_heap_get_first !!$ subroutine psb_int_idx_heap_get_first(key,index,heap,info) !!$ import :: psb_int_idx_heap, psb_ipk_ !!$ type(psb_int_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: index,info !!$ integer(psb_ipk_), intent(out) :: key !!$ end subroutine psb_int_idx_heap_get_first !!$ subroutine psb_sreal_idx_heap_get_first(key,index,heap,info) !!$ import :: psb_spk_, psb_sreal_idx_heap, psb_ipk_ !!$ type(psb_sreal_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: index,info !!$ real(psb_spk_), intent(out) :: key !!$ end subroutine psb_sreal_idx_heap_get_first !!$ subroutine psb_dreal_idx_heap_get_first(key,index,heap,info) !!$ import :: psb_dpk_, psb_dreal_idx_heap, psb_ipk_ !!$ type(psb_dreal_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: index,info !!$ real(psb_dpk_), intent(out) :: key !!$ end subroutine psb_dreal_idx_heap_get_first !!$ subroutine psb_scomplex_idx_heap_get_first(key,index,heap,info) !!$ import :: psb_spk_, psb_scomplex_idx_heap, psb_ipk_ !!$ type(psb_scomplex_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: index,info !!$ complex(psb_spk_), intent(out) :: key !!$ end subroutine psb_scomplex_idx_heap_get_first !!$ !!$ subroutine psb_dcomplex_idx_heap_get_first(key,index,heap,info) !!$ import :: psb_dpk_, psb_dcomplex_idx_heap, psb_ipk_ !!$ type(psb_dcomplex_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: index,info !!$ complex(psb_dpk_), intent(out) :: key !!$ end subroutine psb_dcomplex_idx_heap_get_first !!$ end interface !!$ !!$ interface !!$ subroutine psi_insert_int_heap(key,last,heap,dir,info) !!$ import :: psb_ipk_ !!$ implicit none !!$ !!$ ! !!$ ! Input: !!$ ! key: the new value !!$ ! last: pointer to the last occupied element in heap !!$ ! heap: the heap !!$ ! dir: sorting direction !!$ !!$ integer(psb_ipk_), intent(in) :: key,dir !!$ integer(psb_ipk_), intent(inout) :: heap(:),last !!$ integer(psb_ipk_), intent(out) :: info !!$ end subroutine psi_insert_int_heap !!$ end interface !!$ !!$ interface !!$ subroutine psi_int_heap_get_first(key,last,heap,dir,info) !!$ import :: psb_ipk_ !!$ implicit none !!$ !!$ integer(psb_ipk_), intent(inout) :: key,last !!$ integer(psb_ipk_), intent(in) :: dir !!$ integer(psb_ipk_), intent(inout) :: heap(:) !!$ integer(psb_ipk_), intent(out) :: info !!$ end subroutine psi_int_heap_get_first !!$ end interface !!$ !!$ interface !!$ subroutine psi_insert_real_heap(key,last,heap,dir,info) !!$ import :: psb_spk_, psb_ipk_ !!$ real(psb_spk_), intent(in) :: key !!$ integer(psb_ipk_), intent(in) :: dir !!$ real(psb_spk_), intent(inout) :: heap(:) !!$ integer(psb_ipk_), intent(inout) :: last !!$ integer(psb_ipk_), intent(out) :: info !!$ end subroutine psi_insert_real_heap !!$ end interface !!$ !!$ interface !!$ subroutine psi_real_heap_get_first(key,last,heap,dir,info) !!$ import :: psb_spk_, psb_ipk_ !!$ 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_real_heap_get_first !!$ end interface !!$ !!$ interface !!$ subroutine psi_insert_double_heap(key,last,heap,dir,info) !!$ import :: psb_dpk_, psb_ipk_ !!$ real(psb_dpk_), intent(in) :: key !!$ integer(psb_ipk_), intent(in) :: dir !!$ real(psb_dpk_), intent(inout) :: heap(:) !!$ integer(psb_ipk_), intent(inout) :: last !!$ integer(psb_ipk_), intent(out) :: info !!$ end subroutine psi_insert_double_heap !!$ end interface !!$ !!$ interface !!$ subroutine psi_double_heap_get_first(key,last,heap,dir,info) !!$ import :: psb_dpk_, psb_ipk_ !!$ 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_double_heap_get_first !!$ end interface !!$ !!$ interface !!$ subroutine psi_insert_scomplex_heap(key,last,heap,dir,info) !!$ import :: psb_spk_, psb_ipk_ !!$ complex(psb_spk_), intent(in) :: key !!$ integer(psb_ipk_), intent(in) :: dir !!$ complex(psb_spk_), intent(inout) :: heap(:) !!$ integer(psb_ipk_), intent(inout) :: last !!$ integer(psb_ipk_), intent(out) :: info !!$ end subroutine psi_insert_scomplex_heap !!$ end interface !!$ !!$ interface !!$ subroutine psi_scomplex_heap_get_first(key,last,heap,dir,info) !!$ import :: psb_spk_, psb_ipk_ !!$ 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_scomplex_heap_get_first !!$ end interface !!$ !!$ interface !!$ subroutine psi_insert_dcomplex_heap(key,last,heap,dir,info) !!$ import :: psb_dpk_, psb_ipk_ !!$ complex(psb_dpk_), intent(in) :: key !!$ integer(psb_ipk_), intent(in) :: dir !!$ complex(psb_dpk_), intent(inout) :: heap(:) !!$ integer(psb_ipk_), intent(inout) :: last !!$ integer(psb_ipk_), intent(out) :: info !!$ end subroutine psi_insert_dcomplex_heap !!$ end interface !!$ !!$ interface !!$ subroutine psi_dcomplex_heap_get_first(key,last,heap,dir,info) !!$ import :: psb_dpk_, psb_ipk_ !!$ 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_dcomplex_heap_get_first !!$ end interface !!$ !!$ interface !!$ subroutine psi_insert_int_idx_heap(key,index,last,heap,idxs,dir,info) !!$ import :: psb_ipk_ !!$ integer(psb_ipk_), intent(in) :: key !!$ integer(psb_ipk_), intent(in) :: index,dir !!$ integer(psb_ipk_), intent(inout) :: heap(:),last !!$ integer(psb_ipk_), intent(inout) :: idxs(:) !!$ integer(psb_ipk_), intent(out) :: info !!$ end subroutine psi_insert_int_idx_heap !!$ end interface !!$ !!$ interface !!$ subroutine psi_int_idx_heap_get_first(key,index,last,heap,idxs,dir,info) !!$ import :: psb_ipk_ !!$ integer(psb_ipk_), intent(inout) :: heap(:) !!$ integer(psb_ipk_), intent(out) :: index,info !!$ integer(psb_ipk_), intent(inout) :: last,idxs(:) !!$ integer(psb_ipk_), intent(in) :: dir !!$ integer(psb_ipk_), intent(out) :: key !!$ end subroutine psi_int_idx_heap_get_first !!$ end interface !!$ !!$ interface !!$ subroutine psi_insert_sreal_idx_heap(key,index,last,heap,idxs,dir,info) !!$ import :: psb_spk_, psb_ipk_ !!$ real(psb_spk_), intent(in) :: key !!$ integer(psb_ipk_), intent(in) :: index,dir !!$ real(psb_spk_), intent(inout) :: heap(:) !!$ integer(psb_ipk_), intent(inout) :: idxs(:),last !!$ integer(psb_ipk_), intent(out) :: info !!$ end subroutine psi_insert_sreal_idx_heap !!$ end interface !!$ !!$ interface !!$ subroutine psi_sreal_idx_heap_get_first(key,index,last,heap,idxs,dir,info) !!$ import :: psb_spk_, psb_ipk_ !!$ real(psb_spk_), intent(inout) :: heap(:) !!$ integer(psb_ipk_), intent(out) :: index,info !!$ integer(psb_ipk_), intent(inout) :: last,idxs(:) !!$ integer(psb_ipk_), intent(in) :: dir !!$ real(psb_spk_), intent(out) :: key !!$ end subroutine psi_sreal_idx_heap_get_first !!$ end interface !!$ !!$ interface !!$ subroutine psi_insert_dreal_idx_heap(key,index,last,heap,idxs,dir,info) !!$ import :: psb_dpk_, psb_ipk_ !!$ real(psb_dpk_), intent(in) :: key !!$ integer(psb_ipk_), intent(in) :: index,dir !!$ real(psb_dpk_), intent(inout) :: heap(:) !!$ integer(psb_ipk_), intent(inout) :: idxs(:),last !!$ integer(psb_ipk_), intent(out) :: info !!$ end subroutine psi_insert_dreal_idx_heap !!$ end interface !!$ !!$ interface !!$ subroutine psi_dreal_idx_heap_get_first(key,index,last,heap,idxs,dir,info) !!$ import :: psb_dpk_, psb_ipk_ !!$ real(psb_dpk_), intent(inout) :: heap(:) !!$ integer(psb_ipk_), intent(out) :: index,info !!$ integer(psb_ipk_), intent(inout) :: last,idxs(:) !!$ integer(psb_ipk_), intent(in) :: dir !!$ real(psb_dpk_), intent(out) :: key !!$ end subroutine psi_dreal_idx_heap_get_first !!$ end interface !!$ !!$ interface !!$ subroutine psi_insert_scomplex_idx_heap(key,index,last,heap,idxs,dir,info) !!$ import :: psb_spk_, psb_ipk_ !!$ complex(psb_spk_), intent(in) :: key !!$ integer(psb_ipk_), intent(in) :: index,dir !!$ complex(psb_spk_), intent(inout) :: heap(:) !!$ integer(psb_ipk_), intent(inout) :: idxs(:),last !!$ integer(psb_ipk_), intent(out) :: info !!$ end subroutine psi_insert_scomplex_idx_heap !!$ end interface !!$ !!$ interface !!$ subroutine psi_scomplex_idx_heap_get_first(key,index,last,heap,idxs,dir,info) !!$ import :: psb_spk_, psb_ipk_ !!$ complex(psb_spk_), intent(inout) :: heap(:) !!$ integer(psb_ipk_), intent(out) :: index,info !!$ integer(psb_ipk_), intent(inout) :: last,idxs(:) !!$ integer(psb_ipk_), intent(in) :: dir !!$ complex(psb_spk_), intent(out) :: key !!$ end subroutine psi_scomplex_idx_heap_get_first !!$ end interface !!$ !!$ interface !!$ subroutine psi_insert_dcomplex_idx_heap(key,index,last,heap,idxs,dir,info) !!$ import :: psb_dpk_, psb_ipk_ !!$ complex(psb_dpk_), intent(in) :: key !!$ integer(psb_ipk_), intent(in) :: index,dir !!$ complex(psb_dpk_), intent(inout) :: heap(:) !!$ integer(psb_ipk_), intent(inout) :: idxs(:),last !!$ integer(psb_ipk_), intent(out) :: info !!$ end subroutine psi_insert_dcomplex_idx_heap !!$ end interface !!$ !!$ interface !!$ subroutine psi_dcomplex_idx_heap_get_first(key,index,last,heap,idxs,dir,info) !!$ import :: psb_dpk_, psb_ipk_ !!$ complex(psb_dpk_), intent(inout) :: heap(:) !!$ integer(psb_ipk_), intent(out) :: index,info !!$ integer(psb_ipk_), intent(inout) :: last,idxs(:) !!$ integer(psb_ipk_), intent(in) :: dir !!$ complex(psb_dpk_), intent(out) :: key !!$ end subroutine psi_dcomplex_idx_heap_get_first !!$ end interface !!$ !!$ !!$ interface psb_free_heap !!$ module procedure psb_free_int_heap, psb_free_int_idx_heap,& !!$ & psb_free_sreal_idx_heap, psb_free_scomplex_idx_heap, & !!$ & psb_free_dreal_idx_heap, psb_free_dcomplex_idx_heap !!$ end interface !!$ !!$contains !!$ !!$ subroutine psb_free_int_heap(heap,info) !!$ implicit none !!$ type(psb_int_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ !!$ info=psb_success_ !!$ if (allocated(heap%keys)) deallocate(heap%keys,stat=info) !!$ !!$ end subroutine psb_free_int_heap !!$ !!$ subroutine psb_free_sreal_idx_heap(heap,info) !!$ implicit none !!$ type(psb_sreal_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ !!$ info=psb_success_ !!$ if (allocated(heap%keys)) deallocate(heap%keys,stat=info) !!$ if ((info == psb_success_).and.(allocated(heap%idxs))) deallocate(heap%idxs,stat=info) !!$ !!$ end subroutine psb_free_sreal_idx_heap !!$ !!$ subroutine psb_free_dreal_idx_heap(heap,info) !!$ implicit none !!$ type(psb_dreal_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ !!$ info=psb_success_ !!$ if (allocated(heap%keys)) deallocate(heap%keys,stat=info) !!$ if ((info == psb_success_).and.(allocated(heap%idxs))) deallocate(heap%idxs,stat=info) !!$ !!$ end subroutine psb_free_dreal_idx_heap !!$ !!$ subroutine psb_free_int_idx_heap(heap,info) !!$ implicit none !!$ type(psb_int_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ !!$ info=psb_success_ !!$ if (allocated(heap%keys)) deallocate(heap%keys,stat=info) !!$ if ((info == psb_success_).and.(allocated(heap%idxs))) deallocate(heap%idxs,stat=info) !!$ !!$ end subroutine psb_free_int_idx_heap !!$ !!$ subroutine psb_free_scomplex_idx_heap(heap,info) !!$ implicit none !!$ type(psb_scomplex_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ !!$ info=psb_success_ !!$ if (allocated(heap%keys)) deallocate(heap%keys,stat=info) !!$ if ((info == psb_success_).and.(allocated(heap%idxs))) deallocate(heap%idxs,stat=info) !!$ !!$ end subroutine psb_free_scomplex_idx_heap !!$ !!$ subroutine psb_free_dcomplex_idx_heap(heap,info) !!$ implicit none !!$ type(psb_dcomplex_idx_heap), intent(inout) :: heap !!$ integer(psb_ipk_), intent(out) :: info !!$ !!$ info=psb_success_ !!$ if (allocated(heap%keys)) deallocate(heap%keys,stat=info) !!$ if ((info == psb_success_).and.(allocated(heap%idxs))) deallocate(heap%idxs,stat=info) !!$ !!$ end subroutine psb_free_dcomplex_idx_heap !!$ end module psb_sort_mod