123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- *DECK PFQAD
- SUBROUTINE PFQAD (F, LDC, C, XI, LXI, K, ID, X1, X2, TOL, QUAD,
- + IERR)
- C***BEGIN PROLOGUE PFQAD
- C***PURPOSE Compute the integral on (X1,X2) of a product of a function
- C F and the ID-th derivative of a B-spline,
- C (PP-representation).
- C***LIBRARY SLATEC
- C***CATEGORY H2A2A1, E3, K6
- C***TYPE SINGLE PRECISION (PFQAD-S, DPFQAD-D)
- C***KEYWORDS B-SPLINE, DATA FITTING, INTERPOLATION, QUADRATURE, SPLINES
- C***AUTHOR Amos, D. E., (SNLA)
- C***DESCRIPTION
- C
- C Abstract
- C PFQAD computes the integral on (X1,X2) of a product of a
- C function F and the ID-th derivative of a B-spline, using the
- C PP-representation (C,XI,LXI,K). (X1,X2) is normally a sub-
- C interval of XI(1) .LE. X .LE. XI(LXI+1). An integration rou-
- C tine, PPGQ8(a modification of GAUS8), integrates the product
- C on sub-intervals of (X1,X2) formed by the included break
- C points. Integration outside of (XI(1),XI(LXI+1)) is permitted
- C provided F is defined.
- C
- C Description of Arguments
- C Input
- C F - external function of one argument for the
- C integrand PF(X)=F(X)*PPVAL(LDC,C,XI,LXI,K,ID,X,
- C INPPV)
- C LDC - leading dimension of matrix C, LDC .GE. K
- C C(I,J) - right Taylor derivatives at XI(J), I=1,K , J=1,LXI
- C XI(*) - break point array of length LXI+1
- C LXI - number of polynomial pieces
- C K - order of B-spline, K .GE. 1
- C ID - order of the spline derivative, 0 .LE. ID .LE. K-1
- C ID=0 gives the spline function
- C X1,X2 - end points of quadrature interval, normally in
- C XI(1) .LE. X .LE. XI(LXI+1)
- C TOL - desired accuracy for the quadrature, suggest
- C 10.*STOL .LT. TOL .LE. 0.1 where STOL is the single
- C precision unit roundoff for the machine = R1MACH(4)
- C
- C Output
- C QUAD - integral of PF(X) on (X1,X2)
- C IERR - a status code
- C IERR=1 normal return
- C 2 some quadrature does not meet the
- C requested tolerance
- C
- C Error Conditions
- C TOL not greater than the single precision unit roundoff or
- C less than 0.1 is a fatal error.
- C Some quadrature does not meet the requested tolerance.
- C
- C***REFERENCES D. E. Amos, Quadrature subroutines for splines and
- C B-splines, Report SAND79-1825, Sandia Laboratories,
- C December 1979.
- C***ROUTINES CALLED INTRV, PPGQ8, R1MACH, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 800901 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890531 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
- C 900326 Removed duplicate information from DESCRIPTION section.
- C (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE PFQAD
- C
- INTEGER ID,IERR,IFLG,ILO,IL1,IL2,INPPV,K,LDC,LEFT,LXI,MF1,MF2
- REAL A, AA, ANS, B, BB, C, Q, QUAD, TA, TB, TOL, WTOL, XI, X1, X2
- REAL R1MACH, F
- DIMENSION XI(*), C(LDC,*)
- EXTERNAL F
- C
- C***FIRST EXECUTABLE STATEMENT PFQAD
- IERR = 1
- QUAD = 0.0E0
- IF(K.LT.1) GO TO 100
- IF(LDC.LT.K) GO TO 105
- IF(ID.LT.0 .OR. ID.GE.K) GO TO 110
- IF(LXI.LT.1) GO TO 115
- WTOL = R1MACH(4)
- IF (TOL.LT.WTOL .OR. TOL.GT.0.1E0) GO TO 20
- AA = MIN(X1,X2)
- BB = MAX(X1,X2)
- IF (AA.EQ.BB) RETURN
- ILO = 1
- CALL INTRV(XI, LXI, AA, ILO, IL1, MF1)
- CALL INTRV(XI, LXI, BB, ILO, IL2, MF2)
- Q = 0.0E0
- INPPV = 1
- DO 10 LEFT=IL1,IL2
- TA = XI(LEFT)
- A = MAX(AA,TA)
- IF (LEFT.EQ.1) A = AA
- TB = BB
- IF (LEFT.LT.LXI) TB = XI(LEFT+1)
- B = MIN(BB,TB)
- CALL PPGQ8(F,LDC,C,XI,LXI,K,ID,A,B,INPPV,TOL,ANS,IFLG)
- IF (IFLG.GT.1) IERR = 2
- Q = Q + ANS
- 10 CONTINUE
- IF (X1.GT.X2) Q = -Q
- QUAD = Q
- RETURN
- C
- 20 CONTINUE
- CALL XERMSG ('SLATEC', 'PFQAD',
- + 'TOL IS LESS THAN THE SINGLE PRECISION TOLERANCE OR ' //
- + 'GREATER THAN 0.1', 2, 1)
- RETURN
- 100 CONTINUE
- CALL XERMSG ('SLATEC', 'PFQAD', 'K DOES NOT SATISFY K.GE.1', 2,
- + 1)
- RETURN
- 105 CONTINUE
- CALL XERMSG ('SLATEC', 'PFQAD', 'LDC DOES NOT SATISFY LDC.GE.K',
- + 2, 1)
- RETURN
- 110 CONTINUE
- CALL XERMSG ('SLATEC', 'PFQAD',
- + 'ID DOES NOT SATISFY 0.LE.ID.LT.K', 2, 1)
- RETURN
- 115 CONTINUE
- CALL XERMSG ('SLATEC', 'PFQAD', 'LXI DOES NOT SATISFY LXI.GE.1',
- + 2, 1)
- RETURN
- END
|