1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
*DECK CHFEV
SUBROUTINE CHFEV (X1, X2, F1, F2, D1, D2, NE, XE, FE, NEXT, IERR)
C***BEGIN PROLOGUE CHFEV
C***PURPOSE Evaluate a cubic polynomial given in Hermite form at an
C array of points. While designed for use by PCHFE, it may
C be useful directly as an evaluator for a piecewise cubic
C Hermite function in applications, such as graphing, where
C the interval is known in advance.
C***LIBRARY SLATEC (PCHIP)
C***CATEGORY E3
C***TYPE SINGLE PRECISION (CHFEV-S, DCHFEV-D)
C***KEYWORDS CUBIC HERMITE EVALUATION, CUBIC POLYNOMIAL EVALUATION,
C PCHIP
C***AUTHOR Fritsch, F. N., (LLNL)
C Lawrence Livermore National Laboratory
C P.O. Box 808 (L-316)
C Livermore, CA 94550
C FTS 532-4275, (510) 422-4275
C***DESCRIPTION
C
C CHFEV: Cubic Hermite Function EValuator
C
C Evaluates the cubic polynomial determined by function values
C F1,F2 and derivatives D1,D2 on interval (X1,X2) at the points
C XE(J), J=1(1)NE.
C
C ----------------------------------------------------------------------
C
C Calling sequence:
C
C INTEGER NE, NEXT(2), IERR
C REAL X1, X2, F1, F2, D1, D2, XE(NE), FE(NE)
C
C CALL CHFEV (X1,X2, F1,F2, D1,D2, NE, XE, FE, NEXT, IERR)
C
C Parameters:
C
C X1,X2 -- (input) endpoints of interval of definition of cubic.
C (Error return if X1.EQ.X2 .)
C
C F1,F2 -- (input) values of function at X1 and X2, respectively.
C
C D1,D2 -- (input) values of derivative at X1 and X2, respectively.
C
C NE -- (input) number of evaluation points. (Error return if
C NE.LT.1 .)
C
C XE -- (input) real array of points at which the function is to be
C evaluated. If any of the XE are outside the interval
C [X1,X2], a warning error is returned in NEXT.
C
C FE -- (output) real array of values of the cubic function defined
C by X1,X2, F1,F2, D1,D2 at the points XE.
C
C NEXT -- (output) integer array indicating number of extrapolation
C points:
C NEXT(1) = number of evaluation points to left of interval.
C NEXT(2) = number of evaluation points to right of interval.
C
C IERR -- (output) error flag.
C Normal return:
C IERR = 0 (no errors).
C "Recoverable" errors:
C IERR = -1 if NE.LT.1 .
C IERR = -2 if X1.EQ.X2 .
C (The FE-array has not been changed in either case.)
C
C***REFERENCES (NONE)
C***ROUTINES CALLED XERMSG
C***REVISION HISTORY (YYMMDD)
C 811019 DATE WRITTEN
C 820803 Minor cosmetic changes for release 1.
C 890411 Added SAVE statements (Vers. 3.2).
C 890531 Changed all specific intrinsics to generic. (WRB)
C 890703 Corrected category record. (WRB)
C 890703 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***END PROLOGUE CHFEV
C Programming notes:
C
C To produce a double precision version, simply:
C a. Change CHFEV to DCHFEV wherever it occurs,
C b. Change the real declaration to double precision, and
C c. Change the constant ZERO to double precision.
C
C DECLARE ARGUMENTS.
C
INTEGER NE, NEXT(2), IERR
REAL X1, X2, F1, F2, D1, D2, XE(*), FE(*)
C
C DECLARE LOCAL VARIABLES.
C
INTEGER I
REAL C2, C3, DEL1, DEL2, DELTA, H, X, XMI, XMA, ZERO
SAVE ZERO
DATA ZERO /0./
C
C VALIDITY-CHECK ARGUMENTS.
C
C***FIRST EXECUTABLE STATEMENT CHFEV
IF (NE .LT. 1) GO TO 5001
H = X2 - X1
IF (H .EQ. ZERO) GO TO 5002
C
C INITIALIZE.
C
IERR = 0
NEXT(1) = 0
NEXT(2) = 0
XMI = MIN(ZERO, H)
XMA = MAX(ZERO, H)
C
C COMPUTE CUBIC COEFFICIENTS (EXPANDED ABOUT X1).
C
DELTA = (F2 - F1)/H
DEL1 = (D1 - DELTA)/H
DEL2 = (D2 - DELTA)/H
C (DELTA IS NO LONGER NEEDED.)
C2 = -(DEL1+DEL1 + DEL2)
C3 = (DEL1 + DEL2)/H
C (H, DEL1 AND DEL2 ARE NO LONGER NEEDED.)
C
C EVALUATION LOOP.
C
DO 500 I = 1, NE
X = XE(I) - X1
FE(I) = F1 + X*(D1 + X*(C2 + X*C3))
C COUNT EXTRAPOLATION POINTS.
IF ( X.LT.XMI ) NEXT(1) = NEXT(1) + 1
IF ( X.GT.XMA ) NEXT(2) = NEXT(2) + 1
C (NOTE REDUNDANCY--IF EITHER CONDITION IS TRUE, OTHER IS FALSE.)
500 CONTINUE
C
C NORMAL RETURN.
C
RETURN
C
C ERROR RETURNS.
C
5001 CONTINUE
C NE.LT.1 RETURN.
IERR = -1
CALL XERMSG ('SLATEC', 'CHFEV',
+ 'NUMBER OF EVALUATION POINTS LESS THAN ONE', IERR, 1)
RETURN
C
5002 CONTINUE
C X1.EQ.X2 RETURN.
IERR = -2
CALL XERMSG ('SLATEC', 'CHFEV', 'INTERVAL ENDPOINTS EQUAL', IERR,
+ 1)
RETURN
C------------- LAST LINE OF CHFEV FOLLOWS ------------------------------
END
|