dbsgq8.f 6.6 KB

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