dbsqad.f 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. *DECK DBSQAD
  2. SUBROUTINE DBSQAD (T, BCOEF, N, K, X1, X2, BQUAD, WORK)
  3. C***BEGIN PROLOGUE DBSQAD
  4. C***PURPOSE Compute the integral of a K-th order B-spline using the
  5. C B-representation.
  6. C***LIBRARY SLATEC
  7. C***CATEGORY H2A2A1, E3, K6
  8. C***TYPE DOUBLE PRECISION (BSQAD-S, DBSQAD-D)
  9. C***KEYWORDS INTEGRAL OF B-SPLINES, QUADRATURE
  10. C***AUTHOR Amos, D. E., (SNLA)
  11. C***DESCRIPTION
  12. C
  13. C Abstract **** a double precision routine ****
  14. C
  15. C DBSQAD computes the integral on (X1,X2) of a K-th order
  16. C B-spline using the B-representation (T,BCOEF,N,K). Orders
  17. C K as high as 20 are permitted by applying a 2, 6, or 10
  18. C point Gauss formula on subintervals of (X1,X2) which are
  19. C formed by included (distinct) knots.
  20. C
  21. C If orders K greater than 20 are needed, use DBFQAD with
  22. C F(X) = 1.
  23. C
  24. C The maximum number of significant digits obtainable in
  25. C DBSQAD is the smaller of 18 and the number of digits
  26. C carried in double precision arithmetic.
  27. C
  28. C Description of Arguments
  29. C Input T,BCOEF,X1,X2 are double precision
  30. C T - knot array of length N+K
  31. C BCOEF - B-spline coefficient array of length N
  32. C N - length of coefficient array
  33. C K - order of B-spline, 1 .LE. K .LE. 20
  34. C X1,X2 - end points of quadrature interval in
  35. C T(K) .LE. X .LE. T(N+1)
  36. C
  37. C Output BQUAD,WORK are double precision
  38. C BQUAD - integral of the B-spline over (X1,X2)
  39. C WORK - work vector of length 3*K
  40. C
  41. C Error Conditions
  42. C Improper input is a fatal error
  43. C
  44. C***REFERENCES D. E. Amos, Quadrature subroutines for splines and
  45. C B-splines, Report SAND79-1825, Sandia Laboratories,
  46. C December 1979.
  47. C***ROUTINES CALLED DBVALU, DINTRV, XERMSG
  48. C***REVISION HISTORY (YYMMDD)
  49. C 800901 DATE WRITTEN
  50. C 890531 Changed all specific intrinsics to generic. (WRB)
  51. C 890531 REVISION DATE from Version 3.2
  52. C 891214 Prologue converted to Version 4.0 format. (BAB)
  53. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  54. C 900326 Removed duplicate information from DESCRIPTION section.
  55. C (WRB)
  56. C 920501 Reformatted the REFERENCES section. (WRB)
  57. C***END PROLOGUE DBSQAD
  58. C
  59. INTEGER I,IL1,IL2,ILO,INBV, JF,K,LEFT,M,MF,MFLAG,N, NPK, NP1
  60. DOUBLE PRECISION A,AA,B,BB,BCOEF,BMA,BPA,BQUAD,C1,GPTS,GWTS,GX,Q,
  61. 1 SUM, T, TA, TB, WORK, X1, X2, Y1, Y2
  62. DOUBLE PRECISION DBVALU
  63. DIMENSION T(*), BCOEF(*), GPTS(9), GWTS(9), SUM(5), WORK(*)
  64. C
  65. SAVE GPTS, GWTS
  66. DATA GPTS(1), GPTS(2), GPTS(3), GPTS(4), GPTS(5), GPTS(6),
  67. 1 GPTS(7), GPTS(8), GPTS(9)/
  68. 2 5.77350269189625764D-01, 2.38619186083196909D-01,
  69. 3 6.61209386466264514D-01, 9.32469514203152028D-01,
  70. 4 1.48874338981631211D-01, 4.33395394129247191D-01,
  71. 5 6.79409568299024406D-01, 8.65063366688984511D-01,
  72. 6 9.73906528517171720D-01/
  73. DATA GWTS(1), GWTS(2), GWTS(3), GWTS(4), GWTS(5), GWTS(6),
  74. 1 GWTS(7), GWTS(8), GWTS(9)/
  75. 2 1.00000000000000000D+00, 4.67913934572691047D-01,
  76. 3 3.60761573048138608D-01, 1.71324492379170345D-01,
  77. 4 2.95524224714752870D-01, 2.69266719309996355D-01,
  78. 5 2.19086362515982044D-01, 1.49451349150580593D-01,
  79. 6 6.66713443086881376D-02/
  80. C
  81. C***FIRST EXECUTABLE STATEMENT DBSQAD
  82. BQUAD = 0.0D0
  83. IF(K.LT.1 .OR. K.GT.20) GO TO 65
  84. IF(N.LT.K) GO TO 70
  85. AA = MIN(X1,X2)
  86. BB = MAX(X1,X2)
  87. IF (AA.LT.T(K)) GO TO 60
  88. NP1 = N + 1
  89. IF (BB.GT.T(NP1)) GO TO 60
  90. IF (AA.EQ.BB) RETURN
  91. NPK = N + K
  92. C SELECTION OF 2, 6, OR 10 POINT GAUSS FORMULA
  93. JF = 0
  94. MF = 1
  95. IF (K.LE.4) GO TO 10
  96. JF = 1
  97. MF = 3
  98. IF (K.LE.12) GO TO 10
  99. JF = 4
  100. MF = 5
  101. 10 CONTINUE
  102. C
  103. DO 20 I=1,MF
  104. SUM(I) = 0.0D0
  105. 20 CONTINUE
  106. ILO = 1
  107. INBV = 1
  108. CALL DINTRV(T, NPK, AA, ILO, IL1, MFLAG)
  109. CALL DINTRV(T, NPK, BB, ILO, IL2, MFLAG)
  110. IF (IL2.GE.NP1) IL2 = N
  111. DO 40 LEFT=IL1,IL2
  112. TA = T(LEFT)
  113. TB = T(LEFT+1)
  114. IF (TA.EQ.TB) GO TO 40
  115. A = MAX(AA,TA)
  116. B = MIN(BB,TB)
  117. BMA = 0.5D0*(B-A)
  118. BPA = 0.5D0*(B+A)
  119. DO 30 M=1,MF
  120. C1 = BMA*GPTS(JF+M)
  121. GX = -C1 + BPA
  122. Y2 = DBVALU(T,BCOEF,N,K,0,GX,INBV,WORK)
  123. GX = C1 + BPA
  124. Y1 = DBVALU(T,BCOEF,N,K,0,GX,INBV,WORK)
  125. SUM(M) = SUM(M) + (Y1+Y2)*BMA
  126. 30 CONTINUE
  127. 40 CONTINUE
  128. Q = 0.0D0
  129. DO 50 M=1,MF
  130. Q = Q + GWTS(JF+M)*SUM(M)
  131. 50 CONTINUE
  132. IF (X1.GT.X2) Q = -Q
  133. BQUAD = Q
  134. RETURN
  135. C
  136. C
  137. 60 CONTINUE
  138. CALL XERMSG ('SLATEC', 'DBSQAD',
  139. + 'X1 OR X2 OR BOTH DO NOT SATISFY T(K).LE.X.LE.T(N+1)', 2, 1)
  140. RETURN
  141. 65 CONTINUE
  142. CALL XERMSG ('SLATEC', 'DBSQAD',
  143. + 'K DOES NOT SATISFY 1.LE.K.LE.20', 2, 1)
  144. RETURN
  145. 70 CONTINUE
  146. CALL XERMSG ('SLATEC', 'DBSQAD', 'N DOES NOT SATISFY N.GE.K', 2,
  147. + 1)
  148. RETURN
  149. END