2
SUBROUTINE SPPERM (X, N, IPERM, IER)
3
C***BEGIN PROLOGUE SPPERM
4
C***PURPOSE Rearrange a given array according to a prescribed
8
C***TYPE SINGLE PRECISION (SPPERM-S, DPPERM-D, IPPERM-I, HPPERM-H)
9
C***KEYWORDS APPLICATION OF PERMUTATION TO DATA VECTOR
10
C***AUTHOR McClain, M. A., (NIST)
11
C Rhoads, G. S., (NBS)
14
C SPPERM rearranges the data vector X according to the
15
C permutation IPERM: X(I) <--- X(IPERM(I)). IPERM could come
16
C from one of the sorting routines IPSORT, SPSORT, DPSORT or
19
C Description of Parameters
20
C X - input/output -- real array of values to be rearranged.
21
C N - input -- number of values in real array X.
22
C IPERM - input -- permutation vector.
23
C IER - output -- error indicator:
25
C = 1 if N is zero or negative,
26
C = 2 if IPERM is not a valid permutation.
29
C***ROUTINES CALLED XERMSG
30
C***REVISION HISTORY (YYMMDD)
32
C 920507 Modified by M. McClain to revise prologue text.
33
C***END PROLOGUE SPPERM
34
INTEGER N, IPERM(*), I, IER, INDX, INDX0, ISTRT
36
C***FIRST EXECUTABLE STATEMENT SPPERM
40
CALL XERMSG ('SLATEC', 'SPPERM',
41
+ 'The number of values to be rearranged, N, is not positive.',
46
C CHECK WHETHER IPERM IS A VALID PERMUTATION
50
IF((INDX.GE.1).AND.(INDX.LE.N))THEN
51
IF(IPERM(INDX).GT.0)THEN
52
IPERM(INDX)=-IPERM(INDX)
57
CALL XERMSG ('SLATEC', 'SPPERM',
58
+ 'The permutation vector, IPERM, is not valid.', IER, 1)
62
C REARRANGE THE VALUES OF X
64
C USE THE IPERM VECTOR AS A FLAG.
65
C IF IPERM(I) > 0, THEN THE I-TH VALUE IS IN CORRECT LOCATION
68
IF (IPERM(ISTRT) .GT. 0) GOTO 330
73
IF (IPERM(INDX) .GE. 0) GOTO 325
74
X(INDX) = X(-IPERM(INDX))
76
IPERM(INDX) = -IPERM(INDX)