sort_unique Subroutine

private pure subroutine sort_unique(x, tol)

Sort an array in increasing order, and remove values that are within tol of the previous one.

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(inout), dimension(:), allocatable :: x

the array

real(kind=wp), intent(in) :: tol

duplicate tolerance


Called by

proc~~sort_unique~~CalledByGraph proc~sort_unique sort_unique proc~db1root db1root proc~db1root->proc~sort_unique proc~spline_roots spline_roots proc~db1root->proc~spline_roots proc~spline_roots->proc~sort_unique proc~db1extremum db1extremum proc~db1extremum->proc~spline_roots proc~roots_1d bspline_1d%roots_1d proc~roots_1d->proc~db1root proc~db1max db1max proc~db1max->proc~db1extremum proc~db1min db1min proc~db1min->proc~db1extremum proc~inverse_1d bspline_1d%inverse_1d proc~inverse_1d->proc~roots_1d proc~maximum_1d bspline_1d%maximum_1d proc~maximum_1d->proc~db1max proc~minimum_1d bspline_1d%minimum_1d proc~minimum_1d->proc~db1min

Source Code

    pure subroutine sort_unique(x,tol)

    implicit none

    real(wp),dimension(:),allocatable,intent(inout) :: x    !! the array
    real(wp),intent(in)                             :: tol  !! duplicate tolerance

    integer(ip) :: i    !! counter
    integer(ip) :: j    !! counter
    integer(ip) :: nu   !! number of unique values
    real(wp) :: tmp     !! the value being inserted

    ! insertion sort (the arrays are small and nearly sorted)
    do i = 2_ip, size(x,kind=ip)
        tmp = x(i)
        j = i - 1_ip
        do while (j>=1_ip)
            if (x(j)<=tmp) exit
            x(j+1_ip) = x(j)
            j = j - 1_ip
        end do
        x(j+1_ip) = tmp
    end do

    nu = min(1_ip,size(x,kind=ip))
    do i = 2_ip, size(x,kind=ip)
        if (x(i)-x(nu)>tol) then
            nu = nu + 1_ip
            x(nu) = x(i)
        end if
    end do
    x = x(1_ip:nu)

    end subroutine sort_unique