123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- *DECK DPCHCI
- SUBROUTINE DPCHCI (N, H, SLOPE, D, INCFD)
- C***BEGIN PROLOGUE DPCHCI
- C***SUBSIDIARY
- C***PURPOSE Set interior derivatives for DPCHIC
- C***LIBRARY SLATEC (PCHIP)
- C***TYPE DOUBLE PRECISION (PCHCI-S, DPCHCI-D)
- C***AUTHOR Fritsch, F. N., (LLNL)
- C***DESCRIPTION
- C
- C DPCHCI: DPCHIC Initial Derivative Setter.
- C
- C Called by DPCHIC to set derivatives needed to determine a monotone
- C piecewise cubic Hermite interpolant to the data.
- C
- C Default boundary conditions are provided which are compatible
- C with monotonicity. If the data are only piecewise monotonic, the
- C interpolant will have an extremum at each point where monotonicity
- C switches direction.
- C
- C To facilitate two-dimensional applications, includes an increment
- C between successive values of the D-array.
- C
- C The resulting piecewise cubic Hermite function should be identical
- C (within roundoff error) to that produced by DPCHIM.
- C
- C ----------------------------------------------------------------------
- C
- C Calling sequence:
- C
- C PARAMETER (INCFD = ...)
- C INTEGER N
- C DOUBLE PRECISION H(N), SLOPE(N), D(INCFD,N)
- C
- C CALL DPCHCI (N, H, SLOPE, D, INCFD)
- C
- C Parameters:
- C
- C N -- (input) number of data points.
- C If N=2, simply does linear interpolation.
- C
- C H -- (input) real*8 array of interval lengths.
- C SLOPE -- (input) real*8 array of data slopes.
- C If the data are (X(I),Y(I)), I=1(1)N, then these inputs are:
- C H(I) = X(I+1)-X(I),
- C SLOPE(I) = (Y(I+1)-Y(I))/H(I), I=1(1)N-1.
- C
- C D -- (output) real*8 array of derivative values at data points.
- C If the data are monotonic, these values will determine a
- C a monotone cubic Hermite function.
- C The value corresponding to X(I) is stored in
- C D(1+(I-1)*INCFD), I=1(1)N.
- C No other entries in D are changed.
- C
- C INCFD -- (input) increment between successive values in D.
- C This argument is provided primarily for 2-D applications.
- C
- C -------
- C WARNING: This routine does no validity-checking of arguments.
- C -------
- C
- C Fortran intrinsics used: ABS, MAX, MIN.
- C
- C***SEE ALSO DPCHIC
- C***ROUTINES CALLED DPCHST
- C***REVISION HISTORY (YYMMDD)
- C 820218 DATE WRITTEN
- C 820601 Modified end conditions to be continuous functions of
- C data when monotonicity switches in next interval.
- C 820602 1. Modified formulas so end conditions are less prone
- C to over/underflow problems.
- C 2. Minor modification to HSUM calculation.
- C 820805 Converted to SLATEC library version.
- C 870813 Minor cosmetic changes.
- C 890411 Added SAVE statements (Vers. 3.2).
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 890831 REVISION DATE from Version 3.2
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C 910408 Updated AUTHOR section in prologue. (WRB)
- C 930503 Improved purpose. (FNF)
- C***END PROLOGUE DPCHCI
- C
- C Programming notes:
- C 1. The function DPCHST(ARG1,ARG2) is assumed to return zero if
- C either argument is zero, +1 if they are of the same sign, and
- C -1 if they are of opposite sign.
- C**End
- C
- C DECLARE ARGUMENTS.
- C
- INTEGER N, INCFD
- DOUBLE PRECISION H(*), SLOPE(*), D(INCFD,*)
- C
- C DECLARE LOCAL VARIABLES.
- C
- INTEGER I, NLESS1
- DOUBLE PRECISION DEL1, DEL2, DMAX, DMIN, DRAT1, DRAT2, HSUM,
- * HSUMT3, THREE, W1, W2, ZERO
- SAVE ZERO, THREE
- DOUBLE PRECISION DPCHST
- C
- C INITIALIZE.
- C
- DATA ZERO /0.D0/, THREE/3.D0/
- C***FIRST EXECUTABLE STATEMENT DPCHCI
- NLESS1 = N - 1
- DEL1 = SLOPE(1)
- C
- C SPECIAL CASE N=2 -- USE LINEAR INTERPOLATION.
- C
- IF (NLESS1 .GT. 1) GO TO 10
- D(1,1) = DEL1
- D(1,N) = DEL1
- GO TO 5000
- C
- C NORMAL CASE (N .GE. 3).
- C
- 10 CONTINUE
- DEL2 = SLOPE(2)
- C
- C SET D(1) VIA NON-CENTERED THREE-POINT FORMULA, ADJUSTED TO BE
- C SHAPE-PRESERVING.
- C
- HSUM = H(1) + H(2)
- W1 = (H(1) + HSUM)/HSUM
- W2 = -H(1)/HSUM
- D(1,1) = W1*DEL1 + W2*DEL2
- IF ( DPCHST(D(1,1),DEL1) .LE. ZERO) THEN
- D(1,1) = ZERO
- ELSE IF ( DPCHST(DEL1,DEL2) .LT. ZERO) THEN
- C NEED DO THIS CHECK ONLY IF MONOTONICITY SWITCHES.
- DMAX = THREE*DEL1
- IF (ABS(D(1,1)) .GT. ABS(DMAX)) D(1,1) = DMAX
- ENDIF
- C
- C LOOP THROUGH INTERIOR POINTS.
- C
- DO 50 I = 2, NLESS1
- IF (I .EQ. 2) GO TO 40
- C
- HSUM = H(I-1) + H(I)
- DEL1 = DEL2
- DEL2 = SLOPE(I)
- 40 CONTINUE
- C
- C SET D(I)=0 UNLESS DATA ARE STRICTLY MONOTONIC.
- C
- D(1,I) = ZERO
- IF ( DPCHST(DEL1,DEL2) .LE. ZERO) GO TO 50
- C
- C USE BRODLIE MODIFICATION OF BUTLAND FORMULA.
- C
- HSUMT3 = HSUM+HSUM+HSUM
- W1 = (HSUM + H(I-1))/HSUMT3
- W2 = (HSUM + H(I) )/HSUMT3
- DMAX = MAX( ABS(DEL1), ABS(DEL2) )
- DMIN = MIN( ABS(DEL1), ABS(DEL2) )
- DRAT1 = DEL1/DMAX
- DRAT2 = DEL2/DMAX
- D(1,I) = DMIN/(W1*DRAT1 + W2*DRAT2)
- C
- 50 CONTINUE
- C
- C SET D(N) VIA NON-CENTERED THREE-POINT FORMULA, ADJUSTED TO BE
- C SHAPE-PRESERVING.
- C
- W1 = -H(N-1)/HSUM
- W2 = (H(N-1) + HSUM)/HSUM
- D(1,N) = W1*DEL1 + W2*DEL2
- IF ( DPCHST(D(1,N),DEL2) .LE. ZERO) THEN
- D(1,N) = ZERO
- ELSE IF ( DPCHST(DEL1,DEL2) .LT. ZERO) THEN
- C NEED DO THIS CHECK ONLY IF MONOTONICITY SWITCHES.
- DMAX = THREE*DEL2
- IF (ABS(D(1,N)) .GT. ABS(DMAX)) D(1,N) = DMAX
- ENDIF
- C
- C NORMAL RETURN.
- C
- 5000 CONTINUE
- RETURN
- C------------- LAST LINE OF DPCHCI FOLLOWS -----------------------------
- END
|