!
!##################################################################
!##################################################################
!###### ######
!###### 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, & 24,5
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
INCLUDE 'bndry.inc'
INCLUDE 'mp.inc'
!
!-----------------------------------------------------------------------
!
! 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)
REAL :: tem1(nx,ny,nz)
!
!-----------------------------------------------------------------------
!
! 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
CALL mpsendrecv2dew
(arpsbar, nx, ny, nz, ebc, wbc, 1, tem1)
CALL mpsendrecv2dew
(arpsprt, nx, ny, nz, ebc, wbc, 1, tem1)
CALL mpsendrecv2dns
(arpsbar, nx, ny, nz, nbc, sbc, 1, tem1)
CALL mpsendrecv2dns
(arpsprt, nx, ny, nz, nbc, sbc, 1, tem1)
!
RETURN
END SUBROUTINE mkarpsvar
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE MKARPSVAR ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE mkarpsvar1(nx_ext,ny_ext,nz_ext,nx,ny,nz,lvlprof, & 4,2
iorder,iprtopt,intropt,iloc,jloc,x_ext,y_ext, &
hgtext,zext,x2d,y2d,za,varext, &
zsnd,varsnd,arpsbar,arpsprt, &
trn_ext,var_h0,h0, &
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.
! Near surface fields are used in low level interpolation.
! (Written from Keith Brewster's original mkarpsvar code)
!
!-----------------------------------------------------------------------
!
! AUTHOR: Fanyou Kong (Modified based on Keith Brewster's mkarpsvar)
! 10/25/2003
!
! MODIFICATION HISTORY:
!
! 05/20/2004 (Yunheng Wang)
! Removed the unused parameter extsfcopt.
!
!-----------------------------------------------------------------------
!
! 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
! trn_ext External grid terrain height
! var_h0 Near surface variable at h0 height above ground
! h0 Near surface variable height (m)
!
! 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
REAL :: trn_ext(nx_ext,ny_ext) ! external terrain height (m)
REAL :: var_h0(nx_ext,ny_ext) ! near surface values
REAL :: h0 ! near surface varaiable height (m)
REAL :: tem_var_h0(nx_ext,ny_ext)
!
!-----------------------------------------------------------------------
!
! 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)
REAL :: tem_1(nx_ext,ny_ext)
REAL :: tem_2(nx_ext,ny_ext)
REAL :: tem_3(nx_ext,ny_ext)
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k,ia,ja,ka,kl,ks
REAL :: wlow,zsfc
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
! processing near surface variable
zsfc=trn_ext(i,j) + h0
DO kl=2,lvlprof-1
IF(zsnd(kl) > zsfc) EXIT
END DO
wlow=(zsnd(kl)-zsfc)/(zsnd(kl)-zsnd(kl-1))
tem_var_h0(i,j)=var_h0(i,j)- &
((1.-wlow)*varsnd(kl) + wlow*varsnd(kl-1))
END DO
END DO
ELSE
tem_ext = varext
tem_var_h0=var_h0
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)
! processing near surface variable
CALL setdrvy
(nx_ext,ny_ext,1, &
1,nx_ext,1,ny_ext,1,1, &
dyfld,rdyfld,tem_var_h0, &
tem_1,tem_2,tem_3)
!
!-----------------------------------------------------------------------
!
! 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))
! find first external layer index (ks) above zsfc
zsfc=0.5*(za(ia,ja,1)+za(ia,ja,2)) + h0
DO ks=1,nz_ext
IF(zext(ia,ja,ks) > zsfc) EXIT ! ks determined
END DO
! vertical loop (arps domain)
DO ka=2,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
IF(za(ia,ja,ka) > zext(ia,ja,nz_ext)) THEN
arpsprt(ia,ja,ka)=topprt
ELSE
DO kl=1,nz_ext-1
IF(zext(ia,ja,kl) > za(ia,ja,ka)) EXIT
END DO
! 351 CONTINUE
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))
IF(za(ia,ja,ka) >= zext(ia,ja,ks)) THEN ! using external layer
wlow=(zext(ia,ja,kl)- za(ia,ja,ka))/ &
(zext(ia,ja,kl)-zext(ia,ja,kl-1))
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))
ELSE ! using near surface value
wlow=(zext(ia,ja,kl)- za(ia,ja,ka))/ &
(zext(ia,ja,kl)-zsfc)
! The line below reflects rare situation when za(ka)<zsfc (occurring for u,v)
IF ( za(ia,ja,ka) <= zsfc ) wlow=1.0
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_var_h0, &
dxfld,dyfld,rdxfld,rdyfld, &
tem_1,tem_2,tem_3)
END IF
arpsprt(ia,ja,ka)=(1.-wlow)*arpstop+wlow*arpsbot
END IF
END DO
! Extropolating to k=1 level
wlow=(za(ia,ja,3)-za(ia,ja,1))/(za(ia,ja,3)-za(ia,ja,2))
arpsprt(ia,ja,1)=wlow*arpsprt(ia,ja,2)+ &
(1.-wlow)*arpsprt(ia,ja,3)
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 mkarpsvar1
!
!##################################################################
!##################################################################
!###### ######
!###### 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, & 2,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, & 34,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 j=1,ny
DO i=1,nx
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