dppqad.f 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. *DECK DPPQAD
  2. SUBROUTINE DPPQAD (LDC, C, XI, LXI, K, X1, X2, PQUAD)
  3. C***BEGIN PROLOGUE DPPQAD
  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 DOUBLE 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 **** a double precision routine ****
  14. C DPPQAD 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 C,XI,X1,X2 are double precision
  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 PQUAD is double precision
  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 DINTRV, XERMSG
  42. C***REVISION HISTORY (YYMMDD)
  43. C 800901 DATE WRITTEN
  44. C 890531 Changed all specific intrinsics to generic. (WRB)
  45. C 890911 Removed unnecessary intrinsics. (WRB)
  46. C 890911 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 920501 Reformatted the REFERENCES section. (WRB)
  50. C***END PROLOGUE DPPQAD
  51. C
  52. INTEGER I, II, IL, ILO, IL1, IL2, IM, K, LDC, LEFT, LXI, MF1, MF2
  53. DOUBLE PRECISION A,AA,BB,C,DX,FLK,PQUAD,Q,S,SS,TA,TB,X,XI,X1,X2
  54. DIMENSION XI(*), C(LDC,*), SS(2)
  55. C
  56. C***FIRST EXECUTABLE STATEMENT DPPQAD
  57. PQUAD = 0.0D0
  58. IF(K.LT.1) GO TO 100
  59. IF(LXI.LT.1) GO TO 105
  60. IF(LDC.LT.K) GO TO 110
  61. AA = MIN(X1,X2)
  62. BB = MAX(X1,X2)
  63. IF (AA.EQ.BB) RETURN
  64. ILO = 1
  65. CALL DINTRV(XI, LXI, AA, ILO, IL1, MF1)
  66. CALL DINTRV(XI, LXI, BB, ILO, IL2, MF2)
  67. Q = 0.0D0
  68. DO 40 LEFT=IL1,IL2
  69. TA = XI(LEFT)
  70. A = MAX(AA,TA)
  71. IF (LEFT.EQ.1) A = AA
  72. TB = BB
  73. IF (LEFT.LT.LXI) TB = XI(LEFT+1)
  74. X = MIN(BB,TB)
  75. DO 30 II=1,2
  76. SS(II) = 0.0D0
  77. DX = X - XI(LEFT)
  78. IF (DX.EQ.0.0D0) GO TO 20
  79. S = C(K,LEFT)
  80. FLK = K
  81. IM = K - 1
  82. IL = IM
  83. DO 10 I=1,IL
  84. S = S*DX/FLK + C(IM,LEFT)
  85. IM = IM - 1
  86. FLK = FLK - 1.0D0
  87. 10 CONTINUE
  88. SS(II) = S*DX
  89. 20 CONTINUE
  90. X = A
  91. 30 CONTINUE
  92. Q = Q + (SS(1)-SS(2))
  93. 40 CONTINUE
  94. IF (X1.GT.X2) Q = -Q
  95. PQUAD = Q
  96. RETURN
  97. C
  98. C
  99. 100 CONTINUE
  100. CALL XERMSG ('SLATEC', 'DPPQAD', 'K DOES NOT SATISFY K.GE.1', 2,
  101. + 1)
  102. RETURN
  103. 105 CONTINUE
  104. CALL XERMSG ('SLATEC', 'DPPQAD', 'LXI DOES NOT SATISFY LXI.GE.1',
  105. + 2, 1)
  106. RETURN
  107. 110 CONTINUE
  108. CALL XERMSG ('SLATEC', 'DPPQAD', 'LDC DOES NOT SATISFY LDC.GE.K',
  109. + 2, 1)
  110. RETURN
  111. END