C$Procedure interp_drag_bias C subroutine interp_drag_bias ( x, ydata, n, y ) C C C******************************************************************************* C C Copyright (C) 1993, California Institute of Technology. U.S. C Government Sponsorhip under NASA Contract NAS7-918 is C acknowledged. C C******************************************************************************* C C$ Log C C Date Name Description C ----------------------------------------------------------------------------- C 30-AUG-1991 Bruce Shapiro Creation of interp_drag_bias C Built from interp C C$ Purpose C C Linear interpolation into an array C C$ Input_Arguments C C Name Type Dim Units Description C ----------------------------------------------------------------------------- C X DP - - x-value of desired point C Y DP - - return value y-value C Ydata DP - - y-data in world coordinates C N I 1 - number of data points C C$ Parameters C C C$ Declarations_of_Input_and_Output_Arguments C INTEGER N DOUBLE PRECISION YDATA ( N ) DOUBLE PRECISION X DOUBLE PRECISION Y C C$ Declarations_of_Local_Variables C C Name Type Dim Units Description C ----------------------------------------------------------------------------- C C$ Namelists C C C$ Data_Statements C C C$ Method C-& INTEGER I1 DOUBLE PRECISION X1, X2, Y1, Y2 C assume the data is distributed one point per day to the last point C with the first point being for day 0 i1 = idint ( x ) + 1 C now do a linear interpolation if ( i1 .lt. 1 ) then y1 = ydata ( 1 ) y2 = ydata ( 2 ) x1 = 0.0 x2 = 1.0 else if ( i1 .GE. n ) THEN y1 = ydata ( N - 1 ) y2 = ydata ( N ) x1 = dble ( N - 2 ) x2 = dble ( N - 1 ) else y1 = ydata ( I1) y2 = ydata ( I1 + 1) x1 = dble ( I1 - 1) x2 = dble ( I1 ) end if if ( x2 .eq. x1 ) then y = y1 else y = y1 + ( x - x1 ) * (y2-y1) / (x2-x1) end if return end C program tester C double precision x, y, xdata(12), ydata(12) C integer n C C data n / 10 / C data xdata /2, 3, 5, 7, 11, C & 13, 17, 19, 23, 29, 31, 37/ C data ydata /100, 200, 300, 400, 500, C & 600, 700, 800, 900, 1000, 1001, 1002 / C C write (6,*) xdata C write (6,*) '*****' C write (6,*) ydata C write (6,*) '*****' C C x = 8.4 C call interp_drag_bias ( x, ydata, n, y ) C write (6,*) x,' ', y C end