C #LINTA V1A 27-JUN-73. C LAST UPDATE: C FUNCTION LINTA ( FN, XN, N, X, I) DIMENSION FN(N), XN(N) C C *PURPOSE. C TO PERFORM LINEAR INTERPOLATION OF A FUNCTION C GIVEN BY ITS VALUES AT A NUMBER OF POINTS. C C *PARAMETERS: C C FN - REAL ARRAY OF FUNCTION VALUES FN(I) AT XN(I) FOR I=1 TO N C XN - REAL ARRAY OF X POSITIONS C N - INTEGER NUMBER OF FUNCTION POINTS STORED C X - REAL X VALUE AT WHICH INTERPOLATION REQUIRED. C I - INTEGER INDEX TO KNOT INTERVAL USED, WILL BE RETURNED IN RANGE C 1 TO N-1. MUST BE SET TO ZERO ON FIRST CALL AND WHENEVER C FN OR XN CHANGED. C C INPUT PARAMETERS: C FN, XN, N, X, I C OUTPUT PARAMETERS: C I, (FUNCTION VALUE) C C *METHOD. C THE ROUTINE SEARCHES FROM THE "I" VALUE LAST USED - C UNLESS I=0 - TO FIND THE CORRECT INTERVAL. IT THEN PERFORMS C A STANDARD LINEAR INTERPOLATION. MUCH OF THE SEARCHING CAN C BE ELIMINATED IN THIS WAY WHEN SUCCESSIVE X VALUES ARE CLOSE, C AS CAN THE CALCULATION OF THE INTERPOLATION COEFFICIENTS WHEN THE C SAME INTERVAL IS USED AGAIN. C THE VALUE RETURNED WHEN THE X CO-ORDINATE IS OUT OF RANGE C IS THAT OBTAINED BY LINEAR INTERPOLATION FROM THE CLOSEST C ENDPOINT. C THE SEARCH ASSUMES THE CO-ORDINATE VALUES XN(I) ARE C IN INCREASING ORDER! C C *ACCURACY. C C *RESTRICTIONS. C THE ARRAY XN(I) MUST BE ORDERED. C C *ERROR CONDITIONS. C THE BEHAVIOUR IS NOT DEFINED IF THE ARRAY XN(I) IS NOT C ORDERED PROPERLY, AND NO INDICATION IS GIVEN OF THIS. THE C OVERFLOW CONDITION - I.E. X > XN(N) - IS SHOWN BY I=N, BUT C THE UNDERFLOW CONDITION IS NOT SHOWN BY I=0 AS THIS IS THE C INDICATOR FOR PRIMING THE INTERNAL VARIABLES. C C *NON STANDARD ROUTINES CALLED. C C *TYPICAL TIMES. C C *ORIGIN. M.R.MANNING. C C *COMMENTS. C THIS ROUTINE HAS BEEN ADAPTED FROM "SPLINE" HENCE THE C SIMILARITY. C C #END. C DATA ILAST/ -1/ C C PHASE 1 - LOCATE INTERVAL TO INTERPOLATE IN. C IF (I .GT. 0) GO TO 5 I= 1 ILAST= -1 5 DX= X - XN(I) IF(DX) 10, 50, 20 C TOO HIGH IN XN TABLE - STEP BACK IF POSSIBLE. 10 I= I - 1 IF( I .LE. 0) GO TO 50 DX= X - XN(I) IF(DX) 10, 50, 50 C C TOO LOW IN XN TABLE - MOVE UP TO NEXT ENTRY 15 I= I+ 1 DX= DEL C TOO LOW IN XN TABLE - CHECK NEXT ENTRY UP. 20 IF( I .GE. N) GO TO 50 DEL= X - XN(I+1) IF(DEL) 50, 15, 15 C C FOUND INTERVAL XN(I) TO XN(I+1), I=0 IS UNDERFLOW AND C I=N IS OVERFLOW. C PHASE 2 - CALCULATE INTERPOLATION COEFFICIENTS IF NECCESSARY. C 50 IF( I .EQ. ILAST) GO TO 100 C ILAST= I IF ( I .LE. 0) I= 1 IF ( I .GE. N) I= N -1 C0= FN(I) C1= ( FN(I+1) - FN(I) )/( XN(I+1) - XN(I) ) C C NOW HAVE INTERPOLATION COEFFICIENTS C PHASE 3 - EVALUATE FUNCTION AND RETURN. C 100 LINTA= C0 + DX*C1 C RETURN END