davint.f 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. *DECK DAVINT
  2. SUBROUTINE DAVINT (X, Y, N, XLO, XUP, ANS, IERR)
  3. C***BEGIN PROLOGUE DAVINT
  4. C***PURPOSE Integrate a function tabulated at arbitrarily spaced
  5. C abscissas using overlapping parabolas.
  6. C***LIBRARY SLATEC
  7. C***CATEGORY H2A1B2
  8. C***TYPE DOUBLE PRECISION (AVINT-S, DAVINT-D)
  9. C***KEYWORDS INTEGRATION, QUADRATURE, TABULATED DATA
  10. C***AUTHOR Jones, R. E., (SNLA)
  11. C***DESCRIPTION
  12. C
  13. C Abstract
  14. C DAVINT integrates a function tabulated at arbitrarily spaced
  15. C abscissas. The limits of integration need not coincide
  16. C with the tabulated abscissas.
  17. C
  18. C A method of overlapping parabolas fitted to the data is used
  19. C provided that there are at least 3 abscissas between the
  20. C limits of integration. DAVINT also handles two special cases.
  21. C If the limits of integration are equal, DAVINT returns a
  22. C result of zero regardless of the number of tabulated values.
  23. C If there are only two function values, DAVINT uses the
  24. C trapezoid rule.
  25. C
  26. C Description of Parameters
  27. C The user must dimension all arrays appearing in the call list
  28. C X(N), Y(N)
  29. C
  30. C Input--
  31. C X - DOUBLE PRECISION array of abscissas, which must be in
  32. C increasing order.
  33. C Y - DOUBLE PRECISION array of function values. i.e.,
  34. C Y(I)=FUNC(X(I))
  35. C N - The integer number of function values supplied.
  36. C N .GE. 2 unless XLO = XUP.
  37. C XLO - DOUBLE PRECISION lower limit of integration
  38. C XUP - DOUBLE PRECISION upper limit of integration. Must have
  39. C XLO.LE.XUP
  40. C
  41. C Output--
  42. C ANS - Double Precision computed approximate value of integral
  43. C IERR - A status code
  44. C --Normal Code
  45. C =1 Means the requested integration was performed.
  46. C --Abnormal Codes
  47. C =2 Means XUP was less than XLO.
  48. C =3 Means the number of X(I) between XLO and XUP
  49. C (inclusive) was less than 3 and neither of the two
  50. C special cases described in the abstract occurred.
  51. C No integration was performed.
  52. C =4 Means the restriction X(I+1).GT.X(I) was violated.
  53. C =5 Means the number N of function values was .lt. 2.
  54. C ANS is set to zero if IERR=2,3,4,or 5.
  55. C
  56. C DAVINT is documented completely in SC-M-69-335
  57. C Original program from *Numerical Integration* by Davis & Rabinowitz
  58. C Adaptation and modifications by Rondall E Jones.
  59. C
  60. C***REFERENCES R. E. Jones, Approximate integrator of functions
  61. C tabulated at arbitrarily spaced abscissas,
  62. C Report SC-M-69-335, Sandia Laboratories, 1969.
  63. C***ROUTINES CALLED XERMSG
  64. C***REVISION HISTORY (YYMMDD)
  65. C 690901 DATE WRITTEN
  66. C 890831 Modified array declarations. (WRB)
  67. C 890831 REVISION DATE from Version 3.2
  68. C 891214 Prologue converted to Version 4.0 format. (BAB)
  69. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  70. C 920501 Reformatted the REFERENCES section. (WRB)
  71. C***END PROLOGUE DAVINT
  72. C
  73. INTEGER I, IERR, INLFT, INRT, ISTART, ISTOP, N
  74. DOUBLE PRECISION A, ANS, B, C, CA, CB, CC, FL, FR, R3, RP5,
  75. 1 SLOPE, SUM, SYL, SYL2, SYL3, SYU, SYU2, SYU3, TERM1, TERM2,
  76. 2 TERM3, X, X1, X12, X13, X2, X23, X3, XLO, XUP, Y
  77. DIMENSION X(*),Y(*)
  78. C BEGIN BLOCK PERMITTING ...EXITS TO 190
  79. C BEGIN BLOCK PERMITTING ...EXITS TO 180
  80. C***FIRST EXECUTABLE STATEMENT DAVINT
  81. IERR = 1
  82. ANS = 0.0D0
  83. IF (XLO .GT. XUP) GO TO 160
  84. IF (XLO .EQ. XUP) GO TO 150
  85. IF (N .GE. 2) GO TO 10
  86. IERR = 5
  87. CALL XERMSG ('SLATEC', 'DAVINT',
  88. + 'LESS THAN TWO FUNCTION VALUES WERE SUPPLIED.',
  89. + 4, 1)
  90. C ...............EXIT
  91. GO TO 190
  92. 10 CONTINUE
  93. DO 20 I = 2, N
  94. C ............EXIT
  95. IF (X(I) .LE. X(I-1)) GO TO 180
  96. C ...EXIT
  97. IF (X(I) .GT. XUP) GO TO 30
  98. 20 CONTINUE
  99. 30 CONTINUE
  100. IF (N .GE. 3) GO TO 40
  101. C
  102. C SPECIAL N=2 CASE
  103. SLOPE = (Y(2) - Y(1))/(X(2) - X(1))
  104. FL = Y(1) + SLOPE*(XLO - X(1))
  105. FR = Y(2) + SLOPE*(XUP - X(2))
  106. ANS = 0.5D0*(FL + FR)*(XUP - XLO)
  107. C ...............EXIT
  108. GO TO 190
  109. 40 CONTINUE
  110. IF (X(N-2) .GE. XLO) GO TO 50
  111. IERR = 3
  112. CALL XERMSG ('SLATEC', 'DAVINT',
  113. + 'THERE WERE LESS THAN THREE FUNCTION VALUES ' //
  114. + 'BETWEEN THE LIMITS OF INTEGRATION.', 4, 1)
  115. C ...............EXIT
  116. GO TO 190
  117. 50 CONTINUE
  118. IF (X(3) .LE. XUP) GO TO 60
  119. IERR = 3
  120. CALL XERMSG ('SLATEC', 'DAVINT',
  121. + 'THERE WERE LESS THAN THREE FUNCTION VALUES ' //
  122. + 'BETWEEN THE LIMITS OF INTEGRATION.', 4, 1)
  123. C ...............EXIT
  124. GO TO 190
  125. 60 CONTINUE
  126. I = 1
  127. 70 IF (X(I) .GE. XLO) GO TO 80
  128. I = I + 1
  129. GO TO 70
  130. 80 CONTINUE
  131. INLFT = I
  132. I = N
  133. 90 IF (X(I) .LE. XUP) GO TO 100
  134. I = I - 1
  135. GO TO 90
  136. 100 CONTINUE
  137. INRT = I
  138. IF ((INRT - INLFT) .GE. 2) GO TO 110
  139. IERR = 3
  140. CALL XERMSG ('SLATEC', 'DAVINT',
  141. + 'THERE WERE LESS THAN THREE FUNCTION VALUES ' //
  142. + 'BETWEEN THE LIMITS OF INTEGRATION.', 4, 1)
  143. C ...............EXIT
  144. GO TO 190
  145. 110 CONTINUE
  146. ISTART = INLFT
  147. IF (INLFT .EQ. 1) ISTART = 2
  148. ISTOP = INRT
  149. IF (INRT .EQ. N) ISTOP = N - 1
  150. C
  151. R3 = 3.0D0
  152. RP5 = 0.5D0
  153. SUM = 0.0D0
  154. SYL = XLO
  155. SYL2 = SYL*SYL
  156. SYL3 = SYL2*SYL
  157. C
  158. DO 140 I = ISTART, ISTOP
  159. X1 = X(I-1)
  160. X2 = X(I)
  161. X3 = X(I+1)
  162. X12 = X1 - X2
  163. X13 = X1 - X3
  164. X23 = X2 - X3
  165. TERM1 = Y(I-1)/(X12*X13)
  166. TERM2 = -Y(I)/(X12*X23)
  167. TERM3 = Y(I+1)/(X13*X23)
  168. A = TERM1 + TERM2 + TERM3
  169. B = -(X2 + X3)*TERM1 - (X1 + X3)*TERM2
  170. 1 - (X1 + X2)*TERM3
  171. C = X2*X3*TERM1 + X1*X3*TERM2 + X1*X2*TERM3
  172. IF (I .GT. ISTART) GO TO 120
  173. CA = A
  174. CB = B
  175. CC = C
  176. GO TO 130
  177. 120 CONTINUE
  178. CA = 0.5D0*(A + CA)
  179. CB = 0.5D0*(B + CB)
  180. CC = 0.5D0*(C + CC)
  181. 130 CONTINUE
  182. SYU = X2
  183. SYU2 = SYU*SYU
  184. SYU3 = SYU2*SYU
  185. SUM = SUM + CA*(SYU3 - SYL3)/R3
  186. 1 + CB*RP5*(SYU2 - SYL2) + CC*(SYU - SYL)
  187. CA = A
  188. CB = B
  189. CC = C
  190. SYL = SYU
  191. SYL2 = SYU2
  192. SYL3 = SYU3
  193. 140 CONTINUE
  194. SYU = XUP
  195. ANS = SUM + CA*(SYU**3 - SYL3)/R3
  196. 1 + CB*RP5*(SYU**2 - SYL2) + CC*(SYU - SYL)
  197. 150 CONTINUE
  198. GO TO 170
  199. 160 CONTINUE
  200. IERR = 2
  201. CALL XERMSG ('SLATEC', 'DAVINT',
  202. + 'THE UPPER LIMIT OF INTEGRATION WAS NOT GREATER ' //
  203. + 'THAN THE LOWER LIMIT.', 4, 1)
  204. 170 CONTINUE
  205. C ......EXIT
  206. GO TO 190
  207. 180 CONTINUE
  208. IERR = 4
  209. CALL XERMSG ('SLATEC', 'DAVINT',
  210. + 'THE ABSCISSAS WERE NOT STRICTLY INCREASING. MUST HAVE ' //
  211. + 'X(I-1) .LT. X(I) FOR ALL I.', 4, 1)
  212. 190 CONTINUE
  213. RETURN
  214. END