!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE INTRPX3D ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE intrpx3d(ain,nx,is,ie, ny,js,je, nz,ks,ke, wgtx,ix, & 3
intrphopt,aout,nx1,is1,ie1)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
! Perform interpolation in the first dimension
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 4/1/1999.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nx,is,ie, ny,js,je, nz,ks,ke
INTEGER :: nx1,is1,ie1
REAL :: ain (nx ,ny,nz)
REAL :: aout(nx1,ny,nz)
REAL :: wgtx(nx1,3)
INTEGER :: ix(nx1)
INTEGER :: intrphopt
INTEGER :: i,j,k
IF(intrphopt == 1) THEN
DO k=ks ,ke
DO j=js ,je
DO i=is1,ie1
aout(i,j,k)= wgtx(i,1) *ain(ix(i) ,j,k) &
+(1.0-wgtx(i,1))*ain(ix(i)+1,j,k)
END DO
END DO
END DO
ELSE
DO k=ks ,ke
DO j=js ,je
DO i=is1,ie1
aout(i,j,k)=wgtx(i,1)*ain(ix(i)-1,j,k) &
+wgtx(i,2)*ain(ix(i) ,j,k) &
+wgtx(i,3)*ain(ix(i)+1,j,k)
END DO
END DO
END DO
END IF
RETURN
END SUBROUTINE intrpx3d
SUBROUTINE intrpy3d(ain,nx,is,ie, ny,js,je, nz,ks,ke, wgty,jy, & 3
intrphopt,aout,ny1,js1,je1)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
! Perform interpolation in the second dimension
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 4/1/1999.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,is,ie, ny,js,je, nz,ks,ke
INTEGER :: ny1,js1,je1
REAL :: ain (nx,ny ,nz)
REAL :: aout(nx,ny1,nz)
REAL :: wgty(ny1,3)
INTEGER :: jy(ny1)
INTEGER :: intrphopt
INTEGER :: i,j,k
IF(intrphopt == 1) THEN
DO k=ks ,ke
DO j=js1,je1
DO i=is ,ie
aout(i,j,k)= wgty(j,1) *ain(i,jy(j) ,k) &
+(1.0-wgty(j,1))*ain(i,jy(j)+1,k)
END DO
END DO
END DO
ELSE
DO k=ks ,ke
DO j=js1,je1
DO i=is ,ie
aout(i,j,k)=wgty(j,1)*ain(i,jy(j)-1,k) &
+wgty(j,2)*ain(i,jy(j) ,k) &
+wgty(j,3)*ain(i,jy(j)+1,k)
END DO
END DO
END DO
END IF
RETURN
END SUBROUTINE intrpy3d
SUBROUTINE intrpz3d(ain,nx,is,ie, ny,js,je, nz,ks,ke, wgtz,kz, & 1
intrpvopt,aout,nz1,ks1,ke1)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
! Perform interpolation in the third dimension
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 4/1/1999.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,is,ie, ny,js,je, nz,ks,ke
INTEGER :: nz1,ks1,ke1
REAL :: ain (nx,ny,nz)
REAL :: aout(nx,ny,nz1)
REAL :: wgtz(nx,ny,nz1,3)
INTEGER :: kz(nx,ny,nz1)
INTEGER :: intrpvopt
INTEGER :: i,j,k
IF(intrpvopt == 1) THEN
DO k=ks1,ke1
DO i=is ,ie
DO j=js ,je
aout(i,j,k)= wgtz(i,j,k,1) *ain(i,j,kz(i,j,k) ) &
+(1.0-wgtz(i,j,k,1))*ain(i,j,kz(i,j,k)+1)
END DO
END DO
END DO
ELSE
DO k=ks1,ke1
DO i=is ,ie
DO j=js ,je
aout(i,j,k)=wgtz(i,j,k,1)*ain(i,j,kz(i,j,k)-1) &
+wgtz(i,j,k,2)*ain(i,j,kz(i,j,k) ) &
+wgtz(i,j,k,3)*ain(i,j,kz(i,j,k)+1)
END DO
END DO
END DO
END IF
RETURN
END SUBROUTINE intrpz3d
SUBROUTINE intrpxy3d(ain,nx,is,ie, ny,js,je, nz,ks,ke, & 53,8
wgtx,ix,wgty,jy,intrphopt, &
aout,nx1,is1,ie1, ny1,js1,je1, &
temx1yz)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
! Perform interpolation in the first and second dimensions
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 4/1/1999.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,is,ie, ny,js,je, nz,ks,ke
INTEGER :: nx1,is1,ie1, ny1,js1,je1
REAL :: ain (nx ,ny ,nz)
REAL :: aout(nx1,ny1,nz)
REAL :: wgtx(nx1,3),wgty(ny1,3)
INTEGER :: ix(nx1),jy(ny1)
INTEGER :: intrphopt
REAL :: temx1yz(nx1,ny,nz)
CALL intrpx3d
(ain,nx,is,ie, ny,js,je, nz,ks,ke, &
wgtx,ix,intrphopt, temx1yz,nx1,is1,ie1)
CALL intrpy3d
(temx1yz,nx1,is1,ie1, ny,js,je, nz,ks,ke, &
wgty,jy,intrphopt, aout, ny1,js1,je1)
RETURN
END SUBROUTINE intrpxy3d
SUBROUTINE intrpxyz3d(ain,nx,is,ie, ny,js,je, nz,ks,ke, & 22,2
wgtx,ix,wgty,jy,wgtz,kz, &
intrphopt,intrpvopt, &
aout,nx1,is1,ie1, ny1,js1,je1, nz1,ks1,ke1, &
temx1yz,temx1y1z)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
! Perform interpolation in all three dimensions
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 4/1/1999.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,is,ie, ny,js,je, nz,ks,ke
INTEGER :: nx1,is1,ie1, ny1,js1,je1, nz1,ks1,ke1
REAL :: ain (nx ,ny ,nz)
REAL :: aout(nx1,ny1,nz1)
REAL :: wgtx(nx1,3),wgty(ny1,3),wgtz(nx1,ny1,nz1,3)
INTEGER :: ix(nx1),jy(ny1),kz(nx1,ny1,nz1)
INTEGER :: intrphopt
INTEGER :: intrpvopt
REAL :: temx1yz (nx1,ny ,nz)
REAL :: temx1y1z(nx1,ny1,nz)
CALL intrpxy3d
(ain, nx,is,ie, ny,js,je, nz,ks,ke, &
wgtx,ix,wgty,jy,intrphopt, &
temx1y1z, nx1,is1,ie1, ny1,js1,je1, temx1yz)
CALL intrpz3d
(temx1y1z, nx1,is1,ie1, ny1,js1,je1, nz,ks,ke, &
wgtz,kz,intrpvopt, &
aout, nz1,ks1,ke1)
RETURN
END SUBROUTINE intrpxyz3d
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE INTRP_SOIL_Real ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE intrp_soil_real(nx,ny,nx1,ny1,nstyp,nstyp1,nzsoil,wx,wy,ix,jy, & 3
tsoil,soiltyp,stypfrct,tsoil1)
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Interpolate soil properties onto another grid.
! real variables used in soil model: tsoil, qsoil,wetcanp
!
! NOTE: This should be used with the old ARPS Force-Restore Soil
! Model. When using the new OUSoil model, use intrpsoil3d_avg
! or intrpsoil3d_pst. (Eric Kemp, 18 June 2002).
!
! Based on intrp_soil
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Hu
! 2006/08/29
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx
! ny
! nx1
! ny1
! xw Weight factor in x-direction
! yw Weight factor in y-direction
! ix Old grid index (lower left) for new grid point
! jy Old grid index (lower left) for new grid point
! nstyp Number of soil types on original grid
! nstyp1 Number of soil types to use on new grid
! tsoil Deep soil temperature in data set (K)
! soiltyp Soil type in data set
! stypfrct Soil type fraction
!
! OUTPUT:
!
! tsoil1 Deep soil temperature in data set (K)
! soiltyp1 Soil type in data set
! stypfrct1 Soil type fraction
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nx,ny,nx1,ny1
INTEGER :: nstyp,nstyp1
INTEGER :: nzsoil
REAL :: wx(nx1) ! Weight factor in x-direction
REAL :: wy(ny1) ! Weight factor in y-direction
INTEGER :: ix(nx1) ! Old grid index (lower left) for new grid point
INTEGER :: jy(ny1) ! Old grid index (lower left) for new grid point
REAL :: tsoil (nx,ny,nzsoil,0:nstyp) ! Deep soil temperature (K)
INTEGER :: soiltyp(nx,ny,nstyp) ! Soil type in model domain
REAL :: stypfrct(nx,ny,nstyp)
REAL :: tsoil1 (nx1,ny1,nzsoil,0:nstyp1) ! Deep soil temperature (K)
INTEGER :: soiltyp1(nx1,ny1,nstyp1) ! Soil type in model domain
REAL :: stypfrct1(nx1,ny1,nstyp1)
LOGICAL :: warned=.FALSE.
!-----------------------------------------------------------------------
!
! Include file:
!
!-----------------------------------------------------------------------
INCLUDE 'arpssfc.inc'
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
! Arrays start at zero in case no soil type defined (i.e. soiltyp=0)
REAL :: tsoil1sum (0:nsoiltyp) ! Deep soil temperature (K)
REAL :: stypfrct1sum(0:nsoiltyp) ! Frction of soil type
INTEGER :: i,j,i1,j1,is,ii
REAL :: weight,maxweight,frctot
REAL :: totweight(0:nsoiltyp)
INTEGER :: maxtype
INTEGER :: soiltype
REAL :: inverse
INTEGER :: kk
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
tsoil1 (:,:,:,:) = 0
DO kk=1,nzsoil
soiltyp1 (:,:,:) = 0
stypfrct1(:,:,:) = 0
IF (nstyp == 1) THEN
stypfrct = 1 ! make sure stypfrct is set for nstyp=1
! copy level 0 to level 1 if level 1 is undefined:
IF (tsoil(1,1,kk,1) <= 0) tsoil (:,:,kk,1) = tsoil (:,:,kk,0)
ENDIF
DO j1 = 1,ny1-1 ! desired grid
DO i1 = 1,nx1-1
tsoil1sum = 0.
stypfrct1sum = 0.
maxweight = 0.
totweight = 0.
DO j = jy(j1), jy(j1)+1 ! external input grid
DO i = ix(i1), ix(i1)+1
weight = wx(i1)*(1.+ix(i1)-i)*wy(j1) *(1+jy(j1)-j)&
+ (1.-wx(i1))*(i-ix(i1) )*wy(j1) *(1+jy(j1)-j)&
+ wx(i1)*(1.+ix(i1)-i)*(1.-wy(j1))*(j-jy(j1)) &
+ (1.-wx(i1))*(i-ix(i1) )*(1.-wy(j1))*(j-jy(j1))
DO is=1,nstyp
IF (stypfrct(i,j,is) > 0) THEN
soiltype = soiltyp(i,j,is)
IF (soiltype < 1 .or. soiltype > nsoiltyp) soiltype = 0
stypfrct1sum(soiltyp(i,j,is)) = stypfrct1sum(soiltyp(i,j,is)) &
+ weight*stypfrct(i,j,is)
totweight(soiltyp(i,j,is)) = totweight(soiltyp(i,j,is)) + weight
tsoil1sum(soiltyp(i,j,is)) = tsoil1sum(soiltyp(i,j,is)) &
+ weight*stypfrct(i,j,is)*tsoil(i,j,kk,is)
END IF
END DO
END DO
END DO
! get the nstyp1 largest weighted soil types
DO is = 1,nstyp1
maxtype = -1
maxweight = 0.
DO ii = 0,nsoiltyp
IF (stypfrct1sum(ii) > maxweight) THEN
maxweight = stypfrct1sum(ii)
maxtype = ii
END IF
END DO
IF (maxtype /= -1) THEN
soiltyp1(i1,j1,is) = maxtype
inverse = 1./stypfrct1sum(maxtype)
tsoil1(i1,j1,kk,is) = tsoil1sum(maxtype) * inverse
IF (nstyp /= 1) THEN
stypfrct1(i1,j1,is)= stypfrct1sum(maxtype)/totweight(maxtype)
ELSE
stypfrct1(i1,j1,is)= stypfrct1sum(maxtype)
END IF
!wjm
stypfrct1sum(maxtype) = 0.
ELSE
IF (is == 1) THEN
IF (.NOT. warned) THEN
WRITE (6,*) 'INTRP_SOIL: WARNING, no soil type found, ', &
'variables not assigned!'
warned = .TRUE.
END IF
ELSE
stypfrct1(i1,j1,is) = 0.
ENDIF
ENDIF
END DO
! renormalize
frctot = 0.
DO is = 1,nstyp1
frctot = frctot + stypfrct1(i1,j1,is)
END DO
IF (frctot /= 0) THEN
inverse = 1.0 / frctot
DO is = 1,nstyp1
stypfrct1(i1,j1,is) = stypfrct1(i1,j1,is) * inverse
END DO
ELSE
stypfrct1(i1,j1,1) = 1.
IF (nstyp1 .gt. 1) stypfrct1(i1,j1,2:nstyp1) = 0.
END IF
tsoil1(i1,j1,kk,0) = 0.
DO is = 1,nstyp1
tsoil1(i1,j1,kk,0) = tsoil1(i1,j1,kk,0) &
+ stypfrct1(i1,j1,is)*tsoil1(i1,j1,kk,is)
END DO
END DO
END DO
ENDDO ! kk
END SUBROUTINE intrp_soil_real
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE INTRP_SOIL_int ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
SUBROUTINE intrp_soil_int(nx,ny,nx1,ny1,nstyp,nstyp1,wx,wy,ix,jy, & 1
soiltyp,stypfrct,vegtyp, &
soiltyp1,stypfrct1,vegtyp1)
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Interpolate soil properties onto another grid. For soiltyp, stypfrct
! and vegtyp only
!
! NOTE: This should be used with the old ARPS Force-Restore Soil
! Model. When using the new OUSoil model, use intrpsoil3d_avg
! or intrpsoil3d_pst. (Eric Kemp, 18 June 2002).
!
! based on intrp_soil
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Hu
! 2006/08/29
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx
! ny
! nx1
! ny1
! xw Weight factor in x-direction
! yw Weight factor in y-direction
! ix Old grid index (lower left) for new grid point
! jy Old grid index (lower left) for new grid point
! nstyp Number of soil types on original grid
! nstyp1 Number of soil types to use on new grid
! soiltyp Soil type in data set
! stypfrct Soil type fraction
! vegtyp Vegetation type in data set
!
! OUTPUT:
!
! soiltyp1 Soil type in data set
! stypfrct1 Soil type fraction
! vegtyp1 Vegetation type in data set
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nx,ny,nx1,ny1
INTEGER :: nstyp,nstyp1
REAL :: wx(nx1) ! Weight factor in x-direction
REAL :: wy(ny1) ! Weight factor in y-direction
INTEGER :: ix(nx1) ! Old grid index (lower left) for new grid point
INTEGER :: jy(ny1) ! Old grid index (lower left) for new grid point
INTEGER :: soiltyp(nx,ny,nstyp) ! Soil type in model domain
REAL :: stypfrct(nx,ny,nstyp)
INTEGER :: vegtyp(nx,ny)
INTEGER :: soiltyp1(nx1,ny1,nstyp1) ! Soil type in model domain
REAL :: stypfrct1(nx1,ny1,nstyp1)
INTEGER :: vegtyp1(nx1,ny1)
LOGICAL :: warned=.FALSE.
!-----------------------------------------------------------------------
!
! Include file:
!
!-----------------------------------------------------------------------
INCLUDE 'arpssfc.inc'
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
! Arrays start at zero in case no soil type defined (i.e. soiltyp=0)
REAL :: stypfrct1sum(0:nsoiltyp) ! Frction of soil type
INTEGER :: i,j,i1,j1,is,ii
REAL :: weight,maxweight,frctot
REAL :: totweight(0:nsoiltyp)
INTEGER :: maxtype
INTEGER :: soiltype
REAL :: inverse
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
soiltyp1 (:,:,:) = 0
stypfrct1(:,:,:) = 0
vegtyp1(:,:) = 0
DO j1 = 1,ny1-1 ! desired grid
DO i1 = 1,nx1-1
stypfrct1sum = 0.
maxweight = 0.
totweight = 0.
vegtyp1(i1,j1) = 0
DO j = jy(j1), jy(j1)+1 ! external input grid
DO i = ix(i1), ix(i1)+1
weight = wx(i1)*(1.+ix(i1)-i)* wy(j1) *(1+jy(j1)-j) &
+ (1.-wx(i1))*(i-ix(i1) )* wy(j1) *(1+jy(j1)-j) &
+ wx(i1)*(1.+ix(i1)-i)*(1.-wy(j1))*(j-jy(j1)) &
+ (1.-wx(i1))*(i-ix(i1) )*(1.-wy(j1))*(j-jy(j1))
DO is=1,nstyp
IF (stypfrct(i,j,is) > 0) THEN
soiltype = soiltyp(i,j,is)
IF (soiltype < 1 .or. soiltype > nsoiltyp) soiltype = 0
stypfrct1sum(soiltyp(i,j,is)) = stypfrct1sum(soiltyp(i,j,is)) &
+ weight*stypfrct(i,j,is)
totweight(soiltyp(i,j,is)) = totweight(soiltyp(i,j,is)) + weight
END IF
END DO
! use the vegtyp of the closest point
IF (weight > maxweight) THEN
vegtyp1(i1,j1) = vegtyp(i,j)
maxweight = weight
END IF
!!use most popular vegtyp weighted by distance
!IF (vegtyp(i,j) > 0 .and. vegtyp(i,j) <= nvegtyp) THEN
! vegtyp1sum(vegtyp(i,j)) = vegtyp1sum(vegtyp(i,j)) + weight
!END IF
END DO
END DO
! get the nstyp1 largest weighted soil types
DO is = 1,nstyp1
maxtype = -1
maxweight = 0.
DO ii = 0,nsoiltyp
IF (stypfrct1sum(ii) > maxweight) THEN
maxweight = stypfrct1sum(ii)
maxtype = ii
END IF
END DO
IF (maxtype /= -1) THEN
soiltyp1(i1,j1,is) = maxtype
inverse = 1./stypfrct1sum(maxtype)
IF (nstyp /= 1) THEN
stypfrct1(i1,j1,is)= stypfrct1sum(maxtype)/totweight(maxtype)
ELSE
stypfrct1(i1,j1,is)= stypfrct1sum(maxtype)
END IF
!wjm
stypfrct1sum(maxtype) = 0.
ELSE
IF (is == 1) THEN
IF (.NOT. warned) THEN
WRITE (6,*) 'INTRP_SOIL: WARNING, no soil type found, ', &
'variables not assigned!'
warned = .TRUE.
END IF
ELSE
stypfrct1(i1,j1,is) = 0.
ENDIF
ENDIF
END DO
! renormalize
frctot = 0.
DO is = 1,nstyp1
frctot = frctot + stypfrct1(i1,j1,is)
END DO
IF (frctot /= 0) THEN
inverse = 1.0 / frctot
DO is = 1,nstyp1
stypfrct1(i1,j1,is) = stypfrct1(i1,j1,is) * inverse
END DO
ELSE
stypfrct1(i1,j1,1) = 1.
IF (nstyp1 .gt. 1) stypfrct1(i1,j1,2:nstyp1) = 0.
END IF
END DO
END DO
END SUBROUTINE intrp_soil_int