bsqad.f 4.7 KB

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