Fortran-90 generic routine PERMUTI() for I/O API-3.2:: compiler selects the appropriate type-specific form depending upon the number and types of theINTEGER,INTEGER*8dimensions and permute-indices and permutation-arraysFor I/O API Versions 3.2 December, 2023 or later.
SUBROUTINE PERMUTI( N, INDX, ILIST1 )
SUBROUTINE PERMUTI( N, INDX, ILIST1, ILIST2 )
SUBROUTINE PERMUTI( N, INDX, ILIST1, ILIST2 , ILIST3 )
SUBROUTINE PERMUTI( N8, INDX8, ILIST1 )
SUBROUTINE PERMUTI( N8, INDX8, ILIST1, ILIST2 )
SUBROUTINE PERMUTI( N8, INDX8, ILIST1, ILIST2 , ILIST3 )
SUBROUTINE PERMUTI( N, INDX, LLIST1 )
SUBROUTINE PERMUTI( N, INDX, LLIST1, LLIST2 )
SUBROUTINE PERMUTI( N, INDX, LLIST1, LLIST2 , LLIST3 )
SUBROUTINE PERMUTI( N8, INDX8, LLIST1 )
SUBROUTINE PERMUTI( N8, INDX8, LLIST1, LLIST2 )
SUBROUTINE PERMUTI( N8, INDX8, LLIST1, LLIST2 , LLIST3 )
SUBROUTINE PERMUTI( N, INDX, RLIST1 )
SUBROUTINE PERMUTI( N, INDX, RLIST1, RLIST2 )
SUBROUTINE PERMUTI( N, INDX, RLIST1, RLIST2 , RLIST3 )
SUBROUTINE PERMUTI( N8, INDX8, RLIST1 )
SUBROUTINE PERMUTI( N8, INDX8, RLIST1, RLIST2 )
SUBROUTINE PERMUTI( N8, INDX8, RLIST1, RLIST2 , RLIST3 )
SUBROUTINE PERMUTI( N, INDX, DLIST1 )
SUBROUTINE PERMUTI( N, INDX, DLIST1, DLIST2 )
SUBROUTINE PERMUTI( N, INDX, DLIST1, DLIST2 , DLIST3 )
SUBROUTINE PERMUTI( N8, INDX8, DLIST1 )
SUBROUTINE PERMUTI( N8, INDX8, DLIST1, DLIST2 )
SUBROUTINE PERMUTI( N8, INDX8, DLIST1, DLIST2 , DLIST3 )
SUBROUTINE PERMUTI( N, INDX, CLIST1 )
SUBROUTINE PERMUTI( N, INDX, CLIST1, CLIST2 )
SUBROUTINE PERMUTI( N, INDX, CLIST1, CLIST2 , CLIST3 )
SUBROUTINE PERMUTI( N8, INDX8, CLIST1 )
SUBROUTINE PERMUTI( N8, INDX8, CLIST1, CLIST2 )
SUBROUTINE PERMUTI( N8, INDX8, CLIST1, CLIST2 , CLIST3 )
INTEGER , INTENT(IN ) :: N ! table size
INTEGER*8, INTENT(IN ) :: N8 ! table size
INTEGER , INTENT(IN ) :: INDX ( N ) ! permutation-index from SORTI*
INTEGER*8, INTENT(IN ) :: INDX8( N8 ) ! permutation-index from SORTI*
INTEGER , INTENT(INOUT) :: ILIST1( N )
INTEGER , INTENT(INOUT) :: ILIST2( N )
INTEGER , INTENT(INOUT) :: ILIST3( N )
INTEGER*8, INTENT(INOUT) :: LLIST1( N )
INTEGER*8, INTENT(INOUT) :: LLIST2( N )
INTEGER*8, INTENT(INOUT) :: LLIST3( N )
REAL, INTENT(INOUT) :: RLIST1( N )
REAL, INTENT(INOUT) :: RLIST2( N )
REAL, INTENT(INOUT) :: RLIST3( N )
REAL*8, INTENT(INOUT) :: DLIST1( N )
REAL*8, INTENT(INOUT) :: DLIST2( N )
REAL*8, INTENT(INOUT) :: DLIST3( N )
CHARACTER(*), INTENT(INOUT) :: CLIST1( N )
CHARACTER(*), INTENT(INOUT) :: CLIST2( N )
CHARACTER(*), INTENT(INOUT) :: CLIST3( N )
Functionally, a single multi-array call to PERMUTI,
e.g.,
CALL PERMUTI( N, INDX, ARRAY1, ARRAY2, ARRAY3 )
is equivalent to the corresponding sequence of single-array calls:
CALL PERMUTI( N, INDX, ARRAY1 )
CALL PERMUTI( N, INDX, ARRAY2 )
CALL PERMUTI( N, INDX, ARRAY3 )
Which of these offers better computational performance depends upon
problem size, hardware (cache-size, particularly), and compiler
quality.
{LIST1,LIST2,LIST3}
with an associated data arrays DATA1, DATA2 :
...
USE M3UTILIO
...
INTEGER N
PARAMETER ( N = ...
...
INTEGER I
INTEGER INDX ( N ) ! index array to be sorted
INTEGER LIST1( N ) ! input unsorted 3-tuple table
INTEGER LIST2( N ) ! input unsorted 3-tuple table
INTEGER LIST3( N ) ! input unsorted 3-tuple table
REAL DATA1( N ) ! input data table with same subscripting
REAL DATA2( N ) ! as <LIST1,LIST2,LIST3>
...
DATA LIST1 / 1983, 1980, 1988, 1988, 1990, ...
DATA LIST2 / 1, 5, 4, 11, 7, ...
DATA LIST3 / 10, 3, 15, 19, 20, ...
DATA DATA1 / 1.23, -0.7, 5.5, 11.9, -4.3, ...
DATA DATA2 /1.2e5,-2.7e3, 4.8e4, 2.2e6, -7.72, ...
...
DO I = 1, N ! initialize INDX array
INDX( I ) = I
END DO
CALL SORTI3( N, INDX, LIST1, LIST2, LIST3 )
CALL PERMUTI( N, INDX, LIST1, LIST2, LIST3 )
CALL PERMUTI( N, INDX, DATA1, DATA2 )
...
SEE ALSO: FIND* Binary Search Routines
SEE ALSO: LOCAT* Binary Search-and-Insert Routines
SEE ALSO: SORTI* Indirect Sort Routines
To: Models-3/EDSS I/O API: The Help Pages
$Id: PERMUTI.html 271 2025-01-18 16:15:25Z coats $