qpsrt.f 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. *DECK QPSRT
  2. SUBROUTINE QPSRT (LIMIT, LAST, MAXERR, ERMAX, ELIST, IORD, NRMAX)
  3. C***BEGIN PROLOGUE QPSRT
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to QAGE, QAGIE, QAGPE, QAGSE, QAWCE, QAWOE and
  6. C QAWSE
  7. C***LIBRARY SLATEC
  8. C***TYPE SINGLE PRECISION (QPSRT-S, DQPSRT-D)
  9. C***KEYWORDS SEQUENTIAL SORTING
  10. C***AUTHOR (UNKNOWN)
  11. C***DESCRIPTION
  12. C
  13. C 1. QPSRT
  14. C Ordering Routine
  15. C Standard FORTRAN Subroutine
  16. C REAL Version
  17. C
  18. C 2. PURPOSE
  19. C This routine maintains the descending ordering
  20. C in the list of the local error estimates resulting from
  21. C the interval subdivision process. At each call two error
  22. C estimates are inserted using the sequential search
  23. C method, top-down for the largest error estimate
  24. C and bottom-up for the smallest error estimate.
  25. C
  26. C 3. CALLING SEQUENCE
  27. C CALL QPSRT(LIMIT,LAST,MAXERR,ERMAX,ELIST,IORD,NRMAX)
  28. C
  29. C PARAMETERS (MEANING AT OUTPUT)
  30. C LIMIT - INTEGER
  31. C Maximum number of error estimates the list
  32. C can contain
  33. C
  34. C LAST - INTEGER
  35. C Number of error estimates currently
  36. C in the list
  37. C
  38. C MAXERR - INTEGER
  39. C MAXERR points to the NRMAX-th largest error
  40. C estimate currently in the list
  41. C
  42. C ERMAX - REAL
  43. C NRMAX-th largest error estimate
  44. C ERMAX = ELIST(MAXERR)
  45. C
  46. C ELIST - REAL
  47. C Vector of dimension LAST containing
  48. C the error estimates
  49. C
  50. C IORD - INTEGER
  51. C Vector of dimension LAST, the first K
  52. C elements of which contain pointers
  53. C to the error estimates, such that
  54. C ELIST(IORD(1)),... , ELIST(IORD(K))
  55. C form a decreasing sequence, with
  56. C K = LAST if LAST.LE.(LIMIT/2+2), and
  57. C K = LIMIT+1-LAST otherwise
  58. C
  59. C NRMAX - INTEGER
  60. C MAXERR = IORD(NRMAX)
  61. C
  62. C***SEE ALSO QAGE, QAGIE, QAGPE, QAGSE, QAWCE, QAWOE, QAWSE
  63. C***ROUTINES CALLED (NONE)
  64. C***REVISION HISTORY (YYMMDD)
  65. C 800101 DATE WRITTEN
  66. C 890831 Modified array declarations. (WRB)
  67. C 891214 Prologue converted to Version 4.0 format. (BAB)
  68. C 900328 Added TYPE section. (WRB)
  69. C***END PROLOGUE QPSRT
  70. C
  71. REAL ELIST,ERMAX,ERRMAX,ERRMIN
  72. INTEGER I,IBEG,IDO,IORD,ISUCC,J,JBND,JUPBN,K,LAST,LIMIT,MAXERR,
  73. 1 NRMAX
  74. DIMENSION ELIST(*),IORD(*)
  75. C
  76. C CHECK WHETHER THE LIST CONTAINS MORE THAN
  77. C TWO ERROR ESTIMATES.
  78. C
  79. C***FIRST EXECUTABLE STATEMENT QPSRT
  80. IF(LAST.GT.2) GO TO 10
  81. IORD(1) = 1
  82. IORD(2) = 2
  83. GO TO 90
  84. C
  85. C THIS PART OF THE ROUTINE IS ONLY EXECUTED
  86. C IF, DUE TO A DIFFICULT INTEGRAND, SUBDIVISION
  87. C INCREASED THE ERROR ESTIMATE. IN THE NORMAL CASE
  88. C THE INSERT PROCEDURE SHOULD START AFTER THE
  89. C NRMAX-TH LARGEST ERROR ESTIMATE.
  90. C
  91. 10 ERRMAX = ELIST(MAXERR)
  92. IF(NRMAX.EQ.1) GO TO 30
  93. IDO = NRMAX-1
  94. DO 20 I = 1,IDO
  95. ISUCC = IORD(NRMAX-1)
  96. C ***JUMP OUT OF DO-LOOP
  97. IF(ERRMAX.LE.ELIST(ISUCC)) GO TO 30
  98. IORD(NRMAX) = ISUCC
  99. NRMAX = NRMAX-1
  100. 20 CONTINUE
  101. C
  102. C COMPUTE THE NUMBER OF ELEMENTS IN THE LIST TO
  103. C BE MAINTAINED IN DESCENDING ORDER. THIS NUMBER
  104. C DEPENDS ON THE NUMBER OF SUBDIVISIONS STILL
  105. C ALLOWED.
  106. C
  107. 30 JUPBN = LAST
  108. IF(LAST.GT.(LIMIT/2+2)) JUPBN = LIMIT+3-LAST
  109. ERRMIN = ELIST(LAST)
  110. C
  111. C INSERT ERRMAX BY TRAVERSING THE LIST TOP-DOWN,
  112. C STARTING COMPARISON FROM THE ELEMENT ELIST(IORD(NRMAX+1)).
  113. C
  114. JBND = JUPBN-1
  115. IBEG = NRMAX+1
  116. IF(IBEG.GT.JBND) GO TO 50
  117. DO 40 I=IBEG,JBND
  118. ISUCC = IORD(I)
  119. C ***JUMP OUT OF DO-LOOP
  120. IF(ERRMAX.GE.ELIST(ISUCC)) GO TO 60
  121. IORD(I-1) = ISUCC
  122. 40 CONTINUE
  123. 50 IORD(JBND) = MAXERR
  124. IORD(JUPBN) = LAST
  125. GO TO 90
  126. C
  127. C INSERT ERRMIN BY TRAVERSING THE LIST BOTTOM-UP.
  128. C
  129. 60 IORD(I-1) = MAXERR
  130. K = JBND
  131. DO 70 J=I,JBND
  132. ISUCC = IORD(K)
  133. C ***JUMP OUT OF DO-LOOP
  134. IF(ERRMIN.LT.ELIST(ISUCC)) GO TO 80
  135. IORD(K+1) = ISUCC
  136. K = K-1
  137. 70 CONTINUE
  138. IORD(I) = LAST
  139. GO TO 90
  140. 80 IORD(K+1) = LAST
  141. C
  142. C SET MAXERR AND ERMAX.
  143. C
  144. 90 MAXERR = IORD(NRMAX)
  145. ERMAX = ELIST(MAXERR)
  146. RETURN
  147. END