dqc25c.f 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. *DECK DQC25C
  2. SUBROUTINE DQC25C (F, A, B, C, RESULT, ABSERR, KRUL, NEVAL)
  3. C***BEGIN PROLOGUE DQC25C
  4. C***PURPOSE To compute I = Integral of F*W over (A,B) with
  5. C error estimate, where W(X) = 1/(X-C)
  6. C***LIBRARY SLATEC (QUADPACK)
  7. C***CATEGORY H2A2A2, J4
  8. C***TYPE DOUBLE PRECISION (QC25C-S, DQC25C-D)
  9. C***KEYWORDS 25-POINT CLENSHAW-CURTIS INTEGRATION, QUADPACK, QUADRATURE
  10. C***AUTHOR Piessens, Robert
  11. C Applied Mathematics and Programming Division
  12. C K. U. Leuven
  13. C de Doncker, Elise
  14. C Applied Mathematics and Programming Division
  15. C K. U. Leuven
  16. C***DESCRIPTION
  17. C
  18. C Integration rules for the computation of CAUCHY
  19. C PRINCIPAL VALUE integrals
  20. C Standard fortran subroutine
  21. C Double precision version
  22. C
  23. C PARAMETERS
  24. C F - Double precision
  25. C Function subprogram defining the integrand function
  26. C F(X). The actual name for F needs to be declared
  27. C E X T E R N A L in the driver program.
  28. C
  29. C A - Double precision
  30. C Left end point of the integration interval
  31. C
  32. C B - Double precision
  33. C Right end point of the integration interval, B.GT.A
  34. C
  35. C C - Double precision
  36. C Parameter in the WEIGHT function
  37. C
  38. C RESULT - Double precision
  39. C Approximation to the integral
  40. C result is computed by using a generalized
  41. C Clenshaw-Curtis method if C lies within ten percent
  42. C of the integration interval. In the other case the
  43. C 15-point Kronrod rule obtained by optimal addition
  44. C of abscissae to the 7-point Gauss rule, is applied.
  45. C
  46. C ABSERR - Double precision
  47. C Estimate of the modulus of the absolute error,
  48. C which should equal or exceed ABS(I-RESULT)
  49. C
  50. C KRUL - Integer
  51. C Key which is decreased by 1 if the 15-point
  52. C Gauss-Kronrod scheme has been used
  53. C
  54. C NEVAL - Integer
  55. C Number of integrand evaluations
  56. C
  57. C ......................................................................
  58. C
  59. C***REFERENCES (NONE)
  60. C***ROUTINES CALLED DQCHEB, DQK15W, DQWGTC
  61. C***REVISION HISTORY (YYMMDD)
  62. C 810101 DATE WRITTEN
  63. C 890531 Changed all specific intrinsics to generic. (WRB)
  64. C 890531 REVISION DATE from Version 3.2
  65. C 891214 Prologue converted to Version 4.0 format. (BAB)
  66. C***END PROLOGUE DQC25C
  67. C
  68. DOUBLE PRECISION A,ABSERR,AK22,AMOM0,AMOM1,AMOM2,B,C,CC,CENTR,
  69. 1 CHEB12,CHEB24,DQWGTC,F,FVAL,HLGTH,P2,P3,P4,RESABS,
  70. 2 RESASC,RESULT,RES12,RES24,U,X
  71. INTEGER I,ISYM,K,KP,KRUL,NEVAL
  72. C
  73. DIMENSION X(11),FVAL(25),CHEB12(13),CHEB24(25)
  74. C
  75. EXTERNAL F, DQWGTC
  76. C
  77. C THE VECTOR X CONTAINS THE VALUES COS(K*PI/24),
  78. C K = 1, ..., 11, TO BE USED FOR THE CHEBYSHEV SERIES
  79. C EXPANSION OF F
  80. C
  81. SAVE X
  82. DATA X(1),X(2),X(3),X(4),X(5),X(6),X(7),X(8),X(9),X(10),X(11)/
  83. 1 0.9914448613738104D+00, 0.9659258262890683D+00,
  84. 2 0.9238795325112868D+00, 0.8660254037844386D+00,
  85. 3 0.7933533402912352D+00, 0.7071067811865475D+00,
  86. 4 0.6087614290087206D+00, 0.5000000000000000D+00,
  87. 5 0.3826834323650898D+00, 0.2588190451025208D+00,
  88. 6 0.1305261922200516D+00/
  89. C
  90. C LIST OF MAJOR VARIABLES
  91. C ----------------------
  92. C FVAL - VALUE OF THE FUNCTION F AT THE POINTS
  93. C COS(K*PI/24), K = 0, ..., 24
  94. C CHEB12 - CHEBYSHEV SERIES EXPANSION COEFFICIENTS,
  95. C FOR THE FUNCTION F, OF DEGREE 12
  96. C CHEB24 - CHEBYSHEV SERIES EXPANSION COEFFICIENTS,
  97. C FOR THE FUNCTION F, OF DEGREE 24
  98. C RES12 - APPROXIMATION TO THE INTEGRAL CORRESPONDING
  99. C TO THE USE OF CHEB12
  100. C RES24 - APPROXIMATION TO THE INTEGRAL CORRESPONDING
  101. C TO THE USE OF CHEB24
  102. C DQWGTC - EXTERNAL FUNCTION SUBPROGRAM DEFINING
  103. C THE WEIGHT FUNCTION
  104. C HLGTH - HALF-LENGTH OF THE INTERVAL
  105. C CENTR - MID POINT OF THE INTERVAL
  106. C
  107. C
  108. C CHECK THE POSITION OF C.
  109. C
  110. C***FIRST EXECUTABLE STATEMENT DQC25C
  111. CC = (0.2D+01*C-B-A)/(B-A)
  112. IF(ABS(CC).LT.0.11D+01) GO TO 10
  113. C
  114. C APPLY THE 15-POINT GAUSS-KRONROD SCHEME.
  115. C
  116. KRUL = KRUL-1
  117. CALL DQK15W(F,DQWGTC,C,P2,P3,P4,KP,A,B,RESULT,ABSERR,
  118. 1 RESABS,RESASC)
  119. NEVAL = 15
  120. IF (RESASC.EQ.ABSERR) KRUL = KRUL+1
  121. GO TO 50
  122. C
  123. C USE THE GENERALIZED CLENSHAW-CURTIS METHOD.
  124. C
  125. 10 HLGTH = 0.5D+00*(B-A)
  126. CENTR = 0.5D+00*(B+A)
  127. NEVAL = 25
  128. FVAL(1) = 0.5D+00*F(HLGTH+CENTR)
  129. FVAL(13) = F(CENTR)
  130. FVAL(25) = 0.5D+00*F(CENTR-HLGTH)
  131. DO 20 I=2,12
  132. U = HLGTH*X(I-1)
  133. ISYM = 26-I
  134. FVAL(I) = F(U+CENTR)
  135. FVAL(ISYM) = F(CENTR-U)
  136. 20 CONTINUE
  137. C
  138. C COMPUTE THE CHEBYSHEV SERIES EXPANSION.
  139. C
  140. CALL DQCHEB(X,FVAL,CHEB12,CHEB24)
  141. C
  142. C THE MODIFIED CHEBYSHEV MOMENTS ARE COMPUTED BY FORWARD
  143. C RECURSION, USING AMOM0 AND AMOM1 AS STARTING VALUES.
  144. C
  145. AMOM0 = LOG(ABS((0.1D+01-CC)/(0.1D+01+CC)))
  146. AMOM1 = 0.2D+01+CC*AMOM0
  147. RES12 = CHEB12(1)*AMOM0+CHEB12(2)*AMOM1
  148. RES24 = CHEB24(1)*AMOM0+CHEB24(2)*AMOM1
  149. DO 30 K=3,13
  150. AMOM2 = 0.2D+01*CC*AMOM1-AMOM0
  151. AK22 = (K-2)*(K-2)
  152. IF((K/2)*2.EQ.K) AMOM2 = AMOM2-0.4D+01/(AK22-0.1D+01)
  153. RES12 = RES12+CHEB12(K)*AMOM2
  154. RES24 = RES24+CHEB24(K)*AMOM2
  155. AMOM0 = AMOM1
  156. AMOM1 = AMOM2
  157. 30 CONTINUE
  158. DO 40 K=14,25
  159. AMOM2 = 0.2D+01*CC*AMOM1-AMOM0
  160. AK22 = (K-2)*(K-2)
  161. IF((K/2)*2.EQ.K) AMOM2 = AMOM2-0.4D+01/(AK22-0.1D+01)
  162. RES24 = RES24+CHEB24(K)*AMOM2
  163. AMOM0 = AMOM1
  164. AMOM1 = AMOM2
  165. 40 CONTINUE
  166. RESULT = RES24
  167. ABSERR = ABS(RES24-RES12)
  168. 50 RETURN
  169. END