demo_rank_decreasing Program

Contents

Source Code


Variables

Type Attributes Name Initial
integer, allocatable, dimension(:) :: INVALS
integer, allocatable, dimension(:) :: count
integer, allocatable, dimension(:) :: distinct
character(len=*), parameter :: fmt = '(a,*(g3.3,1x))'
integer :: i
integer, allocatable, dimension(:) :: igoest
integer :: imx

Source Code

     program demo_rank_decreasing
     ! rank input array ranking duplicates the same
     use M_orderpack, only : rank_decreasing
     implicit none
     character(len=*),parameter :: fmt='(a,*(g3.3,1x))'
     integer,allocatable,dimension(:) :: INVALS, igoest, distinct, count
     integer :: imx, i
        ! create an input array
        INVALS=[11, 11, 22, 11, 33, 33, 22, 33, 33]
        ! make an index array of the same size
        if(allocated(igoest))deallocate(igoest)
        allocate(igoest(size(INVALS)))
        print fmt, 'Original:                 ',INVALS
        print fmt, 'Number of indices to sort:',size(INVALS)
        ! rank input array ranking duplicates the same
        call rank_decreasing(INVALS,igoest)
        print fmt, 'Returned Indices:         ',igoest(:)
        !
        ! interrogate the results
        !
        imx=maxval(igoest)
        print fmt, 'Number of unique indices :',imx
        ! squeeze it down to just IMX unique values
        count=[(0,i=1,imx)] ! count how many times a value occurs
        distinct=count      ! array to set of unique values
        do i=1,size(INVALS)
           distinct(igoest(i))=INVALS(i)
           count(igoest(i))= count(igoest(i))+1
        enddo
        print fmt, 'Sorted unique values:     ',distinct
        print fmt, 'count of occurrences:     ',count
     end program demo_rank_decreasing