!
!##################################################################
!##################################################################
!###### ######
!###### The Tri_linear Interpolation subroutine ######
!###### ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma. ######
!###### ######
!##################################################################
!##################################################################
!
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Linear Interpolation in 3D.
!
!-----------------------------------------------------------------------
!
! AUTHOR:
!
! Jidong Gao, CAPS, July, 2000
!
!-----------------------------------------------------------------------
!
SUBROUTINE linearint_3d(nx,ny,nz,vbl3,pgx,pgy,pgz, & 13
nzk,mxobs, nlev, nobs, ivar, &
pxx,pyy,pz1,pz2,hgt,ihgt,pval )
!
!ivar, px,py,pz,pval,iflag)
!
! nx,ny,nz: Dimension of 3d field
! pgx,pgy,pgz:Coordinate of 3d field
! vbl3: 3d field
! ivar : varible type, indicate position
! px,py,pz : observation point position
! pval : return value at above point
!
IMPLICIT NONE
!
INTEGER :: nx, ny, nz, ivar
INTEGER :: nzk, mxobs, nobs
INTEGER :: ii,kk,ik
REAL :: vbl3(nx,ny,nz)
REAL :: pgx(nx)
REAL :: pgy(ny)
REAL :: pgz(nx,ny,nz)
!
INTEGER :: nlev(mxobs)
REAL :: pxx(mxobs), pyy(mxobs)
REAL :: pz1(nzk,mxobs)
REAL :: pz2(nzk,mxobs)
REAL :: hgt(nzk,mxobs)
INTEGER :: ihgt(nzk,mxobs)
REAL :: pval(nzk,mxobs)
!
REAL :: zv1,zv2,zdz2,zdz1
!
DO ii = 1,nobs
DO kk = 1, nlev(ii)
ik = ihgt(kk,ii)
IF( ik>0 ) THEN
!
CALL linearint_2df
(nx,ny,vbl3(1,1,ik ),pxx(ii),pyy(ii),zv1)
CALL linearint_2df
(nx,ny,vbl3(1,1,ik+1),pxx(ii),pyy(ii),zv2)
!
zdz2 = (hgt(kk,ii)-pz1(kk,ii))/(pz2(kk,ii)-pz1(kk,ii))
zdz1 = -(hgt(kk,ii)-pz2(kk,ii))/(pz2(kk,ii)-pz1(kk,ii))
!
pval(kk,ii) = zdz1 * zv1 + zdz2 * zv2
!
ELSE IF( ik == 0) THEN
CALL linearint_2df
(nx,ny,vbl3(1,1,ik+1),pxx(ii),pyy(ii),zv2)
IF( (ivar == 1).OR.(ivar == 2).OR.(ivar == 4) &
.OR.(ivar == 5) .OR.(ivar == 6) ) THEN
pval(kk,ii) = zv2
ELSE IF(ivar == 3 ) THEN
pval(kk,ii) = zv2 + 1.145E-4*(pz2(kk,ii)-hgt(kk,ii))
ELSE
PRINT*,' stop, the analysis variable is not exist!'
STOP
END IF
! ELSE
! PRINT*,'the observation is out of top of model domain!!!!!!'
END IF
! print*,'pval============',pval(kk,ii)
END DO
END DO
!
RETURN
END SUBROUTINE linearint_3d
!
!
!
!##################################################################
!##################################################################
!###### ######
!###### The Tri_linear Interpolation subroutine ######
!###### ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma. ######
!###### ######
!##################################################################
!##################################################################
!
!
SUBROUTINE alinearint_3d(nx,ny,nz,vbl3,pgx,pgy,pgz, & 13
nzk,mxobs, nlev, nobs, ivar, &
pxx,pyy,pz1,pz2,hgt,ihgt,pval )
!
!ivar, px,py,pz,pval,iflag)
!
! nx,ny,nz: Dimension of 3d field
! pgx,pgy,pgz:Coordinate of 3d field
! vbl3: 3d field
! ivar : varible type, indicate position
! px,py,pz : observation point position
! pval : return value at above point
!
IMPLICIT NONE
!
INTEGER :: nx, ny, nz, ivar
INTEGER :: nzk, mxobs, nobs
INTEGER :: ii,kk,ik
REAL :: vbl3(nx,ny,nz)
REAL :: pgx(nx)
REAL :: pgy(ny)
REAL :: pgz(nx,ny,nz)
!
INTEGER :: nlev(mxobs)
REAL :: pxx(mxobs), pyy(mxobs)
REAL :: pz1(nzk,mxobs)
REAL :: pz2(nzk,mxobs)
REAL :: hgt(nzk,mxobs)
INTEGER :: ihgt(nzk,mxobs)
REAL :: pval(nzk,mxobs)
!
REAL :: zv1,zv2,zdz2,zdz1
!
DO ii = 1,nobs
DO kk = 1, nlev(ii)
ik = ihgt(kk,ii)
IF( ik>0 ) THEN
!
! zdz2 = (pz - z1)/(z2 - z1)
! zdz1 =-(pz - z2)/(z2 - z1)
zdz2 = (hgt(kk,ii)-pz1(kk,ii))/(pz2(kk,ii)-pz1(kk,ii))
zdz1 = -(hgt(kk,ii)-pz2(kk,ii))/(pz2(kk,ii)-pz1(kk,ii))
!
zv2 = zdz2 * pval(kk,ii)
zv1 = zdz1 * pval(kk,ii)
pval(kk,ii) = 0.
!
CALL alinearint_2df
(nx,ny,vbl3(1,1,ik ),pxx(ii),pyy(ii),zv1)
!
CALL alinearint_2df
(nx,ny,vbl3(1,1,ik+1),pxx(ii),pyy(ii),zv2)
!
ELSE IF( ik==0 ) THEN
IF( (ivar == 1).OR.(ivar == 2).OR.(ivar == 4) &
.OR.(ivar == 5).OR.(ivar == 6) ) THEN
zv2 = pval(kk,ii)
pval(kk,ii) = 0.0
ELSE IF(ivar == 3 ) THEN
! pval = zv2 + 1.145e-4*(z1-pz)
zv2 = pval(kk,ii)
pval(kk,ii)=0.0
ELSE
PRINT*,' stop, the analysis variable is not exist!'
STOP
END IF
CALL alinearint_2df
(nx,ny,vbl3(1,1,ik+1),pxx(ii),pyy(ii),zv2)
! ELSE
! PRINT*,'the observation is out of top of model domain!!!!!!'
END IF
END DO
END DO
RETURN
END SUBROUTINE alinearint_3d