SUBROUTINE INTDER 1 (X,FX,NPTS,X0,FX0,FPX0,IORDER,I) C C This subroutine will perform either a first or second C order interpolation of the dependent variable. The C derivative of the interpolation is also calculated. C C X Array containing the independent parameter. C FX Array containing the dependent variable. C NPTS Number of points in each of the above arrays. C X0 Point for which the interpolation is to take place. C FX0 Interpolated vale at X0. C FPX0 Derivative of the interpolation at X0. C IORDER Order of interpolation, either 1 or 2. C I Segment number of the last X0. C DIMENSION X(1), FX(1) C C C - CHECK FOR EXTRAPOLATION. IF( X(1) .LE. X0 ) GO TO 100 I = 1 GO TO 400 100 IF( X0 .LE. X(NPTS) ) GO TO 200 I = NPTS-1 GO TO 400 C C - FIND THE CORRECT SEGMENT. 200 I = MIN0( NPTS-1, MAX0( 1, I ) ) 300 IF( ( X(I) .LE. X0 ) .AND. ( X0 .LE. X(I+1) ) ) GO TO 400 I = I+SIGN(1.,X0-X(I)) GO TO 300 C C - CHECK TO SEE WHICH ORDER OF INTERPOLATION. 400 IF( IORDER .NE. 1 ) GO TO 500 C C - PERFORM FIRST ORDER DIFFERENTIATION AND INTERPOLATION. FPX0 = ( FX(I+1)-FX(I) )/( X(I+1)-X(I) ) FX0 = FX(I) + FPX0*( X0-X(I) ) RETURN C C - SECOND ORDER INTERPOLATION, NEED TO SELECT THE SHORTER ADJACENT SEGMENT. 500 IF( I .EQ. 1 ) GO TO 700 IF( I .EQ. NPTS-1 ) GO TO 600 IF( ABS( X(I+1)-X(I-1) ) .GT. ABS( X(I+2)-X(I) ) ) GO TO 700 600 I = I-1 C C - PERFORM SECOND ORDER INTERPOLATION AND DEIFFERENTIATION. 700 FX0 = ( ( FX(I)*( X(I+1)-X0 ) - FX(I+1)*( X(I)-X0 ) )* 1 ( X(I+2)-X0 )/( X(I+1)-X(I) ) - 2 ( FX(I+1)*( X(I+2)-X0 ) - FX(I+2)*( X(I+1)-X0 ) )* 3 ( X(I)-X0 )/( X(I+2)-X(I+1) ) )/( X(I+2)-X(I) ) FPX0 = ( ( ( FX(I+1)-FX(I) )*( X(I+2)-X0 )- 1 FX(I)*( X(I+1)-X0 ) + FX(I+1)*( X(I)-X0 ) )/( X(I+1)-X(I) ) - 2 ( ( FX(I+2)-FX(I+1) )*( X(I)-X0 ) - FX(I+1)*( X(I+2)-X0 ) + 3 FX(I+2)*( X(I+1)-X0 ) )/( X(I+2)-X(I+1) ) )/( X(I+2)-X(I) ) RETURN END