77module test_sorting
88
99 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
1111 use stdlib_sorting, only: sort, sort_index, sort_adjoint, ord_sort, radix_sort, int_index, int_index_low
1212 use stdlib_string_type, only: string_type, assignment(=), operator(>), &
1313 operator(<), write(formatted)
@@ -115,6 +115,9 @@ contains
115115 new_unittest('string_sort_adjointes_${namei}$', test_string_sort_adjointes_${namei}$), &
116116 new_unittest('bitset_large_sort_adjointes_${namei}$', test_bitsetl_sort_adjointes_${namei}$), &
117117 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}$), &
118121#:endfor
119122 new_unittest('int_ord_sorts', test_int_ord_sorts) &
120123 ]
@@ -1896,6 +1899,119 @@ contains
18961899 end subroutine test_bitset64_sort_adjoint_${namei}$
18971900#:endfor
18981901
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+
18992015 subroutine verify_sort( a, valid, i )
19002016 integer(int32), intent(in) :: a(0:)
19012017 logical, intent(out) :: valid
@@ -1912,6 +2028,23 @@ contains
19122028
19132029 end subroutine verify_sort
19142030
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+
19152048 subroutine verify_real_sort( a, valid, i )
19162049 real(sp), intent(in) :: a(0:)
19172050 logical, intent(out) :: valid
0 commit comments