dppgq8.f 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. *DECK DPPGQ8
  2. SUBROUTINE DPPGQ8 (FUN, LDC, C, XI, LXI, KK, ID, A, B, INPPV, ERR,
  3. + ANS, IERR)
  4. C***BEGIN PROLOGUE DPPGQ8
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to DPFQAD
  7. C***LIBRARY SLATEC
  8. C***TYPE DOUBLE PRECISION (PPGQ8-S, DPPGQ8-D)
  9. C***AUTHOR Jones, R. E., (SNLA)
  10. C***DESCRIPTION
  11. C
  12. C Abstract **** A DOUBLE PRECISION routine ****
  13. C
  14. C DPPGQ8, a modification of GAUS8, integrates the
  15. C product of FUN(X) by the ID-th derivative of a spline
  16. C DPPVAL(LDC,C,XI,LXI,KK,ID,X,INPPV) between limits A and B.
  17. C
  18. C Description of Arguments
  19. C
  20. C Input-- FUN,C,XI,A,B,ERR are DOUBLE PRECISION
  21. C FUN - Name of external function of one argument which
  22. C multiplies DPPVAL.
  23. C LDC - Leading dimension of matrix C, LDC .GE. KK
  24. C C - Matrix of Taylor derivatives of dimension at least
  25. C (K,LXI)
  26. C XI - Breakpoint vector of length LXI+1
  27. C LXI - Number of polynomial pieces
  28. C KK - Order of the spline, KK .GE. 1
  29. C ID - Order of the spline derivative, 0 .LE. ID .LE. KK-1
  30. C A - Lower limit of integral
  31. C B - Upper limit of integral (may be less than A)
  32. C INPPV- Initialization parameter for DPPVAL
  33. C ERR - Is a requested pseudorelative error tolerance. Normally
  34. C pick a value of ABS(ERR) .LT. 1D-3. ANS will normally
  35. C have no more error than ABS(ERR) times the integral of
  36. C the absolute value of FUN(X)*DPPVAL(LDC,C,XI,LXI,KK,ID,X,
  37. C INPPV).
  38. C
  39. C
  40. C Output-- ERR,ANS are DOUBLE PRECISION
  41. C ERR - Will be an estimate of the absolute error in ANS if the
  42. C input value of ERR was negative. (ERR Is unchanged if
  43. C the input value of ERR was nonnegative.) The estimated
  44. C error is solely for information to the user and should
  45. C not be used as a correction to the computed integral.
  46. C ANS - Computed value of integral
  47. C IERR- A status code
  48. C --Normal Codes
  49. C 1 ANS most likely meets requested error tolerance,
  50. C or A=B.
  51. C -1 A and B are too nearly equal to allow normal
  52. C integration. ANS is set to zero.
  53. C --Abnormal Code
  54. C 2 ANS probably does not meet requested error tolerance.
  55. C
  56. C***SEE ALSO DPFQAD
  57. C***ROUTINES CALLED D1MACH, DPPVAL, I1MACH, XERMSG
  58. C***REVISION HISTORY (YYMMDD)
  59. C 800901 DATE WRITTEN
  60. C 890531 Changed all specific intrinsics to generic. (WRB)
  61. C 890911 Removed unnecessary intrinsics. (WRB)
  62. C 891214 Prologue converted to Version 4.0 format. (BAB)
  63. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  64. C 900326 Removed duplicate information from DESCRIPTION section.
  65. C (WRB)
  66. C 900328 Added TYPE section. (WRB)
  67. C 910408 Updated the AUTHOR section. (WRB)
  68. C***END PROLOGUE DPPGQ8
  69. C
  70. INTEGER ID,IERR,INPPV,K,KK,KML,KMX,L,LDC,LMN,LMX,LR,LXI,MXL,
  71. 1 NBITS, NIB, NLMN, NLMX
  72. INTEGER I1MACH
  73. DOUBLE PRECISION A,AA,AE,ANIB,ANS,AREA,B,BE,C,CC,EE,EF,EPS,ERR,
  74. 1 EST,GL,GLR,GR,HH,SQ2,TOL,VL,VR,W1, W2, W3, W4, XI, X1,
  75. 2 X2, X3, X4, X, H
  76. DOUBLE PRECISION D1MACH, DPPVAL, G8, FUN
  77. DIMENSION XI(*), C(LDC,*)
  78. DIMENSION AA(60), HH(60), LR(60), VL(60), GR(60)
  79. SAVE X1, X2, X3, X4, W1, W2, W3, W4, SQ2, NLMN, KMX, KML
  80. DATA X1, X2, X3, X4/
  81. 1 1.83434642495649805D-01, 5.25532409916328986D-01,
  82. 2 7.96666477413626740D-01, 9.60289856497536232D-01/
  83. DATA W1, W2, W3, W4/
  84. 1 3.62683783378361983D-01, 3.13706645877887287D-01,
  85. 2 2.22381034453374471D-01, 1.01228536290376259D-01/
  86. DATA SQ2/1.41421356D0/
  87. DATA NLMN/1/,KMX/5000/,KML/6/
  88. G8(X,H)=
  89. 1 H*((W1*(FUN(X-X1*H)*DPPVAL(LDC,C,XI,LXI,KK,ID,X-X1*H,INPPV)
  90. 2 +FUN(X+X1*H)*DPPVAL(LDC,C,XI,LXI,KK,ID,X+X1*H,INPPV))
  91. 3 +W2*(FUN(X-X2*H)*DPPVAL(LDC,C,XI,LXI,KK,ID,X-X2*H,INPPV)
  92. 4 +FUN(X+X2*H)*DPPVAL(LDC,C,XI,LXI,KK,ID,X+X2*H,INPPV)))
  93. 5 +(W3*(FUN(X-X3*H)*DPPVAL(LDC,C,XI,LXI,KK,ID,X-X3*H,INPPV)
  94. 6 +FUN(X+X3*H)*DPPVAL(LDC,C,XI,LXI,KK,ID,X+X3*H,INPPV))
  95. 7 +W4*(FUN(X-X4*H)*DPPVAL(LDC,C,XI,LXI,KK,ID,X-X4*H,INPPV)
  96. 8 +FUN(X+X4*H)*DPPVAL(LDC,C,XI,LXI,KK,ID,X+X4*H,INPPV))))
  97. C
  98. C INITIALIZE
  99. C
  100. C***FIRST EXECUTABLE STATEMENT DPPGQ8
  101. K = I1MACH(14)
  102. ANIB = D1MACH(5)*K/0.30102000D0
  103. NBITS = INT(ANIB)
  104. NLMX = MIN((NBITS*5)/8,60)
  105. ANS = 0.0D0
  106. IERR = 1
  107. BE = 0.0D0
  108. IF (A.EQ.B) GO TO 140
  109. LMX = NLMX
  110. LMN = NLMN
  111. IF (B.EQ.0.0D0) GO TO 10
  112. IF (SIGN(1.0D0,B)*A.LE.0.0D0) GO TO 10
  113. CC = ABS(1.0D0-A/B)
  114. IF (CC.GT.0.1D0) GO TO 10
  115. IF (CC.LE.0.0D0) GO TO 140
  116. ANIB = 0.5D0 - LOG(CC)/0.69314718D0
  117. NIB = INT(ANIB)
  118. LMX = MIN(NLMX,NBITS-NIB-7)
  119. IF (LMX.LT.1) GO TO 130
  120. LMN = MIN(LMN,LMX)
  121. 10 TOL = MAX(ABS(ERR),2.0D0**(5-NBITS))/2.0D0
  122. IF (ERR.EQ.0.0D0) TOL = SQRT(D1MACH(4))
  123. EPS = TOL
  124. HH(1) = (B-A)/4.0D0
  125. AA(1) = A
  126. LR(1) = 1
  127. L = 1
  128. EST = G8(AA(L)+2.0D0*HH(L),2.0D0*HH(L))
  129. K = 8
  130. AREA = ABS(EST)
  131. EF = 0.5D0
  132. MXL = 0
  133. C
  134. C COMPUTE REFINED ESTIMATES, ESTIMATE THE ERROR, ETC.
  135. C
  136. 20 GL = G8(AA(L)+HH(L),HH(L))
  137. GR(L) = G8(AA(L)+3.0D0*HH(L),HH(L))
  138. K = K + 16
  139. AREA = AREA + (ABS(GL)+ABS(GR(L))-ABS(EST))
  140. GLR = GL + GR(L)
  141. EE = ABS(EST-GLR)*EF
  142. AE = MAX(EPS*AREA,TOL*ABS(GLR))
  143. IF (EE-AE) 40, 40, 50
  144. 30 MXL = 1
  145. 40 BE = BE + (EST-GLR)
  146. IF (LR(L)) 60, 60, 80
  147. C
  148. C CONSIDER THE LEFT HALF OF THIS LEVEL
  149. C
  150. 50 IF (K.GT.KMX) LMX = KML
  151. IF (L.GE.LMX) GO TO 30
  152. L = L + 1
  153. EPS = EPS*0.5D0
  154. EF = EF/SQ2
  155. HH(L) = HH(L-1)*0.5D0
  156. LR(L) = -1
  157. AA(L) = AA(L-1)
  158. EST = GL
  159. GO TO 20
  160. C
  161. C PROCEED TO RIGHT HALF AT THIS LEVEL
  162. C
  163. 60 VL(L) = GLR
  164. 70 EST = GR(L-1)
  165. LR(L) = 1
  166. AA(L) = AA(L) + 4.0D0*HH(L)
  167. GO TO 20
  168. C
  169. C RETURN ONE LEVEL
  170. C
  171. 80 VR = GLR
  172. 90 IF (L.LE.1) GO TO 120
  173. L = L - 1
  174. EPS = EPS*2.0D0
  175. EF = EF*SQ2
  176. IF (LR(L)) 100, 100, 110
  177. 100 VL(L) = VL(L+1) + VR
  178. GO TO 70
  179. 110 VR = VL(L+1) + VR
  180. GO TO 90
  181. C
  182. C EXIT
  183. C
  184. 120 ANS = VR
  185. IF ((MXL.EQ.0) .OR. (ABS(BE).LE.2.0D0*TOL*AREA)) GO TO 140
  186. IERR = 2
  187. CALL XERMSG ('SLATEC', 'DPPGQ8',
  188. + 'ANS IS PROBABLY INSUFFICIENTLY ACCURATE.', 3, 1)
  189. GO TO 140
  190. 130 IERR = -1
  191. CALL XERMSG ('SLATEC', 'DPPGQ8',
  192. + 'A AND B ARE TOO NEARLY EQUAL TO ALLOW NORMAL ' //
  193. + 'INTEGRATION. ANSWER IS SET TO ZERO, AND IERR=-1.', 1, -1)
  194. 140 CONTINUE
  195. IF (ERR.LT.0.0D0) ERR = BE
  196. RETURN
  197. END