mc20ad.f 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. *DECK MC20AD
  2. SUBROUTINE MC20AD (NC, MAXA, A, INUM, JPTR, JNUM, JDISP)
  3. C***BEGIN PROLOGUE MC20AD
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to DSPLP
  6. C***LIBRARY SLATEC
  7. C***TYPE DOUBLE PRECISION (MC20AS-S, MC20AD-D)
  8. C***AUTHOR (UNKNOWN)
  9. C***DESCRIPTION
  10. C
  11. C THIS SUBPROGRAM IS A SLIGHT MODIFICATION OF A SUBPROGRAM
  12. C FROM THE C. 1979 AERE HARWELL LIBRARY. THE NAME OF THE
  13. C CORRESPONDING HARWELL CODE CAN BE OBTAINED BY DELETING
  14. C THE FINAL LETTER =D= IN THE NAMES USED HERE.
  15. C REVISED SEP. 13, 1979.
  16. C
  17. C ROYALTIES HAVE BEEN PAID TO AERE-UK FOR USE OF THEIR CODES
  18. C IN THE PACKAGE GIVEN HERE. ANY PRIMARY USAGE OF THE HARWELL
  19. C SUBROUTINES REQUIRES A ROYALTY AGREEMENT AND PAYMENT BETWEEN
  20. C THE USER AND AERE-UK. ANY USAGE OF THE SANDIA WRITTEN CODES
  21. C DSPLP( ) (WHICH USES THE HARWELL SUBROUTINES) IS PERMITTED.
  22. C
  23. C***SEE ALSO DSPLP
  24. C***ROUTINES CALLED (NONE)
  25. C***REVISION HISTORY (YYMMDD)
  26. C 811215 DATE WRITTEN
  27. C 890831 Modified array declarations. (WRB)
  28. C 891214 Prologue converted to Version 4.0 format. (BAB)
  29. C 900402 Added TYPE section. (WRB)
  30. C***END PROLOGUE MC20AD
  31. INTEGER INUM(*), JNUM(*)
  32. DOUBLE PRECISION A(*),ACE,ACEP
  33. DIMENSION JPTR(NC)
  34. C***FIRST EXECUTABLE STATEMENT MC20AD
  35. NULL = -JDISP
  36. C** CLEAR JPTR
  37. DO 10 J=1,NC
  38. JPTR(J) = 0
  39. 10 CONTINUE
  40. C** COUNT THE NUMBER OF ELEMENTS IN EACH COLUMN.
  41. DO 20 K=1,MAXA
  42. J = JNUM(K) + JDISP
  43. JPTR(J) = JPTR(J) + 1
  44. 20 CONTINUE
  45. C** SET THE JPTR ARRAY
  46. K = 1
  47. DO 30 J=1,NC
  48. KR = K + JPTR(J)
  49. JPTR(J) = K
  50. K = KR
  51. 30 CONTINUE
  52. C
  53. C** REORDER THE ELEMENTS INTO COLUMN ORDER. THE ALGORITHM IS AN
  54. C IN-PLACE SORT AND IS OF ORDER MAXA.
  55. DO 50 I=1,MAXA
  56. C ESTABLISH THE CURRENT ENTRY.
  57. JCE = JNUM(I) + JDISP
  58. IF (JCE.EQ.0) GO TO 50
  59. ACE = A(I)
  60. ICE = INUM(I)
  61. C CLEAR THE LOCATION VACATED.
  62. JNUM(I) = NULL
  63. C CHAIN FROM CURRENT ENTRY TO STORE ITEMS.
  64. DO 40 J=1,MAXA
  65. C CURRENT ENTRY NOT IN CORRECT POSITION. DETERMINE CORRECT
  66. C POSITION TO STORE ENTRY.
  67. LOC = JPTR(JCE)
  68. JPTR(JCE) = JPTR(JCE) + 1
  69. C SAVE CONTENTS OF THAT LOCATION.
  70. ACEP = A(LOC)
  71. ICEP = INUM(LOC)
  72. JCEP = JNUM(LOC)
  73. C STORE CURRENT ENTRY.
  74. A(LOC) = ACE
  75. INUM(LOC) = ICE
  76. JNUM(LOC) = NULL
  77. C CHECK IF NEXT CURRENT ENTRY NEEDS TO BE PROCESSED.
  78. IF (JCEP.EQ.NULL) GO TO 50
  79. C IT DOES. COPY INTO CURRENT ENTRY.
  80. ACE = ACEP
  81. ICE = ICEP
  82. JCE = JCEP + JDISP
  83. 40 CONTINUE
  84. C
  85. 50 CONTINUE
  86. C
  87. C** RESET JPTR VECTOR.
  88. JA = 1
  89. DO 60 J=1,NC
  90. JB = JPTR(J)
  91. JPTR(J) = JA
  92. JA = JB
  93. 60 CONTINUE
  94. RETURN
  95. END