7
7
module test_sorting
8
8
9
9
use, intrinsic :: iso_fortran_env, only: compiler_version, error_unit
10
- use stdlib_kinds, only: int8, int16, int32, int64, dp, sp
10
+ use stdlib_kinds, only: int8, int16, int32, int64, dp, sp, xdp, qp
11
11
use stdlib_sorting, only: sort, sort_index, sort_adjoint, ord_sort, radix_sort, int_index, int_index_low
12
12
use stdlib_string_type, only: string_type, assignment(=), operator(>), &
13
13
operator(<), write(formatted)
@@ -115,6 +115,9 @@ contains
115
115
new_unittest('string_sort_adjointes_${namei}$', test_string_sort_adjointes_${namei}$), &
116
116
new_unittest('bitset_large_sort_adjointes_${namei}$', test_bitsetl_sort_adjointes_${namei}$), &
117
117
new_unittest('bitset_64_sort_adjointes_${namei}$', test_bitset64_sort_adjointes_${namei}$), &
118
+ #:endfor
119
+ #:for ki, ti, namei in REAL_TYPES_ALT_NAME
120
+ new_unittest('real_sort_adjointes_${namei}$', test_real_sort_adjointes_${namei}$), &
118
121
#:endfor
119
122
new_unittest('int_ord_sorts', test_int_ord_sorts) &
120
123
]
@@ -1896,6 +1899,119 @@ contains
1896
1899
end subroutine test_bitset64_sort_adjoint_${namei}$
1897
1900
#:endfor
1898
1901
1902
+ #:for ki, ti, namei in REAL_TYPES_ALT_NAME
1903
+ subroutine test_real_sort_adjointes_${namei}$(error)
1904
+ !> Error handling
1905
+ type(error_type), allocatable, intent(out) :: error
1906
+ logical :: ltest
1907
+
1908
+ call test_real_sort_adjoint_${namei}$( blocks, "Blocks", ltest )
1909
+ call check(error, ltest)
1910
+ if (allocated(error)) return
1911
+
1912
+ call test_real_sort_adjoint_${namei}$( decrease, "Decreasing", ltest )
1913
+ call check(error, ltest)
1914
+ if (allocated(error)) return
1915
+
1916
+ call test_real_sort_adjoint_${namei}$( identical, "Identical", ltest )
1917
+ call check(error, ltest)
1918
+ if (allocated(error)) return
1919
+
1920
+ call test_real_sort_adjoint_${namei}$( increase, "Increasing", ltest )
1921
+ call check(error, ltest)
1922
+ if (allocated(error)) return
1923
+
1924
+ call test_real_sort_adjoint_${namei}$( rand1, "Random dense", ltest )
1925
+ call check(error, ltest)
1926
+ if (allocated(error)) return
1927
+
1928
+ call test_real_sort_adjoint_${namei}$( rand2, "Random order", ltest )
1929
+ call check(error, ltest)
1930
+ if (allocated(error)) return
1931
+
1932
+ call test_real_sort_adjoint_${namei}$( rand0, "Random sparse", ltest )
1933
+ call check(error, ltest)
1934
+ if (allocated(error)) return
1935
+
1936
+ call test_real_sort_adjoint_${namei}$( rand3, "Random 3", ltest )
1937
+ call check(error, ltest)
1938
+ if (allocated(error)) return
1939
+
1940
+ call test_real_sort_adjoint_${namei}$( rand10, "Random 10", ltest )
1941
+ call check(error, ltest)
1942
+ if (allocated(error)) return
1943
+
1944
+ end subroutine test_real_sort_adjointes_${namei}$
1945
+
1946
+ subroutine test_real_sort_adjoint_${namei}$( a, a_name, ltest )
1947
+ integer(int32), intent(inout) :: a(:)
1948
+ character(*), intent(in) :: a_name
1949
+ logical, intent(out) :: ltest
1950
+
1951
+ integer(int64) :: t0, t1, tdiff
1952
+ real(dp) :: rate
1953
+ ${ti}$ :: adjoint(size(a))
1954
+ ${ti}$ :: iwork(size(a))
1955
+ integer(int64) :: i, j
1956
+ integer(int64) :: i_adj
1957
+ logical :: valid
1958
+ logical :: valid_adj
1959
+
1960
+ ltest = .true.
1961
+
1962
+ tdiff = 0
1963
+ do i = 1, repeat
1964
+ dummy = a
1965
+ adjoint = real(dummy, kind=${namei}$)
1966
+ call system_clock( t0, rate )
1967
+ call sort_adjoint( dummy, adjoint, work, iwork )
1968
+ call system_clock( t1, rate )
1969
+ tdiff = tdiff + t1 - t0
1970
+ end do
1971
+ tdiff = tdiff/repeat
1972
+
1973
+ call verify_sort( dummy, valid, i )
1974
+ call verify_adjoint(int(adjoint, kind=int32), dummy, valid_adj, i_adj )
1975
+
1976
+ ltest = (ltest .and. valid .and. valid_adj)
1977
+ if ( .not. valid ) then
1978
+ write( *, * ) "SORT_ADJOINT did not sort " // a_name // "."
1979
+ write(*,*) 'i = ', i
1980
+ write(*,'(a18, 2i7)') 'a(i-1:i) = ', a(i-1:i)
1981
+ end if
1982
+ if ( .not. valid_adj ) then
1983
+ write( *, * ) "SORT_ADJOINT did not sort " // a_name // "."
1984
+ write(*,*) 'i_adj = ', i_adj
1985
+ write(*,'(a18, 2i7)') 'a(i_adj-1:i_adj) = ', a(i_adj-1:i_adj)
1986
+ end if
1987
+ write( lun, '("| Integer |", 1x, i7, 2x, "|", 1x, a15, " |", ' // &
1988
+ 'a12, " |", F10.6, " |" )' ) &
1989
+ test_size, a_name, "Sort_adjoint", tdiff/rate
1990
+
1991
+ !reverse
1992
+ dummy = a
1993
+ adjoint = real(dummy, kind=${namei}$)
1994
+ call sort_adjoint( dummy, adjoint, work, iwork, reverse=.true. )
1995
+
1996
+ call verify_reverse_sort( dummy, valid, i )
1997
+ call verify_adjoint(int(adjoint, kind=int32), dummy, valid_adj, i_adj )
1998
+ ltest = (ltest .and. valid .and. valid_adj)
1999
+ if ( .not. valid ) then
2000
+ write( *, * ) "SORT_ADJOINT did not reverse sort " // &
2001
+ a_name // "."
2002
+ write(*,*) 'i = ', i
2003
+ write(*,'(a18, 2i7)') 'a(i-1:i) = ', a(i-1:i)
2004
+ end if
2005
+ if ( .not. valid_adj ) then
2006
+ write( *, * ) "SORT_ADJOINT did not reverse sort " // &
2007
+ a_name // "."
2008
+ write(*,*) 'i_adj = ', i_adj
2009
+ write(*,'(a18, 2i7)') 'a(i_adj-1:i_adj) = ', a(i_adj-1:i_adj)
2010
+ end if
2011
+
2012
+ end subroutine test_real_sort_adjoint_${namei}$
2013
+ #:endfor
2014
+
1899
2015
subroutine verify_sort( a, valid, i )
1900
2016
integer(int32), intent(in) :: a(0:)
1901
2017
logical, intent(out) :: valid
@@ -1912,6 +2028,23 @@ contains
1912
2028
1913
2029
end subroutine verify_sort
1914
2030
2031
+ subroutine verify_adjoint( a, true, valid, i )
2032
+ integer(int32), intent(in) :: a(:)
2033
+ integer(int32), intent(in) :: true(:)
2034
+ logical, intent(out) :: valid
2035
+ integer(int64), intent(out) :: i
2036
+
2037
+ integer(int64) :: n
2038
+
2039
+ n = size( a, kind=int64 )
2040
+ valid = .false.
2041
+ do i=1, n
2042
+ if ( a(i) /= true(i) ) return
2043
+ end do
2044
+ valid = .true.
2045
+
2046
+ end subroutine verify_adjoint
2047
+
1915
2048
subroutine verify_real_sort( a, valid, i )
1916
2049
real(sp), intent(in) :: a(0:)
1917
2050
logical, intent(out) :: valid
0 commit comments