ppqad.f 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. *DECK PPQAD
  2. SUBROUTINE PPQAD (LDC, C, XI, LXI, K, X1, X2, PQUAD)
  3. C***BEGIN PROLOGUE PPQAD
  4. C***PURPOSE Compute the integral on (X1,X2) of a K-th order B-spline
  5. C using the piecewise polynomial (PP) representation.
  6. C***LIBRARY SLATEC
  7. C***CATEGORY H2A2A1, E3, K6
  8. C***TYPE SINGLE PRECISION (PPQAD-S, DPPQAD-D)
  9. C***KEYWORDS B-SPLINE, DATA FITTING, INTERPOLATION, QUADRATURE, SPLINES
  10. C***AUTHOR Amos, D. E., (SNLA)
  11. C***DESCRIPTION
  12. C
  13. C Abstract
  14. C PPQAD computes the integral on (X1,X2) of a K-th order
  15. C B-spline using the piecewise polynomial representation
  16. C (C,XI,LXI,K). Here the Taylor expansion about the left
  17. C end point XI(J) of the J-th interval is integrated and
  18. C evaluated on subintervals of (X1,X2) which are formed by
  19. C included break points. Integration outside (XI(1),XI(LXI+1))
  20. C is permitted.
  21. C
  22. C Description of Arguments
  23. C Input
  24. C LDC - leading dimension of matrix C, LDC .GE. K
  25. C C(I,J) - right Taylor derivatives at XI(J), I=1,K , J=1,LXI
  26. C XI(*) - break point array of length LXI+1
  27. C LXI - number of polynomial pieces
  28. C K - order of B-spline, K .GE. 1
  29. C X1,X2 - end points of quadrature interval, normally in
  30. C XI(1) .LE. X .LE. XI(LXI+1)
  31. C
  32. C Output
  33. C PQUAD - integral of the PP representation over (X1,X2)
  34. C
  35. C Error Conditions
  36. C Improper input is a fatal error
  37. C
  38. C***REFERENCES D. E. Amos, Quadrature subroutines for splines and
  39. C B-splines, Report SAND79-1825, Sandia Laboratories,
  40. C December 1979.
  41. C***ROUTINES CALLED INTRV, XERMSG
  42. C***REVISION HISTORY (YYMMDD)
  43. C 800901 DATE WRITTEN
  44. C 890531 Changed all specific intrinsics to generic. (WRB)
  45. C 890531 REVISION DATE from Version 3.2
  46. C 891214 Prologue converted to Version 4.0 format. (BAB)
  47. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  48. C 920501 Reformatted the REFERENCES section. (WRB)
  49. C***END PROLOGUE PPQAD
  50. C
  51. INTEGER I, II, IL, ILO, IL1, IL2, IM, K, LDC, LEFT, LXI, MF1, MF2
  52. REAL A, AA, BB, C, DX, FLK, PQUAD, Q, S, SS, TA, TB, X, XI, X1, X2
  53. DIMENSION XI(*), C(LDC,*), SS(2)
  54. C
  55. C***FIRST EXECUTABLE STATEMENT PPQAD
  56. PQUAD = 0.0E0
  57. IF(K.LT.1) GO TO 100
  58. IF(LXI.LT.1) GO TO 105
  59. IF(LDC.LT.K) GO TO 110
  60. AA = MIN(X1,X2)
  61. BB = MAX(X1,X2)
  62. IF (AA.EQ.BB) RETURN
  63. ILO = 1
  64. CALL INTRV(XI, LXI, AA, ILO, IL1, MF1)
  65. CALL INTRV(XI, LXI, BB, ILO, IL2, MF2)
  66. Q = 0.0E0
  67. DO 40 LEFT=IL1,IL2
  68. TA = XI(LEFT)
  69. A = MAX(AA,TA)
  70. IF (LEFT.EQ.1) A = AA
  71. TB = BB
  72. IF (LEFT.LT.LXI) TB = XI(LEFT+1)
  73. X = MIN(BB,TB)
  74. DO 30 II=1,2
  75. SS(II) = 0.0E0
  76. DX = X - XI(LEFT)
  77. IF (DX.EQ.0.0E0) GO TO 20
  78. S = C(K,LEFT)
  79. FLK = K
  80. IM = K - 1
  81. IL = IM
  82. DO 10 I=1,IL
  83. S = S*DX/FLK + C(IM,LEFT)
  84. IM = IM - 1
  85. FLK = FLK - 1.0E0
  86. 10 CONTINUE
  87. SS(II) = S*DX
  88. 20 CONTINUE
  89. X = A
  90. 30 CONTINUE
  91. Q = Q + (SS(1)-SS(2))
  92. 40 CONTINUE
  93. IF (X1.GT.X2) Q = -Q
  94. PQUAD = Q
  95. RETURN
  96. C
  97. C
  98. 100 CONTINUE
  99. CALL XERMSG ('SLATEC', 'PPQAD', 'K DOES NOT SATISFY K.GE.1', 2,
  100. + 1)
  101. RETURN
  102. 105 CONTINUE
  103. CALL XERMSG ('SLATEC', 'PPQAD', 'LXI DOES NOT SATISFY LXI.GE.1',
  104. + 2, 1)
  105. RETURN
  106. 110 CONTINUE
  107. CALL XERMSG ('SLATEC', 'PPQAD', 'LDC DOES NOT SATISFY LDC.GE.K',
  108. + 2, 1)
  109. RETURN
  110. END