dqc25f.f 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. *DECK DQC25F
  2. SUBROUTINE DQC25F (F, A, B, OMEGA, INTEGR, NRMOM, MAXP1, KSAVE,
  3. + RESULT, ABSERR, NEVAL, RESABS, RESASC, MOMCOM, CHEBMO)
  4. C***BEGIN PROLOGUE DQC25F
  5. C***PURPOSE To compute the integral I=Integral of F(X) over (A,B)
  6. C Where W(X) = COS(OMEGA*X) or W(X)=SIN(OMEGA*X) and to
  7. C compute J = Integral of ABS(F) over (A,B). For small value
  8. C of OMEGA or small intervals (A,B) the 15-point GAUSS-KRONRO
  9. C Rule is used. Otherwise a generalized CLENSHAW-CURTIS
  10. C method is used.
  11. C***LIBRARY SLATEC (QUADPACK)
  12. C***CATEGORY H2A2A2
  13. C***TYPE DOUBLE PRECISION (QC25F-S, DQC25F-D)
  14. C***KEYWORDS CLENSHAW-CURTIS METHOD, GAUSS-KRONROD RULES,
  15. C INTEGRATION RULES FOR FUNCTIONS WITH COS OR SIN FACTOR,
  16. C QUADPACK, QUADRATURE
  17. C***AUTHOR Piessens, Robert
  18. C Applied Mathematics and Programming Division
  19. C K. U. Leuven
  20. C de Doncker, Elise
  21. C Applied Mathematics and Programming Division
  22. C K. U. Leuven
  23. C***DESCRIPTION
  24. C
  25. C Integration rules for functions with COS or SIN factor
  26. C Standard fortran subroutine
  27. C Double precision version
  28. C
  29. C PARAMETERS
  30. C ON ENTRY
  31. C F - Double precision
  32. C Function subprogram defining the integrand
  33. C function F(X). The actual name for F needs to
  34. C be declared E X T E R N A L in the calling program.
  35. C
  36. C A - Double precision
  37. C Lower limit of integration
  38. C
  39. C B - Double precision
  40. C Upper limit of integration
  41. C
  42. C OMEGA - Double precision
  43. C Parameter in the WEIGHT function
  44. C
  45. C INTEGR - Integer
  46. C Indicates which WEIGHT function is to be used
  47. C INTEGR = 1 W(X) = COS(OMEGA*X)
  48. C INTEGR = 2 W(X) = SIN(OMEGA*X)
  49. C
  50. C NRMOM - Integer
  51. C The length of interval (A,B) is equal to the length
  52. C of the original integration interval divided by
  53. C 2**NRMOM (we suppose that the routine is used in an
  54. C adaptive integration process, otherwise set
  55. C NRMOM = 0). NRMOM must be zero at the first call.
  56. C
  57. C MAXP1 - Integer
  58. C Gives an upper bound on the number of Chebyshev
  59. C moments which can be stored, i.e. for the
  60. C intervals of lengths ABS(BB-AA)*2**(-L),
  61. C L = 0,1,2, ..., MAXP1-2.
  62. C
  63. C KSAVE - Integer
  64. C Key which is one when the moments for the
  65. C current interval have been computed
  66. C
  67. C ON RETURN
  68. C RESULT - Double precision
  69. C Approximation to the integral I
  70. C
  71. C ABSERR - Double precision
  72. C Estimate of the modulus of the absolute
  73. C error, which should equal or exceed ABS(I-RESULT)
  74. C
  75. C NEVAL - Integer
  76. C Number of integrand evaluations
  77. C
  78. C RESABS - Double precision
  79. C Approximation to the integral J
  80. C
  81. C RESASC - Double precision
  82. C Approximation to the integral of ABS(F-I/(B-A))
  83. C
  84. C ON ENTRY AND RETURN
  85. C MOMCOM - Integer
  86. C For each interval length we need to compute the
  87. C Chebyshev moments. MOMCOM counts the number of
  88. C intervals for which these moments have already been
  89. C computed. If NRMOM.LT.MOMCOM or KSAVE = 1, the
  90. C Chebyshev moments for the interval (A,B) have
  91. C already been computed and stored, otherwise we
  92. C compute them and we increase MOMCOM.
  93. C
  94. C CHEBMO - Double precision
  95. C Array of dimension at least (MAXP1,25) containing
  96. C the modified Chebyshev moments for the first MOMCOM
  97. C MOMCOM interval lengths
  98. C
  99. C ......................................................................
  100. C
  101. C***REFERENCES (NONE)
  102. C***ROUTINES CALLED D1MACH, DGTSL, DQCHEB, DQK15W, DQWGTF
  103. C***REVISION HISTORY (YYMMDD)
  104. C 810101 DATE WRITTEN
  105. C 890531 Changed all specific intrinsics to generic. (WRB)
  106. C 890531 REVISION DATE from Version 3.2
  107. C 891214 Prologue converted to Version 4.0 format. (BAB)
  108. C***END PROLOGUE DQC25F
  109. C
  110. DOUBLE PRECISION A,ABSERR,AC,AN,AN2,AS,ASAP,ASS,B,CENTR,CHEBMO,
  111. 1 CHEB12,CHEB24,CONC,CONS,COSPAR,D,DQWGTF,D1,
  112. 2 D1MACH,D2,ESTC,ESTS,F,FVAL,HLGTH,OFLOW,OMEGA,PARINT,PAR2,PAR22,
  113. 3 P2,P3,P4,RESABS,RESASC,RESC12,RESC24,RESS12,RESS24,RESULT,
  114. 4 SINPAR,V,X
  115. INTEGER I,IERS,INTEGR,ISYM,J,K,KSAVE,M,MOMCOM,NEVAL,MAXP1,
  116. 1 NOEQU,NOEQ1,NRMOM
  117. C
  118. DIMENSION CHEBMO(MAXP1,25),CHEB12(13),CHEB24(25),D(25),D1(25),
  119. 1 D2(25),FVAL(25),V(28),X(11)
  120. C
  121. EXTERNAL F, DQWGTF
  122. C
  123. C THE VECTOR X CONTAINS THE VALUES COS(K*PI/24)
  124. C K = 1, ...,11, TO BE USED FOR THE CHEBYSHEV EXPANSION OF F
  125. C
  126. SAVE X
  127. DATA X(1),X(2),X(3),X(4),X(5),X(6),X(7),X(8),X(9),X(10),X(11)/
  128. 1 0.9914448613738104D+00, 0.9659258262890683D+00,
  129. 2 0.9238795325112868D+00, 0.8660254037844386D+00,
  130. 3 0.7933533402912352D+00, 0.7071067811865475D+00,
  131. 4 0.6087614290087206D+00, 0.5000000000000000D+00,
  132. 5 0.3826834323650898D+00, 0.2588190451025208D+00,
  133. 6 0.1305261922200516D+00/
  134. C
  135. C LIST OF MAJOR VARIABLES
  136. C -----------------------
  137. C
  138. C CENTR - MID POINT OF THE INTEGRATION INTERVAL
  139. C HLGTH - HALF-LENGTH OF THE INTEGRATION INTERVAL
  140. C FVAL - VALUE OF THE FUNCTION F AT THE POINTS
  141. C (B-A)*0.5*COS(K*PI/12) + (B+A)*0.5, K = 0, ..., 24
  142. C CHEB12 - COEFFICIENTS OF THE CHEBYSHEV SERIES EXPANSION
  143. C OF DEGREE 12, FOR THE FUNCTION F, IN THE
  144. C INTERVAL (A,B)
  145. C CHEB24 - COEFFICIENTS OF THE CHEBYSHEV SERIES EXPANSION
  146. C OF DEGREE 24, FOR THE FUNCTION F, IN THE
  147. C INTERVAL (A,B)
  148. C RESC12 - APPROXIMATION TO THE INTEGRAL OF
  149. C COS(0.5*(B-A)*OMEGA*X)*F(0.5*(B-A)*X+0.5*(B+A))
  150. C OVER (-1,+1), USING THE CHEBYSHEV SERIES
  151. C EXPANSION OF DEGREE 12
  152. C RESC24 - APPROXIMATION TO THE SAME INTEGRAL, USING THE
  153. C CHEBYSHEV SERIES EXPANSION OF DEGREE 24
  154. C RESS12 - THE ANALOGUE OF RESC12 FOR THE SINE
  155. C RESS24 - THE ANALOGUE OF RESC24 FOR THE SINE
  156. C
  157. C
  158. C MACHINE DEPENDENT CONSTANT
  159. C --------------------------
  160. C
  161. C OFLOW IS THE LARGEST POSITIVE MAGNITUDE.
  162. C
  163. C***FIRST EXECUTABLE STATEMENT DQC25F
  164. OFLOW = D1MACH(2)
  165. C
  166. CENTR = 0.5D+00*(B+A)
  167. HLGTH = 0.5D+00*(B-A)
  168. PARINT = OMEGA*HLGTH
  169. C
  170. C COMPUTE THE INTEGRAL USING THE 15-POINT GAUSS-KRONROD
  171. C FORMULA IF THE VALUE OF THE PARAMETER IN THE INTEGRAND
  172. C IS SMALL.
  173. C
  174. IF(ABS(PARINT).GT.0.2D+01) GO TO 10
  175. CALL DQK15W(F,DQWGTF,OMEGA,P2,P3,P4,INTEGR,A,B,RESULT,
  176. 1 ABSERR,RESABS,RESASC)
  177. NEVAL = 15
  178. GO TO 170
  179. C
  180. C COMPUTE THE INTEGRAL USING THE GENERALIZED CLENSHAW-
  181. C CURTIS METHOD.
  182. C
  183. 10 CONC = HLGTH*COS(CENTR*OMEGA)
  184. CONS = HLGTH*SIN(CENTR*OMEGA)
  185. RESASC = OFLOW
  186. NEVAL = 25
  187. C
  188. C CHECK WHETHER THE CHEBYSHEV MOMENTS FOR THIS INTERVAL
  189. C HAVE ALREADY BEEN COMPUTED.
  190. C
  191. IF(NRMOM.LT.MOMCOM.OR.KSAVE.EQ.1) GO TO 120
  192. C
  193. C COMPUTE A NEW SET OF CHEBYSHEV MOMENTS.
  194. C
  195. M = MOMCOM+1
  196. PAR2 = PARINT*PARINT
  197. PAR22 = PAR2+0.2D+01
  198. SINPAR = SIN(PARINT)
  199. COSPAR = COS(PARINT)
  200. C
  201. C COMPUTE THE CHEBYSHEV MOMENTS WITH RESPECT TO COSINE.
  202. C
  203. V(1) = 0.2D+01*SINPAR/PARINT
  204. V(2) = (0.8D+01*COSPAR+(PAR2+PAR2-0.8D+01)*SINPAR/PARINT)/PAR2
  205. V(3) = (0.32D+02*(PAR2-0.12D+02)*COSPAR+(0.2D+01*
  206. 1 ((PAR2-0.80D+02)*PAR2+0.192D+03)*SINPAR)/PARINT)/(PAR2*PAR2)
  207. AC = 0.8D+01*COSPAR
  208. AS = 0.24D+02*PARINT*SINPAR
  209. IF(ABS(PARINT).GT.0.24D+02) GO TO 30
  210. C
  211. C COMPUTE THE CHEBYSHEV MOMENTS AS THE SOLUTIONS OF A
  212. C BOUNDARY VALUE PROBLEM WITH 1 INITIAL VALUE (V(3)) AND 1
  213. C END VALUE (COMPUTED USING AN ASYMPTOTIC FORMULA).
  214. C
  215. NOEQU = 25
  216. NOEQ1 = NOEQU-1
  217. AN = 0.6D+01
  218. DO 20 K = 1,NOEQ1
  219. AN2 = AN*AN
  220. D(K) = -0.2D+01*(AN2-0.4D+01)*(PAR22-AN2-AN2)
  221. D2(K) = (AN-0.1D+01)*(AN-0.2D+01)*PAR2
  222. D1(K+1) = (AN+0.3D+01)*(AN+0.4D+01)*PAR2
  223. V(K+3) = AS-(AN2-0.4D+01)*AC
  224. AN = AN+0.2D+01
  225. 20 CONTINUE
  226. AN2 = AN*AN
  227. D(NOEQU) = -0.2D+01*(AN2-0.4D+01)*(PAR22-AN2-AN2)
  228. V(NOEQU+3) = AS-(AN2-0.4D+01)*AC
  229. V(4) = V(4)-0.56D+02*PAR2*V(3)
  230. ASS = PARINT*SINPAR
  231. ASAP = (((((0.210D+03*PAR2-0.1D+01)*COSPAR-(0.105D+03*PAR2
  232. 1 -0.63D+02)*ASS)/AN2-(0.1D+01-0.15D+02*PAR2)*COSPAR
  233. 2 +0.15D+02*ASS)/AN2-COSPAR+0.3D+01*ASS)/AN2-COSPAR)/AN2
  234. V(NOEQU+3) = V(NOEQU+3)-0.2D+01*ASAP*PAR2*(AN-0.1D+01)*
  235. 1 (AN-0.2D+01)
  236. C
  237. C SOLVE THE TRIDIAGONAL SYSTEM BY MEANS OF GAUSSIAN
  238. C ELIMINATION WITH PARTIAL PIVOTING.
  239. C
  240. C *** CALL TO DGTSL MUST BE REPLACED BY CALL TO
  241. C *** DOUBLE PRECISION VERSION OF LINPACK ROUTINE SGTSL
  242. C
  243. CALL DGTSL(NOEQU,D1,D,D2,V(4),IERS)
  244. GO TO 50
  245. C
  246. C COMPUTE THE CHEBYSHEV MOMENTS BY MEANS OF FORWARD
  247. C RECURSION.
  248. C
  249. 30 AN = 0.4D+01
  250. DO 40 I = 4,13
  251. AN2 = AN*AN
  252. V(I) = ((AN2-0.4D+01)*(0.2D+01*(PAR22-AN2-AN2)*V(I-1)-AC)
  253. 1 +AS-PAR2*(AN+0.1D+01)*(AN+0.2D+01)*V(I-2))/
  254. 2 (PAR2*(AN-0.1D+01)*(AN-0.2D+01))
  255. AN = AN+0.2D+01
  256. 40 CONTINUE
  257. 50 DO 60 J = 1,13
  258. CHEBMO(M,2*J-1) = V(J)
  259. 60 CONTINUE
  260. C
  261. C COMPUTE THE CHEBYSHEV MOMENTS WITH RESPECT TO SINE.
  262. C
  263. V(1) = 0.2D+01*(SINPAR-PARINT*COSPAR)/PAR2
  264. V(2) = (0.18D+02-0.48D+02/PAR2)*SINPAR/PAR2
  265. 1 +(-0.2D+01+0.48D+02/PAR2)*COSPAR/PARINT
  266. AC = -0.24D+02*PARINT*COSPAR
  267. AS = -0.8D+01*SINPAR
  268. IF(ABS(PARINT).GT.0.24D+02) GO TO 80
  269. C
  270. C COMPUTE THE CHEBYSHEV MOMENTS AS THE SOLUTIONS OF A BOUNDARY
  271. C VALUE PROBLEM WITH 1 INITIAL VALUE (V(2)) AND 1 END VALUE
  272. C (COMPUTED USING AN ASYMPTOTIC FORMULA).
  273. C
  274. AN = 0.5D+01
  275. DO 70 K = 1,NOEQ1
  276. AN2 = AN*AN
  277. D(K) = -0.2D+01*(AN2-0.4D+01)*(PAR22-AN2-AN2)
  278. D2(K) = (AN-0.1D+01)*(AN-0.2D+01)*PAR2
  279. D1(K+1) = (AN+0.3D+01)*(AN+0.4D+01)*PAR2
  280. V(K+2) = AC+(AN2-0.4D+01)*AS
  281. AN = AN+0.2D+01
  282. 70 CONTINUE
  283. AN2 = AN*AN
  284. D(NOEQU) = -0.2D+01*(AN2-0.4D+01)*(PAR22-AN2-AN2)
  285. V(NOEQU+2) = AC+(AN2-0.4D+01)*AS
  286. V(3) = V(3)-0.42D+02*PAR2*V(2)
  287. ASS = PARINT*COSPAR
  288. ASAP = (((((0.105D+03*PAR2-0.63D+02)*ASS+(0.210D+03*PAR2
  289. 1 -0.1D+01)*SINPAR)/AN2+(0.15D+02*PAR2-0.1D+01)*SINPAR-
  290. 2 0.15D+02*ASS)/AN2-0.3D+01*ASS-SINPAR)/AN2-SINPAR)/AN2
  291. V(NOEQU+2) = V(NOEQU+2)-0.2D+01*ASAP*PAR2*(AN-0.1D+01)
  292. 1 *(AN-0.2D+01)
  293. C
  294. C SOLVE THE TRIDIAGONAL SYSTEM BY MEANS OF GAUSSIAN
  295. C ELIMINATION WITH PARTIAL PIVOTING.
  296. C
  297. C *** CALL TO DGTSL MUST BE REPLACED BY CALL TO
  298. C *** DOUBLE PRECISION VERSION OF LINPACK ROUTINE SGTSL
  299. C
  300. CALL DGTSL(NOEQU,D1,D,D2,V(3),IERS)
  301. GO TO 100
  302. C
  303. C COMPUTE THE CHEBYSHEV MOMENTS BY MEANS OF FORWARD RECURSION.
  304. C
  305. 80 AN = 0.3D+01
  306. DO 90 I = 3,12
  307. AN2 = AN*AN
  308. V(I) = ((AN2-0.4D+01)*(0.2D+01*(PAR22-AN2-AN2)*V(I-1)+AS)
  309. 1 +AC-PAR2*(AN+0.1D+01)*(AN+0.2D+01)*V(I-2))
  310. 2 /(PAR2*(AN-0.1D+01)*(AN-0.2D+01))
  311. AN = AN+0.2D+01
  312. 90 CONTINUE
  313. 100 DO 110 J = 1,12
  314. CHEBMO(M,2*J) = V(J)
  315. 110 CONTINUE
  316. 120 IF (NRMOM.LT.MOMCOM) M = NRMOM+1
  317. IF (MOMCOM.LT.(MAXP1-1).AND.NRMOM.GE.MOMCOM) MOMCOM = MOMCOM+1
  318. C
  319. C COMPUTE THE COEFFICIENTS OF THE CHEBYSHEV EXPANSIONS
  320. C OF DEGREES 12 AND 24 OF THE FUNCTION F.
  321. C
  322. FVAL(1) = 0.5D+00*F(CENTR+HLGTH)
  323. FVAL(13) = F(CENTR)
  324. FVAL(25) = 0.5D+00*F(CENTR-HLGTH)
  325. DO 130 I = 2,12
  326. ISYM = 26-I
  327. FVAL(I) = F(HLGTH*X(I-1)+CENTR)
  328. FVAL(ISYM) = F(CENTR-HLGTH*X(I-1))
  329. 130 CONTINUE
  330. CALL DQCHEB(X,FVAL,CHEB12,CHEB24)
  331. C
  332. C COMPUTE THE INTEGRAL AND ERROR ESTIMATES.
  333. C
  334. RESC12 = CHEB12(13)*CHEBMO(M,13)
  335. RESS12 = 0.0D+00
  336. K = 11
  337. DO 140 J = 1,6
  338. RESC12 = RESC12+CHEB12(K)*CHEBMO(M,K)
  339. RESS12 = RESS12+CHEB12(K+1)*CHEBMO(M,K+1)
  340. K = K-2
  341. 140 CONTINUE
  342. RESC24 = CHEB24(25)*CHEBMO(M,25)
  343. RESS24 = 0.0D+00
  344. RESABS = ABS(CHEB24(25))
  345. K = 23
  346. DO 150 J = 1,12
  347. RESC24 = RESC24+CHEB24(K)*CHEBMO(M,K)
  348. RESS24 = RESS24+CHEB24(K+1)*CHEBMO(M,K+1)
  349. RESABS = ABS(CHEB24(K))+ABS(CHEB24(K+1))
  350. K = K-2
  351. 150 CONTINUE
  352. ESTC = ABS(RESC24-RESC12)
  353. ESTS = ABS(RESS24-RESS12)
  354. RESABS = RESABS*ABS(HLGTH)
  355. IF(INTEGR.EQ.2) GO TO 160
  356. RESULT = CONC*RESC24-CONS*RESS24
  357. ABSERR = ABS(CONC*ESTC)+ABS(CONS*ESTS)
  358. GO TO 170
  359. 160 RESULT = CONC*RESS24+CONS*RESC24
  360. ABSERR = ABS(CONC*ESTS)+ABS(CONS*ESTC)
  361. 170 RETURN
  362. END