MODULE linear_md IMPLICIT NONE CONTAINS SUBROUTINE linear(maskin,maskout,datain,dataout, & xo,xn,io,in) IMPLICIT NONE ! Doing linear interpolation ..... ! Author: Biju Thomas on 2007/11/27 .... ! Land Values are excluded from interpolation .... INTEGER, INTENT(IN) :: io,in REAL, INTENT(IN) :: maskin,maskout REAL, DIMENSION(io), INTENT(IN) :: xo(io), datain(io) REAL, DIMENSION(in), INTENT(IN) :: xn(in) REAL, DIMENSION(in), INTENT(OUT) :: dataout(in) INTEGER :: i,i1,i2,ik REAL :: x,x1,x2,dx,sum REAL, DIMENSION(2) :: flag ! IF ( xo(1) > xo(io)) THEN PRINT*, 'Input Xs are not acending oreder' print*,xo(1),xo(io) RETURN END IF DO i=1,in IF ( xn(i) > xo(io) ) THEN dataout(i) = datain(io) CYCLE END IF IF ( xn(i) < xo(1) ) THEN dataout(i) = datain(1) CYCLE END IF ! x=xn(i) i1=1 i2=1 x1=xo(i1) x2=xo(i2) DO ik=1,io IF( xo(ik) <= x ) THEN i1 = ik x1=xo(ik) END IF END DO DO ik=io,1,-1 IF( xo(ik) >= x ) THEN i2 = ik x2=xo(ik) END IF END DO IF (datain(i1) == maskin) THEN flag(1)=0. ELSE flag(1)=1. END IF IF(datain(i2) == maskin) THEN flag(2)=0. ELSE flag(2)=1. END IF IF (x2 /= x1) THEN sum=flag(1) + flag(2) IF (sum .eq. 0.) THEN dataout(i)=maskout ELSE dx = flag(1)*(x2-x) + flag(2)*(x-x1) !--->> y = [ y1*(x2-x) + y2*(x-x1) ] / [x2-x1] dataout(i) = flag(1)*datain(i1)*(x2-x)/dx & + flag(2)*datain(i2)*(x-x1)/dx END IF ELSE sum=flag(1) IF (sum == 0.) THEN dataout(i)=maskout ELSE dataout(i) = datain(i1) END IF END IF END DO END SUBROUTINE linear END MODULE linear_md