module DataMod
integer, parameter:: COLMAX = 3
contains
subroutine DataCreate (out_val, in_size, out_index)
real, dimension(:,COLMAX), intent (out):: out_val
integer, intent(in):: in_size
integer, dimension(:), intent(out):: out_index
integer:: ii
real:: val
do ii = 1, in_size
call random_number (harvest = val)
val = floor (val * 100.0)
out_val(ii,1) = val
out_val(ii,2) = val * val
out_val(ii,3) = sqrt(val)
end do
! Initialize the indices
do ix = 1, in_size
out_index(ix) = ix
end do
end subroutine DataCreate
subroutine DataSort (in_val, in_size, out_index)
real, dimension(:,COLMAX), intent(in):: in_val
integer, intent(in):: in_size
integer, dimension(:), intent(out):: out_index(:)
do ix = 1, in_size
out_index(ix) = ix
end do
! Selection sort
do ii = 1, in_size - 1
iix = out_index(ii)
ix = ii
do jj = ii + 1, in_size
jix = out_index(jj)
! Do your comparison here
if (in_val(iix,1) .gt. in_val(jix,1)) then
! Record the smallest
ix = jj
iix = jix
end if
end do
! Swap
out_index(ix) = out_index(ii)
out_index(ii) = iix
end do
end subroutine DataSort
subroutine DataPrint (in_val, in_size, in_index)
real, dimension(:,COLMAX), intent (in):: in_val
integer, intent(in):: in_size
integer, dimension(:), intent(in):: in_index
! Show what the order is
print '(10I4)', (in_index(ii), ii = 1, in_size)
! Print the data in order
do ii = 1, in_size
ix = in_index(ii)
print '(8F10.2)', (in_val(ix,jj), jj = 1, COLMAX)
end do
end subroutine DataPrint
end module DataMod
program main
use DataMod
integer, parameter:: VALMAX = 10
real:: val(VALMAX,COLMAX)
integer:: index(VALMAX)
call DataCreate (val, VALMAX, index)
print *, 'Create'
call DataPrint (val, VALMAX, index)
call DataSort (val, VALMAX, index)
print *, 'After sorting'
call DataPrint (val, VALMAX, index)
stop
end program main