comparison libcruft/slatec-fn/pchim.f @ 7789:82be108cc558

First attempt at single precision tyeps * * * corrections to qrupdate single precision routines * * * prefer demotion to single over promotion to double * * * Add single precision support to log2 function * * * Trivial PROJECT file update * * * Cache optimized hermitian/transpose methods * * * Add tests for tranpose/hermitian and ChangeLog entry for new transpose code
author David Bateman <dbateman@free.fr>
date Sun, 27 Apr 2008 22:34:17 +0200
parents
children
comparison
equal deleted inserted replaced
7788:45f5faba05a2 7789:82be108cc558
1 *DECK PCHIM
2 SUBROUTINE PCHIM (N, X, F, D, INCFD, IERR)
3 C***BEGIN PROLOGUE PCHIM
4 C***PURPOSE Set derivatives needed to determine a monotone piecewise
5 C cubic Hermite interpolant to given data. Boundary values
6 C are provided which are compatible with monotonicity. The
7 C interpolant will have an extremum at each point where mono-
8 C tonicity switches direction. (See PCHIC if user control is
9 C desired over boundary or switch conditions.)
10 C***LIBRARY SLATEC (PCHIP)
11 C***CATEGORY E1A
12 C***TYPE SINGLE PRECISION (PCHIM-S, DPCHIM-D)
13 C***KEYWORDS CUBIC HERMITE INTERPOLATION, MONOTONE INTERPOLATION,
14 C PCHIP, PIECEWISE CUBIC INTERPOLATION
15 C***AUTHOR Fritsch, F. N., (LLNL)
16 C Lawrence Livermore National Laboratory
17 C P.O. Box 808 (L-316)
18 C Livermore, CA 94550
19 C FTS 532-4275, (510) 422-4275
20 C***DESCRIPTION
21 C
22 C PCHIM: Piecewise Cubic Hermite Interpolation to
23 C Monotone data.
24 C
25 C Sets derivatives needed to determine a monotone piecewise cubic
26 C Hermite interpolant to the data given in X and F.
27 C
28 C Default boundary conditions are provided which are compatible
29 C with monotonicity. (See PCHIC if user control of boundary con-
30 C ditions is desired.)
31 C
32 C If the data are only piecewise monotonic, the interpolant will
33 C have an extremum at each point where monotonicity switches direc-
34 C tion. (See PCHIC if user control is desired in such cases.)
35 C
36 C To facilitate two-dimensional applications, includes an increment
37 C between successive values of the F- and D-arrays.
38 C
39 C The resulting piecewise cubic Hermite function may be evaluated
40 C by PCHFE or PCHFD.
41 C
42 C ----------------------------------------------------------------------
43 C
44 C Calling sequence:
45 C
46 C PARAMETER (INCFD = ...)
47 C INTEGER N, IERR
48 C REAL X(N), F(INCFD,N), D(INCFD,N)
49 C
50 C CALL PCHIM (N, X, F, D, INCFD, IERR)
51 C
52 C Parameters:
53 C
54 C N -- (input) number of data points. (Error return if N.LT.2 .)
55 C If N=2, simply does linear interpolation.
56 C
57 C X -- (input) real array of independent variable values. The
58 C elements of X must be strictly increasing:
59 C X(I-1) .LT. X(I), I = 2(1)N.
60 C (Error return if not.)
61 C
62 C F -- (input) real array of dependent variable values to be inter-
63 C polated. F(1+(I-1)*INCFD) is value corresponding to X(I).
64 C PCHIM is designed for monotonic data, but it will work for
65 C any F-array. It will force extrema at points where mono-
66 C tonicity switches direction. If some other treatment of
67 C switch points is desired, PCHIC should be used instead.
68 C -----
69 C D -- (output) real array of derivative values at the data points.
70 C If the data are monotonic, these values will determine a
71 C a monotone cubic Hermite function.
72 C The value corresponding to X(I) is stored in
73 C D(1+(I-1)*INCFD), I=1(1)N.
74 C No other entries in D are changed.
75 C
76 C INCFD -- (input) increment between successive values in F and D.
77 C This argument is provided primarily for 2-D applications.
78 C (Error return if INCFD.LT.1 .)
79 C
80 C IERR -- (output) error flag.
81 C Normal return:
82 C IERR = 0 (no errors).
83 C Warning error:
84 C IERR.GT.0 means that IERR switches in the direction
85 C of monotonicity were detected.
86 C "Recoverable" errors:
87 C IERR = -1 if N.LT.2 .
88 C IERR = -2 if INCFD.LT.1 .
89 C IERR = -3 if the X-array is not strictly increasing.
90 C (The D-array has not been changed in any of these cases.)
91 C NOTE: The above errors are checked in the order listed,
92 C and following arguments have **NOT** been validated.
93 C
94 C***REFERENCES 1. F. N. Fritsch and J. Butland, A method for construc-
95 C ting local monotone piecewise cubic interpolants, SIAM
96 C Journal on Scientific and Statistical Computing 5, 2
97 C (June 1984), pp. 300-304.
98 C 2. F. N. Fritsch and R. E. Carlson, Monotone piecewise
99 C cubic interpolation, SIAM Journal on Numerical Ana-
100 C lysis 17, 2 (April 1980), pp. 238-246.
101 C***ROUTINES CALLED PCHST, XERMSG
102 C***REVISION HISTORY (YYMMDD)
103 C 811103 DATE WRITTEN
104 C 820201 1. Introduced PCHST to reduce possible over/under-
105 C flow problems.
106 C 2. Rearranged derivative formula for same reason.
107 C 820602 1. Modified end conditions to be continuous functions
108 C of data when monotonicity switches in next interval.
109 C 2. Modified formulas so end conditions are less prone
110 C of over/underflow problems.
111 C 820803 Minor cosmetic changes for release 1.
112 C 870813 Updated Reference 1.
113 C 890411 Added SAVE statements (Vers. 3.2).
114 C 890531 Changed all specific intrinsics to generic. (WRB)
115 C 890703 Corrected category record. (WRB)
116 C 890831 Modified array declarations. (WRB)
117 C 890831 REVISION DATE from Version 3.2
118 C 891214 Prologue converted to Version 4.0 format. (BAB)
119 C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
120 C 920429 Revised format and order of references. (WRB,FNF)
121 C***END PROLOGUE PCHIM
122 C Programming notes:
123 C
124 C 1. The function PCHST(ARG1,ARG2) is assumed to return zero if
125 C either argument is zero, +1 if they are of the same sign, and
126 C -1 if they are of opposite sign.
127 C 2. To produce a double precision version, simply:
128 C a. Change PCHIM to DPCHIM wherever it occurs,
129 C b. Change PCHST to DPCHST wherever it occurs,
130 C c. Change all references to the Fortran intrinsics to their
131 C double precision equivalents,
132 C d. Change the real declarations to double precision, and
133 C e. Change the constants ZERO and THREE to double precision.
134 C
135 C DECLARE ARGUMENTS.
136 C
137 INTEGER N, INCFD, IERR
138 REAL X(*), F(INCFD,*), D(INCFD,*)
139 C
140 C DECLARE LOCAL VARIABLES.
141 C
142 INTEGER I, NLESS1
143 REAL DEL1, DEL2, DMAX, DMIN, DRAT1, DRAT2, DSAVE,
144 * H1, H2, HSUM, HSUMT3, THREE, W1, W2, ZERO
145 SAVE ZERO, THREE
146 REAL PCHST
147 DATA ZERO /0./, THREE /3./
148 C
149 C VALIDITY-CHECK ARGUMENTS.
150 C
151 C***FIRST EXECUTABLE STATEMENT PCHIM
152 IF ( N.LT.2 ) GO TO 5001
153 IF ( INCFD.LT.1 ) GO TO 5002
154 DO 1 I = 2, N
155 IF ( X(I).LE.X(I-1) ) GO TO 5003
156 1 CONTINUE
157 C
158 C FUNCTION DEFINITION IS OK, GO ON.
159 C
160 IERR = 0
161 NLESS1 = N - 1
162 H1 = X(2) - X(1)
163 DEL1 = (F(1,2) - F(1,1))/H1
164 DSAVE = DEL1
165 C
166 C SPECIAL CASE N=2 -- USE LINEAR INTERPOLATION.
167 C
168 IF (NLESS1 .GT. 1) GO TO 10
169 D(1,1) = DEL1
170 D(1,N) = DEL1
171 GO TO 5000
172 C
173 C NORMAL CASE (N .GE. 3).
174 C
175 10 CONTINUE
176 H2 = X(3) - X(2)
177 DEL2 = (F(1,3) - F(1,2))/H2
178 C
179 C SET D(1) VIA NON-CENTERED THREE-POINT FORMULA, ADJUSTED TO BE
180 C SHAPE-PRESERVING.
181 C
182 HSUM = H1 + H2
183 W1 = (H1 + HSUM)/HSUM
184 W2 = -H1/HSUM
185 D(1,1) = W1*DEL1 + W2*DEL2
186 IF ( PCHST(D(1,1),DEL1) .LE. ZERO) THEN
187 D(1,1) = ZERO
188 ELSE IF ( PCHST(DEL1,DEL2) .LT. ZERO) THEN
189 C NEED DO THIS CHECK ONLY IF MONOTONICITY SWITCHES.
190 DMAX = THREE*DEL1
191 IF (ABS(D(1,1)) .GT. ABS(DMAX)) D(1,1) = DMAX
192 ENDIF
193 C
194 C LOOP THROUGH INTERIOR POINTS.
195 C
196 DO 50 I = 2, NLESS1
197 IF (I .EQ. 2) GO TO 40
198 C
199 H1 = H2
200 H2 = X(I+1) - X(I)
201 HSUM = H1 + H2
202 DEL1 = DEL2
203 DEL2 = (F(1,I+1) - F(1,I))/H2
204 40 CONTINUE
205 C
206 C SET D(I)=0 UNLESS DATA ARE STRICTLY MONOTONIC.
207 C
208 D(1,I) = ZERO
209 IF ( PCHST(DEL1,DEL2) ) 42, 41, 45
210 C
211 C COUNT NUMBER OF CHANGES IN DIRECTION OF MONOTONICITY.
212 C
213 41 CONTINUE
214 IF (DEL2 .EQ. ZERO) GO TO 50
215 IF ( PCHST(DSAVE,DEL2) .LT. ZERO) IERR = IERR + 1
216 DSAVE = DEL2
217 GO TO 50
218 C
219 42 CONTINUE
220 IERR = IERR + 1
221 DSAVE = DEL2
222 GO TO 50
223 C
224 C USE BRODLIE MODIFICATION OF BUTLAND FORMULA.
225 C
226 45 CONTINUE
227 HSUMT3 = HSUM+HSUM+HSUM
228 W1 = (HSUM + H1)/HSUMT3
229 W2 = (HSUM + H2)/HSUMT3
230 DMAX = MAX( ABS(DEL1), ABS(DEL2) )
231 DMIN = MIN( ABS(DEL1), ABS(DEL2) )
232 DRAT1 = DEL1/DMAX
233 DRAT2 = DEL2/DMAX
234 D(1,I) = DMIN/(W1*DRAT1 + W2*DRAT2)
235 C
236 50 CONTINUE
237 C
238 C SET D(N) VIA NON-CENTERED THREE-POINT FORMULA, ADJUSTED TO BE
239 C SHAPE-PRESERVING.
240 C
241 W1 = -H2/HSUM
242 W2 = (H2 + HSUM)/HSUM
243 D(1,N) = W1*DEL1 + W2*DEL2
244 IF ( PCHST(D(1,N),DEL2) .LE. ZERO) THEN
245 D(1,N) = ZERO
246 ELSE IF ( PCHST(DEL1,DEL2) .LT. ZERO) THEN
247 C NEED DO THIS CHECK ONLY IF MONOTONICITY SWITCHES.
248 DMAX = THREE*DEL2
249 IF (ABS(D(1,N)) .GT. ABS(DMAX)) D(1,N) = DMAX
250 ENDIF
251 C
252 C NORMAL RETURN.
253 C
254 5000 CONTINUE
255 RETURN
256 C
257 C ERROR RETURNS.
258 C
259 5001 CONTINUE
260 C N.LT.2 RETURN.
261 IERR = -1
262 CALL XERMSG ('SLATEC', 'PCHIM',
263 + 'NUMBER OF DATA POINTS LESS THAN TWO', IERR, 1)
264 RETURN
265 C
266 5002 CONTINUE
267 C INCFD.LT.1 RETURN.
268 IERR = -2
269 CALL XERMSG ('SLATEC', 'PCHIM', 'INCREMENT LESS THAN ONE', IERR,
270 + 1)
271 RETURN
272 C
273 5003 CONTINUE
274 C X-ARRAY NOT STRICTLY INCREASING.
275 IERR = -3
276 CALL XERMSG ('SLATEC', 'PCHIM', 'X-ARRAY NOT STRICTLY INCREASING'
277 + , IERR, 1)
278 RETURN
279 C------------- LAST LINE OF PCHIM FOLLOWS ------------------------------
280 END