FNLMath : Utilities : SORT_REAL
Sorts a rank-1 array of real numbers x so the y results are algebraically nondecreasing, y1  y2   yn.
Required Arguments
X — Rank-1 array containing the numbers to be sorted. (Output)
Y — Rank-1 array containing the sorted numbers. (Output)
Optional Arguments
nsize = n (Input)
Uses the sub-array of size n for the numbers.
Default value: n = size(x)
iperm = iperm (Input/Output)
Applies interchanges of elements that occur to the entries of iperm(:). If the values iperm(i)=i,i=1,n are assigned prior to call, then the output array is moved to its proper order by the subscripted array assignment y = x(iperm(1:n)).
icycle = icycle (Output)
Permutations applied to the input data are converted to cyclic interchanges. Thus, the output array y is given by the following elementary interchanges, where :=: denotes a swap:
j = icycle(i)
y(j) :=: y(i), i = 1,n
iopt = iopt(:) (Input)
Derived type array with the same precision as the input matrix; used for passing optional data to the routine. The options are as follows:
Packaged Options for SORT_REAL
Option Prefix = ?
Option Name
Option Value
s_, d_
iopt(IO) = ?_options(?_sort_real_scan_for_NaN, ?_dummy)
Examines each input array entry to find the first value such that
isNaN(x(i)) == .true.
See the isNaN() function, Chapter 10.
Default: Does not scan for NaNs.
FORTRAN 90 Interface
Generic: CALL SORT_REAL (X, Y [])
Specific: The specific interface names are S_SORT_REAL and D_SORT_REAL.
For a detailed description, see the “Description” section of routine SVRGN, which appears later in this chapter.
Fatal and Terminal Error Messages
See the messages.gls file for error messages for SORT_REAL. These error messages are numbered 561567; 581587.
Example 1: Sorting an Array
An array of random numbers is obtained. The values are sorted so they are nondecreasing.
use sort_real_int
use rand_gen_int
implicit none
! This is Example 1 for SORT_REAL.
integer, parameter :: n=100
real(kind(1e0)), dimension(n) :: x, y
! Generate random data to sort.
call rand_gen(x)
! Sort the data so it is non-decreasing.
call sort_real(x, y)
! Check that the sorted array is not decreasing.
if (count(y(1:n-1) > y(2:n)) == 0) then
write (*,*) 'Example 1 for SORT_REAL is correct.'
end if
Example 1 for SORT_REAL is correct.
Example 2: Sort and Final Move with a Permutation
A set of n random numbers is sorted so the results are nonincreasing. The columns of an n × n random matrix are moved to the order given by the permutation defined by the interchange of the entries. Since the routine sorts the results to be algebraically nondecreasing, the array of negative values is used as input. Thus, the negative value of the sorted output order is nonincreasing. The optional argument “iperm=” records the final order and is used to move the matrix columns to that order. This example illustrates the principle of sorting record keys, followed by direct movement of the records to sorted order.
use sort_real_int
use rand_gen_int
implicit none
! This is Example 2 for SORT_REAL.
integer i
integer, parameter :: n=100
integer ip(n)
real(kind(1e0)) a(n,n), x(n), y(n), temp(n*n)
! Generate a random array and matrix of values.
call rand_gen(x)
call rand_gen(temp)
a = reshape(temp,(/n,n/))
! Initialize permutation to the identity.
do i=1, n
ip(i) = i
end do
! Sort using negative values so the final order is
! non-increasing.
call sort_real(-x, y, iperm=ip)
! Final movement of keys and matrix columns.
y = x(ip(1:n))
a = a(:,ip(1:n))
! Check the results.
if (count(y(1:n-1) < y(2:n)) == 0) then
write (*,*) 'Example 2 for SORT_REAL is correct.'
end if
Example 2 for SORT_REAL is correct.