qng.f 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. *DECK QNG
  2. SUBROUTINE QNG (F, A, B, EPSABS, EPSREL, RESULT, ABSERR, NEVAL,
  3. + IER)
  4. C***BEGIN PROLOGUE QNG
  5. C***PURPOSE The routine calculates an approximation result to a
  6. C given definite integral I = integral of F over (A,B),
  7. C hopefully satisfying following claim for accuracy
  8. C ABS(I-RESULT).LE.MAX(EPSABS,EPSREL*ABS(I)).
  9. C***LIBRARY SLATEC (QUADPACK)
  10. C***CATEGORY H2A1A1
  11. C***TYPE SINGLE PRECISION (QNG-S, DQNG-D)
  12. C***KEYWORDS AUTOMATIC INTEGRATOR, GAUSS-KRONROD(PATTERSON) RULES,
  13. C NONADAPTIVE, QUADPACK, QUADRATURE, SMOOTH INTEGRAND
  14. C***AUTHOR Piessens, Robert
  15. C Applied Mathematics and Programming Division
  16. C K. U. Leuven
  17. C de Doncker, Elise
  18. C Applied Mathematics and Programming Division
  19. C K. U. Leuven
  20. C***DESCRIPTION
  21. C
  22. C NON-ADAPTIVE INTEGRATION
  23. C STANDARD FORTRAN SUBROUTINE
  24. C REAL VERSION
  25. C
  26. C F - Real version
  27. C Function subprogram defining the integrand function
  28. C F(X). The actual name for F needs to be declared
  29. C E X T E R N A L in the driver program.
  30. C
  31. C A - Real version
  32. C Lower limit of integration
  33. C
  34. C B - Real version
  35. C Upper limit of integration
  36. C
  37. C EPSABS - Real
  38. C Absolute accuracy requested
  39. C EPSREL - Real
  40. C Relative accuracy requested
  41. C If EPSABS.LE.0
  42. C And EPSREL.LT.MAX(50*REL.MACH.ACC.,0.5D-28),
  43. C The routine will end with IER = 6.
  44. C
  45. C ON RETURN
  46. C RESULT - Real
  47. C Approximation to the integral I
  48. C Result is obtained by applying the 21-POINT
  49. C GAUSS-KRONROD RULE (RES21) obtained by optimal
  50. C addition of abscissae to the 10-POINT GAUSS RULE
  51. C (RES10), or by applying the 43-POINT RULE (RES43)
  52. C obtained by optimal addition of abscissae to the
  53. C 21-POINT GAUSS-KRONROD RULE, or by applying the
  54. C 87-POINT RULE (RES87) obtained by optimal addition
  55. C of abscissae to the 43-POINT RULE.
  56. C
  57. C ABSERR - Real
  58. C Estimate of the modulus of the absolute error,
  59. C which should EQUAL or EXCEED ABS(I-RESULT)
  60. C
  61. C NEVAL - Integer
  62. C Number of integrand evaluations
  63. C
  64. C IER - IER = 0 normal and reliable termination of the
  65. C routine. It is assumed that the requested
  66. C accuracy has been achieved.
  67. C IER.GT.0 Abnormal termination of the routine. It is
  68. C assumed that the requested accuracy has
  69. C not been achieved.
  70. C ERROR MESSAGES
  71. C IER = 1 The maximum number of steps has been
  72. C executed. The integral is probably too
  73. C difficult to be calculated by DQNG.
  74. C = 6 The input is invalid, because
  75. C EPSABS.LE.0 AND
  76. C EPSREL.LT.MAX(50*REL.MACH.ACC.,0.5D-28).
  77. C RESULT, ABSERR and NEVAL are set to zero.
  78. C
  79. C***REFERENCES (NONE)
  80. C***ROUTINES CALLED R1MACH, XERMSG
  81. C***REVISION HISTORY (YYMMDD)
  82. C 800101 DATE WRITTEN
  83. C 890531 Changed all specific intrinsics to generic. (WRB)
  84. C 890531 REVISION DATE from Version 3.2
  85. C 891214 Prologue converted to Version 4.0 format. (BAB)
  86. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  87. C***END PROLOGUE QNG
  88. C
  89. REAL A,ABSC,ABSERR,B,CENTR,DHLGTH,EPMACH,EPSABS,EPSREL,F,FCENTR,
  90. 1 FVAL,FVAL1,FVAL2,FV1,FV2,FV3,FV4,HLGTH,RESULT,RES10,RES21,RES43,
  91. 2 RES87,RESABS,RESASC,RESKH,R1MACH,SAVFUN,UFLOW,W10,W21A,W43A,
  92. 3 W43B,W87A,W87B,X1,X2,X3,X4
  93. INTEGER IER,IPX,K,L,NEVAL
  94. EXTERNAL F
  95. C
  96. DIMENSION FV1(5),FV2(5),FV3(5),FV4(5),X1(5),X2(5),X3(11),X4(22),
  97. 1 W10(5),W21A(5),W21B(6),W43A(10),W43B(12),W87A(21),W87B(23),
  98. 2 SAVFUN(21)
  99. C
  100. C THE FOLLOWING DATA STATEMENTS CONTAIN THE
  101. C ABSCISSAE AND WEIGHTS OF THE INTEGRATION RULES USED.
  102. C
  103. C X1 ABSCISSAE COMMON TO THE 10-, 21-, 43-
  104. C AND 87-POINT RULE
  105. C X2 ABSCISSAE COMMON TO THE 21-, 43- AND
  106. C 87-POINT RULE
  107. C X3 ABSCISSAE COMMON TO THE 43- AND 87-POINT
  108. C RULE
  109. C X4 ABSCISSAE OF THE 87-POINT RULE
  110. C W10 WEIGHTS OF THE 10-POINT FORMULA
  111. C W21A WEIGHTS OF THE 21-POINT FORMULA FOR
  112. C ABSCISSAE X1
  113. C W21B WEIGHTS OF THE 21-POINT FORMULA FOR
  114. C ABSCISSAE X2
  115. C W43A WEIGHTS OF THE 43-POINT FORMULA FOR
  116. C ABSCISSAE X1, X3
  117. C W43B WEIGHTS OF THE 43-POINT FORMULA FOR
  118. C ABSCISSAE X3
  119. C W87A WEIGHTS OF THE 87-POINT FORMULA FOR
  120. C ABSCISSAE X1, X2, X3
  121. C W87B WEIGHTS OF THE 87-POINT FORMULA FOR
  122. C ABSCISSAE X4
  123. C
  124. SAVE X1, X2, X3, X4, W10, W21A, W21B, W43A, W43B, W87A, W87B
  125. DATA X1(1),X1(2),X1(3),X1(4),X1(5)/
  126. 1 0.9739065285171717E+00, 0.8650633666889845E+00,
  127. 2 0.6794095682990244E+00, 0.4333953941292472E+00,
  128. 3 0.1488743389816312E+00/
  129. DATA X2(1),X2(2),X2(3),X2(4),X2(5)/
  130. 1 0.9956571630258081E+00, 0.9301574913557082E+00,
  131. 2 0.7808177265864169E+00, 0.5627571346686047E+00,
  132. 3 0.2943928627014602E+00/
  133. DATA X3(1),X3(2),X3(3),X3(4),X3(5),X3(6),X3(7),X3(8),
  134. 1 X3(9),X3(10),X3(11)/
  135. 2 0.9993333609019321E+00, 0.9874334029080889E+00,
  136. 3 0.9548079348142663E+00, 0.9001486957483283E+00,
  137. 4 0.8251983149831142E+00, 0.7321483889893050E+00,
  138. 5 0.6228479705377252E+00, 0.4994795740710565E+00,
  139. 6 0.3649016613465808E+00, 0.2222549197766013E+00,
  140. 7 0.7465061746138332E-01/
  141. DATA X4(1),X4(2),X4(3),X4(4),X4(5),X4(6),X4(7),X4(8),X4(9),
  142. 1 X4(10),X4(11),X4(12),X4(13),X4(14),X4(15),X4(16),X4(17),X4(18),
  143. 2 X4(19),X4(20),X4(21),X4(22)/ 0.9999029772627292E+00,
  144. 3 0.9979898959866787E+00, 0.9921754978606872E+00,
  145. 4 0.9813581635727128E+00, 0.9650576238583846E+00,
  146. 5 0.9431676131336706E+00, 0.9158064146855072E+00,
  147. 6 0.8832216577713165E+00, 0.8457107484624157E+00,
  148. 7 0.8035576580352310E+00, 0.7570057306854956E+00,
  149. 8 0.7062732097873218E+00, 0.6515894665011779E+00,
  150. 9 0.5932233740579611E+00, 0.5314936059708319E+00,
  151. 1 0.4667636230420228E+00, 0.3994248478592188E+00,
  152. 2 0.3298748771061883E+00, 0.2585035592021616E+00,
  153. 3 0.1856953965683467E+00, 0.1118422131799075E+00,
  154. 4 0.3735212339461987E-01/
  155. DATA W10(1),W10(2),W10(3),W10(4),W10(5)/
  156. 1 0.6667134430868814E-01, 0.1494513491505806E+00,
  157. 2 0.2190863625159820E+00, 0.2692667193099964E+00,
  158. 3 0.2955242247147529E+00/
  159. DATA W21A(1),W21A(2),W21A(3),W21A(4),W21A(5)/
  160. 1 0.3255816230796473E-01, 0.7503967481091995E-01,
  161. 2 0.1093871588022976E+00, 0.1347092173114733E+00,
  162. 3 0.1477391049013385E+00/
  163. DATA W21B(1),W21B(2),W21B(3),W21B(4),W21B(5),W21B(6)/
  164. 1 0.1169463886737187E-01, 0.5475589657435200E-01,
  165. 2 0.9312545458369761E-01, 0.1234919762620659E+00,
  166. 3 0.1427759385770601E+00, 0.1494455540029169E+00/
  167. DATA W43A(1),W43A(2),W43A(3),W43A(4),W43A(5),W43A(6),W43A(7),
  168. 1 W43A(8),W43A(9),W43A(10)/ 0.1629673428966656E-01,
  169. 2 0.3752287612086950E-01, 0.5469490205825544E-01,
  170. 3 0.6735541460947809E-01, 0.7387019963239395E-01,
  171. 4 0.5768556059769796E-02, 0.2737189059324884E-01,
  172. 5 0.4656082691042883E-01, 0.6174499520144256E-01,
  173. 6 0.7138726726869340E-01/
  174. DATA W43B(1),W43B(2),W43B(3),W43B(4),W43B(5),W43B(6),
  175. 1 W43B(7),W43B(8),W43B(9),W43B(10),W43B(11),W43B(12)/
  176. 2 0.1844477640212414E-02, 0.1079868958589165E-01,
  177. 3 0.2189536386779543E-01, 0.3259746397534569E-01,
  178. 4 0.4216313793519181E-01, 0.5074193960018458E-01,
  179. 5 0.5837939554261925E-01, 0.6474640495144589E-01,
  180. 6 0.6956619791235648E-01, 0.7282444147183321E-01,
  181. 7 0.7450775101417512E-01, 0.7472214751740301E-01/
  182. DATA W87A(1),W87A(2),W87A(3),W87A(4),W87A(5),W87A(6),
  183. 1 W87A(7),W87A(8),W87A(9),W87A(10),W87A(11),W87A(12),
  184. 2 W87A(13),W87A(14),W87A(15),W87A(16),W87A(17),W87A(18),
  185. 3 W87A(19),W87A(20),W87A(21)/
  186. 4 0.8148377384149173E-02, 0.1876143820156282E-01,
  187. 5 0.2734745105005229E-01, 0.3367770731163793E-01,
  188. 6 0.3693509982042791E-01, 0.2884872430211531E-02,
  189. 7 0.1368594602271270E-01, 0.2328041350288831E-01,
  190. 8 0.3087249761171336E-01, 0.3569363363941877E-01,
  191. 9 0.9152833452022414E-03, 0.5399280219300471E-02,
  192. 1 0.1094767960111893E-01, 0.1629873169678734E-01,
  193. 2 0.2108156888920384E-01, 0.2537096976925383E-01,
  194. 3 0.2918969775647575E-01, 0.3237320246720279E-01,
  195. 4 0.3478309895036514E-01, 0.3641222073135179E-01,
  196. 5 0.3725387550304771E-01/
  197. DATA W87B(1),W87B(2),W87B(3),W87B(4),W87B(5),W87B(6),W87B(7),
  198. 1 W87B(8),W87B(9),W87B(10),W87B(11),W87B(12),W87B(13),W87B(14),
  199. 2 W87B(15),W87B(16),W87B(17),W87B(18),W87B(19),W87B(20),
  200. 3 W87B(21),W87B(22),W87B(23)/ 0.2741455637620724E-03,
  201. 4 0.1807124155057943E-02, 0.4096869282759165E-02,
  202. 5 0.6758290051847379E-02, 0.9549957672201647E-02,
  203. 6 0.1232944765224485E-01, 0.1501044734638895E-01,
  204. 7 0.1754896798624319E-01, 0.1993803778644089E-01,
  205. 8 0.2219493596101229E-01, 0.2433914712600081E-01,
  206. 9 0.2637450541483921E-01, 0.2828691078877120E-01,
  207. 1 0.3005258112809270E-01, 0.3164675137143993E-01,
  208. 2 0.3305041341997850E-01, 0.3425509970422606E-01,
  209. 3 0.3526241266015668E-01, 0.3607698962288870E-01,
  210. 4 0.3669860449845609E-01, 0.3712054926983258E-01,
  211. 5 0.3733422875193504E-01, 0.3736107376267902E-01/
  212. C
  213. C LIST OF MAJOR VARIABLES
  214. C -----------------------
  215. C
  216. C CENTR - MID POINT OF THE INTEGRATION INTERVAL
  217. C HLGTH - HALF-LENGTH OF THE INTEGRATION INTERVAL
  218. C FCENTR - FUNCTION VALUE AT MID POINT
  219. C ABSC - ABSCISSA
  220. C FVAL - FUNCTION VALUE
  221. C SAVFUN - ARRAY OF FUNCTION VALUES WHICH
  222. C HAVE ALREADY BEEN COMPUTED
  223. C RES10 - 10-POINT GAUSS RESULT
  224. C RES21 - 21-POINT KRONROD RESULT
  225. C RES43 - 43-POINT RESULT
  226. C RES87 - 87-POINT RESULT
  227. C RESABS - APPROXIMATION TO THE INTEGRAL OF ABS(F)
  228. C RESASC - APPROXIMATION TO THE INTEGRAL OF ABS(F-I/(B-A))
  229. C
  230. C MACHINE DEPENDENT CONSTANTS
  231. C ---------------------------
  232. C
  233. C EPMACH IS THE LARGEST RELATIVE SPACING.
  234. C UFLOW IS THE SMALLEST POSITIVE MAGNITUDE.
  235. C
  236. C***FIRST EXECUTABLE STATEMENT QNG
  237. EPMACH = R1MACH(4)
  238. UFLOW = R1MACH(1)
  239. C
  240. C TEST ON VALIDITY OF PARAMETERS
  241. C ------------------------------
  242. C
  243. RESULT = 0.0E+00
  244. ABSERR = 0.0E+00
  245. NEVAL = 0
  246. IER = 6
  247. IF(EPSABS.LE.0.0E+00.AND.EPSREL.LT.MAX(0.5E-14,0.5E+02*EPMACH))
  248. 1 GO TO 80
  249. HLGTH = 0.5E+00*(B-A)
  250. DHLGTH = ABS(HLGTH)
  251. CENTR = 0.5E+00*(B+A)
  252. FCENTR = F(CENTR)
  253. NEVAL = 21
  254. IER = 1
  255. C
  256. C COMPUTE THE INTEGRAL USING THE 10- AND 21-POINT FORMULA.
  257. C
  258. DO 70 L = 1,3
  259. GO TO (5,25,45),L
  260. 5 RES10 = 0.0E+00
  261. RES21 = W21B(6)*FCENTR
  262. RESABS = W21B(6)*ABS(FCENTR)
  263. DO 10 K=1,5
  264. ABSC = HLGTH*X1(K)
  265. FVAL1 = F(CENTR+ABSC)
  266. FVAL2 = F(CENTR-ABSC)
  267. FVAL = FVAL1+FVAL2
  268. RES10 = RES10+W10(K)*FVAL
  269. RES21 = RES21+W21A(K)*FVAL
  270. RESABS = RESABS+W21A(K)*(ABS(FVAL1)+ABS(FVAL2))
  271. SAVFUN(K) = FVAL
  272. FV1(K) = FVAL1
  273. FV2(K) = FVAL2
  274. 10 CONTINUE
  275. IPX = 5
  276. DO 15 K=1,5
  277. IPX = IPX+1
  278. ABSC = HLGTH*X2(K)
  279. FVAL1 = F(CENTR+ABSC)
  280. FVAL2 = F(CENTR-ABSC)
  281. FVAL = FVAL1+FVAL2
  282. RES21 = RES21+W21B(K)*FVAL
  283. RESABS = RESABS+W21B(K)*(ABS(FVAL1)+ABS(FVAL2))
  284. SAVFUN(IPX) = FVAL
  285. FV3(K) = FVAL1
  286. FV4(K) = FVAL2
  287. 15 CONTINUE
  288. C
  289. C TEST FOR CONVERGENCE.
  290. C
  291. RESULT = RES21*HLGTH
  292. RESABS = RESABS*DHLGTH
  293. RESKH = 0.5E+00*RES21
  294. RESASC = W21B(6)*ABS(FCENTR-RESKH)
  295. DO 20 K = 1,5
  296. RESASC = RESASC+W21A(K)*(ABS(FV1(K)-RESKH)+ABS(FV2(K)-RESKH))
  297. 1 +W21B(K)*(ABS(FV3(K)-RESKH)+ABS(FV4(K)-RESKH))
  298. 20 CONTINUE
  299. ABSERR = ABS((RES21-RES10)*HLGTH)
  300. RESASC = RESASC*DHLGTH
  301. GO TO 65
  302. C
  303. C COMPUTE THE INTEGRAL USING THE 43-POINT FORMULA.
  304. C
  305. 25 RES43 = W43B(12)*FCENTR
  306. NEVAL = 43
  307. DO 30 K=1,10
  308. RES43 = RES43+SAVFUN(K)*W43A(K)
  309. 30 CONTINUE
  310. DO 40 K=1,11
  311. IPX = IPX+1
  312. ABSC = HLGTH*X3(K)
  313. FVAL = F(ABSC+CENTR)+F(CENTR-ABSC)
  314. RES43 = RES43+FVAL*W43B(K)
  315. SAVFUN(IPX) = FVAL
  316. 40 CONTINUE
  317. C
  318. C TEST FOR CONVERGENCE.
  319. C
  320. RESULT = RES43*HLGTH
  321. ABSERR = ABS((RES43-RES21)*HLGTH)
  322. GO TO 65
  323. C
  324. C COMPUTE THE INTEGRAL USING THE 87-POINT FORMULA.
  325. C
  326. 45 RES87 = W87B(23)*FCENTR
  327. NEVAL = 87
  328. DO 50 K=1,21
  329. RES87 = RES87+SAVFUN(K)*W87A(K)
  330. 50 CONTINUE
  331. DO 60 K=1,22
  332. ABSC = HLGTH*X4(K)
  333. RES87 = RES87+W87B(K)*(F(ABSC+CENTR)+F(CENTR-ABSC))
  334. 60 CONTINUE
  335. RESULT = RES87*HLGTH
  336. ABSERR = ABS((RES87-RES43)*HLGTH)
  337. 65 IF(RESASC.NE.0.0E+00.AND.ABSERR.NE.0.0E+00)
  338. 1 ABSERR = RESASC*MIN(0.1E+01,
  339. 2 (0.2E+03*ABSERR/RESASC)**1.5E+00)
  340. IF (RESABS.GT.UFLOW/(0.5E+02*EPMACH)) ABSERR = MAX
  341. 1 ((EPMACH*0.5E+02)*RESABS,ABSERR)
  342. IF (ABSERR.LE.MAX(EPSABS,EPSREL*ABS(RESULT))) IER = 0
  343. C ***JUMP OUT OF DO-LOOP
  344. IF (IER.EQ.0) GO TO 999
  345. 70 CONTINUE
  346. 80 CALL XERMSG ('SLATEC', 'QNG', 'ABNORMAL RETURN', IER, 0)
  347. 999 RETURN
  348. END