SUBROUTINE W3FT03(FL,HI,STI,STJ,MAXI,MAXJ,ITYPE) C$$$ SUBPROGRAM DOCUMENTATION BLOCK C C SUBPROGRAM: W3FT03 A POINT INTERPOLATER C AUTHOR: HOWCROFT, J. ORG: W342 DATE: 79-02-15 C C ABSTRACT: DO EITHER BILINEAR OR BIQUADRATIC INTERPOLATION FOR A C POINT WITHIN A TWO-DIMENSIONAL DATA ARRAY. C C PROGRAM HISTORY LOG: C 79-02-15 J.HOWCROFT C 89-01-25 R.E.JONES CHANGE TO MICROSOFT FORTRAN 4.10 C 90-06-12 R.E.JONES CHANGE TO SUN FORTRAN 1.3 C 91-03-30 R.E.JONES CONVERT TO SiliconGraphics FORTRAN C 93-03-29 R.E.JONES ADD SAVE STATEMENT C 96-07-01 R.E.JONES COMPILE ON CRAY C C USAGE: CALL W3FT03(FL,HI,STI,STJ,MAXI,MAXJ,KQUAD) C C INPUT VARIABLES: C NAMES INTERFACE DESCRIPTION OF VARIABLES AND TYPES C ------ --------- ----------------------------------------------- C FL ARG LIST REAL*4 TWO-DIMENSIONAL CARTESIAN ARRAY OF DATA C MAXI ARG LIST INTEGER*4 I-DIMENSION OF FL C MAXJ ARG LIST INTEGER*4 J-DIMENSION OF FL C STI ARG LIST REAL*4 I-COORDINATE TO WHICH A VALUE IS TO BE C INTERPOLATED C STJ ARG LIST REAL*4 J-COORDINATE TO WHICH A VALUE IS TO BE C INTERPOLATED C KQUAD ARG LIST INTEGER*4 INTERPOLATION METHOD: C IF = 2, BIQUADRATIC INTERPOLATION IS DONE, C IF = ANY OTHER VALUE, DO BILINEAR. C C OUTPUT VARIABLES: C NAMES INTERFACE DESCRIPTION OF VARIABLES AND TYPES C ------ --------- ----------------------------------------------- C HI ARG LIST REAL*4 INTERPOLATED OUTPUT VALUE C C REMARKS: NO ERROR CHECKS ARE MADE. IT IS LEFT FOR THE USER TO C DETERMINE THAT THE POINT FOR WHICH INTERPOLATION IS DESIRED C LIES WITHIN THE GRID. C C ATTRIBUTES: C LANGUAGE: CRAY CFT77 FORTRAN C MACHINE: CRAY C916/256, CRAY J916/2048 C C$$$ C REAL FL(MAXI,MAXJ) REAL E (4) C SAVE C I = STI J = STJ DI = I DJ = J DI = STI - DI DJ = STJ - DJ C HI = 0. C TEST FOR POINT OFF GRID. IF (I.LT.1 .OR. I.GT.MAXI) GO TO 300 IF (J.LT.1 .OR. J.GT.MAXJ) GO TO 300 IF (ITYPE .NE. 2) GO TO 100 C DO BILINEAR IF POINT IS BETWEEN ULTIMATE AND C PENULTIMATE ROWS, WHERE BIQUAD NOT POSSIBLE. IF (I.LT.2 .OR. I.GT.(MAXI-1)) GO TO 100 IF (J.LT.2 .OR. J.GT.(MAXJ-1)) GO TO 100 GO TO 200 C C BILINEAR. 100 CONTINUE HI = FL(I ,J )*(1.-DI)*(1.-DJ) + FL(I+1,J )*DI*(1.-DJ) & + FL(I ,J+1)*(1.-DI)*DJ + FL(I+1,J+1)*DI*DJ GO TO 300 C 200 CONTINUE C BIQUADRATIC. DI2 = DI*(DI-1.)*.25 DJ2 = DJ*(DJ-1.)*.25 J1 = J - 1 DO 250 K=1,4 E(K) = FL(I ,J1)*(1.-DI-DI2) + FL(I+1,J1)*(DI-DI2) & + (FL(I-1,J1) + FL(I+2,J1))*DI2 J1 = J1 + 1 250 CONTINUE HI = E(2)*(1.-DJ-DJ2) + E(3)*(DJ-DJ2) + (E(1) + E(4))*DJ2 C 300 CONTINUE RETURN END