dpperm.f 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. *DECK DPPERM
  2. SUBROUTINE DPPERM (DX, N, IPERM, IER)
  3. C***BEGIN PROLOGUE DPPERM
  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 DOUBLE PRECISION (SPPERM-S, DPPERM-D, IPPERM-I, HPPERM-H)
  9. C***KEYWORDS PERMUTATION, REARRANGEMENT
  10. C***AUTHOR McClain, M. A., (NIST)
  11. C Rhoads, G. S., (NBS)
  12. C***DESCRIPTION
  13. C
  14. C DPPERM rearranges the data vector DX according to the
  15. C permutation IPERM: DX(I) <--- DX(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 DX - input/output -- double precision array of values to be
  21. C rearranged.
  22. C N - input -- number of values in double precision array DX.
  23. C IPERM - input -- permutation vector.
  24. C IER - output -- error indicator:
  25. C = 0 if no error,
  26. C = 1 if N is zero or negative,
  27. C = 2 if IPERM is not a valid permutation.
  28. C
  29. C***REFERENCES (NONE)
  30. C***ROUTINES CALLED XERMSG
  31. C***REVISION HISTORY (YYMMDD)
  32. C 901004 DATE WRITTEN
  33. C 920507 Modified by M. McClain to revise prologue text.
  34. C***END PROLOGUE DPPERM
  35. INTEGER N, IPERM(*), I, IER, INDX, INDX0, ISTRT
  36. DOUBLE PRECISION DX(*), DTEMP
  37. C***FIRST EXECUTABLE STATEMENT DPPERM
  38. IER=0
  39. IF(N.LT.1)THEN
  40. IER=1
  41. CALL XERMSG ('SLATEC', 'DPPERM',
  42. + 'The number of values to be rearranged, N, is not positive.',
  43. + IER, 1)
  44. RETURN
  45. ENDIF
  46. C
  47. C CHECK WHETHER IPERM IS A VALID PERMUTATION
  48. C
  49. DO 100 I=1,N
  50. INDX=ABS(IPERM(I))
  51. IF((INDX.GE.1).AND.(INDX.LE.N))THEN
  52. IF(IPERM(INDX).GT.0)THEN
  53. IPERM(INDX)=-IPERM(INDX)
  54. GOTO 100
  55. ENDIF
  56. ENDIF
  57. IER=2
  58. CALL XERMSG ('SLATEC', 'DPPERM',
  59. + 'The permutation vector, IPERM, is not valid.', IER, 1)
  60. RETURN
  61. 100 CONTINUE
  62. C
  63. C REARRANGE THE VALUES OF DX
  64. C
  65. C USE THE IPERM VECTOR AS A FLAG.
  66. C IF IPERM(I) > 0, THEN THE I-TH VALUE IS IN CORRECT LOCATION
  67. C
  68. DO 330 ISTRT = 1 , N
  69. IF (IPERM(ISTRT) .GT. 0) GOTO 330
  70. INDX = ISTRT
  71. INDX0 = INDX
  72. DTEMP = DX(ISTRT)
  73. 320 CONTINUE
  74. IF (IPERM(INDX) .GE. 0) GOTO 325
  75. DX(INDX) = DX(-IPERM(INDX))
  76. INDX0 = INDX
  77. IPERM(INDX) = -IPERM(INDX)
  78. INDX = IPERM(INDX)
  79. GOTO 320
  80. 325 CONTINUE
  81. DX(INDX0) = DTEMP
  82. 330 CONTINUE
  83. C
  84. RETURN
  85. END