CTITLESALINTP -- LINEAR INTERPOLATOR C*********************************************************************** C COPYRIGHT ATLANTIC RICHFIELD COMPANY 1991 * C*********************************************************************** CA CA AUTHOR B. VERWEST CA DESIGNER B. VERWEST CA LANGUAGE VS FORTRAN C WRITTEN 08/21/87 C REVISED 02/05/90 JJC - RENAMED LINTRP TO SALINTP. C REVISED 07/23/90 CLJ - ALLOW PREP TO RUN ON THE IBM CA CA CA CALLING SEQUENCE: CA CA CALL SALINTP (XN,FN,NPT,XE,DX,LPT,VAL) CA CA IN R4 XN AN INDEPENDENT VARIABLE LENGTH NPT CA IN R4 FN A DEPENDENT VARIABLE LENGTH NPT CA IN I4 NPT NO. OF GIVEN DATA POINTS CA IN R4 XE START VALUE OF INDEPENDENT VARIABLE CA TO INTERPOLATE CA IN R4 DX INCREMENT OF INDEPENDENT VARIABLE CA TO INTERPOLATE CA IN I4 LPT NO. OF POINTS TO GENERATE ARRAY OF CA DEPENDENT VARIABLE CA OUT R4 VAL GENERATED DEPENDENT VARIABLE LENGTH LPT CA CA CA PURPOSE: LINEAR INTERPOLATION CA CA EXTRAPOLATION PAST ENDS OF XN IS CONSTANT C C C SUBROUTINE SALINTP (XN,FN,NPT,XE,DX,LPT,VAL) C IMPLICIT INTEGER(A-Z) REAL A REAL B REAL DX REAL FN REAL HL REAL VAL REAL X REAL XE REAL XN C DIMENSION XN(NPT),FN(NPT),VAL(LPT) C C NDX = 1 X = XE C C INITIALIZE IF TO EXTRAPOLATE ONLY AFTER XN(NPT) C IF (X .LE. XN(NPT)) GO TO 100 GO TO 180 C C EXTRAPOLATE UP TO XN(1) C 100 IF (X .GE. XN(1)) GO TO 140 120 CONTINUE VAL(NDX) = FN(1) NDX = NDX + 1 X = X + DX IF (NDX .GT. LPT) RETURN IF (X .LT. XN(1)) GO TO 120 C C INTERPOLATE BETWEEN XN(1) AND XN(NPT) C 140 IF (X. GT. XN(NPT)) GO TO 180 N = 1 160 CONTINUE IF (N .GT. NPT-1) GO TO 180 C C CHECK IF X IN SEGMENT N - IF YES THEN INTERPOLATE ELSE BUMP N C AND TRY AGAIN C IF (X .GE. XN(N) .AND. X .LE. XN(N+1)) THEN A=XN(N+1)-X B=X-XN(N) HL=XN(N+1)-XN(N) VAL(NDX) = (A*FN(N)+B*FN(N+1))/HL X = X+DX NDX = NDX+1 IF (NDX .GT. LPT) RETURN ELSE N = N+1 ENDIF GO TO 160 C C EXTRAPOLATE AFTER XN(NPT) C 180 IF (NDX .GT. LPT) RETURN DO 200 N=NDX,LPT VAL(N) = FN(NPT) 200 X = X + DX RETURN END