spperm.f 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. *DECK SPPERM
  2. SUBROUTINE SPPERM (X, N, IPERM, IER)
  3. C***BEGIN PROLOGUE SPPERM
  4. C***PURPOSE Rearrange a given array according to a prescribed
  5. C permutation vector.
  6. C***LIBRARY SLATEC
  7. C***CATEGORY N8
  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)
  12. C***DESCRIPTION
  13. C
  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
  17. C HPSORT.
  18. C
  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:
  24. C = 0 if no error,
  25. C = 1 if N is zero or negative,
  26. C = 2 if IPERM is not a valid permutation.
  27. C
  28. C***REFERENCES (NONE)
  29. C***ROUTINES CALLED XERMSG
  30. C***REVISION HISTORY (YYMMDD)
  31. C 901004 DATE WRITTEN
  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
  35. REAL X(*), TEMP
  36. C***FIRST EXECUTABLE STATEMENT SPPERM
  37. IER=0
  38. IF(N.LT.1)THEN
  39. IER=1
  40. CALL XERMSG ('SLATEC', 'SPPERM',
  41. + 'The number of values to be rearranged, N, is not positive.',
  42. + IER, 1)
  43. RETURN
  44. ENDIF
  45. C
  46. C CHECK WHETHER IPERM IS A VALID PERMUTATION
  47. C
  48. DO 100 I=1,N
  49. INDX=ABS(IPERM(I))
  50. IF((INDX.GE.1).AND.(INDX.LE.N))THEN
  51. IF(IPERM(INDX).GT.0)THEN
  52. IPERM(INDX)=-IPERM(INDX)
  53. GOTO 100
  54. ENDIF
  55. ENDIF
  56. IER=2
  57. CALL XERMSG ('SLATEC', 'SPPERM',
  58. + 'The permutation vector, IPERM, is not valid.', IER, 1)
  59. RETURN
  60. 100 CONTINUE
  61. C
  62. C REARRANGE THE VALUES OF X
  63. C
  64. C USE THE IPERM VECTOR AS A FLAG.
  65. C IF IPERM(I) > 0, THEN THE I-TH VALUE IS IN CORRECT LOCATION
  66. C
  67. DO 330 ISTRT = 1 , N
  68. IF (IPERM(ISTRT) .GT. 0) GOTO 330
  69. INDX = ISTRT
  70. INDX0 = INDX
  71. TEMP = X(ISTRT)
  72. 320 CONTINUE
  73. IF (IPERM(INDX) .GE. 0) GOTO 325
  74. X(INDX) = X(-IPERM(INDX))
  75. INDX0 = INDX
  76. IPERM(INDX) = -IPERM(INDX)
  77. INDX = IPERM(INDX)
  78. GOTO 320
  79. 325 CONTINUE
  80. X(INDX0) = TEMP
  81. 330 CONTINUE
  82. C
  83. RETURN
  84. END