!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE MKARPSVAR ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE mkarpsvar(nx_ext,ny_ext,nz_ext,nx,ny,nz,lvlprof, & 13,1
iorder,iprtopt,intropt,iloc,jloc,x_ext,y_ext, &
hgtext,zext,x2d,y2d,za,varext, &
zsnd,varsnd,arpsbar,arpsprt, &
dxfld,dyfld,rdxfld,rdyfld, &
slopey,alphay,betay, &
tem_ext)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Take data from external file on pressure levels and interpolate in
! the horizontal and vertical to ARPS height levels and horizontal
! locations. Then, form the ARPS mean and perturbation quantities.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! 5/01/1994.
!
! MODIFICATION HISTORY:
!
! 11/21/1994 (KB)
! Added full documentation.
!
! 2000/08/16 (Gene Bassett)
! Added intropt.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx_ext Number of grid points in the x-direction (east/west)
! for the external grid
! ny_ext Number of grid points in the y-direction (north/south)
! for the external grid
! nz_ext Number of grid points in the vertical
! for the external grid
!
! nx Number of grid points in the x-direction (east/west)
! for the ARPS grid
! ny Number of grid points in the y-direction (north/south)
! for the ARPS grid
! nz Number of grid points in the vertical
! for the ARPS grid
!
! iorder order of polynomial for interpolation (1, 2 or 3)
! intropt Option indicating to interpolate perturbation or total
! variables:
! = 1 Interpolate perturbation variables and add to base
! sounding (default);
! = 2 Interploate total variables.
! iprtopt Flag for producing a perturbation variable
! iprtopt = 1 Produce mean and perturbation field
! iprtopt = 0 Produce mean and total field
!
! iloc x-index location of ARPS grid point in the external array
! jloc y-index location of ARPS grid point in the external array
!
! x2d x coordinate of ARPS grid point in external coordinate
! y2d x coordinate of ARPS grid point in external coordinate
!
! zext Array of heights of the external grid
! za Array of heights of ARPS physical heights
! zsnd 1-D array of height representing a mean sounding
! over domain
! varsnd 1-D array of variable representing a mean sounding
! over domain
!
! OUTPUT:
!
! arpsbar 3-D array of mean field on ARPS levels
! arpsprt 3-D array of perturbation (iprtopt=1) or
! total (iprtopt=0) variable at ARPS grid locations
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
!-----------------------------------------------------------------------
!
! Input variables
!
!-----------------------------------------------------------------------
!
INTEGER :: nx_ext,ny_ext,nz_ext ! external grid dimensions
INTEGER :: nx,ny,nz ! ARPS grid dimensions
INTEGER :: lvlprof ! levels in mean sounding
INTEGER :: iorder ! interpolating polynomial order
INTEGER :: intropt ! interpolation option
INTEGER :: iprtopt ! perturbation generation flag
INTEGER :: iloc(nx,ny) ! external x-index of ARPS grid point
INTEGER :: jloc(nx,ny) ! external y-index of ARPS grid point
REAL :: x_ext(nx_ext) ! external x-coord
REAL :: y_ext(ny_ext) ! external y-coord
REAL :: hgtext(nx_ext,ny_ext,nz_ext) ! heights of external levels
REAL :: zext(nx,ny,nz_ext) ! heights of external levels
! interpolated to ARPS grid locs
REAL :: x2d(nx,ny)
REAL :: y2d(nx,ny)
REAL :: za(nx,ny,nz) ! ARPS physical heights
REAL :: varext(nx_ext,ny_ext,nz_ext) ! variable to convert
REAL :: zsnd(lvlprof) ! 1-D array of level heights
REAL :: varsnd(lvlprof) ! 1-D array of level-means
!
!-----------------------------------------------------------------------
!
! Output variables
!
!-----------------------------------------------------------------------
!
REAL :: arpsbar( nx, ny, nz) ! 3-D array of level-means
REAL :: arpsprt( nx, ny, nz) ! Output array, perturnbation variable
! or total variable (see iprtopt)
!
!-----------------------------------------------------------------------
!
! Temporary work arrays
!
!-----------------------------------------------------------------------
!
REAL :: dxfld(nx_ext)
REAL :: dyfld(ny_ext)
REAL :: rdxfld(nx_ext)
REAL :: rdyfld(ny_ext)
REAL :: slopey(nx_ext,ny_ext,nz_ext)
REAL :: alphay(nx_ext,ny_ext,nz_ext)
REAL :: betay(nx_ext,ny_ext,nz_ext)
REAL :: tem_ext(nx_ext,ny_ext,nz_ext)
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k,ia,ja,ka,kl
REAL :: wlow
REAL :: topprt,botprt,arpstop,arpsbot
REAL :: pntint2d
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Subtract horizontal mean from external fields.
!
!-----------------------------------------------------------------------
!
IF (intropt == 1) THEN
DO j=1,ny_ext
DO i=1,nx_ext
DO k=1,nz_ext
DO kl=2,lvlprof-1
IF(zsnd(kl) > hgtext(i,j,k)) EXIT
END DO
! 11 CONTINUE
wlow=(zsnd(kl)-hgtext(i,j,k))/ &
(zsnd(kl)-zsnd(kl-1))
tem_ext(i,j,k)=varext(i,j,k)- &
((1.-wlow)*varsnd(kl) + wlow*varsnd(kl-1))
END DO
END DO
END DO
ELSE
tem_ext = varext
ENDIF
!
!-----------------------------------------------------------------------
!
! Compute derivative terms
!
!-----------------------------------------------------------------------
!
CALL setdrvy
(nx_ext,ny_ext,nz_ext, &
1,nx_ext,1,ny_ext,1,nz_ext, &
dyfld,rdyfld,tem_ext, &
slopey,alphay,betay)
!
!-----------------------------------------------------------------------
!
! Loop through all ARPS grid points
!
!-----------------------------------------------------------------------
!
DO ja=1,ny
DO ia=1,nx
!
!-----------------------------------------------------------------------
!
! Interpolate from the mean sounding to get arpsbar
!
!-----------------------------------------------------------------------
!
DO ka=1,nz
DO kl=2,lvlprof-1
IF(zsnd(kl) > za(ia,ja,ka)) EXIT
END DO
! 51 CONTINUE
wlow=(zsnd(kl)-za(ia,ja,ka))/ &
(zsnd(kl)-zsnd(kl-1))
arpsbar(ia,ja,ka)= &
(1.-wlow)*varsnd(kl) + wlow*varsnd(kl-1)
END DO
!
!-----------------------------------------------------------------------
!
! Find vertical location
! and interpolate in vertical between two horizontal
! interpolations on the external grid surfaces.
!
! Extrapolation is done by assuming the perturbation
! from mean is constant.
!
!-----------------------------------------------------------------------
!
botprt=pntint2d(nx_ext,ny_ext, &
2,nx_ext-1,2,ny_ext-1, &
iorder,x_ext,y_ext,x2d(ia,ja),y2d(ia,ja), &
iloc(ia,ja),jloc(ia,ja),tem_ext(1,1,1), &
dxfld,dyfld,rdxfld,rdyfld, &
slopey(1,1,1),alphay(1,1,1),betay(1,1,1))
topprt=pntint2d(nx_ext,ny_ext, &
2,nx_ext-1,2,ny_ext-1, &
iorder,x_ext,y_ext,x2d(ia,ja),y2d(ia,ja), &
iloc(ia,ja),jloc(ia,ja),tem_ext(1,1,nz_ext), &
dxfld,dyfld,rdxfld,rdyfld, &
slopey(1,1,nz_ext), &
alphay(1,1,nz_ext),betay(1,1,nz_ext))
DO ka=1,nz
IF(za(ia,ja,ka) < zext(ia,ja,1)) THEN
arpsprt(ia,ja,ka)=botprt
ELSE IF(za(ia,ja,ka) > zext(ia,ja,nz_ext)) THEN
arpsprt(ia,ja,ka)=topprt
ELSE
DO kl=2,nz_ext-1
IF(zext(ia,ja,kl) > za(ia,ja,ka)) EXIT
END DO
! 351 CONTINUE
wlow=(zext(ia,ja,kl)- za(ia,ja,ka))/ &
(zext(ia,ja,kl)-zext(ia,ja,kl-1))
arpstop=pntint2d(nx_ext,ny_ext, &
2,nx_ext-1,2,ny_ext-1, &
iorder,x_ext,y_ext,x2d(ia,ja),y2d(ia,ja), &
iloc(ia,ja),jloc(ia,ja),tem_ext(1,1,kl), &
dxfld,dyfld,rdxfld,rdyfld, &
slopey(1,1,kl), &
alphay(1,1,kl),betay(1,1,kl))
arpsbot=pntint2d(nx_ext,ny_ext, &
2,nx_ext-1,2,ny_ext-1, &
iorder,x_ext,y_ext,x2d(ia,ja),y2d(ia,ja), &
iloc(ia,ja),jloc(ia,ja),tem_ext(1,1,kl-1), &
dxfld,dyfld,rdxfld,rdyfld, &
slopey(1,1,kl-1), &
alphay(1,1,kl-1),betay(1,1,kl-1))
arpsprt(ia,ja,ka)=(1.-wlow)*arpstop+wlow*arpsbot
END IF
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! If total quantity, rather than perturbation quantity desired,
! add the level mean to the interpolated perturbation variable
! at each grid point.
!
!-----------------------------------------------------------------------
!
IF(iprtopt == 0 .and. intropt == 1) THEN
arpsprt = arpsprt + arpsbar
ELSE IF(iprtopt == 1 .and. intropt == 2) THEN
arpsprt = arpsprt - arpsbar
END IF
!
RETURN
END SUBROUTINE mkarpsvar
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE MKARPSVLZ ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE mkarpsvlz(nx_ext,ny_ext,nz_ext,nx,ny,nz,lvlprof, & 1,1
iorder,iprtopt,intropt,iloc,jloc,x_ext,y_ext, &
hgtext,zext,x2d,y2d,za,varext, &
zsnd,vlnsnd,arpsbar,arpsprt, &
dxfld,dyfld,rdxfld,rdyfld, &
slopey,alphay,betay, &
tem_ext)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Take data from external file on pressure levels and interpolate in
! the horizontal and vertical to ARPS height levels and horizontal
! locations. Then, form the ARPS mean and perturbation quantities.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
! 5/01/1994.
!
! MODIFICATION HISTORY:
!
! 11/21/1994 (KB)
! Added full documentation.
!
! 2000/08/16 (Gene Bassett)
! Added intropt.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx_ext Number of grid points in the x-direction (east/west)
! for the external grid
! ny_ext Number of grid points in the y-direction (north/south)
! for the external grid
! nz_ext Number of grid points in the vertical
! for the external grid
!
! nx Number of grid points in the x-direction (east/west)
! for the ARPS grid
! ny Number of grid points in the y-direction (north/south)
! for the ARPS grid
! nz Number of grid points in the vertical
! for the ARPS grid
!
! iorder order of polynomial for interpolation (1, 2 or 3)
! intropt Option indicating to interpolate perturbation or total
! variables:
! = 1 Interpolate perturbation variables and add to base
! sounding (default);
! = 2 Interploate total variables.
! iprtopt Flag for producing a perturbation variable
! iprtopt = 1 Produce mean and perturbation field
! iprtopt = 0 Produce mean and total field
!
! iloc x-index location of ARPS grid point in the external array
! jloc y-index location of ARPS grid point in the external array
!
! x2d x coordinate of ARPS grid point in external coordinate
! y2d x coordinate of ARPS grid point in external coordinate
!
! zext Array of heights of the external grid
! za Array of heights of ARPS physical heights
! zsnd 1-D array of height representing a mean sounding
! over domain
! vlnsnd 1-D array of variable representing the log of the
! mean sounding of the variable.
!
! OUTPUT:
!
! arpsbar 3-D array of mean field on ARPS levels
! arpsprt 3-D array of perturbation (iprtopt=1) or
! total (iprtopt=0) variable at ARPS grid locations
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
!-----------------------------------------------------------------------
!
! Input variables
!
!-----------------------------------------------------------------------
!
INTEGER :: nx_ext,ny_ext,nz_ext ! external grid dimensions
INTEGER :: nx,ny,nz ! ARPS grid dimensions
INTEGER :: lvlprof ! levels in mean sounding
INTEGER :: iorder ! interpolating polynomial order
INTEGER :: intropt ! interpolation option
INTEGER :: iprtopt ! perturbation generation flag
INTEGER :: iloc(nx,ny) ! external x-index of ARPS grid point
INTEGER :: jloc(nx,ny) ! external y-index of ARPS grid point
REAL :: x_ext(nx_ext) ! external x-coord
REAL :: y_ext(ny_ext) ! external y-coord
REAL :: hgtext(nx_ext,ny_ext,nz_ext) ! heights of external levels
REAL :: zext(nx,ny,nz_ext) ! heights of external levels
! interpolated to ARPS grid locs
REAL :: x2d(nx,ny)
REAL :: y2d(nx,ny)
REAL :: za(nx,ny,nz) ! ARPS physical heights
REAL :: varext(nx_ext,ny_ext,nz_ext) ! variable to convert
REAL :: zsnd(lvlprof) ! 1-D array of level heights
REAL :: vlnsnd(lvlprof) ! 1-D array of level-means
!
!-----------------------------------------------------------------------
!
! Output variables
!
!-----------------------------------------------------------------------
!
REAL :: arpsbar( nx, ny, nz) ! 3-D array of level-means
REAL :: arpsprt( nx, ny, nz) ! Output array, perturnbation variable
! or total variable (see iprtopt)
!
!-----------------------------------------------------------------------
!
! Temporary work arrays
!
!-----------------------------------------------------------------------
!
REAL :: dxfld(nx_ext)
REAL :: dyfld(ny_ext)
REAL :: rdxfld(nx_ext)
REAL :: rdyfld(ny_ext)
REAL :: slopey(nx_ext,ny_ext,nz_ext)
REAL :: alphay(nx_ext,ny_ext,nz_ext)
REAL :: betay(nx_ext,ny_ext,nz_ext)
REAL :: tem_ext(nx_ext,ny_ext,nz_ext)
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k,ia,ja,ka,kl
REAL :: wlow
REAL :: topprt,botprt,arpstop,arpsbot
REAL :: pntint2d
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Subtract horizontal mean from external fields.
!
!-----------------------------------------------------------------------
!
IF (intropt == 1) THEN
DO j=1,ny_ext
DO i=1,nx_ext
DO k=1,nz_ext
DO kl=2,lvlprof-1
IF(zsnd(kl) > hgtext(i,j,k)) EXIT
END DO
! 11 CONTINUE
wlow=(zsnd(kl)-hgtext(i,j,k))/ &
(zsnd(kl)-zsnd(kl-1))
tem_ext(i,j,k)=varext(i,j,k)-EXP( &
((1.-wlow)*vlnsnd(kl) + wlow*vlnsnd(kl-1)))
END DO
END DO
END DO
ELSE ! intropt=2
tem_ext = LOG(varext)
ENDIF
!
!-----------------------------------------------------------------------
!
! Compute derivative terms
!
!-----------------------------------------------------------------------
!
CALL setdrvy
(nx_ext,ny_ext,nz_ext, &
1,nx_ext,1,ny_ext,1,nz_ext, &
dyfld,rdyfld,tem_ext, &
slopey,alphay,betay)
!
!-----------------------------------------------------------------------
!
! Loop through all ARPS grid points
!
!-----------------------------------------------------------------------
!
DO ja=1,ny
DO ia=1,nx
!
!-----------------------------------------------------------------------
!
! Interpolate from the mean sounding to get arpsbar
!
!-----------------------------------------------------------------------
!
DO ka=1,nz
DO kl=2,lvlprof-1
IF(zsnd(kl) > za(ia,ja,ka)) EXIT
END DO
! 51 CONTINUE
wlow=(zsnd(kl)-za(ia,ja,ka))/ &
(zsnd(kl)-zsnd(kl-1))
arpsbar(ia,ja,ka)=EXP( &
(1.-wlow)*vlnsnd(kl) + wlow*vlnsnd(kl-1))
END DO
!
!-----------------------------------------------------------------------
!
! Find vertical location
! and interpolate in vertical between two horizontal
! interpolations on the external grid surfaces.
!
! Extrapolation is done by assuming the perturbation
! from mean is constant.
!
!-----------------------------------------------------------------------
!
botprt=pntint2d(nx_ext,ny_ext, &
2,nx_ext-1,2,ny_ext-1, &
iorder,x_ext,y_ext,x2d(ia,ja),y2d(ia,ja), &
iloc(ia,ja),jloc(ia,ja),tem_ext(1,1,1), &
dxfld,dyfld,rdxfld,rdyfld, &
slopey(1,1,1),alphay(1,1,1),betay(1,1,1))
topprt=pntint2d(nx_ext,ny_ext, &
2,nx_ext-1,2,ny_ext-1, &
iorder,x_ext,y_ext,x2d(ia,ja),y2d(ia,ja), &
iloc(ia,ja),jloc(ia,ja),tem_ext(1,1,nz_ext), &
dxfld,dyfld,rdxfld,rdyfld, &
slopey(1,1,nz_ext), &
alphay(1,1,nz_ext),betay(1,1,nz_ext))
DO ka=1,nz
IF(za(ia,ja,ka) < zext(ia,ja,1)) THEN
arpsprt(ia,ja,ka)=botprt
ELSE IF(za(ia,ja,ka) > zext(ia,ja,nz_ext)) THEN
arpsprt(ia,ja,ka)=topprt
ELSE
DO kl=2,nz_ext-1
IF(zext(ia,ja,kl) > za(ia,ja,ka)) EXIT
END DO
! 351 CONTINUE
wlow=(zext(ia,ja,kl)- za(ia,ja,ka))/ &
(zext(ia,ja,kl)-zext(ia,ja,kl-1))
arpstop=pntint2d(nx_ext,ny_ext, &
2,nx_ext-1,2,ny_ext-1, &
iorder,x_ext,y_ext,x2d(ia,ja),y2d(ia,ja), &
iloc(ia,ja),jloc(ia,ja),tem_ext(1,1,kl), &
dxfld,dyfld,rdxfld,rdyfld, &
slopey(1,1,kl), &
alphay(1,1,kl),betay(1,1,kl))
arpsbot=pntint2d(nx_ext,ny_ext, &
2,nx_ext-1,2,ny_ext-1, &
iorder,x_ext,y_ext,x2d(ia,ja),y2d(ia,ja), &
iloc(ia,ja),jloc(ia,ja),tem_ext(1,1,kl-1), &
dxfld,dyfld,rdxfld,rdyfld, &
slopey(1,1,kl-1), &
alphay(1,1,kl-1),betay(1,1,kl-1))
arpsprt(ia,ja,ka)=(1.-wlow)*arpstop+wlow*arpsbot
END IF
END DO
END DO
END DO
IF(intropt == 2) THEN
arpsprt = EXP(arpsprt)
ENDIF
!
!-----------------------------------------------------------------------
!
! If total quantity, rather than perturbation quantity desired,
! add the level mean to the interpolated perturbation variable
! at each grid point.
!
!-----------------------------------------------------------------------
!
IF(iprtopt == 0 .and. intropt == 1) THEN
arpsprt = arpsprt + arpsbar
ELSE IF(iprtopt == 1 .and. intropt == 2) THEN
arpsprt = arpsprt - arpsbar
END IF
!
RETURN
END SUBROUTINE mkarpsvlz
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE MKARPS2D ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE mkarps2d (nx_ext,ny_ext,nx,ny, & 1,1
iorder,iloc,jloc,x_ext,y_ext, &
x2d,y2d,varext,arpsvar, &
dxfld,dyfld,rdxfld,rdyfld, &
slopey,alphay,betay, &
tem_ext)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Take 2D surface data from external file and interpolate in
! the horizontal to form the ARPS 2D data set
!
!-----------------------------------------------------------------------
!
! AUTHOR: Fanyou Kong
! 6/10/1997.
!
! MODIFICATION HISTORY:
!
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx_ext Number of grid points in the x-direction (east/west)
! for the external grid
! ny_ext Number of grid points in the y-direction (north/south)
! for the external grid
!
! nx Number of grid points in the x-direction (east/west)
! for the ARPS grid
! ny Number of grid points in the y-direction (north/south)
! for the ARPS grid
!
! iorder order of polynomial for interpolation (1, 2 or 3)
!
! iloc x-index location of ARPS grid point in the external array
! jloc y-index location of ARPS grid point in the external array
!
! x2d x coordinate of ARPS grid point in external coordinate
! y2d x coordinate of ARPS grid point in external coordinate
!
! varext external 2D data
!
! OUTPUT:
!
! arpsvar 2D array of variable at ARPS grid locations
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
!-----------------------------------------------------------------------
!
! Input variables
!
!-----------------------------------------------------------------------
!
INTEGER :: nx_ext,ny_ext ! external grid dimensions
INTEGER :: nx,ny ! ARPS grid dimensions
INTEGER :: iorder ! interpolating polynomial order
INTEGER :: iloc(nx,ny) ! external x-index of ARPS grid point
INTEGER :: jloc(nx,ny) ! external y-index of ARPS grid point
REAL :: x_ext(nx_ext) ! external x-coord
REAL :: y_ext(ny_ext) ! external y-coord
! interpolated to ARPS grid locs
REAL :: x2d(nx,ny)
REAL :: y2d(nx,ny)
REAL :: varext(nx_ext,ny_ext) ! 2D variable to convert
!
!-----------------------------------------------------------------------
!
! Output variables
!
!-----------------------------------------------------------------------
!
REAL :: arpsvar( nx, ny) ! 2-D array of ARPS grid data
!
!-----------------------------------------------------------------------
!
! Temporary work arrays
!
!-----------------------------------------------------------------------
!
REAL :: dxfld(nx_ext)
REAL :: dyfld(ny_ext)
REAL :: rdxfld(nx_ext)
REAL :: rdyfld(ny_ext)
REAL :: slopey(nx_ext,ny_ext)
REAL :: alphay(nx_ext,ny_ext)
REAL :: betay(nx_ext,ny_ext)
REAL :: tem_ext(nx_ext,ny_ext)
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: ia,ja
REAL :: arpsdata
REAL :: pntint2d
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Compute derivative terms
!
!-----------------------------------------------------------------------
!
CALL setdrvy
(nx_ext,ny_ext,1, &
1,nx_ext,1,ny_ext,1,1, &
dyfld,rdyfld,varext, &
slopey,alphay,betay)
!
!-----------------------------------------------------------------------
!
! Loop through all ARPS grid points
!
!-----------------------------------------------------------------------
!
DO ja=1,ny
DO ia=1,nx
!
!-----------------------------------------------------------------------
!
! Horizontal interpolation
!
!-----------------------------------------------------------------------
!
arpsdata=pntint2d(nx_ext,ny_ext, &
2,nx_ext-1,2,ny_ext-1, &
iorder,x_ext,y_ext,x2d(ia,ja),y2d(ia,ja), &
iloc(ia,ja),jloc(ia,ja),varext, &
dxfld,dyfld,rdxfld,rdyfld, &
slopey,alphay,betay)
arpsvar(ia,ja)=arpsdata
END DO
END DO
RETURN
END SUBROUTINE mkarps2d
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE INITSOILEXT ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE initsoilext (nx,ny,nzsoil,nzsoil_ext, nstyp,zpsoil, &
zpsoil_ext,tsoil,tsoil_ext,qsoil,qsoil_ext)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Take soil data from external file and interpolate in
! the vertical to form the ARPS 2D data set profile
!
!-----------------------------------------------------------------------
!
! AUTHOR: Jerry Brotzge
! 05/15/2002
!
! MODIFICATION HISTORY:
!
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! for the ARPS grid
! ny Number of grid points in the y-direction (north/south)
! for the ARPS grid
! nzsoil Number of grid points in the soil
!
! nzsoil_ext Number of grid points in the soil external file
!
! nstyp Number of soil types
!
! zpsoil Physical depth of soil layers (m)
!
! zpsoil_ext Physical depth of external model soil layers (m)
!
! tsoil Soil temperature (K)
!
! qsoil Soil moisture (m**3/m**3)
!
! OUTPUT:
!
! tsoil Soil temperature profile (K)
!
! qsoil Soil moisture profile (m**3/m**3)
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
!
!-----------------------------------------------------------------------
!
! Input/output variables
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k,kk
INTEGER :: nx,ny ! ARPS grid dimensions
INTEGER :: nzsoil ! ARPS soil levels
INTEGER :: nzsoil_ext ! External file soil levels
INTEGER :: nstyp ! Number of soil types
!
REAL :: zpsoil(nx,ny,nzsoil) ! Physical depth of ARPS soil layers
REAL :: zpsoil_ext(nx,ny,nzsoil_ext) ! Physical depth of ext. file soil layers
REAL :: tsoil(nx,ny,nzsoil) ! Soil temperature (K)
REAL :: qsoil(nx,ny,nzsoil) ! Soil moisture (m**3/m**3)
REAL :: tsoil_ext(nx,ny,nzsoil_ext) ! External file soil temperature (K)
REAL :: qsoil_ext(nx,ny,nzsoil_ext) ! External file soil moisture (m**3/m**3)
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
REAL :: dampdepth
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'grid.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
! Vertical interpolation
!
!-----------------------------------------------------------------------
!----------------------------------------------------------------
! Set top boundary condition at level = 1
!-------------------------------------------------------------
DO i=1,nx
DO j=1,ny
tsoil (i,j,1) = tsoil_ext(i,j,1)
qsoil (i,j,1) = qsoil_ext(i,j,1)
DO k=1,nzsoil
zpsoil(i,j,k) = zpsoil(i,j,k) + zrefsfc
END DO
DO kk=1,nzsoil_ext
zpsoil_ext(i,j,kk) = zpsoil_ext(i,j,kk) + zrefsfc
END DO
END DO
END DO
!----------------------------------------------------------------------
! Initialize soil temp and moisture profiles
!----------------------------------------------------------------------
! Note: All soil depths are negative (downward)
DO k=2,nzsoil
DO j=1,ny
DO i=1,nx
dampdepth = -0.15 - zpsoil(i,j,k) !Typical damping depth = 15 cm
DO kk=2,nzsoil_ext
!----------------------------------------------------------------------
! Linear fit between initialized levels below damping depth (15 cm)
!----------------------------------------------------------------------
IF (zpsoil(i,j,k) >= zpsoil_ext(i,j,kk) .AND. &
zpsoil(i,j,k) <= zpsoil_ext(i,j,kk-1)) THEN
tsoil(i,j,k) = tsoil_ext(i,j,kk)+((tsoil_ext(i,j,kk)- &
tsoil_ext(i,j,kk-1))* (zpsoil(i,j,k)/zpsoil_ext(i,j,kk)) )
qsoil(i,j,k) = qsoil_ext(i,j,kk)+((qsoil_ext(i,j,kk)- &
qsoil_ext(i,j,kk-1))* (zpsoil(i,j,k)/zpsoil_ext(i,j,kk)) )
!----------------------------------------------------------------------
! Exponential fit to initialization above damping depth (15 cm)
!----------------------------------------------------------------------
ELSE IF (zpsoil(i,j,k) > zpsoil_ext(i,j,kk)) THEN
IF (zpsoil_ext(i,j,kk) < dampdepth) THEN
IF (zpsoil(i,j,k) >= dampdepth) THEN
tsoil(i,j,k)=tsoil(i,j,k-1)+(tsoil_ext(i,j,kk)-tsoil(i,j,k-1))* &
EXP( - (zpsoil(i,j,k)/dampdepth) )
qsoil(i,j,k)=qsoil(i,j,k-1)+(qsoil_ext(i,j,kk)-qsoil(i,j,k-1))* &
EXP( - (zpsoil(i,j,k)/dampdepth) )
ELSE IF (zpsoil(i,j,k) < dampdepth) THEN
tsoil(i,j,k) = tsoil(i,j,k-1)+((tsoil_ext(i,j,kk)- &
tsoil(i,j,k-1))* (zpsoil(i,j,k)/zpsoil_ext(i,j,kk)) )
qsoil(i,j,k) = qsoil(i,j,k-1)+((qsoil_ext(i,j,kk)- &
qsoil(i,j,k-1))* (zpsoil(i,j,k)/zpsoil_ext(i,j,kk)) )
END IF
ELSE IF (zpsoil_ext(i,j,kk) >= dampdepth) THEN
tsoil(i,j,k)=tsoil(i,j,k-1)+(tsoil_ext(i,j,kk)-tsoil(i,j,k-1))* &
EXP( - (zpsoil(i,j,k)/zpsoil_ext(i,j,kk)) )
qsoil(i,j,k)=qsoil(i,j,k-1)+(qsoil_ext(i,j,kk)-qsoil(i,j,k-1))* &
EXP( - (zpsoil(i,j,k)/zpsoil_ext(i,j,kk)) )
END IF
!----------------------------------------------------------------------
! Set constant below lowest initialized level
!----------------------------------------------------------------------
ELSE IF (zpsoil(i,j,k) < zpsoil_ext(i,j,kk)) THEN
tsoil(i,j,k) = tsoil_ext(i,j,kk)
qsoil(i,j,k) = qsoil_ext(i,j,kk)
END IF
END DO
END DO
END DO
END DO
RETURN
END SUBROUTINE initsoilext