hpperm.f 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. *DECK HPPERM
  2. SUBROUTINE HPPERM (HX, N, IPERM, WORK, IER)
  3. C***BEGIN PROLOGUE HPPERM
  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 CHARACTER (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 HPPERM rearranges the data vector HX according to the
  15. C permutation IPERM: HX(I) <--- HX(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 HX - input/output -- character array of values to be
  21. C rearranged.
  22. C N - input -- number of values in character array HX.
  23. C IPERM - input -- permutation vector.
  24. C WORK - character variable which must have a length
  25. C specification at least as great as that of HX.
  26. C IER - output -- error indicator:
  27. C = 0 if no error,
  28. C = 1 if N is zero or negative,
  29. C = 2 if work array is not long enough,
  30. C = 3 if IPERM is not a valid permutation.
  31. C
  32. C***REFERENCES (NONE)
  33. C***ROUTINES CALLED XERMSG
  34. C***REVISION HISTORY (YYMMDD)
  35. C 901004 DATE WRITTEN
  36. C 920507 Modified by M. McClain to revise prologue text and to add
  37. C check for length of work array.
  38. C***END PROLOGUE HPPERM
  39. INTEGER N, IPERM(*), I, IER, INDX, INDX0, ISTRT
  40. CHARACTER*(*) HX(*), WORK
  41. C***FIRST EXECUTABLE STATEMENT HPPERM
  42. IER=0
  43. IF(N.LT.1)THEN
  44. IER=1
  45. CALL XERMSG ('SLATEC', 'HPPERM',
  46. + 'The number of values to be rearranged, N, is not positive.',
  47. + IER, 1)
  48. RETURN
  49. ENDIF
  50. IF(LEN(WORK).LT.LEN(HX(1)))THEN
  51. IER=2
  52. CALL XERMSG ('SLATEC', 'HPPERM',
  53. + 'The length of the work variable, WORK, is too short.',IER,1)
  54. RETURN
  55. ENDIF
  56. C
  57. C CHECK WHETHER IPERM IS A VALID PERMUTATION
  58. C
  59. DO 100 I=1,N
  60. INDX=ABS(IPERM(I))
  61. IF((INDX.GE.1).AND.(INDX.LE.N))THEN
  62. IF(IPERM(INDX).GT.0)THEN
  63. IPERM(INDX)=-IPERM(INDX)
  64. GOTO 100
  65. ENDIF
  66. ENDIF
  67. IER=3
  68. CALL XERMSG ('SLATEC', 'HPPERM',
  69. + 'The permutation vector, IPERM, is not valid.', IER, 1)
  70. RETURN
  71. 100 CONTINUE
  72. C
  73. C REARRANGE THE VALUES OF HX
  74. C
  75. C USE THE IPERM VECTOR AS A FLAG.
  76. C IF IPERM(I) > 0, THEN THE I-TH VALUE IS IN CORRECT LOCATION
  77. C
  78. DO 330 ISTRT = 1 , N
  79. IF (IPERM(ISTRT) .GT. 0) GOTO 330
  80. INDX = ISTRT
  81. INDX0 = INDX
  82. WORK = HX(ISTRT)
  83. 320 CONTINUE
  84. IF (IPERM(INDX) .GE. 0) GOTO 325
  85. HX(INDX) = HX(-IPERM(INDX))
  86. INDX0 = INDX
  87. IPERM(INDX) = -IPERM(INDX)
  88. INDX = IPERM(INDX)
  89. GOTO 320
  90. 325 CONTINUE
  91. HX(INDX0) = WORK
  92. 330 CONTINUE
  93. C
  94. RETURN
  95. END