2 SUBROUTINE pchsp (IC, VC, N, X, F, D, INCFD, WK, NWK, IERR)
149 INTEGER IC(2), N, INCFD, NWK, IERR
150 REAL VC(2), X(*), F(incfd,*), D(incfd,*), WK(2,*)
154 INTEGER IBEG, IEND, INDEX, J, NM1
155 REAL G, HALF, ONE, STEMP(3), THREE, TWO, XTEMP(4), ZERO
156 SAVE zero, half, one, two, three
159 DATA zero /0./, half /0.5/, one /1./, two /2./, three /3./
164 IF ( n.LT.2 )
GO TO 5001
165 IF ( incfd.LT.1 )
GO TO 5002
167 IF ( x(j).LE.x(j-1) )
GO TO 5003
173 IF ( (ibeg.LT.0).OR.(ibeg.GT.4) ) ierr = ierr - 1
174 IF ( (iend.LT.0).OR.(iend.GT.4) ) ierr = ierr - 2
175 IF ( ierr.LT.0 )
GO TO 5004
179 IF ( nwk .LT. 2*n )
GO TO 5007
184 wk(1,j) = x(j) - x(j-1)
185 wk(2,j) = (f(1,j) - f(1,j-1))/wk(1,j)
190 IF ( ibeg.GT.n ) ibeg = 0
191 IF ( iend.GT.n ) iend = 0
195 IF ( (ibeg.EQ.1).OR.(ibeg.EQ.2) )
THEN
197 ELSE IF (ibeg .GT. 2)
THEN
203 IF (j .LT. ibeg) stemp(j) = wk(2,index)
206 d(1,1) = pchdf(ibeg, xtemp, stemp, ierr)
208 IF (ierr .NE. 0)
GO TO 5009
212 IF ( (iend.EQ.1).OR.(iend.EQ.2) )
THEN
214 ELSE IF (iend .GT. 2)
THEN
220 IF (j .LT. iend) stemp(j) = wk(2,index+1)
223 d(1,n) = pchdf(iend, xtemp, stemp, ierr)
225 IF (ierr .NE. 0)
GO TO 5009
239 IF (ibeg .EQ. 0)
THEN
248 wk(1,1) = wk(1,2) + wk(1,3)
249 d(1,1) =((wk(1,2) + two*wk(1,1))*wk(2,2)*wk(1,3)
250 * + wk(1,2)**2*wk(2,3)) / wk(1,1)
252 ELSE IF (ibeg .EQ. 1)
THEN
260 d(1,1) = three*wk(2,2) - half*wk(1,2)*d(1,1)
270 IF (wk(2,j-1) .EQ. zero)
GO TO 5008
271 g = -wk(1,j+1)/wk(2,j-1)
273 * + three*(wk(1,j)*wk(2,j+1) + wk(1,j+1)*wk(2,j))
274 wk(2,j) = g*wk(1,j-1) + two*(wk(1,j) + wk(1,j+1))
284 IF (iend .EQ. 1)
GO TO 30
286 IF (iend .EQ. 0)
THEN
287 IF (n.EQ.2 .AND. ibeg.EQ.0)
THEN
291 ELSE IF ((n.EQ.2) .OR. (n.EQ.3 .AND. ibeg.EQ.0))
THEN
296 IF (wk(2,n-1) .EQ. zero)
GO TO 5008
301 g = wk(1,n-1) + wk(1,n)
303 d(1,n) = ((wk(1,n)+two*g)*wk(2,n)*wk(1,n-1)
304 * + wk(1,n)**2*(f(1,n-1)-f(1,n-2))/wk(1,n-1))/g
305 IF (wk(2,n-1) .EQ. zero)
GO TO 5008
311 d(1,n) = three*wk(2,n) + half*wk(1,n)*d(1,n)
313 IF (wk(2,n-1) .EQ. zero)
GO TO 5008
319 wk(2,n) = g*wk(1,n-1) + wk(2,n)
320 IF (wk(2,n) .EQ. zero)
GO TO 5008
321 d(1,n) = (g*d(1,n-1) + d(1,n))/wk(2,n)
327 IF (wk(2,j) .EQ. zero)
GO TO 5008
328 d(1,j) = (d(1,j) - wk(1,j)*d(1,j+1))/wk(2,j)
341 CALL xermsg (
'SLATEC',
'PCHSP',
342 +
'NUMBER OF DATA POINTS LESS THAN TWO', ierr, 1)
348 CALL xermsg (
'SLATEC',
'PCHSP',
'INCREMENT LESS THAN ONE', ierr,
355 CALL xermsg (
'SLATEC',
'PCHSP',
'X-ARRAY NOT STRICTLY INCREASING'
362 CALL xermsg (
'SLATEC',
'PCHSP',
'IC OUT OF RANGE', ierr, 1)
368 CALL xermsg (
'SLATEC',
'PCHSP',
'WORK ARRAY TOO SMALL', ierr, 1)
376 CALL xermsg (
'SLATEC',
'PCHSP',
'SINGULAR LINEAR SYSTEM', ierr,
384 CALL xermsg (
'SLATEC',
'PCHSP',
'ERROR RETURN FROM PCHDF', ierr,
subroutine xermsg(LIBRAR, SUBROU, MESSG, NERR, LEVEL)
subroutine pchsp(IC, VC, N, X, F, D, INCFD, WK, NWK, IERR)