!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE INITIAL ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE initial(mptr,nx,ny,nz,nzsoil,nxndg,nyndg,nzndg,nstyps, & 3,9
exbcbufsz, &
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
udteb,udtwb,udtnb,udtsb,vdteb,vdtwb,vdtnb,vdtsb, &
wdteb,wdtwb,wdtnb,wdtsb,pdteb,pdtwb,pdtnb,pdtsb, &
sdteb,sdtwb,sdtnb,sdtsb, &
ubar,vbar,ptbar,pbar,ptbari,pbari, &
rhostr,rhostri,qvbar,ppi,csndsq, &
x,y,z,zp,zpsoil,hterain,mapfct, &
j1,j2,j3,j3soil,aj3x,aj3y,aj3z,j3inv,j3soilinv, &
trigs1,trigs2,ifax1,ifax2, &
wsave1,wsave2,vwork1,vwork2, &
sinlat, kmh,kmv,rprntl, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsoil,qsoil,wetcanp,snowdpth,ptsfc,qvsfc, &
ptcumsrc,qcumsrc,w0avg,nca,kfraincv, &
cldefi,xland,bmjraincv, &
raing,rainc,prcrate,exbcbuf,bcrlx,radfrc,radsw, &
rnflx,radswnet,radlwin,usflx,vsflx,ptsflx,qvsflx, &
uincr,vincr,wincr,pincr,ptincr,qvincr, &
qcincr,qrincr,qiincr,qsincr,qhincr, &
tem1soil,tem2soil,tem3soil,tem4soil,tem5soil, &
temxy1,tem1,tem2,tem3,tem4,tem5,tem6,tem7, &
tem8,tem9,tem10,tem11,tem12,tem13, &
tem14,tem15,tem16,tem17,tem18,tem19, &
tem20,tem21,tem22,tem23,tem24,tem25,tem26, &
tem1_0,tem2_0,tem3_0)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Initialize the model parameters and variables, including base state
! variables, dependent variables and grid structure.
!
! This is the main driver for model initializations.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 11/5/92.
!
! MODIFICATION HISTORY:
!
! 5/02/92 (M. Xue)
! Added full documentation.
!
! 5/03/92 (M. Xue)
! Further documentation.
!
! 9/14/1992 (M. Xue)
! Different surface drag coefficients defined for momentum, heat and
! moisture.
! Three options included for the Coriolis force calculations.
!
! 2/12/94 (Yuhe Liu)
! Surface data and variables added for surface energy budget model.
!
! 6/10/94 (M. Xue &AS)
! Added call to initpwr.
!
! 02/07/1995 (Yuhe Liu)
! Added a new 2-D permanent array, veg(nx,ny), to the argument list
!
! 08/30/1995 (Yuhe Liu)
! Moved the initialization of external boundary arrays from the
! main program to this subroutine.
!
! 10/31/95 (D. Weber)
! Added trigs1,trigs2,ifax1,ifax2 for use in the upper w-p
! radiation condition.
!
! 1/22/96 (Donghai Wang & Yuhe Liu)
! Added the map projection factor to ARPS governing equations.
!
! 07/22/97 (D. Weber)
! Added wsave1,wsave2,vwork1,vwork2 for use in the even fft version
! of the upper w-p radiation condition (fftopt=2).
!
! 08/01/97 (Zonghui Huo)
! Added Kain-fritsch cumulus parameterization scheme.
!
! 11/05/97 (D. Weber)
! Added temxy5 array for use in the bottom boundary condition for
! pertrubation pressure (hydrostatic).
!
! 11/06/97 (D. Weber)
! Added three additional levels to the mapfct array. The three
! levels (4,5,6) represent the inverse of the first three in order.
! The inverse map factors are computed to improve efficiency.
!
! 4/15/1998 (Donghai Wang)
! Added the source terms to the right hand terms of the qc,qr,qi,qs
! equations due to the K-F cumulus parameterization.
!
! 4/15/1998 (Donghai Wang)
! Added the running average vertical velocity (array w0avg)
! for the K-F cumulus parameterization scheme.
!
! 9/15/1998 (D. Weber)
! Added ptbari, pbari (inverse) for use in optimizing the code.
!
! 8/31/1998 (K. Brewster)
! Added call to ININUDGE to initialize nudging terms.
!
! 11/18/1998 (K. Brewster)
! Changed pibar to ppi (full pi) and moved initialization.
!
! 12/09/1998 (Donghai Wang)
! Added the snow cover.
!
! 07/10/2001 (K. Brewster)
! Added increment arrays to argument list and to call to ininudge.
!
! 03/13/2002 (Eric Kemp)
! Added arrays for WRF BMJ cumulus scheme.
!
! April 2002 (Fanyou Kong)
! Added WRF new Kain-Fritsch (April 2002 version: KF_ETA) scheme
! initialization (lookup table)
! 05/02/2002 (Dan Weber and Jerry Brotzge)
! Added arrays for the new soil model.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! mptr Grid identifier.
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
! nzsoil Number of grid points in the soil model in the -z-direction
!
! nxndg Number of x grid points for nudging (1 or nx)
! nyndg Number of y grid points for nudging (1 or ny)
! nzndg Number of z grid points for nudging (1 or nz)
!
! OUTPUT:
!
! u x-component of velocity at all time levels (m/s).
! v y-component of velocity at all time levels (m/s).
! w z-component of velocity at all time levels (m/s).
! wcont Contravariant vertical velocity (m/s)
! ptprt Perturbation potential temperature at all time levels (K)
! pprt Perturbation pressure at all time levels (Pascal)
! qv Water vapor specific humidity at all time levels (kg/kg)
! qc Cloud water mixing ratio at all time levels (kg/kg)
! qr Rainwater mixing ratio at all time levels (kg/kg)
! qi Cloud ice mixing ratio at all time levels (kg/kg)
! qs Snow mixing ratio at all time levels (kg/kg)
! qh Hail mixing ratio at all time levels (kg/kg)
! tke Turbulent Kinetic Energy ((m/s)**2)
!
! udteb Time tendency of u field at east boundary (m/s**2)
! udtwb Time tendency of u field at west boundary (m/s**2)
! udtnb Time tendency of u field at north boundary (m/s**2)
! udtsb Time tendency of u field at south boundary (m/s**2)
!
! vdteb Time tendency of v field at east boundary (m/s**2)
! vdtwb Time tendency of v field at west boundary (m/s**2)
! vdtnb Time tendency of v field at north boundary (m/s**2)
! vdtsb Time tendency of v field at south boundary (m/s**2)
!
! wdteb Time tendency of w field at east boundary (m/s**2)
! wdtwb Time tendency of w field at west boundary (m/s**2)
! wdtnb Time tendency of w field at north boundary (m/s**2)
! wdtsb Time tendency of w field at south boundary (m/s**2)
!
! pdteb Time tendency of pprt field at east boundary (PASCAL/s)
! pdtwb Time tendency of pprt field at west boundary (PASCAL/s)
! pdtnb Time tendency of pprt field at north boundary (PASCAL/s)
! pdtsb Time tendency of pprt field at south boundary (PASCAL/s)
!
! sdteb Time tendency of a scalar field at east boundary (m/s**2)
! sdtwb Time tendency of a scalar field at west boundary (m/s**2)
! sdtnb Time tendency of a scalar field at north boundary (m/s**2)
! sdtsb Time tendency of a scalar field at south boundary (m/s**2)
!
! ubar Base state x-velocity component (m/s)
! vbar Base state y-velocity component (m/s)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! ptbari Inverse Base state potential temperature (K)
! pbari Inverse Base state pressure (Pascal)
! rhostr Base state density rhobar times j3 (kg/m**3)
! rhostri Inverse base state density rhobar times j3 (kg/m**3)
! qvbar Base state water vapor specific humidity (kg/kg).
! ppi Exner function
! csndsq Sound wave speed squared.
!
! x x-coordinate of grid points in computational space (m)
! y y-coordinate of grid points in computational space (m)
! z z-coordinate of grid points in computational space (m)
! zp Vertical coordinate of grid points in physical space (m)
! zpsoil Vertical coordinate of grid points in the soil model
! in physical space (m).
! hterain Terrain height (m)
! mapfct Map factors at scalar, u and v points
!
! j1 Coordinate transformation Jacobian -d(zp)/dx
! j2 Coordinate transformation Jacobian -d(zp)/dy
! j3 Coordinate transformation Jacobian d(zp)/dz
! j3soil Soil coordinate transformation Jacobian d(zpsoil)/dz
! aj3x Avgx of the coordinate transformation Jacobian d(zp)/dz
! aj3y Avgy of the coordinate transformation Jacobian d(zp)/dz
! aj3z Avgz of the coordinate transformation Jacobian d(zp)/dz
! j3inv Inverse of the coordinate transformation j3
! j3soilinv Inverse of the soil coordinate transformation j3soil
!
! trigs1 Array containing pre-computed trig function for fftopt=1.
! trigs2 Array containing pre-computed trig function for fftopt=1.
! ifax1 Array containing the factors of nx for fftopt=1.
! ifax2 Array containing the factors of ny for fftopt=1.
!
! vwork1 2-D work array for fftopt=2 option.
! vwork2 2-D work array for fftopt=2 option.
! wsave1 Work array for fftopt=2 option.
! wsave2 Work array for fftopt=2 option.
!
! sinlat Sin of latitude at each grid point
!
! kmh Horizontal turb. mixing coef. for momentum ( m**2/s )
! kmv Vertical turb. mixing coef. for momentum ( m**2/s )
! rprntl Reciprocal of Prandtl number
!
! soiltyp Soil type
! stypfrct Soil type fraction
! vegtyp Vegetation type
! lai Leaf Area Index
! roufns Surface roughness
! veg Vegetation fraction
!
! tsoil Soil temperature (K)
! qsoil Soil moisture (m**3/m**3)
! wetcanp Canopy water amount
! ptsfc Ground surface potential temperature (K)
! qvsfc Effective S.H. at sfc.
!
! ptcumsrc Source term in pt-equation due to cumulus parameterization
! qcumsrc Source term in water equations due to cumulus parameterization
!
! nca Counter for CAPE release in the Kain-Fritsch scheme
! kfraincv K-F convective precipitation rate
! cldefi BMJ cloud efficiency
! xland BMJ land/sea mask
! bmjraincv BMJ convective precipitation amount
!
! radfrc Radiation forcing (K/s)
! radsw Solar radiation reaching the surface
! rnflx Net absorbed radiation by the surface
! radswnet Net shortwave radiation
! radlwin Incoming longwave radiation
!
! raing Grid supersaturation rain
! rainc Cumulus convective rain
!
! usflx Surface flux of u-momentum (kg/(m*s**2))
! vsflx Surface flux of v-momentum (kg/(m*s**2))
! ptsflx Surface heat flux (K*kg/(m**2 * s ))
! qvsflx Surface moisture flux of (kg/(m**2 * s))
!
! temxy1 Temporary work array
!
! tem1soil Soil model temporary work array.
! tem2soil Soil model temporary work array.
! tem3soil Soil model temporary work array.
! tem4soil Soil model temporary work array.
! tem5soil Soil model temporary work array.
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
! tem4 Temporary work array.
! tem5 Temporary work array.
! tem6 Temporary work array.
! tem7 Temporary work array.
! tem8 Temporary work array.
! tem9 Temporary work array.
! tem10 Temporary work array.
! tem11 Temporary work array.
! tem12 Temporary work array.
! tem13 Temporary work array.
! tem14 Temporary work array.
! tem15 Temporary work array.
! tem16 Temporary work array.
! tem17 Temporary work array.
! tem18 Temporary work array.
! tem19 Temporary work array.
! tem20 Temporary work array.
! tem21 Temporary work array.
! tem22 Temporary work array.
! tem23 Temporary work array.
! tem24 Temporary work array.
! tem25 Temporary work array.
! tem26 Temporary work array.
!
! tem1_0 Temporary work array.
! tem2_0 Temporary work array.
! tem3_0 Temporary work array.
!
!-----------------------------------------------------------------------
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: mptr ! Grid identifier
INCLUDE 'timelvls.inc'
INTEGER :: nx,ny,nz ! The number of grid points in 3 directions
INTEGER :: nzsoil ! Number of grid points in the -z-direction
INTEGER :: nxndg,nyndg,nzndg ! The number of grid points in 3 directions
REAL :: u (nx,ny,nz,nt) ! Total u-velocity (m/s).
REAL :: v (nx,ny,nz,nt) ! Total v-velocity (m/s).
REAL :: w (nx,ny,nz,nt) ! Total w-velocity (m/s).
REAL :: wcont (nx,ny,nz) ! Contravariant vertical velocity (m/s)
REAL :: ptprt (nx,ny,nz,nt) ! Perturbation potential temperature
! from that of base state atmosphere (Kelvin).
REAL :: pprt (nx,ny,nz,nt) ! Perturbation pressure from that
! of base state atmosphere (Pascal).
REAL :: qv (nx,ny,nz,nt) ! Water vapor specific humidity (kg/kg).
REAL :: qc (nx,ny,nz,nt) ! Cloud water mixing ratio (kg/kg).
REAL :: qr (nx,ny,nz,nt) ! Rain water mixing ratio (kg/kg).
REAL :: qi (nx,ny,nz,nt) ! Cloud ice mixing ratio (kg/kg).
REAL :: qs (nx,ny,nz,nt) ! Snow mixing ratio (kg/kg).
REAL :: qh (nx,ny,nz,nt) ! Hail mixing ratio (kg/kg).
REAL :: tke (nx,ny,nz,nt) ! Turbulent Kinetic Energy ((m/s)**2)
REAL :: udteb (ny,nz) ! T-tendency of u at e-boundary (m/s**2)
REAL :: udtwb (ny,nz) ! T-tendency of u at w-boundary (m/s**2)
REAL :: udtnb (nx,nz) ! T-tendency of u at n-boundary (m/s**2)
REAL :: udtsb (nx,nz) ! T-tendency of u at s-boundary (m/s**2)
REAL :: vdteb (ny,nz) ! T-tendency of v at e-boundary (m/s**2)
REAL :: vdtwb (ny,nz) ! T-tendency of v at w-boundary (m/s**2)
REAL :: vdtnb (nx,nz) ! T-tendency of v at n-boundary (m/s**2)
REAL :: vdtsb (nx,nz) ! T-tendency of v at s-boundary (m/s**2)
REAL :: wdteb (ny,nz) ! T-tendency of w at e-boundary (m/s**2)
REAL :: wdtwb (ny,nz) ! T-tendency of w at w-boundary (m/s**2)
REAL :: wdtnb (nx,nz) ! T-tendency of w at n-boundary (m/s**2)
REAL :: wdtsb (nx,nz) ! T-tendency of w at s-boundary (m/s**2)
REAL :: pdteb (ny,nz) ! T-tendency of pprt at e-boundary (PASCAL/s)
REAL :: pdtwb (ny,nz) ! T-tendency of pprt at w-boundary (PASCAL/s)
REAL :: pdtnb (nx,nz) ! T-tendency of pprt at n-boundary (PASCAL/s)
REAL :: pdtsb (nx,nz) ! T-tendency of pprt at s-boundary (PASCAL/s)
REAL :: sdteb (ny,nz) ! T-tendency of w at e-boundary (m/s**2)
REAL :: sdtwb (ny,nz) ! T-tendency of w at w-boundary (m/s**2)
REAL :: sdtnb (nx,nz) ! T-tendency of w at n-boundary (m/s**2)
REAL :: sdtsb (nx,nz) ! T-tendency of w at s-boundary (m/s**2)
REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s).
REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s).
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal).
REAL :: ptbari(nx,ny,nz) ! Inverse Base state pot. temperature (K)
REAL :: pbari (nx,ny,nz) ! Inverse Base state pressure (Pascal).
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: rhostri(nx,ny,nz) ! Inverse base state density rhobar times j3.
REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity
! (kg/kg).
REAL :: ppi (nx,ny,nz) ! Exner function.
REAL :: csndsq(nx,ny,nz) ! Sound wave speed squared.
REAL :: x (nx) ! The x-coord. of the physical and
! computational grid. Defined at u-point.
REAL :: y (ny) ! The y-coord. of the physical and
! computational grid. Defined at v-point.
REAL :: z (nz) ! The z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at
! w-point on the staggered grid.
REAL :: zpsoil(nx,ny,nzsoil) ! The physical height coordinate defined
! at the center of a soil layer(m).
REAL :: hterain(nx,ny) ! Terrain height (m).
REAL :: mapfct(nx,ny,8) ! Map factors at scalar, u and v points
REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian -d(zp)/dx.
REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian -d(zp)/dy.
REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian d(zp)/dz.
REAL :: j3soil(nx,ny,nzsoil) ! Coordinate transformation Jacobian
! defined as d( zpsoil )/d( zsoil ).
REAL :: aj3x (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE X-DIR.
REAL :: aj3y (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE Y-DIR.
REAL :: aj3z (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE Z-DIR.
REAL :: j3inv (nx,ny,nz) ! Inverse of J3
REAL :: j3soilinv(nx,ny,nzsoil) ! Inverse of J3soil.
REAL :: trigs1(3*(nx-1)/2+1) ! Array containing pre-computed trig
! function for fftopt=1.
REAL :: trigs2(3*(ny-1)/2+1) ! Array containing pre-computed trig
! function for fftopt=1.
INTEGER :: ifax1(13) ! Array containing the factors of nx for
! fftopt=1.
INTEGER :: ifax2(13) ! Array containing the factors of ny for
! fftopt=1.
REAL :: vwork1 (nx+1,ny+1) ! 2-D work array for fftopt=2.
REAL :: vwork2 (ny,nx+1) ! 2-D work array for fftopt=2.
REAL :: wsave1 (3*(ny-1)+15) ! Work array for fftopt=2.
REAL :: wsave2 (3*(nx-1)+15) ! Work array for fftopt=2.
REAL :: sinlat(nx,ny) ! Sin of latitude at each grid point
REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: rprntl(nx,ny,nz) ! Reciprocal of Prandtl number
INTEGER :: nstyps ! Number of soil type
INTEGER :: soiltyp(nx,ny,nstyps) ! Soil types at grids
REAL :: stypfrct(nx,ny,nstyps) ! Fraction of soil types
INTEGER :: vegtyp (nx,ny) ! Vegetation type
REAL :: lai (nx,ny) ! Leaf Area Index
REAL :: roufns (nx,ny) ! Surface roughness
REAL :: veg (nx,ny) ! Vegetation fraction
REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil layer temperature (K)
REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil layer moisture (m**3/m**3)
REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount
REAL :: snowdpth(nx,ny) ! Snow depth (m)
REAL :: qvsfc (nx,ny,0:nstyps) ! Effective qv at sfc.
REAL :: ptsfc (nx,ny) ! Ground surface potential
! temperature (K)
REAL :: ptcumsrc(nx,ny,nz) ! Source term in pt-equation due
! to cumulus parameterization
REAL :: qcumsrc(nx,ny,nz,5) ! Source term in water equations due
! to cumulus parameterization:
! qcumsrc(1,1,1,1) for qv equation
! qcumsrc(1,1,1,2) for qc equation
! qcumsrc(1,1,1,3) for qr equation
! qcumsrc(1,1,1,4) for qi equation
! qcumsrc(1,1,1,5) for qs equation
REAL :: w0avg(nx,ny,nz) ! a closing running average vertical
! velocity in 10min for K-F scheme
REAL :: kfraincv(nx,ny) ! K-F convective rainfall (cm)
INTEGER :: nca(nx,ny) ! K-F counter for CAPE release
!EMK BMJ
REAL,INTENT(INOUT) :: cldefi(nx,ny) ! BMJ cloud efficiency
REAL,INTENT(INOUT) :: xland(nx,ny) ! BMJ land mask
! (1.0 = land, 2.0 = sea)
REAL,INTENT(INOUT) :: bmjraincv(nx,ny) ! BMJ convective rainfall (cm)
!EMK END
REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s)
REAL :: radsw(nx,ny) ! Solar radiation reacing the surface
REAL :: rnflx(nx,ny) ! Net absorbed radiation by the surface
REAL :: radswnet(nx,ny) ! Net shortwave radiation
REAL :: radlwin(nx,ny) ! Incoming longwave radiation
REAL :: raing(nx,ny) ! Grid supersaturation rain
REAL :: rainc(nx,ny) ! Cumulus convective rain
REAL :: prcrate(nx,ny,4) ! precipitation rates (kg/(m**2*s))
! prcrate(1,1,1) = total precipitation rate
! prcrate(1,1,2) = grid scale precip. rate
! prcrate(1,1,3) = cumulus precip. rate
! prcrate(1,1,4) = microphysics precip. rate
REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2))
REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2))
REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2))
REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s))
INTEGER :: exbcbufsz ! EXBC buffer size
REAL :: exbcbuf( exbcbufsz ) ! EXBC buffer array
REAL :: bcrlx(nx,ny) ! EXBC relaxation coefficients
REAL :: uincr(nxndg,nyndg,nzndg) ! Analysis increment for u
REAL :: vincr(nxndg,nyndg,nzndg) ! Analysis increment for v
REAL :: wincr(nxndg,nyndg,nzndg) ! Analysis increment for w
REAL :: pincr(nxndg,nyndg,nzndg) ! Analysis increment for p
REAL :: ptincr(nxndg,nyndg,nzndg) ! Analysis increment for pt
REAL :: qvincr(nxndg,nyndg,nzndg) ! Analysis increment for qv
REAL :: qcincr(nxndg,nyndg,nzndg) ! Analysis increment for qc
REAL :: qrincr(nxndg,nyndg,nzndg) ! Analysis increment for qr
REAL :: qiincr(nxndg,nyndg,nzndg) ! Analysis increment for qi
REAL :: qsincr(nxndg,nyndg,nzndg) ! Analysis increment for qs
REAL :: qhincr(nxndg,nyndg,nzndg) ! Analysis increment for qh
REAL :: temxy1(nx,ny) ! Temporary work array
REAL :: tem1soil(nx,ny,nzsoil) ! Temporary soil model work array.
REAL :: tem2soil(nx,ny,nzsoil) ! Temporary soil model work array.
REAL :: tem3soil(nx,ny,nzsoil) ! Temporary soil model work array.
REAL :: tem4soil(nx,ny,nzsoil) ! Temporary soil model work array.
REAL :: tem5soil(nx,ny,nzsoil) ! Temporary soil model work array.
REAL :: tem1 (nx,ny,nz) ! Temporary work array.
REAL :: tem2 (nx,ny,nz) ! Temporary work array.
REAL :: tem3 (nx,ny,nz) ! Temporary work array.
REAL :: tem4 (nx,ny,nz) ! Temporary work array.
REAL :: tem5 (nx,ny,nz) ! Temporary work array.
REAL :: tem6 (nx,ny,nz) ! Temporary work array.
REAL :: tem7 (nx,ny,nz) ! Temporary work array.
REAL :: tem8 (nx,ny,nz) ! Temporary work array.
REAL :: tem9 (nx,ny,nz) ! Temporary work array.
REAL :: tem10 (nx,ny,nz) ! Temporary work array.
REAL :: tem11 (nx,ny,nz) ! Temporary work array.
REAL :: tem12 (nx,ny,nz) ! Temporary work array.
REAL :: tem13 (nx,ny,nz) ! Temporary work array.
REAL :: tem14 (nx,ny,nz) ! Temporary work array.
REAL :: tem15 (nx,ny,nz) ! Temporary work array.
REAL :: tem16 (nx,ny,nz) ! Temporary work array.
REAL :: tem17 (nx,ny,nz) ! Temporary work array.
REAL :: tem18 (nx,ny,nz) ! Temporary work array.
REAL :: tem19 (nx,ny,nz) ! Temporary work array.
REAL :: tem20 (nx,ny,nz) ! Temporary work array.
REAL :: tem21 (nx,ny,nz) ! Temporary work array.
REAL :: tem22 (nx,ny,nz) ! Temporary work array.
REAL :: tem23 (nx,ny,nz) ! Temporary work array.
REAL :: tem24 (nx,ny,nz) ! Temporary work array.
REAL :: tem25 (nx,ny,nz) ! Temporary work array.
REAL :: tem26 (nx,ny,nz) ! Temporary work array.
REAL :: tem1_0(0:nx,0:ny,0:nz) ! Temporary work array.
REAL :: tem2_0(0:nx,0:ny,0:nz) ! Temporary work array.
REAL :: tem3_0(0:nx,0:ny,0:nz) ! Temporary work array.
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'bndry.inc'
INCLUDE 'indtflg.inc'
INCLUDE 'phycst.inc'
INCLUDE 'exbc.inc'
INCLUDE 'nudging.inc'
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j
INTEGER :: ireturn
REAL :: tem
!EMK BMJ
LOGICAL :: restart
INTEGER,PARAMETER :: vegwaterflag = 14
INTEGER,PARAMETER :: xland_waterflag = 2
INTEGER,PARAMETER :: xland_landflag = 1
!EMK END
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
mgrid = mptr
grdin = 0
basin = 0
varin = 0
mstin = 0
rainin= 0
prcin = 0
icein = 0
trbin = 0
sfcin = 0
landin= 0
radin = 0
flxin = 0
!wdt update - init0 no longer necessary (arrays set to 0 after allocation)
!
!-----------------------------------------------------------------------
!
! INITialize model array VARiables.
!
!-----------------------------------------------------------------------
!
!EMK BMJ
CALL initgrdvar
(nx,ny,nz,nzsoil,nt,nstyps,exbcbufsz, &
x,y,z,zp,zpsoil,hterain,mapfct, &
j1,j2,j3,j3soil,aj3x,aj3y,aj3z,j3inv,j3soilinv, &
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
udteb, udtwb, vdtnb, vdtsb, &
pdteb,pdtwb ,pdtnb ,pdtsb, &
trigs1,trigs2,ifax1,ifax2, &
wsave1,wsave2,vwork1,vwork2, &
ubar,vbar,ptbar,pbar,ptbari,pbari, &
rhostr,rhostri,qvbar,ppi,csndsq, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsoil,qsoil,wetcanp,snowdpth,qvsfc, &
ptcumsrc,qcumsrc,w0avg,nca,kfraincv, &
cldefi,xland,bmjraincv, &
raing,rainc,prcrate,exbcbuf, &
radfrc,radsw,rnflx,radswnet,radlwin, &
usflx,vsflx,ptsflx,qvsflx, &
tem1soil,tem2soil,tem3soil,tem4soil,tem5soil, &
tem1,tem2,tem3,tem4,tem5, &
tem6,tem7,tem8,tem9)
DO j=1,ny-1
DO i=1,nx-1
tem = 0.5 * ( pprt(i,j,1,2)+pbar(i,j,1) &
+ pprt(i,j,2,2)+pbar(i,j,2) )
ptsfc(i,j)=tsoil(i,j,1,0)*(p0/tem)**rddcp
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Calculate the sin of the lattitude of each grid point, to be used
! in the calculation of latitude-dependent Coriolis parameters.
!
!-----------------------------------------------------------------------
!
CALL gtsinlat
(nx,ny,x,y, sinlat, tem1,tem2, tem3)
!
!-----------------------------------------------------------------------
!
! Initialize arrays that store the lookup table data.
!
!-----------------------------------------------------------------------
!
CALL initlktb
!
!-----------------------------------------------------------------------
!
! Initialize the external boundary data array.
!
!-----------------------------------------------------------------------
!
IF( lbcopt == 2 .AND. mptr == 1 ) THEN
ireturn = 0
! DBW question why not soil model variables as well????
CALL extbdtini
(nx,ny,nz, &
u,v,w,ptprt,pprt, &
qv,qc,qr,qi,qs,qh,ptbar,pbar, &
exbcbuf(nu0exb), exbcbuf(nv0exb), &
exbcbuf(nw0exb), exbcbuf(npt0exb), &
exbcbuf(npr0exb), exbcbuf(nqv0exb), &
exbcbuf(nqc0exb), exbcbuf(nqr0exb), &
exbcbuf(nqi0exb), exbcbuf(nqs0exb), &
exbcbuf(nqh0exb), exbcbuf(nudtexb), &
exbcbuf(nvdtexb), exbcbuf(nwdtexb), &
exbcbuf(nptdtexb),exbcbuf(nprdtexb), &
exbcbuf(nqvdtexb),exbcbuf(nqcdtexb), &
exbcbuf(nqrdtexb),exbcbuf(nqidtexb), &
exbcbuf(nqsdtexb),exbcbuf(nqhdtexb), &
bcrlx, &
tem1,tem2,tem3,tem4,tem5,tem6, &
tem7,tem8,tem9,tem10,tem11,ireturn)
IF( ireturn == 1 ) THEN
WRITE (6,'(a/a)') &
'Can not find the external boundary data. Dump the', &
'history file and restart file and then STOP the model.'
CALL arpsstop
('arpsstop called from initial with ext boundary file',1)
ELSE IF( ireturn == 2 ) THEN
WRITE (6,'(a/a)') &
'Can not open the external boundary data. Dump the history', &
'file and restart file and then STOP the model.'
CALL arpsstop
('arpsstop called from initial with opening ext &
& boundary file ',1)
ELSE IF( ireturn == 3 ) THEN
WRITE (6,'(a/a)') &
'Read errors in the external boundary data file. Dump the', &
'history file and restart file and then STOP the model.'
CALL arpsstop
('arpsstop called from initial with reading ext &
& boundary file ',1)
ELSE IF( ireturn /= 0 ) THEN
WRITE (6,'(a/a)') &
'Other errors in getting the external boundary data. Dump the', &
'history file and restart file and then STOP the model.'
CALL arpsstop
('arpsstop called from initial with the ext &
& boundary file ',1)
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Initialize nudging assimilation variables
!
!-----------------------------------------------------------------------
!
IF( nudgopt > 0 ) &
CALL ininudge
(nxndg,nyndg,nzndg, &
uincr,vincr,wincr,pincr,ptincr,qvincr, &
qcincr,qrincr,qiincr,qsincr,qhincr,ireturn)
!-----------------------------------------------------------------------
!
! Initialize KF_ETA arrays and look-up tables.
!
!-----------------------------------------------------------------------
!KFY KF_ETA
IF (cnvctopt == 5) THEN
!...Now initialize KF_ETA look-up tables
IF (initopt == 2 .or. initopt == 4) THEN
restart = .TRUE.
ELSE
restart = .FALSE.
END IF
CALL interface_wrf_kfinit(nx,ny,nz,nca,restart)
END IF ! IF (cnvctopt == 5) THEN
!KFY KF_ETA END
!-----------------------------------------------------------------------
!
! Initialize BMJ arrays and look-up tables.
!
!-----------------------------------------------------------------------
!EMK BMJ
IF (cnvctopt == 4) THEN
DO j = 1,ny-1
DO i = 1,nx-1
IF (vegtyp(i,j) == vegwaterflag) THEN
xland(i,j) = xland_waterflag
ELSE
xland(i,j) = xland_landflag
END IF
END DO ! DO i = 1,nx
END DO ! DO j = 1,ny
!...Now initialize BMJ look-up tables
IF (initopt == 2 .or. initopt == 4) THEN
restart = .TRUE.
ELSE
restart = .FALSE.
END IF
CALL interface_wrf_bmjinit(nx,ny,nz,cldefi,restart)
END IF ! IF (cnvctopt == 4) THEN
!EMK END
!
!-----------------------------------------------------------------------
!
! End of model initialization.
!
!-----------------------------------------------------------------------
!
RETURN
END SUBROUTINE initial
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE INIGRD ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE inigrd(nx,ny,nz,nzsoil,x,y,z,zp,zpsoil, & 7,18
hterain,mapfct,j1,j2,j3,j3soil, &
j3soilinv,zp1d,dzp1d,tem1)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Initialize the model grid variables.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 3/17/1991.
!
! MODIFICATION HISTORY:
!
! 5/02/92 (M. Xue)
! Added full documentation.
!
! 5/03/92 (M. Xue)
! Further documentation.
!
! 4/10/93 (M. Xue & Hao Jin)
! Add the terrain.
!
! 9/10/94 (Weygandt & Y. Lu)
! Cleaned up documentation.
!
! 12/22/94 (Yuhe Liu)
! Changed variable tuning, which was hard wired inside this
! subroutine, to strhtune, which is input from namelist input file.
!
! 1/22/96 (Donghai Wang & Yuhe Liu)
! Added the map projection factor to ARPS governing equations.
!
! 11/06/97 (D. Weber)
! Added three additional levels to the mapfct array. The three
! levels (4,5,6) represent the inverse of the first three in order.
! The inverse map factors are computed to improve efficiency.
!
! 2000/04/11 (Gene Bassett)
! Only update the terrain data with a call to BCS2D for ternopt=1.
!
! 05/02/2002 (Dan Weber and Jerry Brotzge)
! Added zpsoil, j3soil, variables for OUSOIL.
!
!-----------------------------------------------------------------------
!
! INPUT :
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
! nzsoil Number of grid points in the soil model in the -z-direction
!
! OUTPUT:
!
! x x coordinate of grid points in physical/comp. space (m)
! y y coordinate of grid points in physical/comp. space (m)
! z z coordinate of grid points in computational space (m)
! zp Vertical coordinate of grid points in physical space
! (m)
! zpsoil Vertical coordinate of grid points in the soil model
! in physical space (m).
! hterain Terrain height (m)
! mapfct Map factors at scalar, u and v points
!
! j1 Coordinate transformation Jacobian -d(zp)/dx
! j2 Coordinate transformation Jacobian -d(zp)/dy
! j3 Coordinate transformation Jacobian d(zp)/dz
! j3soil Soil coordinate transformation Jacobian d(zpsoil)/dz
! j3soilinv Inverse of the soil coordinate transformation j3soil
!
! WORK ARRAY:
!
! zp1d Temporary work array.
! dzp1d Temporary work array.
! tem1 Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! The number of grid points in 3 directions
INTEGER :: nzsoil ! Number of grid points in the -z-direction
REAL :: x(nx) ! x-coord. of the physical and
! computational grid. Defined at u-point.
REAL :: y(ny) ! y-coord. of the physical and
! computational grid. Defined at v-point.
REAL :: z(nz) ! z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
REAL :: zsoil(nzsoil) ! z-coord. of the soil model computational grid.
! Defined at the center of a soil layer.
REAL :: zp(nx,ny,nz) ! Physical height coordinate defined at
! w-point of the staggered grid.
REAL :: zpsoil (nx,ny,nzsoil) ! The physical height coordinate defined
! at the center of a soil layer(m).
REAL :: j1(nx,ny,nz) ! Coordinate transformation Jacobian
! -d(zp)/dx.
REAL :: j2(nx,ny,nz) ! Coordinate transformation Jacobian
! -d(zp)/dy.
REAL :: j3(nx,ny,nz) ! Coordinate transformation Jacobian
! d(zp)/dz.
REAL :: j3soil (nx,ny,nzsoil) ! Coordinate transformation Jacobian
! defined as d( zpsoil )/d( zsoil ).
REAL :: j3soilinv(nx,ny,nzsoil) ! Inverse of J3soil.
REAL :: hterain(nx,ny) ! Terrain height.
REAL :: mapfct(nx,ny,8) ! Map factors at scalar, u and v points
REAL :: zp1d (nz) ! Temporary array
REAL :: dzp1d(nz) ! Temporary array
REAL :: tem1(nx,ny,nz) ! Temporary array
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
REAL :: xs, ys, zs, radnd, pi2
REAL :: zflat1,z1,z2
REAL :: zpmax
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
INCLUDE 'phycst.inc'
INCLUDE 'bndry.inc'
INCLUDE 'mp.inc' ! Message passing parameters.
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Define a uniform model grid.
!
!-----------------------------------------------------------------------
!
CALL setgrd
( nx,ny, x,y )
!
!-----------------------------------------------------------------------
!
! Set map factor at scalar, u, and v points
!
!-----------------------------------------------------------------------
!
IF ( mpfctopt /= 0 ) THEN
DO j=1,ny-1
DO i=1,nx-1
xs = 0.5*(x(i)+x(i+1))
ys = 0.5*(y(j)+y(j+1))
CALL xytomf
( 1,1,xs,ys,mapfct(i,j,1) )
IF(maptest == 1)THEN ! set up a symmetric field...
mapfct(i,j,1) = 1.0 + ABS((xs-0.5*(x(1)+x(nx))) &
/(x(nx)-x(1)) &
+(ys-0.5*(y(1)+y(ny))) &
/(y(ny)-y(1)))
END IF
mapfct(i,j,4) = 1.0/mapfct(i,j,1)
mapfct(i,j,7) = mapfct(i,j,1)*mapfct(i,j,1)
mapfct(i,j,8) = 0.25*mapfct(i,j,1) ! for use in sovlwpim
! and wcontra...
END DO
END DO
DO j=1,ny-1
DO i=1,nx
ys = 0.5*(y(j)+y(j+1))
CALL xytomf
( 1,1,x(i),ys,mapfct(i,j,2) )
IF(maptest == 1)THEN ! set up a symmetric field...
mapfct(i,j,2) = 1.0 + ABS((x(i)-0.5*(x(1)+x(nx))) &
/(x(nx)-x(1)) &
+(ys-0.5*(y(1)+y(ny))) &
/(y(ny)-y(1)))
END IF
mapfct(i,j,5) = 1.0/mapfct(i,j,2)
END DO
END DO
DO j=1,ny
DO i=1,nx-1
xs = 0.5*(x(i)+x(i+1))
CALL xytomf
( 1,1,xs,y(j),mapfct(i,j,3) )
IF(maptest == 1)THEN ! set up a symmetric field...
mapfct(i,j,3) = 1.0 + ABS((xs-0.5*(x(1)+x(nx))) &
/(x(nx)-x(1)) &
+(y(j)-0.5*(y(1)+y(ny))) &
/(y(ny)-y(1)))
END IF
mapfct(i,j,6) = 1.0/mapfct(i,j,3)
END DO
END DO
ELSE
DO k=1,7
DO j=1,ny
DO i=1,nx
mapfct(i,j,k) = 1.0
mapfct(i,j,8) = 0.25
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Print map factor at scalar, u, and v points for the purpose of
! debug
!
!-----------------------------------------------------------------------
!
! CALL getunit( mpunit )
! CALL asnctl ('NEWLOCAL', 1, ierr)
! CALL asnfile('mapfactor.data', '-F f77 -N ieee', ierr)
!
! OPEN (mpunit,file='mapfactor.data',form='unformatted')
!
! CALL edgfill(mapfct(1,1,1),1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1)
! write(mpunit) ((mapfct(i,j,1),i=1,nx),j=1,ny)
!
! CALL edgfill(mapfct(1,1,2),1,nx,1,nx, 1,ny,1,ny-1, 1,1,1,1)
! write(mpunit) ((mapfct(i,j,2),i=1,nx),j=1,ny)
!
! CALL edgfill(mapfct(1,1,3),1,nx,1,nx-1, 1,ny,1,ny, 1,1,1,1)
! write(mpunit) ((mapfct(i,j,3),i=1,nx),j=1,ny)
!
! CLOSE( mpunit )
! CALL retunit( mpunit )
!
!-----------------------------------------------------------------------
!
! End of debug print.
!
!-----------------------------------------------------------------------
!
DO k=1,nz
z(k) = zrefsfc + (k-2) * dz
END DO
!
!-----------------------------------------------------------------------
!
! Specify the terrain
!
!-----------------------------------------------------------------------
!
IF( ternopt == 0 ) THEN ! No terrain, the ground is flat
DO j=1,ny-1
DO i=1,nx-1
hterain(i,j) = zrefsfc
END DO
END DO
ELSE IF( ternopt == 1 ) THEN ! Bell-shaped mountain
!
!-----------------------------------------------------------------------
!
! Define the bell-shaped mountain
!
!-----------------------------------------------------------------------
!
pi2 = 1.5707963267949
DO j=1,ny-1
DO i=1,nx-1
xs = (x(i)+x(i+1))*0.5
ys = (y(j)+y(j+1))*0.5
zs = z(2)
IF( mntwidy < 0.0 .OR. runmod == 2 ) THEN ! 2-d terrain in x-z plane.
radnd = 1.0+((xs-mntctrx)/mntwidx)**2
ELSE IF( mntwidx < 0.0 .OR. runmod == 3 ) THEN ! 2-d terrain in y-z plane.
radnd = 1.0+((ys-mntctry)/mntwidy)**2
ELSE ! 3-d terrain
radnd = 1.0+((xs-mntctrx)/mntwidx)**2 &
+((ys-mntctry)/mntwidy)**2
END IF
hterain(i,j) = zrefsfc + hmount/radnd
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Make sure that the terrain satisfies the specified boundary
! conditions.
!
!-----------------------------------------------------------------------
!
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv1dew
(hterain,nx,ny,ebc,wbc,0,tem1)
CALL mpsendrecv1dns
(hterain,nx,ny,nbc,sbc,0,tem1)
END IF
CALL acct_interrupt
(bc_acct)
CALL bcs2d
(nx,ny,hterain, ebc,wbc,nbc,sbc)
CALL acct_stop_inter
ELSE IF( ternopt == 2 ) THEN ! Read from terrain data base
!
!-----------------------------------------------------------------------
!
! Read in the terrain data.
!
!-----------------------------------------------------------------------
!
! blocking inserted for ordering i/o for message passing
DO i=0,nprocs-1,readstride
IF(myproc >= i.AND.myproc <= i+readstride-1)THEN
IF (mp_opt > 0 .AND. readsplit > 0) THEN
CALL readsplittrn
( nx,ny,dx,dy, terndta, &
mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, &
hterain )
ELSE
CALL readtrn
( nx,ny,dx,dy, terndta, &
mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, &
hterain )
END IF
END IF
IF (mp_opt > 0) CALL mpbarrier
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Set up a stretched vertical grid.
!
! For strhopt=1, function y = a+b*x**3 is used to specify dz as a
! function of k.
! For strhopt=2, function y = c + a*tanh(b*x) is used to specify dz
! as a function of k.
!
!-----------------------------------------------------------------------
!
IF ( strhopt == 0 ) THEN
DO k=1,nz
zp1d(k) = z(k)
END DO
ELSE IF ( strhopt == 1 .OR.strhopt == 2 ) THEN
z1 = zrefsfc + MAX(0.0, MIN(dlayer1, z(nz-2)-zrefsfc ))
z2 = z1 + MAX(0.0, MIN(dlayer2, z(nz-1)-z1 ))
IF( dlayer1 >= (nz-3)*dzmin ) THEN
WRITE(6,'(/1x,a,f13.3,/a,f13.3,a,a)') &
'Can not setup a vertical grid with uniform dz=',dzmin, &
' over the depth of ',dlayer1,' please specify a smaller ', &
'value of dlayer1. Program stopped INIGRD.'
CALL arpsstop
('arpsstop called from INIGRD with ther vertical grid ' &
,1)
END IF
CALL strhgrd
(nz,strhopt,zrefsfc,z1,z2,z(nz-1), &
dzmin,strhtune, zp1d,dzp1d)
ELSE
WRITE(6,'(1x,a,i3,a/)') &
'Invalid vertical grid stretching option, strhopt was ',strhopt, &
'. Program stopped in INIGRD.'
CALL arpsstop
('arpsstop called from INIGRD with stretching ' ,1)
END IF
!
!-----------------------------------------------------------------------
!
! Physical height of computational grid defined as
!
! Zp=(z-zrefsfc)*(Zm-hterain)/(Zm-zrefsfc)+hterain for z=<Zm.
! ZP=z for z>Zm
!
! where Zm the height at which the grid levels becomes flat.
! Hm < Zm =< Ztop, hm is the height of mountain and Ztop the height
! of model top.
!
!-----------------------------------------------------------------------
!
DO k=nz-1,2,-1
IF(zp1d(k) <= zflat) THEN
zflat1 = zp1d(k)
EXIT
END IF
END DO
zflat1=MAX(MIN(z(nz-1),zflat1),zrefsfc)
DO k=2,nz-1
IF(zp1d(k) > zflat1) THEN
DO j=1,ny-1
DO i=1,nx-1
zp(i,j,k)=zp1d(k)
END DO
END DO
ELSE
DO j=1,ny-1
DO i=1,nx-1
zp(i,j,k)=(zp1d(k)-zrefsfc)*(zflat1-hterain(i,j)) &
/(zflat1-zrefsfc)+hterain(i,j)
END DO
END DO
END IF
END DO
DO j=1,ny-1
DO i=1,nx-1
zp(i,j,2)=hterain(i,j)
zp(i,j,1)=2.0*zp(i,j,2)-zp(i,j,3)
zp(i,j,nz)=2.0*zp(i,j,nz-1)-zp(i,j,nz-2)
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Calculate transformation Jacobians J1, J2 and J3.
!
!-----------------------------------------------------------------------
!
CALL jacob
(nx,ny,nz,x,y,z,zp,j1,j2,j3,tem1)
CALL inisoilgrd
(nx,ny,nzsoil,hterain,zpsoil,j3soil,j3soilinv)
RETURN
END SUBROUTINE inigrd
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE STRHGRD ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE strhgrd(nz,strhopt,z0,z1,z2,ztop,dzmin,strhtune, z,dzk) 3,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! To construct a vertically stretched grid.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 10/17/94.
!
! MODIFICATION HISTORY:
!
! 05/11/95 (Jinxing Zong and MX)
!
! A bug fix for the case of nonzero zrefsfc, the reference height of
! the surface. Results not affected for zrefsfc=0 (default value).
!
!-----------------------------------------------------------------------
!
!
! INPUT:
!
! nz The vertical dimension of ARPS grid.
!
!
! OUTPUT:
!
! z Array containing the height of veritical grid levels.
! dzk Array containing the grid spacing between vertical levels
!
!-----------------------------------------------------------------------
IMPLICIT NONE
INTEGER :: nz
INTEGER :: strhopt
REAL :: z0
REAL :: z1
REAL :: z2
REAL :: ztop
REAL :: dzmin
REAL :: strhtune
REAL :: z (nz)
REAL :: dzk (nz)
REAL :: rnzh,dzm
REAL :: a,b,c,hnew,zkmid,dzu
INTEGER :: nzh,nzl,k
REAL :: dz
IF( (z1-z0) == (nz-3)*dzmin.AND.(z1-z0) == (ztop-z0) ) THEN
dz = (ztop-z0)/(nz-3)
DO k=1,nz-1
dzk(k)= dz
END DO
DO k=1,nz
z(k)=z0 + (k-2) * dz
END DO
WRITE(6,'(/1x,a,f13.3,/a,f13.3)') &
'Layer 1 depth was as deep as the entire domain. i', &
'A uniform vertical grid is assumed with dz=',dz, &
' over the model depth of ',ztop-z0
RETURN
END IF
IF(z1 < z0) z1 = z0
IF(z2 > ztop) z2 = ztop
nzl = (z1-z0)/dzmin
IF( (z1-z0) >= (nz-3)*dzmin ) THEN
WRITE(6,'(/1x,a,f13.3,/a,f13.3,a,a)') &
'Can not setup a vertical grid with uniform dz=',dzmin, &
' over the depth of ',z1-z0,' please specify a smaller', &
' value of dlayer1 '
CALL arpsstop
('arpsstop called from STRHGRD with stretching ' ,1)
END IF
IF( z2 >= ztop ) THEN
dzm = (ztop-z0-nzl*dzmin)/(nz-3-nzl)
! print*, nzl*dzmin + (nz-3-nzl)*dzm
nzh = 0
dzu = 2*dzm - dzmin
ELSE
a = 2*(nz-3-nzl)
b = 2*z0-ztop-z2-(nz-3-3*nzl)*dzmin
c = dzmin*(z2-z0-nzl*dzmin)
dzm = (-b + SQRT(b*b-4*a*c) )/(2*a)
rnzh = (ztop-z2)/(2*dzm-dzmin)
nzh = INT(rnzh)
hnew = nzl*dzmin + nzh*(2*dzm-dzmin) + &
(nz-3-nzl-nzh)*dzm + z0
IF( nzh /= 0 ) THEN
dzu = (2*dzm-dzmin) + (ztop-hnew)/nzh
ELSE IF( nz-3-nzl-nzh /= 0 ) THEN
dzm = dzm + (ztop-hnew)/(nz-3-nzl-nzh)
dzu = (2*dzm-dzmin)
END IF
END IF
DO k=1,nzl+1
dzk(k)=dzmin
END DO
IF( strhopt == 1 ) THEN
a = (dzm-dzmin)
DO k=nzl+2,nz-2-nzh
dzk(k)= dzm+a* &
((2.0*FLOAT(k-nzl-2)/FLOAT(nz-4-nzh-nzl)-1.0) )**3
END DO
ELSE
zkmid=0.5*FLOAT( nz-nzh+nzl)
IF( nzl+2-zkmid == 0.0 ) THEN
b = 0.0
ELSE
b= strhtune* 2.0/(nzl+2-zkmid)
END IF
a=(dzmin-dzm)/TANH( strhtune* 2.0)
DO k=nzl+2,nz-2-nzh
dzk(k)=dzm + a*TANH(b*(FLOAT(k)-zkmid))
END DO
END IF
DO k=nz-2-nzh+1, nz-2
dzk(k)= dzu
END DO
dzk(nz-1) = dzk(nz-2)
dzk(nz ) = dzk(nz-1)
z(2) = z0
DO k=3,nz-1
z(k) = z(k-1)+dzk(k-1)
END DO
z(1) =z(2)-dzk(1)
z(nz-1)=ztop
z(nz)=z(nz-1)+dzk(nz-1)
RETURN
END SUBROUTINE strhgrd
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE INISOILGRD ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE inisoilgrd(nx,ny,nzsoil,hterain,zpsoil,j3soil,j3soilinv) 5
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! To construct the soil model grid and all associated variables.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Dan Weber
! 05/24/2002.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nzsoil Number of grid points in the soil
!
! zp Vertical coordinate of grid points in physical space (m)
!
! OUTPUT:
!
! zpsoil Vertical coordinate of grid points in the soil (m)
! j3soil Coordinate transformation Jacobian d(zpsoil)/dz
! j3soilinv Inverse of the coordinate transformation Jacobian d(zpsoil)/dz
!
!-----------------------------------------------------------------------
IMPLICIT NONE
!
! INPUT
!
INTEGER :: nx ! Number of grid points in the x-direction
INTEGER :: ny ! Number of grid points in the y-direction
INTEGER :: nzsoil ! Number of grid points in the -z-direction
REAL :: hterain(nx,ny) ! The terrain height in meters.
!
! OUTPUT
!
REAL :: zpsoil (nx,ny,nzsoil) ! The physical height coordinate defined at
! w-point of the soil.
REAL :: j3soil(nx,ny,nzsoil) ! Coordinate transformation Jacobian d(zp)/d(z)
REAL :: j3soilinv (nx,ny,nzsoil) ! Inverse of Soil coord. trans (1.0/j3soil).
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
include 'grid.inc'
!
!-----------------------------------------------------------------------
!
! Miscellaneous local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Calculate the soil model grid variables:
!
! zsoil,zpsoil,j3soil,j3soilinv.
!
!-----------------------------------------------------------------------
!
! Following ARPS convention,
! Set zsoil at velocity points or at the top of each soil layer.....
!
IF(soilstrhopt == 0)THEN ! set up soil model without a stretched grid..
DO k = 1,nzsoil
DO j = 1,ny
DO i = 1,nx
zpsoil(i,j,k) = hterain(i,j) - (k-1)*dzsoil
j3soil(i,j,k) = 1.0
j3soilinv(i,j,k) = 1.0
END DO
END DO
END DO
ELSEIF(soilstrhopt == 1)THEN
! DO k = 2,nzsoil
! zsoil(k) = zrefsfc - (k-1)*dzsoil
! END DO
!-----------------------------------------------------------------------
!
! Physical height of soil model computational grid defined as
!
! Zpsoil=(zsoil-zrefsfc)*(Zm-hterain)/(Zm-zrefsfc)+hterain for zsoil=<Zm.
! ZPsoil=zsoil for zsoil>Zm
!
! where Zm the height at which the grid levels becomes flat.
! Hm < Zm =< Ztop, hm is the height of mountain and Ztop the height
! of model top.
!
!-----------------------------------------------------------------------
!
! DO k=nzsoil-1,2,-1
! IF(zp1dsoil(k) <= zflatsoil) THEN
! zflat1soil = zp1dsoil(k)
! EXIT
! END IF
! END DO
! zflat1soil=MAX(MIN(zsoil(nz-1),zflat1soil),zrefsfc)
! DO k=2,nzsoil-1
! IF(zp1dsoil(k) > zflat1soil) THEN
! DO j=1,ny-1
! DO i=1,nx-1
! zpsoil(i,j,k)=zp1dsoil(k)
! END DO
! END DO
! ELSE
! DO j=1,ny-1
! DO i=1,nx-1
! zpsoil(i,j,k)=(zp1dsoil(k)-zrefsfc)*(zflat1soil-hterain(i,j)) &
! /(zflat1soil-zrefsfc)+hterain(i,j)
! END DO
! END DO
! END IF
! END DO
! old code..
! DO k = 2,nzsoil
! zsoil(k) = zrefsfc - (k-2)*dzsoil
! zpsoil(i,j,k) = hterain(i,j) - (k-1)*dzsoil
! END DO
! jerry's code note zpsoil is set to the top of each layer.
! question why are we using positive values? need to use zrefsfc... and
! the existing coordinate system...
! zpsoil (1) = 0.0
! DO k=2,nzsoil ! set zpsoil
!! zpsoil(k) = zpsoil(k-1) - dzsoil * k
! zpsoil(k) = zpsoil(k-1) + dzsoil !(positive values)
! END DO ! done setting zpsoil
! DO k=1,nzsoil
! j3soil(k) = 1.0
! END DO
! arps code starts here.
! IF( (z1-z0) == (nz-3)*dzmin.AND.(z1-z0) == (ztop-z0) ) THEN
!! dz = (ztop-z0)/(nz-3)
! DO k=1,nz-1
! dzk(k)= dz
! END DO
! DO k=1,nz
! z(k)=z0 + (k-2) * dz
! END DO
! WRITE(6,'(/1x,a,f13.3,/a,f13.3)') &
! 'Layer 1 depth was as deep as the entire domain. i', &
! 'A uniform vertical grid is assumed with dz=',dz, &
! ' over the model depth of ',ztop-z0
! RETURN
! END IF
! IF(z1 < z0) z1 = z0
! IF(z2 > ztop) z2 = ztop
! nzl = (z1-z0)/dzmin
! IF( (z1-z0) >= (nz-3)*dzmin ) THEN
! WRITE(6,'(/1x,a,f13.3,/a,f13.3,a,a)') &
! 'Can not setup a vertical grid with uniform dz=',dzmin, &
! ' over the depth of ',z1-z0,' please specify a smaller', &
! ' value of dlayer1 '
! CALL arpsstop('arpsstop called from STRHGRD with stretching ' ,1)
! END IF
! IF( z2 >= ztop ) THEN
! dzm = (ztop-z0-nzl*dzmin)/(nz-3-nzl)
! print*, nzl*dzmin + (nz-3-nzl)*dzm
! nzh = 0
! dzu = 2*dzm - dzmin
! ELSE
! a = 2*(nz-3-nzl)
! b = 2*z0-ztop-z2-(nz-3-3*nzl)*dzmin
! c = dzmin*(z2-z0-nzl*dzmin)
! dzm = (-b + SQRT(b*b-4*a*c) )/(2*a)
! rnzh = (ztop-z2)/(2*dzm-dzmin)
! nzh = INT(rnzh)
! hnew = nzl*dzmin + nzh*(2*dzm-dzmin) + &
! (nz-3-nzl-nzh)*dzm + z0
! IF( nzh /= 0 ) THEN
! dzu = (2*dzm-dzmin) + (ztop-hnew)/nzh
! ELSE IF( nz-3-nzl-nzh /= 0 ) THEN
! dzm = dzm + (ztop-hnew)/(nz-3-nzl-nzh)
! dzu = (2*dzm-dzmin)
! END IF
! END IF
! DO k=1,nzl+1
! dzk(k)=dzmin
! END DO
! IF( strhopt == 1 ) THEN
! a = (dzm-dzmin)
! DO k=nzl+2,nz-2-nzh
! dzk(k)= dzm+a* &
! ((2.0*FLOAT(k-nzl-2)/FLOAT(nz-4-nzh-nzl)-1.0) )**3
! END DO
! ELSE
! zkmid=0.5*FLOAT( nz-nzh+nzl)
! IF( nzl+2-zkmid == 0.0 ) THEN
! b = 0.0
! ELSE
! b= strhtune* 2.0/(nzl+2-zkmid)
! END IF
! a=(dzmin-dzm)/TANH( strhtune* 2.0)
! DO k=nzl+2,nz-2-nzh
! dzk(k)=dzm + a*TANH(b*(FLOAT(k)-zkmid))
! END DO
! END IF
! DO k=nz-2-nzh+1, nz-2
! dzk(k)= dzu
! END DO
! dzk(nz-1) = dzk(nz-2)
! dzk(nz ) = dzk(nz-1)
! z(2) = z0
! DO k=3,nz-1
! z(k) = z(k-1)+dzk(k-1)
! END DO
! z(1) =z(2)-dzk(1)
! z(nz-1)=ztop
! z(nz)=z(nz-1)+dzk(nz-1)
END IF ! end of soilstrhopt if block
! soil grid variables are set.
RETURN
END SUBROUTINE inisoilgrd
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE JACOB ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE jacob(nx,ny,nz,x,y,z,zp,j1,j2,j3,mp_tem) 7,8
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate transformation Jacobians J1, J2 and J3.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 3/17/1991.
!
! MODIFICATION HISTORY:
!
! 4/10/93 (M. Xue & Hao Jin)
! Add the terrain.
!
! 9/2/94 (M. Xue)
! Loop 710 that resets j2 on north and south boundary to
! zero gradient deleted. It shouldn't have been there.
!
! 9/10/94 (Weygandt & Y. Lu)
! Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
! INPUT :
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! OUTPUT:
!
! x x coordinate of grid points in physical/comp. space (m)
! y y coordinate of grid points in physical/comp. space (m)
! z z coordinate of grid points in computational space (m)
! zp Vertical coordinate of grid points in physical space
! (m)
!
! j1 Coordinate transformation Jacobian -d(zp)/dx
! j2 Coordinate transformation Jacobian -d(zp)/dy
! j3 Coordinate transformation Jacobian d(zp)/dz
!
! WORK ARRAY:
!
! mp_tem Used for message passing, NOTE: the shape of this array
! may different from that in real paramenter.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! The number of grid points in 3 directions
REAL :: x(nx) ! x-coord. of the physical and
! computational grid. Defined at u-point.
REAL :: y(ny) ! y-coord. of the physical and
! computational grid. Defined at v-point.
REAL :: z(nz) ! z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
REAL :: zp(nx,ny,nz) ! the physical height coordinate defined at
! w-point of the staggered grid.
REAL :: j1(nx,ny,nz) ! Coordinate transformation Jacobian
! -d(zp)/dx.
REAL :: j2(nx,ny,nz) ! Coordinate transformation Jacobian
! -d(zp)/dy.
REAL :: j3(nx,ny,nz) ! Coordinate transformation Jacobian
! d(zp)/dz.
REAL :: mp_tem(nx,ny,nz)
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
INTEGER :: istat
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'bndry.inc'
INCLUDE 'globcst.inc'
INCLUDE 'mp.inc' ! Message passing parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! IF (mp_opt > 0) THEN
! ALLOCATE (mp_tem(MAX(nx,ny)*nz),stat=istat)
! IF (istat /= 0) THEN
! CALL arpsstop ("arpsstop called from JACOB: ERROR allocating mp_tem" &
! ,1)
! END IF
! END IF
!
!-----------------------------------------------------------------------
!
! Calculate transformation Jacobian J1 defined as -del(zp)/del(x)
!
!-----------------------------------------------------------------------
!
DO k=1,nz
DO j=1,ny-1
DO i=2,nx-1
j1(i,j,k) = -2 * (zp(i,j,k)-zp(i-1,j,k)) / (x(i+1)-x(i-1))
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! X - boundary conditions of j1
!
!-----------------------------------------------------------------------
!
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(j1,nx,ny,nz,ebc,wbc,1,mp_tem)
END IF
CALL acct_interrupt
(bc_acct)
IF(wbc == 1) THEN ! Rigid wall boundary condition
DO k=1,nz
DO j=1,ny-1
j1( 1,j,k)=j1( 3 ,j,k)
END DO
END DO
ELSE IF(wbc == 2) THEN ! Periodic boundary condition.
IF(mp_opt == 0) THEN
DO k=1,nz
DO j=1,ny-1
j1( 1,j,k)=j1(nx-2,j,k)
END DO
END DO
END IF
ELSE IF(wbc /= 0) THEN
DO k=1,nz
DO j=1,ny-1
j1( 1,j,k)=j1( 2 ,j,k)
END DO
END DO
END IF
IF(ebc == 1) THEN ! Rigid wall boundary condition
DO k=1,nz
DO j=1,ny-1
j1(nx,j,k)=j1(nx-2,j,k)
END DO
END DO
ELSE IF(ebc == 2) THEN ! Periodic boundary condition.
IF(mp_opt == 0) THEN
DO k=1,nz
DO j=1,ny-1
j1(nx,j,k)=j1( 3 ,j,k)
END DO
END DO
END IF
ELSE IF(ebc /= 0) THEN
DO k=1,nz
DO j=1,ny-1
j1(nx,j,k)=j1(nx-1,j,k)
END DO
END DO
END IF
DO k=1,nz
DO i=1,nx
j1(i,ny,k) = j1(i,ny-1,k)
END DO
END DO
CALL acct_stop_inter
!
!-----------------------------------------------------------------------
!
! Calculate transformation Jacobian J2 defined as -del(zp)/del(y)
!
!-----------------------------------------------------------------------
!
DO k=1,nz
DO i=1,nx-1
DO j=2,ny-1
j2(i,j,k) = -2 * (zp(i,j,k)-zp(i,j-1,k)) / (y(j+1)-y(j-1))
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Y - boundary conditions of j2
!
!-----------------------------------------------------------------------
!
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dns
(j2,nx,ny,nz,nbc,sbc,2,mp_tem)
END IF
CALL acct_interrupt
(bc_acct)
IF(sbc == 1) THEN ! Rigid wall boundary condition
DO k=1,nz
DO i=1,nx-1
j2(i, 1,k)=j2(i, 3 ,k)
END DO
END DO
ELSE IF(sbc == 2) THEN ! Periodic boundary condition.
IF (mp_opt == 0) THEN
DO k=1,nz
DO i=1,nx-1
j2(i, 1,k)=j2(i,ny-2,k)
END DO
END DO
END IF
ELSE IF(sbc /= 0) THEN
DO k=1,nz
DO i=1,nx-1
j2(i, 1,k)=j2(i, 2 ,k)
END DO
END DO
END IF
IF(nbc == 1) THEN ! Rigid wall boundary condition
DO k=1,nz
DO i=1,nx-1
j2(i,ny,k)=j2(i,ny-2,k)
END DO
END DO
ELSE IF(nbc == 2) THEN ! Periodic boundary condition.
IF (mp_opt == 0) THEN
DO k=1,nz
DO i=1,nx-1
j2(i,ny,k)=j2(i, 3 ,k)
END DO
END DO
END IF
ELSE IF(nbc /= 0) THEN
DO k=1,nz
DO i=1,nx-1
j2(i,ny,k)=j2(i,ny-1,k)
END DO
END DO
END IF
DO k=1,nz
DO j=1,ny
j2(nx,j,k) = j2(nx-1,j,k)
END DO
END DO
CALL acct_stop_inter
!
!-----------------------------------------------------------------------
!
! Calculate transformation Jacobian J3 defined as del(zp)/del(z)
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
j3(i,j,k) = (zp(i,j,k+1)-zp(i,j,k))/(z(k+1)-z(k))
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
j3(nx,j,k) = j3(nx-1,j,k)
END DO
END DO
DO k=1,nz-1
DO i=1,nx
j3(i,ny,k) = j3(i,ny-1,k)
END DO
END DO
DO j=1,ny
DO i=1,nx
j3(i,j,nz) = j3(i,j,nz-1)
END DO
END DO
! IF (mp_opt > 0) THEN
! DEALLOCATE (mp_tem,stat=istat)
! END IF
RETURN
END SUBROUTINE jacob
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE INITGRDVAR ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE initgrdvar(nx,ny,nz,nzsoil,nts,nstyps,exbcbufsz, & 4,46
x,y,z,zp,zpsoil,hterain,mapfct, &
j1,j2,j3,j3soil,aj3x,aj3y,aj3z,j3inv,j3soilinv, &
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
udteb, udtwb, vdtnb, vdtsb, &
pdteb,pdtwb ,pdtnb ,pdtsb, &
trigs1,trigs2,ifax1,ifax2, &
wsave1,wsave2,vwork1,vwork2, &
ubar,vbar,ptbar,pbar,ptbari,pbari, &
rhostr,rhostri,qvbar,ppi,csndsq, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsoil,qsoil,wetcanp,snowdpth,qvsfc, &
ptcumsrc,qcumsrc,w0avg,nca,kfraincv, &
cldefi,xland,bmjraincv, &
raing,rainc,prcrate,exbcbuf, &
radfrc,radsw,rnflx,radswnet,radlwin, &
usflx,vsflx,ptsflx,qvsflx, &
tem1soil,tem2soil,tem3soil,tem4soil,tem5soil, &
tem1,tem2,tem3,tem4,tem5, &
tem6,tem7,tem8,tem9)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Initialize the model array variables.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 3/17/1992.
!
! MODIFICATION HISTORY:
!
! 5/02/92 (M. Xue)
! Added full documentation.
!
! 5/03/92 (M. Xue)
! Further documentation.
!
! 10/7/1992 (M. Xue)
! Added call to subroutine extinit, the option three of
! initialization.
!
! 9/10/94 (Weygandt & Y. Lu)
! Cleaned up documentation.
!
! 02/07/1995 (Yuhe Liu)
! Added a new 2-D permanent array, veg(nx,ny), to the argument list
!
! 10/31/95 (D. Weber)
! Added trigs1,trigs2,ifax1,ifax2 for use in the fft code for the
! upper radiation condition.
!
! 1/22/96 (Donghai Wang & Yuhe Liu)
! Added the map projection factor to ARPS governing equations.
!
! 07/22/97 (D. Weber)
! Added wsave1,wsave2,vwork1,vwork2 for use in the even fft version
! of the upper w-p radiation condition (fftopt=2).
!
! 08/01/97 (Zonghui Huo)
! Added Kain-fritsch cumulus parameterization scheme.
!
! 11/06/97 (D. Weber)
! Added three additional levels to the mapfct array. The three
! levels (4,5,6) represent the inverse of the first three in order.
! The inverse map factors are computed to improve efficiency.
!
! 12/05/97 (K. Brewster)
! Added argument, nt, so that routines that do not require more
! than one time level can be initialized using less memory.
!
! 4/15/1998 (Donghai Wang)
! Added the source terms to the right hand terms of the qc,qr,qi,qs
! equations due to the K-F cumulus parameterization.
!
! 4/15/1998 (Donghai Wang)
! Added the running average vertical velocity (array w0avg)
! for the K-F cumulus parameterization scheme.
!
! 11/18/98 (Keith Brewster)
! Changed pibar to ppi (full pi).
!
! 12/09/1998 (Donghai Wang)
! Added the snow cover.
!
! 11/06/2001 (Yunheng Wang)
! Added mpupdatei calling for ict/icb to solve radiation forcing
! difference for MPI run.
!
! 2002/02/28 (Gene Bassett)
! Replaced mpupdatei for ict/icb to a call to mpmax0.
!
! 13 March 2002 (Eric Kemp)
! Added arrays for WRF BMJ cumulus scheme.
!
! 04/10/2002 (Yunheng Wang)
! Subsituted mpupdatei calls for mpmax0 calls again
! because mpmax0 calls were not correct.
!
! 05/18/2002 (Dan Weber and Jerry Brotzge)
! Added new soil model variables.
!
!-----------------------------------------------------------------------
!
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
! nts Number of time levels to be initialized.
!
! x x coordinate of grid points in physical/comp. space (m)
! y y coordinate of grid points in physical/comp. space (m)
! z z coordinate of grid points in computational space (m)
! zp Vertical coordinate of grid points in physical space
! (m)
! zpsoil Vertical coordinate of grid points in the soil model
! in physical space (m).
! hterain The height of terrain (m)
!
! mapfct Map factors at scalar, u and v points
!
! j1 Coordinate transformation Jacobian -d(zp)/dx
! j2 Coordinate transformation Jacobian -d(zp)/dy
! j3 Coordinate transformation Jacobian d(zp)/dz
! j3soil Soil coordinate transformation Jacobian d(zpsoil)/dz
! aj3x Avgx of the coordinate transformation Jacobian d(zp)/dz
! aj3y Avgy of the coordinate transformation Jacobian d(zp)/dz
! aj3z Avgz of the coordinate transformation Jacobian d(zp)/dz
! j3soilinv Inverse of the soil coordinate transformation j3soil
!
! trigs1 Array containing pre-computed trig function for fftopt=1.
! trigs1 Array containing pre-computed trig function for fftopt=1.
! ifax1 Array containing the factors of nx for fftopt=1.
! ifax2 Array containing the factors of ny for fftopt=1.
!
! vwork1 2-D work array for fftopt=2.
! vwork2 2-D work array for fftopt=2.
! wsave1 Work array for fftopt=2.
! wsave2 Work array for fftopt=2.
!
! OUTPUT:
!
! u x component of velocity at all time levels (m/s)
! v y component of velocity at all time levels (m/s)
! w Vertical component of Cartesian velocity
! at all time levels (m/s)
! wcont Contravariant vertical velocity (m/s)
! ptprt Perturbation potential temperature at all time levels
! (K)
! pprt Perturbation pressure at all time levels (Pascal)
! qv Water vapor specific humidity at all time levels
! (kg/kg)
! qc Cloud water mixing ratio at all time levels (kg/kg)
! qr Rainwater mixing ratio at all time levels (kg/kg)
! qi Cloud ice mixing ratio at all time levels (kg/kg)
! qs Snow mixing ratio at all time levels (kg/kg)
! qh Hail mixing ratio at all time levels (kg/kg)
! tke Turbulent Kinetic Energy ((m/s)**2)
!
! udteb Time tendency of u field at east boundary (m/s**2)
! udtwb Time tendency of u field at west boundary (m/s**2)
!
! vdtnb Time tendency of v field at north boundary (m/s**2)
! vdtsb Time tendency of v field at south boundary (m/s**2)
!
! pdteb Time tendency of pprt field at east boundary (PASCAL/s)
! pdtwb Time tendency of pprt field at west boundary (PASCAL/s)
! pdtnb Time tendency of pprt field at north boundary
! (PASCAL/s)
! pdtsb Time tendency of pprt field at south boundary
! (PASCAL/s)
!
! ubar Base state zonal velocity component (m/s)
! vbar Base state meridional velocity component (m/s)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! ptbari Inverse Base state potential temperature (K)
! pbari Inverse Base state pressure (Pascal)
! rhostr Base state density rhobar times j3 (kg/m**3)
! rhostri Inverse base state density rhobar times j3 (kg/m**3)
! qvbar Base state water vapor specific humidity (kg/kg)
! ppi Exner function.
! csndsq Sound wave speed squared.
!
! soiltyp Soil type
! vegtyp Vegetation type
! lai Leaf Area Index
! roufns Surface roughness
! veg Vegetation fraction
!
! tsoil Soil temperature (K)
! qsoil Soil moisture (m**3/m**3)
! wetcanp Canopy water amount
! snowdpth Snow depth (m)
! qvsfc Effective S.H. at sfc.
!
! ptcumsrc Source term in pt-equation due to cumulus parameterization
! qcumsrc Source term in water equations due to cumulus parameterization
! kfraincv K-F convective rainfall (cm)
! nca K-F counter for CAPE release
! cldefi BMJ cloud efficiency
! xland BMJ land/sea mask
! bmjraincv BMJ convective rainfall (cm)
!
! radfrc Radiation forcing (K)
! radsw Solar radiation reaching the surface
! rnflx Net absorbed radiation by the surface
! radswnet Net shortwave radiation
! radlwin Incoming longwave radiation
!
! raing Grid supersaturation rain
! rainc Cumulus convective rain
!
! WORK ARRAYS:
!
! tem1soil Soil model temporary work array.
! tem2soil Soil model temporary work array.
! tem3soil Soil model temporary work array.
! tem4soil Soil model temporary work array.
! tem5soil Soil model temporary work array.
!
! tem1 Temporary work array.
! tem2 Temporary work array.
! tem3 Temporary work array.
! tem4 Temporary work array.
! tem5 Temporary work array.
! tem6 Temporary work array.
! tem7 Temporary work array.
! tem8 Temporary work array.
! tem9 Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nts ! Number of time levels to be initialized.
INTEGER :: tpast ! Index of time level for the past time.
INTEGER :: tpresent ! Index of time level for the present
! time.
INTEGER :: tfuture ! Index of time level for the future
! time.
INTEGER :: nx,ny,nz ! The number of grid points in 3
! directions
INTEGER :: nzsoil ! Number of grid points in the -z direction
REAL :: x (nx) ! x-coord. of the physical and compu-
! tational grid. Defined at u-point.
REAL :: y (ny) ! y-coord. of the physical and compu-
! tational grid. Defined at v-point.
REAL :: z (nz) ! z-coord. of the computational grid.
! Defined at w-point on the staggered
! grid.
REAL :: zp (nx,ny,nz) ! Physical height coordinate defined at
! w-point of the staggered grid.
REAL :: zpsoil(nx,ny,nzsoil) ! The physical height coordinate defined
! at the center of a soil layer(m).
REAL :: hterain(nx,ny) ! The height of the terrain.
REAL :: mapfct(nx,ny,8) ! Map factors at scalar, u and v points
REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian
! defined as - d( zp )/d( x ).
REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian
! defined as - d( zp )/d( y ).
REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian
! defined as d( zp )/d( z ).
REAL :: j3soil(nx,ny,nzsoil) ! Coordinate transformation Jacobian
! defined as d( zpsoil )/d( zsoil ).
REAL :: aj3x (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE X-DIR.
REAL :: aj3y (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE Y-DIR.
REAL :: aj3z (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE Z-DIR.
REAL :: j3inv (nx,ny,nz) ! Inverse of j3
REAL :: j3soilinv(nx,ny,nzsoil) ! Inverse of J3soil.
REAL :: trigs1(3*(nx-1)/2+1) ! Array containing pre-computed trig
! function for fftopt=1.
REAL :: trigs2(3*(ny-1)/2+1) ! Array containing pre-computed trig
! function for fftopt=1.
INTEGER :: ifax1(13) ! Array containing the factors of nx for
! fftopt=1.
INTEGER :: ifax2(13) ! Array containing the factors of ny for
! fftopt=1.
REAL :: vwork1 (nx+1,ny+1) ! 2-D work array for fftopt=2.
REAL :: vwork2 (ny,nx+1) ! 2-D work array for fftopt=2.
REAL :: wsave1 (3*(ny-1)+15) ! Work array for fftopt=2.
REAL :: wsave2 (3*(nx-1)+15) ! Work array for fftopt=2.
REAL :: u (nx,ny,nz,nts) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz,nts) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz,nts) ! Total w-velocity (m/s)
REAL :: wcont (nx,ny,nz) ! Contravariant vertical velocity (m/s)
REAL :: ptprt (nx,ny,nz,nts) ! Perturbation potential temperature (K)
REAL :: pprt (nx,ny,nz,nts) ! Perturbation pressure (Pascal)
REAL :: qv (nx,ny,nz,nts) ! Water vapor specific humidity (kg/kg)
REAL :: qc (nx,ny,nz,nts) ! Cloud water mixing ratio (kg/kg)
REAL :: qr (nx,ny,nz,nts) ! Rain water mixing ratio (kg/kg)
REAL :: qi (nx,ny,nz,nts) ! Cloud ice mixing ratio (kg/kg)
REAL :: qs (nx,ny,nz,nts) ! Snow mixing ratio (kg/kg)
REAL :: qh (nx,ny,nz,nts) ! Hail mixing ratio (kg/kg)
REAL :: tke (nx,ny,nz,nts) ! Turbulent Kinetic Energy ((m/s)**2)
REAL :: udteb (ny,nz) ! T-tendency of u at e-boundary (m/s**2)
REAL :: udtwb (ny,nz) ! T-tendency of u at w-boundary (m/s**2)
REAL :: vdtnb (nx,nz) ! T-tendency of v at n-boundary (m/s**2)
REAL :: vdtsb (nx,nz) ! T-tendency of v at s-boundary (m/s**2)
REAL :: pdteb (ny,nz) ! T-tendency of pprt at e-boundary
! (PASCAL/s)
REAL :: pdtwb (ny,nz) ! T-tendency of pprt at w-boundary
! (PASCAL/s)
REAL :: pdtnb (nx,nz) ! T-tendency of pprt at n-boundary
! (PASCAL/s)
REAL :: pdtsb (nx,nz) ! T-tendency of pprt at s-boundary
! (PASCAL/s)
REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s)
REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal).
REAL :: ptbari(nx,ny,nz) ! Inverse Base state pot. temperature (K)
REAL :: pbari (nx,ny,nz) ! Inverse Base state pressure (Pascal).
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: rhostri(nx,ny,nz) ! Inv. base state density rhobar times j3.
REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific
! humidity(kg/kg)
REAL :: ppi (nx,ny,nz) ! Exner function.
REAL :: csndsq(nx,ny,nz) ! Sound wave speed squared.
INTEGER :: nstyps ! Number of soil types
INTEGER :: soiltyp(nx,ny,nstyps) ! Soil types at grid points
REAL :: stypfrct(nx,ny,nstyps) ! Fraction of soil types
INTEGER :: vegtyp (nx,ny) ! Vegetation type
REAL :: lai (nx,ny) ! Leaf Area Index
REAL :: roufns (nx,ny) ! Surface roughness
REAL :: veg (nx,ny) ! Vegetation fraction
REAL :: qvsfc(nx,ny,0:nstyps) ! Effective qv at sfc.
REAL :: tsoil(nx,ny,nzsoil,0:nstyps) ! Deep soil temperature (K)
! (in deep 1 m layer)
REAL :: qsoil(nx,ny,nzsoil,0:nstyps) ! Surface soil moisture in the top
! 1 cm layer
REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount
REAL :: snowdpth(nx,ny) ! Snow depth (m)
REAL :: ptcumsrc(nx,ny,nz) ! Source term in pt-equation due
! to cumulus parameterization
REAL :: qcumsrc(nx,ny,nz,5) ! Source term in water equations due
! to cumulus parameterization:
! qcumsrc(1,1,1,1) for qv equation
! qcumsrc(1,1,1,2) for qc equation
! qcumsrc(1,1,1,3) for qr equation
! qcumsrc(1,1,1,4) for qi equation
! qcumsrc(1,1,1,5) for qs equation
REAL :: w0avg(nx,ny,nz) ! a closing running average vertical
! velocity in 10min for K-F scheme
REAL :: kfraincv(nx,ny) ! K-F convective rainfall (cm)
INTEGER :: nca(nx,ny) ! K-F counter for CAPE release
!EMK BMJ
REAL,INTENT(INOUT) :: cldefi(nx,ny) ! BMJ cloud efficiency
REAL,INTENT(INOUT) :: xland(nx,ny) ! BMJ land mask
! (1.0 = land, 2.0 = sea)
REAL,INTENT(INOUT) :: bmjraincv(nx,ny) ! BMJ convective rainfall (cm)
!EMK END
REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s)
REAL :: radsw (nx,ny) ! Solar radiation reaching the surface
REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface
REAL :: radswnet(nx,ny) ! Net shortwave radiation
REAL :: radlwin(nx,ny) ! Incoming longwave radiation
REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2))
REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2))
REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2))
REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s))
REAL :: raing(nx,ny) ! Grid supersaturation rain
REAL :: rainc(nx,ny) ! Cumulus convective rain
REAL :: prcrate(nx,ny,4) ! precipitation rate (kg/(m**2*s))
! prcrate(1,1,1) = total precipitation rate
! prcrate(1,1,2) = grid scale precip. rate
! prcrate(1,1,3) = cumulus precip. rate
! prcrate(1,1,4) = microphysics precip. rate
INTEGER :: exbcbufsz ! EXBC buffer size
REAL :: exbcbuf( exbcbufsz ) ! EXBC buffer array
REAL :: tem1soil(nx,ny,nzsoil) ! Temporary soil model work array.
REAL :: tem2soil(nx,ny,nzsoil) ! Temporary soil model work array.
REAL :: tem3soil(nx,ny,nzsoil) ! Temporary soil model work array.
REAL :: tem4soil(nx,ny,nzsoil) ! Temporary soil model work array.
REAL :: tem5soil(nx,ny,nzsoil) ! Temporary soil model work array.
REAL :: tem1 (nx,ny,nz) ! Temporary work array.
REAL :: tem2 (nx,ny,nz) ! Temporary work array.
REAL :: tem3 (nx,ny,nz) ! Temporary work array.
REAL :: tem4 (nx,ny,nz) ! Temporary work array.
REAL :: tem5 (nx,ny,nz) ! Temporary work array.
REAL :: tem6 (nx,ny,nz) ! Temporary work array.
REAL :: tem7 (nx,ny,nz) ! Temporary work array.
REAL :: tem8 (nx,ny,nz) ! Temporary work array.
REAL :: tem9 (nx,ny,nz) ! Temporary work array.
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k
INTEGER :: iskip
REAL :: temp
REAL :: alatpro(2)
REAL :: sclf
REAL :: dxscl ! Model x-direction grid spacing
! normalized by the map scale
! dxscl=dx/sclf
REAL :: dyscl ! Model y-direction grid spacing
! normalized by the map scale
! dyscl=dy/sclf
REAL :: xs,ys, swx,swy, ctrx, ctry
REAL zpmax
REAL :: rmin,rmax
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
INCLUDE 'bndry.inc'
INCLUDE 'phycst.inc'
INCLUDE 'mp.inc' ! Message passing parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! If initopt = 1, initialize the model fields using intialization
! routines. Typically from an analytical
! definition of initial perturbations.
!
! If initopt = 2, initialize the model fields from a restart file
! produced by a previous model run.
!
! If initopt = 3, initialize the model fields by reading in an
! external data file.
!
! If initopt = 4, initialize the model fields by reading in restart
! file first then an external data file.
!
!-----------------------------------------------------------------------
!
IF( nts > 1 ) THEN
tpast=1
tpresent=2
tfuture=3
ELSE
tpast=1
tpresent=1
tfuture=1
END IF
IF( initopt == 1 ) THEN
!
!-----------------------------------------------------------------------
!
! Initialization of model GRiD definition arrays.
!
!-----------------------------------------------------------------------
!
CALL inigrd
(nx,ny,nz,nzsoil,x,y,z,zp,zpsoil, &
hterain,mapfct,j1,j2,j3,j3soil, &
j3soilinv,tem1,tem2,tem3)
!
!-----------------------------------------------------------------------
!
! Define the base state atmospheric variables.
!
!-----------------------------------------------------------------------
!
! IF ((inibasopt == 1) .AND. (max_fopen < nprocs)) THEN
! CALL wrtcomment("ERROR: for message passing version with "// &
! "inibasopt=1, max_fopen (in arps.input)",1)
! CALL arpsstop ("arpsstop called from initgrdvar due to nproc_x-y &
! & nproc_x*nproc_y (in arps.input).",1)
! END IF
IF(inibasopt == 1) THEN
iskip = nproc_x * nproc_y
ELSE
iskip = max_fopen
END IF
! blocking inserted for ordering i/o for message passing
DO i=0,nprocs-1,iskip
IF(myproc >= i.AND.myproc <= i+iskip-1)THEN
CALL inibase
(nx,ny,nz, ubar,vbar,ptbar,pbar,ptbari,pbari, &
rhostr,rhostri,qvbar, &
x,y,z,zp,j3, tem1,tem2,tem3,tem4,tem5,tem6)
END IF
IF (mp_opt > 0) CALL mpbarrier
END DO
!
!-----------------------------------------------------------------------
!
! Initialize time dependent model variables.
!
!-----------------------------------------------------------------------
!
CALL initdvr
(nx,ny,nz,nts, &
ubar,vbar,ptbar,pbar,rhostr,qvbar, &
x,y,z,zp,hterain, j1,j2,j3, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh, &
ptcumsrc,qcumsrc,raing,rainc,prcrate,tem1)
!
!-----------------------------------------------------------------------
!
! Set the time tendencies of u, v and pprt on the lateral boundaries
! to zero for the initial time step
!
! These tendencies will be used by lateral boundary condition options
! 4 and 5 only.
!
!-----------------------------------------------------------------------
!
DO k=1,nz
DO j=1,ny
udteb(j,k) = 0.0
udtwb(j,k) = 0.0
pdteb(j,k) = 0.0
pdtwb(j,k) = 0.0
END DO
END DO
DO k=1,nz
DO i=1,nx
vdtnb(i,k) = 0.0
vdtsb(i,k) = 0.0
pdtnb(i,k) = 0.0
pdtsb(i,k) = 0.0
END DO
END DO
ELSE IF( initopt == 2 .or. initopt == 4) THEN ! restart run
!
!-----------------------------------------------------------------------
!
! Read in restart data from a restart file to initialize fields
! u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh at time tpast and tpresent,
! the base state variables ubar,vbar,ptbar,pbar,rhostr,qvbar,
! and the time tendencies of variables at the lateral boundries.
!
! Fields at tfuture are set to equal to those at tpresent.
!
! This subroutine also sets the value of tstart to the restart
! data time. The value from input file in over-written.
!
!-----------------------------------------------------------------------
!
IF(mp_opt >0 .AND. readsplit > 0) THEN
CALL rstinsplit
(nx,ny,nz,nzsoil,nts, nstyps, exbcbufsz, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
udteb, udtwb, vdtnb, vdtsb, &
pdteb, pdtwb, pdtnb, pdtsb, &
ubar,vbar,ptbar,pbar,rhostr,qvbar, &
x,y,z,zp,zpsoil,hterain,mapfct,j1,j2,j3,j3soil, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsoil,qsoil,wetcanp,snowdpth,qvsfc, &
ptcumsrc,qcumsrc,w0avg,nca,kfraincv, &
cldefi,xland,bmjraincv, &
radfrc,radsw,rnflx,radswnet,radlwin, &
raing,rainc,prcrate,exbcbuf,tem1,tem2)
ELSE
CALL rstin
(nx,ny,nz,nzsoil,nts, nstyps, exbcbufsz, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
udteb, udtwb, vdtnb, vdtsb, &
pdteb, pdtwb, pdtnb, pdtsb, &
ubar,vbar,ptbar,pbar,rhostr,qvbar, &
x,y,z,zp,zpsoil,hterain,mapfct,j1,j2,j3,j3soil, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsoil,qsoil,wetcanp,snowdpth,qvsfc, &
ptcumsrc,qcumsrc,w0avg,nca,kfraincv, &
cldefi,xland,bmjraincv, &
radfrc,radsw,rnflx,radswnet,radlwin, &
raing,rainc,prcrate,exbcbuf,tem1,tem2)
END IF
!
!-----------------------------------------------------------------------
!
! Set map projection parameters which were not stored in restart
! data file.
!
!-----------------------------------------------------------------------
!
alatpro(1) = trulat1
alatpro(2) = trulat2
IF( sclfct /= 1.0) THEN
sclf = 1.0/sclfct
dxscl = dx*sclf
dyscl = dy*sclf
ELSE
sclf = 1.0
dxscl = dx
dyscl = dy
END IF
CALL setmapr
( mapproj,sclf,alatpro,trulon )
CALL lltoxy
( 1,1, ctrlat,ctrlon, ctrx, ctry )
! swx = ctrx - (float(nx-3)/2.) * dxscl
! swy = ctry - (float(ny-3)/2.) * dyscl
swx = ctrx - (FLOAT(nproc_x*(nx-3))/2.) * dxscl
swy = ctry - (FLOAT(nproc_y*(ny-3))/2.) * dyscl
CALL setorig
( 1, swx, swy)
! set up the model origin to the coord.
CALL setcornerll
(nx,ny, x, y)
DO k=1,nz-1
DO j=1,ny
DO i=1,nx
tem1(i,j,k) = rhostr(i,j,k)/j3(i,j,k)
tem2(i,j,k) = (zp(i,j,k)+zp(i,j,k+1))*0.5
END DO
END DO
END DO
CALL writesnd
(nx,ny,nz,ubar,vbar,ptbar,pbar,qvbar,zp, tem1, tem2)
ENDIF
IF( initopt == 3 .or. initopt == 4) THEN ! External data input.
!
!-----------------------------------------------------------------------
!
! Read in externally supplied initial fields. These fields include
! u, v, w, ptprt, pprt, qv, qc, qr, qi, qs, and qh at time level
! tpresent, and the base state variables ubar, vbar, ptbar, pbar,
! rhostr,qvbar.
!
! Fields at tpast and tfuture are set to their values at tpresent.
!
!-----------------------------------------------------------------------
!
CALL extinit
(nx,ny,nz,nzsoil,nts,nstyps, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
ubar,vbar,ptbar,pbar,rhostr,qvbar, &
x,y,z,zp,zpsoil,hterain,j1,j2,j3,j3soil, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsoil,qsoil,wetcanp,snowdpth,qvsfc, &
ptcumsrc,qcumsrc,raing,rainc,prcrate, &
radfrc,radsw,rnflx,radswnet,radlwin, &
usflx,vsflx,ptsflx,qvsflx, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8,tem9)
!
!-----------------------------------------------------------------------
!
! Set map projection parameters which were not stored in history
! data file.
!
!-----------------------------------------------------------------------
!
alatpro(1) = trulat1
alatpro(2) = trulat2
IF( sclfct /= 1.0) THEN
sclf = 1.0/sclfct
dxscl = dx*sclf
dyscl = dy*sclf
ELSE
sclf = 1.0
dxscl = dx
dyscl = dy
END IF
CALL setmapr
( mapproj,sclf,alatpro,trulon )
CALL lltoxy
( 1,1, ctrlat,ctrlon, ctrx, ctry )
! swx = ctrx - (float(nx-3)/2.) * dxscl
! swy = ctry - (float(ny-3)/2.) * dyscl
swx = ctrx - (FLOAT(nproc_x*(nx-3))/2.) * dxscl
swy = ctry - (FLOAT(nproc_y*(ny-3))/2.) * dyscl
CALL setorig
( 1, swx, swy)
! set up the model origin to the coord.
IF ( mpfctopt /= 0 ) THEN
DO j=1,ny-1
DO i=1,nx-1
xs = 0.5*(x(i)+x(i+1))
ys = 0.5*(y(j)+y(j+1))
CALL xytomf
( 1,1,xs,ys,mapfct(i,j,1) )
mapfct(i,j,4) = 1.0/mapfct(i,j,1)
mapfct(i,j,7) = mapfct(i,j,1)*mapfct(i,j,1)
mapfct(i,j,8) = 0.25*mapfct(i,j,1)
END DO
END DO
DO j=1,ny-1
DO i=1,nx
ys = 0.5*(y(j)+y(j+1))
CALL xytomf
( 1,1,x(i),ys,mapfct(i,j,2) )
mapfct(i,j,5) = 1.0/mapfct(i,j,2)
END DO
END DO
DO j=1,ny
DO i=1,nx-1
xs = 0.5*(x(i)+x(i+1))
CALL xytomf
( 1,1,xs,y(j),mapfct(i,j,3) )
mapfct(i,j,6) = 1.0/mapfct(i,j,3)
END DO
END DO
ELSE
DO k=1,7
DO j=1,ny
DO i=1,nx
mapfct(i,j,k) = 1.0
mapfct(i,j,8) = 0.25
END DO
END DO
END DO
END IF
CALL setcornerll
(nx,ny, x, y)
IF( initopt == 3 ) then
!
!-----------------------------------------------------------------------
!
! Set the time tendencies of u, v and pprt on the lateral boundaries
! to zero for the initial time step
!
! These tendencies will be used by lateral boundary condition options
! 4 and 5 only.
!
!-----------------------------------------------------------------------
!
DO k=1,nz
DO j=1,ny
udteb(j,k) = 0.0
udtwb(j,k) = 0.0
pdteb(j,k) = 0.0
pdtwb(j,k) = 0.0
END DO
END DO
DO k=1,nz
DO i=1,nx
vdtnb(i,k) = 0.0
vdtsb(i,k) = 0.0
pdtnb(i,k) = 0.0
pdtsb(i,k) = 0.0
END DO
END DO
ENDIF
DO k=1,nz-1
DO j=1,ny
DO i=1,nx
tem1(i,j,k) = rhostr(i,j,k)/j3(i,j,k)
tem2(i,j,k) = (zp(i,j,k)+zp(i,j,k+1))*0.5
END DO
END DO
END DO
CALL writesnd
(nx,ny,nz,ubar,vbar,ptbar,pbar,qvbar,zp, tem1, tem2)
END IF
!
!-----------------------------------------------------------------------
!
! Define the reversed vertical indeces of height cldh2m and cldm2l
! which represent the levels that separate high, middle, and low
! clouds in the computation of the solar radiation transfer
!
!-----------------------------------------------------------------------
!
ict = nz-2
icb = nz-2
DO k=nz-2,2,-1
tem1(1,1,k) = (zp(1,1,k)-zp(1,1,2))*(zflat-zrefsfc) &
/(zflat-zp(1,1,2))+zrefsfc
END DO
DO k=nz-2,2,-1
IF ( tem1(1,1,k) <= cldh2m) THEN
ict = k
EXIT
END IF
END DO
! for bit-for-bit MP accuracy:
CALL mpupdatei
(ict, 1)
DO k=nz-2,2,-1
IF ( tem1(1,1,k) <= cldm2l) THEN
icb = k
EXIT
END IF
END DO
! for bit-for-bit MP accuracy:
CALL mpupdatei
(icb, 1)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
j3inv(i,j,k)=1.0/j3(i,j,k)
END DO
END DO
END DO
DO k=1,nzsoil
DO j=1,ny-1
DO i=1,nx-1
j3soilinv(i,j,k)=1.0/j3soil(i,j,k)
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=2,nx-1
aj3x(i,j,k)=0.5*(j3(i,j,k)+j3(i-1,j,k))
END DO
END DO
END DO
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(aj3x,nx,ny,nz,ebc,wbc,1,tem2)
!CALL mpsend2dns(aj3x,nx,ny,nz,1,mptag,tem2)
!CALL mprecv2dns(aj3x,nx,ny,nz,1,mptag,tem2)
END IF
CALL acct_interrupt
(bc_acct)
CALL bcsu
(nx,ny,nz,1,ny-1,1,nz-1,ebc,wbc,aj3x)
CALL acct_stop_inter
DO k=1,nz-1
DO j=2,ny-1
DO i=1,nx-1
aj3y(i,j,k)=0.5*(j3(i,j,k)+j3(i,j-1,k))
END DO
END DO
END DO
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
!CALL mpsend2dew(aj3y,nx,ny,nz,2,mptag,tem2)
!CALL mprecv2dew(aj3y,nx,ny,nz,2,mptag,tem2)
CALL mpsendrecv2dns
(aj3y,nx,ny,nz,nbc,sbc,2,tem2)
END IF
CALL acct_interrupt
(bc_acct)
CALL bcsv
(nx,ny,nz,1,nx-1,1,nz-1,nbc,sbc,aj3y)
CALL acct_stop_inter
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
aj3z(i,j,k)=0.5*(j3(i,j,k)+j3(i,j,k-1))
END DO
END DO
END DO
CALL acct_interrupt
(bc_acct)
CALL bcsw
(nx,ny,nz,1,nx-1,1,ny-1,tbc,bbc,aj3z)
CALL acct_stop_inter
!
!-----------------------------------------------------------------------
!
! Calculate the trigs1,trigs2,ifax1,ifax2 arrays by calling set99
!
! OR
!
! calculate wsave1,wsave2 by calling vcosi.
!
!-----------------------------------------------------------------------
!
DO i=1,13
ifax1(i) = 0
ifax2(i) = 0
END DO
DO i=1,3*(nx-1)/2+1
trigs1(i) = 0
END DO
DO j=1,3*(ny-1)/2+1
trigs2(j) = 0
END DO
DO j=1,ny+1
DO i=1,nx+1
vwork1(i,j) = 0.0
END DO
END DO
DO i=1,nx+1
DO j=1,ny
vwork2(j,i) = 0.0
END DO
END DO
DO i=1,3*(nx-1)+15
wsave2(i) = 0.0
END DO
DO i=1,3*(ny-1)+15
wsave1(i) = 0.0
END DO
IF ( tbc == 4 ) THEN ! set up the fft work arrays for use in the
! upper radiation boundary condition.
IF ( fftopt == 1 ) THEN ! set up periodic work arrays...
IF ( ny == 4 ) THEN ! set up trigs in x direction only
CALL set99
(trigs1,ifax1,nx-1) ! NOTE: nx must be ODD!!!!
! and of special character...
! see fft99f.f for details....
ELSE IF ( nx == 4 ) THEN ! set up trigs in y direction only
CALL set99
(trigs2,ifax2,ny-1) ! NOTE: ny must be ODD!!!!
! and of special character...
! see fft99f.f for details....
ELSE ! set up for 2-d transform...
CALL set99
(trigs1,ifax1,nx-1) ! NOTE: nx must be ODD!!!!
! and of special character...
! see fft99f.f for details....
CALL set99
(trigs2,ifax2,ny-1) ! NOTE: ny must be ODD!!!!
! and of special character...
! see fft99f.f for details....
END IF
ELSE IF ( fftopt == 2 ) THEN ! set up the cos fft arrays...
IF(ny == 4)THEN ! set up function in x direction only...
CALL vcosti
(nx-1,wsave2) ! nx should be even.
ELSE IF(nx == 4)THEN ! set up function in y direction only...
CALL vcosti
(ny-1,wsave1) ! ny should be even.
ELSE ! set up functions for 2-d transform...
CALL vcosti
(ny-1,wsave1) ! ny should be even.
CALL vcosti
(nx-1,wsave2) ! nx should be even.
END IF ! end of run type if block...
END IF ! end of fftopt if block.....
END IF
!
!-----------------------------------------------------------------------
!
! Find the lowest model layer (index rayklow) that is entirely or
! partially contained in the specified Rayleigh damping (sponge)
! layers.
!
! The Rayleigh damping is then applied only to layers with
! k greater than or equal to rayklow.
!
!-----------------------------------------------------------------------
!
rayklow = nz-1
DO k=nz-1,2,-1
zpmax = zp(1,1,k)
DO j=1,ny-1
DO i=1,nx-1
zpmax = MAX( zp(i,j,k), zpmax )
END DO
END DO
! for bit-for-bit accuracy with MP version:
rmin = zpmax
call mpmax0
(zpmax,rmin)
IF( zpmax < zbrdmp ) THEN
rayklow = MAX(2, k+1)
EXIT
END IF
END DO
!
!-----------------------------------------------------------------------
!
! Calculate Exner function and store in ppi
!
!-----------------------------------------------------------------------
!
CALL setppi
(nx,ny,nz,nts,tpresent,pprt,pbar,ppi)
!
!-----------------------------------------------------------------------
!
! Calculate and store the sound wave speed squared in csndsq.
!
!-----------------------------------------------------------------------
!
IF(csopt == 1) THEN ! Original definition of sound speed.
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
csndsq(i,j,k)= cpdcv*pbar(i,j,k)*j3(i,j,k)/rhostr(i,j,k)
END DO
END DO
END DO
ELSE IF(csopt == 2) THEN ! Original sound speed multiplied
! by a factor
temp = csfactr**2*cpdcv
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
csndsq(i,j,k)= temp * pbar(i,j,k)*j3(i,j,k)/rhostr(i,j,k)
END DO
END DO
END DO
ELSE ! Specified constant sound speed.
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
csndsq(i,j,k)= csound * csound
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Fill the edges of base state arrays that are otherwise undefined.
! This is done for safty reason only.
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny
vbar (nx,j,k) = vbar (nx-1,j,k)
END DO
END DO
DO k=1,nz-1
DO i=1,nx
ubar (i,ny,k) = ubar (i,ny-1,k)
END DO
END DO
DO i=1,nx
DO j=1,ny
ubar (i,j,nz) = ubar (i,j,nz-1)
vbar (i,j,nz) = vbar (i,j,nz-1)
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
ptbar (nx,j,k) = ptbar (nx-1,j,k)
pbar (nx,j,k) = pbar (nx-1,j,k)
ppi (nx,j,k) = ppi (nx-1,j,k)
qvbar (nx,j,k) = qvbar (nx-1,j,k)
csndsq(nx,j,k) = csndsq(nx-1,j,k)
rhostr(nx,j,k) = rhostr(nx-1,j,k)
END DO
END DO
DO k=1,nz-1
DO i=1,nx
ptbar (i,ny,k) = ptbar (i,ny-1,k)
pbar (i,ny,k) = pbar (i,ny-1,k)
ppi (i,ny,k) = ppi (i,ny-1,k)
qvbar (i,ny,k) = qvbar (i,ny-1,k)
csndsq(i,ny,k) = csndsq(i,ny-1,k)
rhostr(i,ny,k) = rhostr(i,ny-1,k)
END DO
END DO
DO i=1,nx
DO j=1,ny
ptbar (i,j,nz) = ptbar (i,j,nz-1)
pbar (i,j,nz) = pbar (i,j,nz-1)
ppi (i,j,nz) = ppi (i,j,nz-1)
qvbar (i,j,nz) = qvbar (i,j,nz-1)
csndsq(i,j,nz) = csndsq(i,j,nz-1)
rhostr(i,j,nz) = rhostr(i,j,nz-1)
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
ptbari(i,j,k) = 1.0/ptbar(i,j,k)
pbari(i,j,k) = 1.0/pbar(i,j,k)
rhostri(i,j,k) = 1.0/rhostr(i,j,k)
END DO
END DO
END DO
IF ( sfcphy > 0 ) THEN
CALL initsfc
(nx,ny,nz,nzsoil,nstyps, &
zpsoil, &
pbar,pprt(1,1,1,1), &
ptbar,ptprt(1,1,1,1), &
qvbar,qv(1,1,1,1), &
soiltyp,stypfrct, vegtyp, lai,roufns,veg,tem1, &
tsoil,qsoil,wetcanp,snowdpth,qvsfc,tem1soil)
!
! 07/05/2002 Zuwen He
!
! The following code is added for version compatibility.
! Please refer to readsoil subroutine for more detail.
!
! Before fmtver500 there is no zpsoil specified. Therefore
! error may occur when read in soilvar file written prior
! to version500.
!
! We have hard-coded zpsoil in "readsoil", so that dzsoil
! is always 1m for all the old soilvar files. However,
! there is no terrain data passed to readsoil, and zpsoil
! is not correctly initialized.
!
! The following code fixes the problem.
!
DO k=1, nzsoil
DO j=1, ny
DO i=1, nx
zpsoil(i,j,k)=hterain(i,j)-(zpsoil(i,j,1)-zpsoil(i,j,k))
END DO
END DO
END DO
END IF
RETURN
END SUBROUTINE initgrdvar
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE INITDVR ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE initdvr(nx,ny,nz,nts, & 1,9
ubar,vbar,ptbar,pbar,rhostr,qvbar, &
x,y,z,zp,hterain, j1,j2,j3, &
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh, &
ptcumsrc,qcumsrc,raing,rainc,prcrate,tem1)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Initialize the model time dependent variables.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 10/10/1991.
!
! MODIFICATION HISTORY:
!
! 5/25/92 (M. Xue)
! Added full documentation.
!
! 5/03/92 (M. Xue)
! Further documentation.
!
! 4/10/93 (M. Xue & Hao Jin)
! Add the terrain.
!
! 9/10/94 (Weygandt & Y. Lu)
! Cleaned up documentation.
!
! 01/28/95 (G. Bassett)
! Added pt0opt=5 (soup can shaped perturbation to ptprt).
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
! nts Number of time levels to be initialized.
!
! ubar Base state x-velocity component (m/s)
! vbar Base state y-velocity component (m/s)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! rhostr Base state density rhobar times j3 (kg/m**3)
! qvbar Base state water vapor specific humidity (kg/kg).
!
! x x-coordinate of grid points in computational space (m)
! y y-coordinate of grid points in computational space (m)
! z z-coordinate of grid points in computational space (m)
! zp Vertical coordinate of grid points in physical space(m)
! hterain Terrain height (m)
!
! j1 Coordinate transformation Jacobian -d(zp)/dx
! j2 Coordinate transformation Jacobian -d(zp)/dy
! j3 Coordinate transformation Jacobian d(zp)/dz
!
! OUTPUT:
!
! u x-component of velocity at all time levels (m/s).
! v y-component of velocity at all time levels (m/s).
! w z-component of velocity at all time levels (m/s).
! ptprt Perturbation potential temperature at all time levels
! (K)
! pprt Perturbation pressure at all time levels (Pascal)
! qv Water vapor specific humidity at all time levels
! (kg/kg)
! qc Cloud water mixing ratio at all time levels (kg/kg)
! qr Rainwater mixing ratio at all time levels (kg/kg)
! qi Cloud ice mixing ratio at all time levels (kg/kg)
! qs Snow mixing ratio at all time levels (kg/kg)
! qh Hail mixing ratio at all time levels (kg/kg)
!
! ptcumsrc Source term in pt-equation due to cumulus parameterization
! qcumsrc Source term in water equations due to cumulus parameterization
! raing Grid supersaturation rain
! rainc Cumulus convective rain
! prcrate Precipitation ratesrain
!
! WORK ARRAYS:
!
! tem1 Temporary work array.
!
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! The number of grid points in 3
! directions
INTEGER :: nts ! Number of time levels to be initialized.
INTEGER :: tpast ! Index of time level for the past time.
INTEGER :: tpresent ! Index of time level for the present
! time.
INTEGER :: tfuture ! Index of time level for the future
! time.
REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s)
REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal).
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific
! humidity(kg/kg)
REAL :: x (nx) ! x-coord. of the physical and compu-
! tational grid. Defined at u-point.
REAL :: y (ny) ! y-coord. of the physical and compu-
! tational grid. Defined at v-point.
REAL :: z (nz) ! z-coord. of the computational grid.
! Defined at w-point on the staggered
! grid.
REAL :: zp (nx,ny,nz) ! Physical height coordinate defined at
! w-point of the staggered grid.
REAL :: hterain(nx,ny) ! Terrain height (m).
REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian
! -d(zp)/dx.
REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian
! -d(zp)/dy.
REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian
! d(zp)/dz.
REAL :: u (nx,ny,nz,nts) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz,nts) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz,nts) ! Total w-velocity (m/s)
REAL :: ptprt (nx,ny,nz,nts) ! Perturbation potential temperature (K)
REAL :: pprt (nx,ny,nz,nts) ! Perturbation pressure (Pascal)
REAL :: qv (nx,ny,nz,nts) ! Water vapor specific humidity (kg/kg)
REAL :: qc (nx,ny,nz,nts) ! Cloud water mixing ratio (kg/kg)
REAL :: qr (nx,ny,nz,nts) ! Rain water mixing ratio (kg/kg)
REAL :: qi (nx,ny,nz,nts) ! Cloud ice mixing ratio (kg/kg)
REAL :: qs (nx,ny,nz,nts) ! Snow mixing ratio (kg/kg)
REAL :: qh (nx,ny,nz,nts) ! Hail mixing ratio (kg/kg)
REAL :: ptcumsrc(nx,ny,nz) ! Source term in pt-equation due
! to cumulus parameterization
REAL :: qcumsrc(nx,ny,nz,5) ! Source term in water equations due
! to cumulus parameterization:
! qcumsrc(1,1,1,1) for qv equation
! qcumsrc(1,1,1,2) for qc equation
! qcumsrc(1,1,1,3) for qr equation
! qcumsrc(1,1,1,4) for qi equation
! qcumsrc(1,1,1,5) for qs equation
REAL :: raing (nx,ny) ! Grid supersaturation rain
REAL :: rainc (nx,ny) ! Cumulus convective rain
REAL :: prcrate(nx,ny,4) ! precipitation rate (kg/(m**2*s))
! prcrate(1,1,1) = total precip. rate
! prcrate(1,1,2) = grid scale precip. rate
! prcrate(1,1,3) = cumulus precip. rate
! prcrate(1,1,4) = microphysics precip. rate
REAL :: tem1(nx,ny,nz) ! Temporary work array
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
REAL :: xs, ys, zs
REAL :: us, vs, ws, rhobar
REAL :: radnd , pi,pi2,pi4
INTEGER :: i,j,k, n
INTEGER :: iseed,ibgn,iend,jbgn,jend,kbgn,kend
INTEGER :: ebc1,wbc1,nbc1,sbc1
REAL :: amplitud
REAL :: knumx,lnumy,mnumz
REAL :: lnthx,lnthy,lnthz
REAL :: lambda,lambdah,lambda2
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
INCLUDE 'phycst.inc'
INCLUDE 'bndry.inc'
INCLUDE 'mp.inc' ! Message passing parameters.
INTEGER :: nxlg, nylg
REAL :: temlg1((nx-3)*nproc_x+3,(ny-3)*nproc_y+3,nz)
REAL :: temlg2((nx-3)*nproc_x+3,(ny-3)*nproc_y+3,nz)
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IF( nts > 1 ) THEN
tpast=1
tpresent=2
tfuture=3
ELSE
tpast=1
tpresent=1
tfuture=1
END IF
!
!-----------------------------------------------------------------------
!
! Specify the initial potential temperature perturbation.
!
!-----------------------------------------------------------------------
!
IF( pt0opt == 1 .OR. pt0opt == 6 ) THEN ! Bubble shaped perturbation
!
!-----------------------------------------------------------------------
!
! Define a potential temperature perturbation for a bubble-shaped
! disturbance.
!
!-----------------------------------------------------------------------
!
pi2 = 1.5707963267949
IF( ptpert0 == 0.0) THEN
DO k= 1,nz-1
DO j= 1,ny-1
DO i= 1,nx-1
ptprt(i,j,k,1) = 0.0
END DO
END DO
END DO
ELSE
DO k= 1,nz-1
DO j= 1,ny-1
DO i= 1,nx-1
xs = (x(i)+x(i+1))*0.5
ys = (y(j)+y(j+1))*0.5
! xs = (x(i)+x(i+1))*0.5-x(1)
! ys = (y(j)+y(j+1))*0.5-y(1)
!wdt multiple bubbles for timing tests
zs = (zp(i,j,k)+zp(i,j,k+1))*0.5
IF( pt0rady < 0.0 .OR. runmod == 2 ) THEN
! 2-d bubble in x-z plane.
radnd = SQRT( ((xs-pt0ctrx)/pt0radx)**2 &
+ ((zs-pt0ctrz)/pt0radz)**2 )
ELSE IF( pt0radx < 0.0 .OR. runmod == 3 ) THEN
! 2-d bubble in y-z plane.
radnd = SQRT( ((ys-pt0ctry)/pt0rady)**2 &
+ ((zs-pt0ctrz)/pt0radz)**2 )
ELSE ! 3-d bubble
radnd = SQRT( ((xs-pt0ctrx)/pt0radx)**2 + &
((ys-pt0ctry)/pt0rady)**2 + &
((zs-pt0ctrz)/pt0radz)**2 )
END IF
IF(radnd >= 1.0) THEN
ptprt(i,j,k,1) = 0.0
ELSE
ptprt(i,j,k,1) = ptpert0*(COS(pi2*radnd )**2)
END IF
END DO
END DO
END DO
IF(pt0opt == 6) THEN ! Perturbation speficied in T'.
DO k= 1,nz-1
DO j= 1,ny-1
DO i= 1,nx-1
ptprt(i,j,k,1) = ptprt(i,j,k,1)*(p0/pbar(i,j,k))**rddcp
END DO
END DO
END DO
END IF
END IF
ELSE IF( pt0opt == 2 .OR. pt0opt == 3 ) THEN
! Random field
!
!-----------------------------------------------------------------------
!
! Define a potential temperature perturbation by a random function.
! This ensures that the horizontal average of the perturbation in a
! specified domain is zero.
!
! Fill an array with zeros.
!
!-----------------------------------------------------------------------
!
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
ptprt(i,j,k,1) = 0.0
END DO
END DO
END DO
nxlg = ((nx-3)*nproc_x+3) ! will be nx if nproc_x = 1
! which is the case for serial run, see initpara
nylg = ((ny-3)*nproc_y+3) ! will be ny if nproc_y = 1
! which is the case for serial run, see initpara
!
!-----------------------------------------------------------------------
!
! The following parameters define the portion of domain to be
! initialized with a random potential temperture perturbation.
! Users can modify them to fit their needs.
!
! NOTE: if this is an MPI run, ibgn,iend and jbgn,jend should
! be defined over the entire domain, and not just for one
! processor!
!
!-----------------------------------------------------------------------
!
ibgn = 1
iend = nxlg - 1 ! will be nx-1 if nproc_x = 1
jbgn = 1
jend = nylg - 1 ! will be ny-1 if nproc_y = 1
kbgn = 1
kend = nz-1
iseed = -100
DO k= kbgn,kend
CALL ranary
(nx,ny,ibgn,iend,jbgn,jend, &
iseed,ptpert0,ptprt(1,1,k,1))
END DO
IF( pt0opt == 3 ) THEN ! Symmetric random perturbation
!
!-----------------------------------------------------------------------
!
! Create a random perturbation field symmetric about both the x and y
! axes.
!
!-----------------------------------------------------------------------
CALL mpimerge3d
(ptprt(:,:,:,1), nx, ny, nz, temlg1)
IF (myproc ==0) THEN
DO k=1,nz-1
DO j=1,nylg-1
DO i=1,nxlg/2
temlg1(i,j,k) = temlg1(nxlg-i,j,k)
END DO
END DO
END DO
DO k=1,nz-1
DO i=1,nxlg-1
DO j=1,nylg/2
temlg1(i,j,k) = temlg1(i,nylg-j,k)
END DO
END DO
END DO
IF( nxlg == nylg ) THEN
DO k=1,nz-1
DO j=1,nylg-1
DO i=1,nxlg-1
temlg2(i,j,k) = (temlg1(i,j,k)+temlg1(j,i,k))*0.5
END DO
END DO
END DO
DO k=1,nz-1
DO i=1,nxlg-1
DO j=1,nylg-1
temlg1(i,j,k) = temlg2(i,j,k)
END DO
END DO
END DO
END IF
END IF ! myproc == 0
CALL mpisplit3d
(temlg1,nx,ny,nz,ptprt(:,:,:,1))
END IF
ELSE IF( pt0opt == 4 ) THEN ! Bubble given in Skamarock and
! Klemp (1994)
pi2 = 1.5707963267949
DO k=1,nz-1
DO i=1,nx-1
DO j=1,ny-1
xs = (x(i)+x(i+1))*0.5
zs = (zp(i,j,k)+zp(i,j,k+1))*0.5
ptprt(i,j,k,1) = ptpert0 &
*SIN(pi2*2*zs/((nz-3)*dz))/(1+((xs-pt0ctrx)/pt0radx)**2)
END DO
END DO
END DO
ELSE IF( pt0opt == 5 ) THEN ! Soup can shaped perturbation
DO k= 1,nz-1
DO j= 1,ny-1
DO i= 1,nx-1
xs = (x(i)+x(i+1))*0.5
ys = (y(j)+y(j+1))*0.5
zs = (zp(i,j,k)+zp(i,j,k+1))*0.5
IF ( ABS(zs-pt0ctrz)/pt0radz < 1 ) THEN
IF( pt0rady < 0.0 .OR. runmod == 2 ) THEN
! 2-d bubble in x-z plane.
radnd = ABS(xs-pt0ctrx)/pt0radx
ELSE IF( pt0radx < 0.0 .OR. runmod == 3 ) THEN
! 2-d bubble in y-z plane.
radnd = ABS(ys-pt0ctry)/pt0rady
ELSE ! 3-d bubble
radnd = SQRT( ((xs-pt0ctrx)/pt0radx)**2 + &
((ys-pt0ctry)/pt0rady)**2 )
END IF
IF(radnd >= 1.0) THEN
ptprt(i,j,k,1) = 0.0
ELSE
ptprt(i,j,k,1) = ptpert0
END IF
ELSE
ptprt(i,j,k,1) = 0.0
END IF
END DO
END DO
END DO
END IF
ebc1=0
wbc1=0
sbc1=0
nbc1=0
IF( ebc == 1 .OR.ebc == 2 .OR. ebc == 3 ) ebc1=ebc
IF( wbc == 1 .OR.wbc == 2 .OR. wbc == 3 ) wbc1=wbc
IF( sbc == 1 .OR.sbc == 2 .OR. sbc == 3 ) sbc1=sbc
IF( nbc == 1 .OR.nbc == 2 .OR. nbc == 3 ) nbc1=nbc
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(ptprt,nx,ny,nz,ebc1,wbc1,0,tem1)
CALL mpsendrecv2dns
(ptprt,nx,ny,nz,nbc1,sbc1,0,tem1)
END IF
CALL acct_interrupt
(bc_acct)
CALL bcsclr
(nx,ny,nz,dtbig, &
ptprt(1,1,1,1),ptprt(1,1,1,1), &
ptprt(1,1,1,1),tem1,tem1,tem1,tem1, &
ebc1,wbc1,nbc1,sbc1,tbc,bbc, &
ebc_global,wbc_global,nbc_global,sbc_global)
CALL acct_stop_inter
DO n=1,nts
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
ptprt(i,j,k,n)=ptprt(i,j,k,1)
pprt(i,j,k,n)=0.0
END DO
END DO
END DO
END DO
DO n=1,nts
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
u(i,j,k,n)=ubar(i,j,k)
END DO
END DO
END DO
END DO
DO n=1,nts
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
v(i,j,k,n)=vbar(i,j,k)
END DO
END DO
END DO
END DO
DO n=1,nts
DO k=1,nz
DO j=1,ny-1
DO i=1,nx-1
w(i,j,k,n)=0.0
END DO
END DO
END DO
END DO
DO n=1,nts
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
qv(i,j,k,n)= qvbar(i,j,k)
END DO
END DO
END DO
END DO
DO n=1,nts
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
qc(i,j,k,n)=0.0
END DO
END DO
END DO
END DO
DO n=1,nts
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
qr(i,j,k,n)= 0.0
END DO
END DO
END DO
END DO
DO n=1,nts
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
qi(i,j,k,n)= 0.0
END DO
END DO
END DO
END DO
DO n=1,nts
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
qs(i,j,k,n)= 0.0
END DO
END DO
END DO
END DO
DO n=1,nts
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
qh(i,j,k,n)= 0.0
END DO
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
ptcumsrc(i,j,k)= 0.0
qcumsrc(i,j,k,1)= 0.0
qcumsrc(i,j,k,2)= 0.0
qcumsrc(i,j,k,3)= 0.0
qcumsrc(i,j,k,4)= 0.0
qcumsrc(i,j,k,5)= 0.0
END DO
END DO
END DO
DO j=1,ny-1
DO i=1,nx-1
raing(i,j)= 0.0
rainc(i,j)= 0.0
prcrate(i,j,1)= 0.0
prcrate(i,j,2)= 0.0
prcrate(i,j,3)= 0.0
prcrate(i,j,4)= 0.0
END DO
END DO
!
!-----------------------------------------------------------------------
!
! The following setup is to overwrite the total u, v, w, pprt,
! ptprt, and qv for Beltrami flow initial conditions.
!
!-----------------------------------------------------------------------
!
IF ( pt0opt == 7 ) THEN
pi = 3.1415926535898
pi2 = 2*pi
pi4 = 4*pi
amplitud = 2.0 ! amplitude A=2 m/s
tmixopt = 1 ! constant viscosity option
tmixcst = 1.0 ! viscosity=1 m**2/s
tmixvert = 1.0 ! compute all mixing terms
wbc = 2 ! reset boundary conditions
ebc = 2 ! to periodical condition
nbc = 2
sbc = 2
tbc = 2
bbc = 2
lnthx = dx*(nx-3) ! length in x
lnthy = dy*(ny-3) ! length in y
lnthz = dz*(nz-3) ! length in z
knumx = pi4/lnthx ! wave number in x-dir
lnumy = pi2/lnthy ! wave number in y-dir
mnumz = pi2/lnthz ! wave number in z-dir
lambdah = knumx*knumx + lnumy*lnumy
lambda2 = lambdah + mnumz*mnumz
lambda = SQRT( lambda2 )
! print *, ' amplitude = ',amplitud
PRINT *, ' lnthx = ',lnthx, &
' lnthy = ',lnthy, &
' lnthz = ',lnthz
PRINT *, ' knumx = ',knumx, &
' lnumy = ',lnumy, &
' mnumz = ',mnumz
PRINT *, ' lambda1 = ',lambdah, &
' lambda2 = ',lambda2, &
' lambda = ',lambda
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
ys = 0.5*(y(j+1)+y(j))
zs = 0.5*(z(k+1)+z(k))
u(i,j,k,1) = -amplitud/lambdah &
*(lambda*lnumy &
*COS(knumx*x(i))*SIN(lnumy*ys)*SIN(mnumz*zs) &
+mnumz*knumx &
*SIN(knumx*x(i))*COS(lnumy*ys)*COS(mnumz*zs))
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
xs = 0.5*(x(i+1)+x(i))
zs = 0.5*(z(k+1)+z(k))
v(i,j,k,1)= amplitud/lambdah &
* (lambda*knumx &
*SIN(knumx*xs)*COS(lnumy*y(j))*SIN(mnumz*zs) &
-mnumz*lnumy &
*COS(knumx*xs)*SIN(lnumy*y(j))*COS(mnumz*zs))
END DO
END DO
END DO
DO k=1,nz
DO j=1,ny-1
DO i=1,nx-1
xs = 0.5*(x(i+1)+x(i))
ys = 0.5*(y(j+1)+y(j))
w(i,j,k,1)=amplitud &
*COS(knumx*xs)*COS(lnumy*ys)*SIN(mnumz*z(k))
END DO
END DO
END DO
DO k=1,nz
DO j=1,ny-1
DO i=1,nx-1
zs = 0.5*(z(k+1)+z(k))
us = 0.5*(u(i+1,j,k,1)+u(i,j,k,1))
vs = 0.5*(v(i,j+1,k,1)+v(i,j,k,1))
ws = 0.5*(w(i,j,k+1,1)+w(i,j,k,1))
rhobar = rhostr(i,j,k)/j3(i,j,k)
pprt(i,j,k,1) = p0-rhobar*(0.5*(us*us+vs*vs+ws*ws)+g*zs) &
- pbar(i,j,k)
END DO
END DO
END DO
DO n=1,nts
DO k=1,nz
DO j=1,ny
DO i=1,nx
u (i,j,k,n) = u(i,j,k,1)
v (i,j,k,n) = v(i,j,k,1)
w (i,j,k,n) = w(i,j,k,1)
pprt (i,j,k,n) = pprt(i,j,k,1)
ptprt(i,j,k,n) = 0.0
qv (i,j,k,n) = 0.0
END DO
END DO
END DO
END DO
END IF
RETURN
END SUBROUTINE initdvr
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE EXTINIT ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE extinit(nx,ny,nz,nzsoil,nts, nstyps, & 1,37
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
ubar,vbar,ptbar,pbar,rhostr,qvbar, &
x,y,z,zp,zpsoil,hterain,j1,j2,j3,j3soil, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsoil,qsoil,wetcanp,snowdpth,qvsfc, &
ptcumsrc,qcumsrc,raing,rainc,prcrate, &
radfrc,radsw,rnflx,radswnet,radlwin, &
usflx,vsflx,ptsflx,qvsflx, &
uprt,vprt,qvprt,kmh,kmv,wbar, &
tem6,tem7,tem8)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Read in the initial fields from an externally supplied initial
! data file.
!
! These fields include u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh
! at time level tpresent, and the base state variables
! ubar,vbar,ptbar,pbar,rhostr,qvbar.
!
! Fields at tpast and tfuture are set to their values at tpresent.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 10/7/1992
!
! MODIFICATION HISTORY:
!
! 3/25/94 (G. Bassett, M. Xue)
! Modified to read in regular binary history dumps.
!
! 9/10/94 (Weygandt & Y. Lu)
! Cleaned up documentation.
!
! 01/14/1995 (M. Xue)
! Corrected where jacob was called. It should be called
! before do loop 90.
!
! 03/29/1997 (M. Xue)
! Modification made so that when values of mapproj,trulat1,trulat2,
! trulon,ctrlat,ctrlon in the input data do not match those in
! input file, the values in the data are used instead of those
! in input, as was done before. Warning messages will be printed.
!
! 12/09/1998 (Donghai Wang)
! Added the snow cover.
!
! 03/19/2002 (Keith Brewster)
! Corrected print statement related to mis-match in data and user times.
! 05/18/20020 (Dan Weber)
! Added new soil model variables.
!
!-----------------------------------------------------------------------
!
! INPUT :
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
! nzsoil Number of grid points in the soil model in the -z-direction
! nts Number of time levels to be initialized.
!
! OUTPUT:
!
! u x component of velocity at times tpast and tpresent
! (m/s)
! v y component of velocity at times tpast and tpresent
! (m/s)
! w Vertical component of Cartesian velocity at times
! tpast and tpresent (m/s)
! ptprt Perturbation potential temperature at times tpast and
! tpresent (K)
! pprt Perturbation pressure at times tpast and tpresent
! (Pascal)
!
! qv Water vapor specific humidity at times tpast and
! tpresent (kg/kg)
! qc Cloud water mixing ratio at times tpast and tpresent
! (kg/kg)
! qr Rainwater mixing ratio at times tpast and tpresent
! (kg/kg)
! qi Cloud ice mixing ratio at times tpast and tpresent
! (kg/kg)
! qs Snow mixing ratio at times tpast and tpresent (kg/kg)
! qh Hail mixing ratio at times tpast and tpresent (kg/kg)
! tke Turbulence kinetic energy (m**2/s)
!
! ubar Base state zonal velocity component (m/s)
! vbar Base state meridional velocity component (m/s)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
! rhostr Base state density rhobar times j3 (kg/m**3)
! qvbar Base state water vapor specific humidity (kg/kg)
!
! x x coordinate of grid points in physical/comp. space (m)
! y y coordinate of grid points in physical/comp. space (m)
! z z coordinate of grid points in computational space (m)
! zp Vertical coordinate of grid points in physical space(m)
! zpsoil Vertical coordinate of grid points in the soil model
! in physical space (m).
! hterain The height of terrain (m)
!
! j1 Coordinate transformation Jacobian -d(zp)/dx
! j2 Coordinate transformation Jacobian -d(zp)/dy
! j3 Coordinate transformation Jacobian d(zp)/dz
! j3soil Soil coordinate transformation Jacobian d(zpsoil)/dz
!
! soiltyp Soil type
! vegtyp Vegetation type
! lai Leaf Area Index
! roufns Surface roughness
! veg Vegetation fraction
!
! tsoil Deep soil temperature (K) (in deep 1 m layer)
! qsoil Soil moisture (m**3/m**3)
! wetcanp Canopy water amount
! snowdpth Snow depth (m)
! qvsfc Effective S.H. at sfc.
!
! ptcumsrc Source term in pt-equation due to cumulus parameterization
! qcumsrc Source term in water equations due to cumulus parameterization
! raing Grid supersaturation rain
! rainc Cumulus convective rain
! prcrate Precipitation rates
!
! radfrc Radiation forcing (K/s)
! radsw Solar radiation reaching the surface
! rnflx Net radiation flux absorbed by surface
! radswnet Net shortwave radiation
! radlwin Incoming longwave radiation
!
! usflx Surface flux of u-momentum (kg/(m*s**2))
! vsflx Surface flux of v-momentum (kg/(m*s**2))
! ptsflx Surface heat flux (K*kg/(m**2 * s ))
! qvsflx Surface moisture flux of (kg/(m**2 * s))
!
! tstart The time when the time integration starts, which is set
! to the time of the restart data
!
! WORK ARRAYS:
!
! tem6 Temporary work array.
! tem7 Temporary work array.
! tem8 Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! Number of grid points in 3 directions
INTEGER :: nzsoil ! Number of grid points in the -z-direction
INTEGER :: nts ! Number of time levels to be initialized.
INTEGER :: tpast ! Index of time level for the past time.
INTEGER :: tpresent ! Index of time level for the present
! time.
INTEGER :: tfuture ! Index of time level for the future
! time.
REAL :: u (nx,ny,nz,nts) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz,nts) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz,nts) ! Total w-velocity (m/s)
REAL :: ptprt (nx,ny,nz,nts) ! Perturbation potential temperature (K)
REAL :: pprt (nx,ny,nz,nts) ! Perturbation pressure (Pascal)
REAL :: qv (nx,ny,nz,nts) ! Water vapor specific humidity (kg/kg)
REAL :: qc (nx,ny,nz,nts) ! Cloud water mixing ratio (kg/kg)
REAL :: qr (nx,ny,nz,nts) ! Rain water mixing ratio (kg/kg)
REAL :: qi (nx,ny,nz,nts) ! Cloud ice mixing ratio (kg/kg)
REAL :: qs (nx,ny,nz,nts) ! Snow mixing ratio (kg/kg)
REAL :: qh (nx,ny,nz,nts) ! Hail mixing ratio (kg/kg)
REAL :: tke (nx,ny,nz,nts) ! Turbulence kinetic energy (m**2/s)
REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s)
REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal)
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3.
REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific
! humidity(kg/kg)
REAL :: x(nx) ! x-coord. of the physical and compu-
! tational grid. Defined at u-point.
REAL :: y(ny) ! y-coord. of the physical and compu-
! tational grid. Defined at v-point.
REAL :: z(nz) ! z-coord. of the computational grid.
! Defined at w-point on the staggered
! grid.
REAL :: zp(nx,ny,nz) ! Physical height coordinate defined at
! w-point of the staggered grid.
REAL :: zpsoil(nx,ny,nzsoil) ! The physical height coordinate defined
! at the center of a soil layer(m).
REAL :: hterain(nx,ny) ! Terrain height (m).
REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian
! -d(zp)/dx.
REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian
! -d(zp)/dy.
REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian
! d(zp)/dz.
REAL :: j3soil(nx,ny,nzsoil) ! Coordinate transformation Jacobian
! defined as d( zpsoil )/d( zsoil ).
REAL :: j3soilinv(nx,ny,nzsoil) ! Inverse of J3soil.
INTEGER :: nstyps ! Number of soil types
INTEGER :: soiltyp(nx,ny,nstyps) ! Soil types at grid points
REAL :: stypfrct(nx,ny,nstyps) ! Fraction of soil types
INTEGER :: vegtyp (nx,ny) ! Vegetation type
REAL :: lai (nx,ny) ! Leaf Area Index
REAL :: roufns (nx,ny) ! Surface roughness
REAL :: veg (nx,ny) ! Vegetation fraction
REAL :: qvsfc (nx,ny,0:nstyps) ! Effective qv at sfc.
REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Deep soil temperature (K)
! (in deep 1 m layer)
REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil layer moisture(m**3/m**3)
REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount
REAL :: snowdpth(nx,ny) ! Snow depth (m)
REAL :: ptcumsrc(nx,ny,nz) ! Source term in pt-equation due
! to cumulus parameterization
REAL :: qcumsrc(nx,ny,nz,5) ! Source term in water equations due
! to cumulus parameterization:
! qcumsrc(1,1,1,1) for qv equation
! qcumsrc(1,1,1,2) for qc equation
! qcumsrc(1,1,1,3) for qr equation
! qcumsrc(1,1,1,4) for qi equation
! qcumsrc(1,1,1,5) for qs equation
REAL :: raing(nx,ny) ! Grid supersaturation rain
REAL :: rainc(nx,ny) ! Cumulus convective rain
REAL :: prcrate(nx,ny,4) ! precipitation rate (kg/(m**2*s))
! prcrate(1,1,1) = total precip. rate
! prcrate(1,1,2) = grid scale precip. rate
! prcrate(1,1,3) = cumulus precip. rate
! prcrate(1,1,4) = microphysics precip. rate
REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s)
REAL :: radsw (nx,ny) ! Solar radiation reaching the surface
REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface
REAL :: radswnet(nx,ny) ! Net shortwave radiation
REAL :: radlwin(nx,ny) ! Incoming longwave radiation
REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2))
REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2))
REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2))
REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s))
REAL :: uprt (nx,ny,nz) ! Temporary array
REAL :: vprt (nx,ny,nz) ! Temporary array
REAL :: qvprt(nx,ny,nz) ! Temporary array
REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for
! momentum. ( m**2/s )
REAL :: wbar (nx,ny,nz) ! Temporary array
REAL :: tem6 (nx,ny,nz) ! Temporary array
REAL :: tem7 (nx,ny,nz) ! Temporary array
REAL :: tem8 (nx,ny,nz) ! Temporary array
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: lengbf, lenfil
INTEGER :: i, j, k, ireturn, tim
REAL :: amax,amin
CHARACTER (LEN=256) :: runnamesv
INTEGER :: nocmnt_old ! Number of comment lines
CHARACTER (LEN=80 ) :: cmnt_old(50) ! String of comments on this model run
INTEGER :: nchin
REAL :: time_tmp
REAL :: tstopsv,thisdmpsv,mapprojsv,latitudsv,ctrlatsv,ctrlonsv
INTEGER :: monthsv,daysv,yearsv,hoursv,minutesv,secondsv
REAL :: trulat1sv,trulat2sv,trulonsv
REAL :: dxsv,dysv,strhoptsv,dzsv,dzminsv,zrefsfcsv,dlayer1sv,dlayer2sv, &
strhtunesv,zflatsv
REAL :: p0inv,eps,tvbar
INTEGER :: abstsec0,abstsec1
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
INCLUDE 'phycst.inc'
INCLUDE 'mp.inc' ! Message passing parameters.
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
p0inv=1./p0
IF( nts > 1 ) THEN
tpast=1
tpresent=2
tfuture=3
ELSE
tpast=1
tpresent=1
tfuture=1
END IF
!
!-----------------------------------------------------------------------
!
! Read in the initial fields from the input data file.
!
!-----------------------------------------------------------------------
!
lengbf = 80
CALL strlnth
( inigbf, lengbf )
lenfil = 80
CALL strlnth
( inifile, lenfil )
IF (mp_opt > 0 .AND. readsplit == 0) THEN
runnamesv = inigbf
WRITE(inigbf,'(a,a,2i2.2)') &
runnamesv(1:lengbf),'_',loc_x,loc_y
lengbf = lengbf + 5
runnamesv = inifile
WRITE(inifile,'(a,a,2i2.2)') &
runnamesv(1:lenfil),'_',loc_x,loc_y
lenfil = lenfil + 5
END IF
tim = tpresent
runnamesv = runname
tstopsv = tstop
thisdmpsv = thisdmp
mapprojsv = mapproj
trulat1sv = trulat1
trulat2sv = trulat2
trulonsv = trulon
latitudsv = latitud
ctrlatsv = ctrlat
ctrlonsv = ctrlon
monthsv = month
daysv = day
yearsv = year
hoursv = hour
minutesv = minute
secondsv = second
dxsv = dx
dysv = dy
strhoptsv = strhopt
dzsv = dz
dzminsv = dzmin
zrefsfcsv = zrefsfc
dlayer1sv = dlayer1
dlayer2sv = dlayer2
strhtunesv = strhtune
zflatsv = zflat
nocmnt_old = nocmnt
DO i=1,nocmnt_old
cmnt_old(i)=cmnt(i)
END DO
! blocking inserted for ordering i/o for message passing
DO i=0,nprocs-1,readstride
IF(myproc >= i.AND.myproc <= i+readstride-1)THEN
CALL dtaread
(nx,ny,nz,nzsoil,nstyps, inifmt, nchin ,inigbf,lengbf,&
inifile,lenfil,time_tmp, &
x,y,z,zp,zpsoil,uprt,vprt,w(1,1,1,tim),ptprt(1,1,1,tim),&
pprt(1,1,1,tim),qvprt,qc(1,1,1,tim),qr(1,1,1,tim), &
qi(1,1,1,tim),qs(1,1,1,tim),qh(1,1,1,tim), &
tke(1,1,1,tim),kmh,kmv, &
ubar,vbar,wbar,ptbar,pbar,rhostr,qvbar, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsoil,qsoil,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx,radswnet,radlwin, &
usflx,vsflx,ptsflx,qvsflx, &
ireturn, tem6,tem7,tem8)
END IF
IF (mp_opt > 0) CALL mpbarrier
END DO
!
!-----------------------------------------------------------------------
!
! To restore the original runname and comments, etc.
! from ARPS input file.
!
!-----------------------------------------------------------------------
eps = 0.0001
IF(mapproj /= mapprojsv .OR.ABS(trulat1sv-trulat1) > eps &
.OR.ABS(trulat2sv-trulat2) > eps &
.OR.ABS(trulonsv -trulon ) > eps) THEN
WRITE(6,'(/2(/5x,a),2(/5x,3(a,f13.3))/)') &
'WARNING: Map projection parameters in the input data do not ', &
'match those specified in input file. Values in data used.', &
'In data, trulat1=',trulat1 ,', trulat2=',trulat2, &
', trulon=',trulon, &
'In input, trulat1=',trulat1sv,', trulat2=',trulat2sv, &
', trulon=',trulonsv
END IF
IF(ABS(ctrlatsv-ctrlat) > eps .OR. ABS(ctrlonsv-ctrlon) > eps ) THEN
WRITE(6,'(/3(/5x,a),2(/5x,2(a,f13.3))/)') &
'WARNING: Central latitude and/or longitude of the grid ', &
'in the input data do not match those specified in input file.', &
'Values in data used.', &
'In data , ctrlat=',ctrlat ,', ctrlon=',ctrlon, &
'In input, ctrlat=',ctrlatsv,', ctrlon=',ctrlonsv
END IF
CALL ctim2abss
(year,month,day,hour,minute,second, abstsec0)
CALL ctim2abss
(yearsv,monthsv,daysv,hoursv,minutesv,secondsv, &
abstsec1)
abstsec0 = abstsec0 + nint(time_tmp)
abstsec1 = abstsec1 + nint(tstart)
IF ( abstsec0 /= abstsec1 ) THEN
WRITE(6,'(a,2(/a,1x,i4.4,5(a,i2.2),a,f10.3))') &
'WARNING: Data time is inconsistent with user input time.', &
' Data initime:', year,'-',month,'-',day,'.', &
hour,':',minute,':',second, &
' model data time: ', tstart, &
' User initime:', yearsv,'-',monthsv,'-',daysv,'.', &
hoursv,':',minutesv,':',secondsv, &
' model starting time: ', time_tmp
IF ( timeopt == 1 ) THEN
WRITE(6,'(a)') 'Program continues using user specified time'
year = yearsv
month = monthsv
day = daysv
hour = hoursv
minute = minutesv
second = secondsv
ELSE IF ( timeopt == 2 ) THEN
WRITE(6,'(a)') 'Program continues using data time'
tstart = time_tmp
ELSE
WRITE(6,'(a)') 'Program stopped in subroutine EXTINIT'
CALL arpsstop ("arpsstop called from extinit due to timeopt",1)
END IF
ELSE
year = yearsv
month = monthsv
day = daysv
hour = hoursv
minute = minutesv
second = secondsv
IF (myproc == 0) &
WRITE(6,'(a,i4.4,5(a,i2.2),3x,a,f10.3,a)') &
'Use specified initial time: ', &
year,'-',month,'-',day,'.',hour,':',minute,':',second, &
'and model starting time: ', tstart, 'seconds'
END IF
runname = runnamesv(1:80)
tstop = tstopsv
thisdmp = thisdmpsv
dx = dxsv
dy = dysv
strhopt = strhoptsv
dz = dzsv
dzmin = dzminsv
zrefsfc = zrefsfcsv
dlayer1 = dlayer1sv
dlayer2 = dlayer2sv
strhtune = strhtunesv
zflat = zflatsv
nocmnt = nocmnt_old
DO i=1,nocmnt
cmnt(i)=cmnt_old(i)
END DO
IF( ireturn /= 0) THEN
WRITE(6,'(3(/1x,a))') &
'Error occured when reading history data ', &
inifile(1:lenfil)//' or '//inigbf(1:lengbf), &
'Program stopped in EXTINIT.'
CALL arpsstop ("arpsstop called from extinit in reading file",1)
END IF
!
!-----------------------------------------------------------------------
!
! Calculate rhostr & jacobians, set hterain.
!
!-----------------------------------------------------------------------
!
CALL jacob
(nx,ny,nz,x,y,z,zp,j1,j2,j3,tem6)
DO k= 1,nz-1
DO j= 1,ny-1
DO i= 1,nx-1
tvbar=(ptbar(i,j,k)*((pbar(i,j,k)*p0inv)**rddcp))* &
((1.0+rvdrd*qvbar(i,j,k))/(1.0+qvbar(i,j,k)))
rhostr(i,j,k)= ABS(j3(i,j,k))*pbar(i,j,k)/(rd*tvbar)
!The following is used to define rhostr when initializing the base state
!from a sounding while the above defines rhobar as the virtual
!density. rhostr is there somewhat different for initopt=3 and 4 which calls
!extinit.
!For the code to be consistent with the initialization of
!rhostr/rhobar in INIBASE, use the following version.
!
! rhostr(i,j,k)= abs(j3(i,j,k))*pbar(i,j,k)/ &
! ( Rd * ptbar(i,j,k)*(pbar(i,j,k)*p0inv)**rddcp )
END DO
END DO
END DO
DO j=1,ny-1
DO i=1,nx-1
rhostr(i,j, 1)=rhostr(i,j,2)
rhostr(i,j,nz-1)=rhostr(i,j,nz-2)
END DO
END DO
DO i=1,nx
DO j=1,ny
hterain(i,j) = zp(i,j,2)
END DO
END DO
!
! call the soil model grid initialization
!
! call jacobsoil...stopped here...add the code.
CALL inisoilgrd
(nx,ny,nzsoil,hterain,zpsoil,j3soil,j3soilinv)
!
!-----------------------------------------------------------------------
!
! Put the 3-d variables into their 4-d arrays.
!
!-----------------------------------------------------------------------
!
tim = tpresent
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
u(i,j,k,tim)=uprt(i,j,k)+ubar(i,j,k)
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
v(i,j,k,tim)=vprt(i,j,k)+vbar(i,j,k)
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
qv(i,j,k,tim)=qvprt(i,j,k)+qvbar(i,j,k)
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Set the future values of variables to their current values.
! This is done primarily for safety reasons.
!
!-----------------------------------------------------------------------
!
IF( initopt < 0 .or. initopt > 4 ) then
write(6,'(a,i10)') 'Value of initopt incorrect. It was ', initopt
CALL arpsstop ("arpsstop called from EXTINIT ",1)
ENDIF
IF(initopt == 3) THEN
IF(nts > 1 ) THEN
DO k=1,nz
DO j=1,ny
DO i=1,nx
u (i,j,k,tfuture) = u (i,j,k,tpresent)
v (i,j,k,tfuture) = v (i,j,k,tpresent)
w (i,j,k,tfuture) = w (i,j,k,tpresent)
ptprt(i,j,k,tfuture) = ptprt(i,j,k,tpresent)
pprt (i,j,k,tfuture) = pprt (i,j,k,tpresent)
qv (i,j,k,tfuture) = qv (i,j,k,tpresent)
qc (i,j,k,tfuture) = qc (i,j,k,tpresent)
qr (i,j,k,tfuture) = qr (i,j,k,tpresent)
qi (i,j,k,tfuture) = qi (i,j,k,tpresent)
qs (i,j,k,tfuture) = qs (i,j,k,tpresent)
qh (i,j,k,tfuture) = qh (i,j,k,tpresent)
tke (i,j,k,tfuture) = tke (i,j,k,tpresent)
u (i,j,k,tpast ) = u (i,j,k,tpresent)
v (i,j,k,tpast ) = v (i,j,k,tpresent)
w (i,j,k,tpast ) = w (i,j,k,tpresent)
ptprt(i,j,k,tpast ) = ptprt(i,j,k,tpresent)
pprt (i,j,k,tpast ) = pprt (i,j,k,tpresent)
qv (i,j,k,tpast ) = qv (i,j,k,tpresent)
qc (i,j,k,tpast ) = qc (i,j,k,tpresent)
qr (i,j,k,tpast ) = qr (i,j,k,tpresent)
qi (i,j,k,tpast ) = qi (i,j,k,tpresent)
qs (i,j,k,tpast ) = qs (i,j,k,tpresent)
qh (i,j,k,tpast ) = qh (i,j,k,tpresent)
tke (i,j,k,tpast ) = tke (i,j,k,tpresent)
END DO
END DO
END DO
END IF
!
DO k=1,nz
DO j=1,ny
DO i=1,nx
ptcumsrc(i,j,k)=0.0
qcumsrc(i,j,k,1)=0.0
qcumsrc(i,j,k,2)=0.0
qcumsrc(i,j,k,3)=0.0
qcumsrc(i,j,k,4)=0.0
qcumsrc(i,j,k,5)=0.0
END DO
END DO
END DO
ENDIF
!-----------------------------------------------------------------------
!
! Print out the max/min of initial arrays read in.
!
!-----------------------------------------------------------------------
!
tim = tpresent
IF (myproc ==0) &
WRITE(6,'(1x,a/)') 'Min. and max. of the data arrays read in:'
CALL a3dmax0
(x,1,nx,1,nx,1,1,1,1, 1,1,1,1, amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'xmin = ', amin,', xmax =',amax
CALL a3dmax0
(y,1,ny,1,ny,1,1,1,1, 1,1,1,1, amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'ymin = ', amin,', ymax =',amax
CALL a3dmax0
(z,1,nz,1,nz,1,1,1,1, 1,1,1,1, amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'zmin = ', amin,', zmax =',amax
CALL a3dmax0
(zp,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'zpmin = ', amin,', zpmax =',amax
CALL a3dmax0
(j3,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'j3min = ', amin,', j3max =',amax
CALL a3dmax0
(ubar,1,nx,1,nx,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'ubarmin = ', amin,', ubarmax =',amax
CALL a3dmax0
(vbar,1,nx,1,nx-1,1,ny,1,ny,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'vbarmin = ', amin,', vbarmax =',amax
CALL a3dmax0
(ptbar,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'ptbarmin= ', amin,', ptbarmax=',amax
CALL a3dmax0
(pbar,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'pbarmin = ', amin,', pbarmax =',amax
CALL a3dmax0
(rhostr,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'rhostrmin=', amin,', rhostrmax=',amax
CALL a3dmax0
(qvbar,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'qvbarmin= ', amin,', qvbarmax=',amax
CALL a3dmax0
(u(1,1,1,tim),1,nx,1,nx,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'umin = ', amin,', umax =',amax
CALL a3dmax0
(v(1,1,1,tim),1,nx,1,nx-1,1,ny,1,ny,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'vmin = ', amin,', vmax =',amax
CALL a3dmax0
(w(1,1,1,tim),1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'wmin = ', amin,', wmax =',amax
CALL a3dmax0
(ptprt(1,1,1,tim),1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'ptprtmin= ', amin,', ptprtmax=',amax
CALL a3dmax0
(pprt(1,1,1,tim),1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'pprtmin = ', amin,', pprtmax =',amax
CALL a3dmax0
(qv(1,1,1,tim),1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'qvmin = ', amin,', qvmax =',amax
CALL a3dmax0
(qc(1,1,1,tim),1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'qcmin = ', amin,', qcmax =',amax
CALL a3dmax0
(qr(1,1,1,tim),1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'qrmin = ', amin,', qrmax =',amax
CALL a3dmax0
(qi(1,1,1,tim),1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'qimin = ', amin,', qimax =',amax
CALL a3dmax0
(qs(1,1,1,tim),1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'qsmin = ', amin,', qsmax =',amax
CALL a3dmax0
(qh(1,1,1,tim),1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'qhmin = ', amin,', qhmax =',amax
CALL a3dmax0
(tke(1,1,1,tim),1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'tkemin = ', amin,', tkemax =',amax
! IF ( sfcphy.gt.0 ) THEN
! CALL a3dmax0(tsoil,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, amax,amin)
! write(6,'(1x,2(a,e13.6))') 'tsoilmin= ',amin,', tsoilmax =',amax
! CALL a3dmax0(qsoil,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, amax,amin)
! write(6,'(1x,2(a,e13.6))') 'qsoilmin = ',amin,', qsoilmax =',amax
! CALL a3dmax0(wetcanp,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, amax,amin)
! write(6,'(1x,2(a,e13.6))') 'wetcmin = ',amin,', wetcmax =',amax
! ENDIF
CALL a3dmax0
(ptcumsrc,1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'ptcummin= ', amin,', ptcummax=',amax
CALL a3dmax0
(qcumsrc(1,1,1,1),1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'qvcummin= ', amin,', qvcummax=',amax
CALL a3dmax0
(qcumsrc(1,1,1,2),1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'qccummin= ', amin,', qccummax=',amax
CALL a3dmax0
(qcumsrc(1,1,1,3),1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'qrcummin= ', amin,', qrcummax=',amax
CALL a3dmax0
(qcumsrc(1,1,1,4),1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'qicummin= ', amin,', qicummax=',amax
CALL a3dmax0
(qcumsrc(1,1,1,5),1,nx,1,nx-1,1,ny,1,ny-1,1,nz,1,nz-1, &
amax,amin)
IF (myproc ==0) &
WRITE(6,'(1x,2(a,e13.6))') 'qscummin= ', amin,', qscummax=',amax
RETURN
END SUBROUTINE extinit
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE INITSFC ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
!
SUBROUTINE initsfc(nx,ny,nz,nzsoil,nstyps, & 1,51
zpsoil, &
pbar,pprt,ptbar,ptprt,qvbar,qv, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
ndvi, &
tsoil,qsoil,wetcanp,snowdpth,qvsfc,tem1soil)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Initialize the surface characteristics data and soil model
! variables according to option parameters sfcdat and soilinit.
!
! The surface and soil data files are sequential binary files.
!
! Their structures should be:
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yuhe Liu
! 02/17/94
!
! MODIFICATION:
!
! 02/07/1995 (Yuhe Liu)
! Added a new 2-D permanent array, veg(nx,ny), to the soil model and
! at the same time delete the table data array veg(14).
!
! 01/29/1995 (V. Wong and X. Song)
! Add a flag wtrexist in "initsfc".
!
! 12/04/1997 (Yuhe Liu)
! Set the soil variables to their default value read in from input
! file if they are not included in soilinit file.
!
! 12/09/1998 (Donghai Wang)
! Added the snow cover.
!
! 2000/01/07 (Gene Bassett)
! Modified the behavior for the case where soil data read in from file
! and also present in history file. If soilinit=2, initopt=3 and
! sfcin=1, for soil variables that are not in soildata file the values
! in the history file are used.
!
! 05/17/2002 (Dan Weber)
! Added new soil model variables.
!
! 15 June 2002 (Eric Kemp)
! Bug fixes.
!
!-----------------------------------------------------------------------
!
! INPUT and OUTPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the z-direction (sfc/top)
! nzsoil Number of grid points in the soil model in the -z-direction
!
! pbar Base state pressure
! pprt Preturbation pressure
!
! ptbar Base state potential temperature
! ptprt Preturbation potential temperature
!
! qvbar Base state water vapor mixing ratio
! qv Water vapor mixing ratio
!
! soiltyp Soil type at the horizontal grid points
! stypfrct Soil type fraction
! vegtyp Vegetation type at the horizontal grid points
! lai Leaf Area Index
! roufns Surface roughness
! veg Vegetation fraction
!
! tsoil Soil temperature (K)
! qsoil Soil moisture (m**3/m**3)
! wetcanp Canopy water amount
! qvsfc Effective S.H. at sfc.
!
! TEMPORARY WORKING ARRAY
!
! tem1soil Soil model temporary work array.
!
!-----------------------------------------------------------------------
!
! Variable Declarations. (Local Variables)
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
REAL :: pi
PARAMETER ( pi = 3.141592654)
INTEGER :: nx, ny, nz
INTEGER :: nzsoil ! Number of grid points in the -z-direction
REAL :: zpsoil (nx,ny,nzsoil) ! soil model points elevations. (m)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal)
REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
REAL :: ptbar (nx,ny,nx) ! Base state potential temperature (K)
REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL :: qvbar (nx,ny,nz) ! Base state specific humidity (kg/kg)
REAL :: qv (nx,ny,nz) ! Total specific humidity (kg/kg)
INTEGER :: nstyps ! Number of soil types
INTEGER :: soiltyp(nx,ny,nstyps) ! Soil type at each point
REAL :: stypfrct(nx,ny,nstyps) ! Fraction of soil types
INTEGER :: vegtyp (nx,ny) ! Vegetation type at each point
REAL :: lai (nx,ny) ! Leaf Area Index
REAL :: roufns (nx,ny) ! Surface roughness
REAL :: veg (nx,ny) ! Vegetation fraction
REAL :: ndvi (nx,ny) ! NDVI
REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil layer temperature (K)
REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil layer moisture(m**3/m**3)
REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy moisture
REAL :: snowdpth(nx,ny) ! Snow depth (m)
REAL :: qvsfc (nx,ny,0:nstyps) ! Effective surface specific
! humidity (kg/kg)
!
!-----------------------------------------------------------------------
!
! Define local variables
!
!-----------------------------------------------------------------------
!
REAL :: psfc ! Surface pressure
REAL :: rhgs ! The relative humidity at ground surface
REAL :: qvsatts ! Saturated specific humidity at surface
REAL :: wrmax ! Maximum value for canopy moisture, wetcanp
REAL :: pterm ! Temporary variable, real positive term flag
REAL :: p0inv ! Inverse of p0 (1000 mb)
REAL :: tema ! Temporary variable
REAL :: temb ! Temporary variable
!
!-----------------------------------------------------------------------
!
! Global constants and parameters, most of them specify the
! model run options.
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
INCLUDE 'indtflg.inc'
INCLUDE 'phycst.inc'
INCLUDE 'soilcst.inc'
INCLUDE 'bndry.inc'
INCLUDE 'mp.inc' ! Message passing parameters.
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k,is,imid,jmid,ii
INTEGER :: zpsoilin
INTEGER :: tsoilin
INTEGER :: qsoilin
INTEGER :: wcanpin
INTEGER :: snowdin
INTEGER :: astat
INTEGER, ALLOCATABLE :: mpitmp(:)
REAL, ALLOCATABLE :: mprtmp(:)
REAL :: tem1soil(nx,ny,nzsoil) ! Temporary soil model work array.
!
!-----------------------------------------------------------------------
!
! Function f_qvsat and inline directive for Cray PVP
!
!-----------------------------------------------------------------------
!
REAL :: f_qvsat
!fpp$ expand (f_qvsat)
!!dir$ inline always f_qvsat
!*$* inline routine (f_qvsat)
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
IF (mp_opt > 0 .AND. (sfcdat == 1 .OR. soilinit == 1)) THEN
ALLOCATE(mpitmp(MAX(nx,ny)*2),stat=astat)
CALL check_alloc_status
(astat, "initsfc:mpitmp")
ALLOCATE(mprtmp(MAX(nx,ny)*2),stat=astat)
CALL check_alloc_status
(astat, "initsfc:mprtmp")
END IF
p0inv = 1.0/p0
IF ( initopt == 2 ) THEN
IF(myproc ==0) WRITE (6, '(a,a/a/a/a/a)') &
'Model initialization option was set to restart. ', &
'All the surface and soil arrays should have been read', &
'in from the restart file. No more initialization is ', &
'done in subroutine INITSFC.'
wtrexist=0
DO j = 1, ny
DO i = 1, nx
DO is = 1,nstyp
IF (soiltyp(i,j,is) == 13) THEN
wtrexist=1
RETURN
END IF
END DO
END DO
END DO
RETURN
END IF
IF ( sfcdat == 1 ) THEN
nstyp = 1
DO j=1, ny-1
DO i=1, nx-1
soiltyp(i,j,1) = styp
vegtyp (i,j) = vtyp
lai (i,j) = lai0
roufns (i,j) = roufns0
veg (i,j) = veg0
END DO
END DO
ELSE IF (sfcdat == 2 .OR. (sfcdat == 3.AND.landin /= 1) ) THEN
!
!-----------------------------------------------------------------------
!
! Read the surface property data from file sfcdtfl (passed
! in globcst.inc).
!
!-----------------------------------------------------------------------
!
! blocking inserted for ordering i/o for message passing
DO i=0,nprocs-1,readstride
IF(myproc >= i.AND.myproc <= i+readstride-1)THEN
IF (mp_opt > 0 .AND. readsplit > 0) THEN
CALL readsplitsfcdt
( nx,ny,nstyps,sfcdtfl,dx,dy, &
mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg,ndvi )
ELSE
CALL readsfcdt
( nx,ny,nstyps,sfcdtfl,dx,dy, &
mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg,ndvi )
END IF
END IF
IF (mp_opt > 0) CALL mpbarrier
END DO
ELSE IF(sfcdat == 3 .AND. landin == 1) THEN
WRITE(6,'(1x,a/,a/)') &
'Surface property data in the initialization file was used.', &
'No more initialization performed.'
ELSE
WRITE(6,'(1x,a,i3,a/)') &
'Invalid surface data input option. sfcdat =',sfcdat, &
'. Program stopped in INITSFC.'
CALL arpsstop ("arpsstop called from initsfc with sfcdat option",1)
END IF
! print *, ' nstyps = ',nstyps
! imid=(nx/2)+1
! jmid=(ny/2)+1
! DO is=1,nstyps
! print *, ' Sample soil ( ',imid,jmid,') = ', &
! soiltyp(imid,jmid,is),stypfrct(imid,jmid,is)
! END DO
IF ( nstyp == 1 ) THEN
DO j=1,ny
DO i=1,nx
stypfrct(i,j,1) = 1.0
END DO
END DO
END IF
IF ( soilinit == 1 ) THEN
!
!-----------------------------------------------------------------------
!
! All surface variables are specified uniformly in horizontal from
! the input namelist.
!
!-----------------------------------------------------------------------
DO k=1,nzsoil
DO j=1, ny-1
DO i=1, nx-1
psfc = .5 * ( (pbar(i,j,1)+pprt(i,j,1)) &
+ (pbar(i,j,2)+pprt(i,j,2)) )
tsoil (i,j,k,0) = tsoilint(k)
qsoil (i,j,k,0) = qsoilint(k)
IF( soiltyp(i,j,1) == 13) THEN ! For water
tsoil(i,j,1,0) = ptswtr0*(psfc*p0inv)**rddcp
ELSE ! For land
tsoil(i,j,1,0) = ptslnd0*(psfc*p0inv)**rddcp
END IF
wetcanp(i,j,0) = wetcanp0
snowdpth(i,j) = snowdpth0
END DO
END DO
END DO
DO is=1,nstyp
DO k=1,nzsoil
DO j=1,ny-1
DO i=1,nx-1
tsoil (i,j,k,is) = tsoil (i,j,k,0)
qsoil (i,j,k,is) = qsoil (i,j,k,0)
END DO
END DO
END DO
DO j=1,ny-1
DO i=1,nx-1
wetcanp(i,j,is) = wetcanp(i,j,0)
END DO
END DO
END DO
ELSE IF ( (soilinit == 2) .OR. (soilinit == 5) &
.OR. (soilinit == 3 .AND. sfcin /= 1) ) THEN
!
!-----------------------------------------------------------------------
!
! Read the soil variables from file soilinfl. soilinfl is
! passed in globcst.inc.
!
!-----------------------------------------------------------------------
!
! blocking inserted for ordering i/o for message passing
DO ii=0,nprocs-1,readstride
IF(myproc >= ii.AND.myproc <= ii+readstride-1) THEN
IF (mp_opt >0 .AND. readsplit > 0) THEN
CALL readsplitsoil
(nx,ny,nzsoil,nstyps,soilinfl,dx,dy,zpsoil, &
mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, &
zpsoilin,tsoilin,qsoilin,wcanpin,snowdin, &
tsoil,qsoil,wetcanp,snowdpth,soiltyp)
ELSE
CALL readsoil
(nx,ny,nzsoil,nstyps,soilinfl,dx,dy,zpsoil, &
mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, &
zpsoilin,tsoilin,qsoilin,wcanpin,snowdin, &
tsoil,qsoil,wetcanp,snowdpth,soiltyp)
END IF
END IF
IF(soilinit == 5)THEN
DO is=1,nstyp
DO k=1,nzsoil
DO j=1,ny-1
DO i=1,nx-1
tsoil (i,j,k,is) = tsoil (i,j,k,0)
qsoil (i,j,k,is) = qsoil (i,j,k,0)
END DO
END DO
END DO
END DO
END IF
IF (mp_opt > 0) CALL mpbarrier
END DO
IF (sfcin /= 1) THEN
IF ( tsoilin /= 1 ) THEN
DO is=1,nstyp
DO j=1, ny-1
DO i=1, nx-1
psfc = .5 * ( (pbar(i,j,1)+pprt(i,j,1)) &
+ (pbar(i,j,2)+pprt(i,j,2)) )
IF( soiltyp(i,j,1) == 13) THEN ! For water
tsoil(i,j,1,is) = ptswtr0*(psfc*p0inv)**rddcp
ELSE ! For land
tsoil(i,j,1,is) = ptslnd0*(psfc*p0inv)**rddcp
END IF
END DO
END DO
END DO
DO is=1,nstyp
DO k=2, nzsoil
DO j=1, ny-1
DO i=1, nx-1
tsoil(i,j,k,is) = tsoilint(k)
END DO
END DO
END DO
END DO
END IF
IF ( qsoilin /= 1 ) THEN
DO is=1,nstyp
DO j=1, ny-1
DO i=1, nx-1
qsoil(i,j,1,is) = qsoilint(1)
END DO
END DO
END DO
DO is=1,nstyp
DO k=2, nzsoil
DO j=1, ny-1
DO i=1, nx-1
qsoil(i,j,k,is) = qsoilint(2)
END DO
END DO
END DO
END DO
END IF
IF ( wcanpin /= 1 ) THEN
DO is=1,nstyp
DO j=1, ny-1
DO i=1, nx-1
wetcanp(i,j,is) = wetcanp0
END DO
END DO
END DO
END IF
IF ( snowdin /= 1 ) THEN
DO j=1, ny-1
DO i=1, nx-1
snowdpth(i,j) = snowdpth0
END DO
END DO
END IF
END IF
ELSE IF(soilinit == 3 .AND. sfcin == 1) THEN
WRITE(6,'(1x,a/,a/)') &
'Surface variable in the initialization file was used.', &
'No more initialization performed.'
IF ( nstyp == 1 ) THEN
DO k=1,nzsoil
DO j=1,ny-1
DO i=1,nx-1
tsoil (i,j,k,1) = tsoil (i,j,k,0)
qsoil (i,j,k,1) = qsoil (i,j,k,0)
END DO
END DO
END DO
DO j=1,ny-1
DO i=1,nx-1
wetcanp(i,j,1) = wetcanp(i,j,0)
END DO
END DO
END IF
ELSE IF(soilinit == 4) THEN
p0inv=1./p0
DO j=1,ny-1
DO i=1,nx-1
tema=0.5*((ptbar(i,j,2)+ptprt(i,j,2)) &
+(ptbar(i,j,1)+ptprt(i,j,1)))
psfc=0.5*((pbar(i,j,2)+pprt(i,j,2)) &
+(pbar(i,j,1)+pprt(i,j,1)))
temb = tema*(psfc*p0inv)**rddcp
tsoil (i,j,1,0) = temb + ttprt
tsoil (i,j,nzsoil,0) = temb + tbprt
qsoil (i,j,1,0) = 0.0
qsoil (i,j,2,0) = 0.0
wetcanp(i,j,0) = wetcanp0
snowdpth(i,j) = snowdpth0
END DO
END DO
DO is=1,nstyp
DO j=1,ny-1
DO i=1,nx-1
tsoil (i,j,1,is) = tsoil (i,j,1,0)
IF (soiltyp(i,j,is) == 13) THEN
!Andreas 30-10-03: Make moisture of water 1
qsoil(i,j,1,is) = 1.
ELSE
qsoil(i,j,1,is) = wgrat*wsat(soiltyp(i,j,is))
ENDIF
qsoil(i,j,1,0) = qsoil(i,j,1,0)+stypfrct(i,j,is)*qsoil(i,j,1,is)
wetcanp(i,j,is) = wetcanp(i,j,0)
END DO
END DO
DO k=2,nzsoil
DO j=1,ny-1
DO i=1,nx-1
tsoil(i,j,k,is) = tsoil(i,j,1,0) - ((k - 1)/(nzsoil - 1))* &
(tsoil(i,j,1,0)-tsoil(i,j,nzsoil,0))
IF (soiltyp(i,j,is) == 13) THEN
!Andreas 30-10-03: Make moisture of water 1
qsoil(i,j,k,is) = 1.
ELSE
qsoil(i,j,k,is) = w2rat*wsat(soiltyp(i,j,is))
ENDIF
qsoil(i,j,k,0) = qsoil(i,j,k,0)+stypfrct(i,j,is)*qsoil(i,j,k,is)
END DO
END DO
END DO
END DO
ELSE
WRITE(6,'(1x,a,i3,a/)') &
'Invalid surface variable input option. soilinit =',soilinit, &
'. Program stopped in INITSFC.'
CALL arpsstop ("arpsstop called from initsfc with soilinit option",1)
END IF
IF ( moist /= 0 ) THEN
DO is=1,nstyp
DO k = 1, nzsoil
DO j = 1, ny-1
DO i = 1, nx-1
qsoil(i,j,k,is) = MAX( qsoil(i,j,k,is), 0.0 )
qsoil(i,j,k,is) = MIN( qsoil(i,j,k,is), wsat(soiltyp(i,j,is)) )
END DO
END DO
END DO
DO j = 1, ny-1
DO i = 1, nx-1
wrmax = 0.2*1.0E-3*veg(i,j)*lai(i,j)
wetcanp(i,j,is) = MAX( wetcanp(i,j,is), 0.0 )
wetcanp(i,j,is) = MIN( wetcanp(i,j,is), wrmax )
END DO
END DO
END DO
DO k = 1, nzsoil
DO j = 1, ny-1
DO i = 1, nx-1
qsoil (i,j,k,0) = MAX( qsoil(i,j,k,0), 0.0 )
END DO
END DO
END DO
DO j = 1, ny-1
DO i = 1, nx-1
wetcanp(i,j,0) = MAX( wetcanp(i,j,0), 0.0 )
END DO
END DO
ELSE
DO is=0,nstyp
DO k = 1, nzsoil
DO j = 1, ny-1
DO i = 1, nx-1
qsoil(i,j,k,is) = 0.0
END DO
END DO
END DO
wetcanp(:,:,is) = 0.0
END DO
END IF
DO is=1,nstyp
DO j = 1, ny-1
DO i = 1, nx-1
psfc = .5 * ( (pbar(i,j,1)+pprt(i,j,1)) &
+ (pbar(i,j,2)+pprt(i,j,2)) )
qvsatts = f_qvsat
( psfc, tsoil(i,j,1,is) )
IF ( soiltyp(i,j,is) == 12 .OR. soiltyp(i,j,is) == 13) THEN
! Ice and water
rhgs = 1.0
ELSE IF ( soiltyp(i,j,is) > 0 ) THEN
pterm = .5+SIGN(.5,qsoil(i,j,1,is)-1.1*wfc(soiltyp(i,j,is)))
rhgs = pterm + (1.-pterm) &
* 0.25 * ( 1.-COS(qsoil(i,j,1,is)*pi &
/(1.1*wfc(soiltyp(i,j,is)))) )**2
ELSE
rhgs = 0.0
END IF
qvsfc(i,j,is) = rhgs * qvsatts
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Ensure soil values are consistent with each other.
!
!-----------------------------------------------------------------------
!
tsoil (:,:,:,0) = 0.0
qsoil (:,:,:,0) = 0.0
wetcanp(:,:,0) = 0.0
DO is = 1,nstyp
DO k=1,nzsoil
DO j=1,ny-1
DO i=1,nx-1
tsoil(i,j,k,0) = tsoil(i,j,k,0) &
+ tsoil(i,j,k,is) * stypfrct(i,j,is)
qsoil(i,j,k,0) = qsoil(i,j,k,0) &
+ qsoil(i,j,k,is) * stypfrct(i,j,is)
END DO
END DO
END DO
DO j=1,ny-1
DO i=1,nx-1
wetcanp(i,j,0) = wetcanp(i,j,0) &
+ wetcanp(i,j,is) * stypfrct(i,j,is)
END DO
END DO
END DO
DO j=1,ny-1
DO i=1,nx-1
IF ((vegtyp(i,j) == 14) .OR. (tsoil(i,j,1,0) > 273.16)) THEN
snowdpth(i,j) = 0. ! Make sure that snow cover is consistent
END IF ! with vegetation type and soil temperature.
END DO
END DO
DO j = 1, ny-1
DO i = 1, nx-1
qvsfc(i,j,0) = 0.0
END DO
END DO
DO is=1,nstyp
DO j = 1, ny-1
DO i = 1, nx-1
qvsfc(i,j,0) = qvsfc(i,j,0) + qvsfc(i,j,is)*stypfrct(i,j,is)
END DO
END DO
END DO
IF ( sfcdat == 1 ) THEN
DO is=1,nstyp
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv1diew
(soiltyp(1,1,is),nx,ny,ebc,wbc,0,mpitmp)
CALL mpsendrecv1dins
(soiltyp(1,1,is),nx,ny,nbc,sbc,0,mpitmp)
CALL mpsendrecv1dew
(stypfrct(1,1,is),nx,ny,ebc,wbc,0,mprtmp)
CALL mpsendrecv1dns
(stypfrct(1,1,is),nx,ny,nbc,sbc,0,mprtmp)
END IF
CALL acct_interrupt
(bc_acct)
CALL bcis2d
(nx,ny, soiltyp (1,1,is), ebc,wbc,nbc,sbc)
CALL bcs2d
(nx,ny, stypfrct(1,1,is), ebc,wbc,nbc,sbc)
CALL acct_stop_inter
END DO
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv1diew
(vegtyp,nx,ny,ebc,wbc,0,mpitmp)
CALL mpsendrecv1dins
(vegtyp,nx,ny,nbc,sbc,0,mpitmp)
CALL mpsendrecv1dew
(lai,nx,ny,ebc,wbc,0,mprtmp)
CALL mpsendrecv1dns
(lai,nx,ny,nbc,sbc,0,mprtmp)
CALL mpsendrecv1dew
(roufns,nx,ny,ebc,wbc,0,mprtmp)
CALL mpsendrecv1dns
(roufns,nx,ny,nbc,sbc,0,mprtmp)
CALL mpsendrecv1dew
(veg,nx,ny,ebc,wbc,0,mprtmp)
CALL mpsendrecv1dns
(veg,nx,ny,nbc,sbc,0,mprtmp)
CALL mpsendrecv1dew
(snowdpth,nx,ny,ebc,wbc,0,mprtmp)
CALL mpsendrecv1dns
(snowdpth,nx,ny,nbc,sbc,0,mprtmp)
END IF
CALL acct_interrupt
(bc_acct)
CALL bcis2d
(nx,ny, vegtyp, ebc,wbc,nbc,sbc)
CALL bcs2d
(nx,ny, lai, ebc,wbc,nbc,sbc)
CALL bcs2d
(nx,ny, roufns, ebc,wbc,nbc,sbc)
CALL bcs2d
(nx,ny, veg, ebc,wbc,nbc,sbc)
CALL bcs2d
(nx,ny, snowdpth,ebc,wbc,nbc,sbc)
CALL acct_stop_inter
END IF
IF ( soilinit == 1 ) THEN
DO is=0,nstyp
IF (mp_opt > 0) THEN
CALL acct_interrupt
(mp_acct)
CALL mpsendrecv2dew
(tsoil(1,1,1,is),nx,ny,nzsoil,ebc,wbc,0,tem1soil)
CALL mpsendrecv2dns
(tsoil(1,1,1,is),nx,ny,nzsoil,nbc,sbc,0,tem1soil)
CALL mpsendrecv2dew
(qsoil(1,1,1,is),nx,ny,nzsoil,ebc,wbc,0,tem1soil)
CALL mpsendrecv2dns
(qsoil(1,1,1,is),nx,ny,nzsoil,nbc,sbc,0,tem1soil)
CALL mpsendrecv1dew
(wetcanp(1,1,is),nx,ny,ebc,wbc,0,mprtmp)
CALL mpsendrecv1dns
(wetcanp(1,1,is),nx,ny,nbc,sbc,0,mprtmp)
CALL mpsendrecv1dew
(qvsfc(1,1,is), nx,ny,ebc,wbc,0,mprtmp)
CALL mpsendrecv1dns
(qvsfc(1,1,is), nx,ny,nbc,sbc,0,mprtmp)
END IF
CALL acct_interrupt
(bc_acct)
DO k=1,nzsoil
CALL bcs2d
(nx,ny, tsoil (1,1,k,is), ebc,wbc,nbc,sbc)
CALL bcs2d
(nx,ny, qsoil (1,1,k,is), ebc,wbc,nbc,sbc)
END DO
CALL bcs2d
(nx,ny, wetcanp(1,1,is), ebc,wbc,nbc,sbc)
CALL bcs2d
(nx,ny, qvsfc (1,1,is), ebc,wbc,nbc,sbc)
CALL acct_stop_inter
END DO
END IF
IF (mp_opt > 0 .AND. (sfcdat == 1 .OR. soilinit == 1)) THEN
DEALLOCATE (mpitmp,stat=astat)
DEALLOCATE (mprtmp,stat=astat)
END IF
wtrexist=0
DO j = 1, ny
DO i = 1, nx
DO is = 1,nstyp
IF (soiltyp(i,j,is) == 13) THEN
wtrexist=1
RETURN
END IF
END DO
END DO
END DO
RETURN
WRITE (6,'(/a,i2/a)') &
' Read error in surface data file ' &
//soilinfl//' with the I/O unit ',sfcunit, &
'The model will STOP in subroutine INITSFC.'
CALL arpsstop ("arpsstop called from initsfc reading sfc data file",1)
WRITE (6,'(/a,i2/a)') &
' Read error in surface initial data file ' &
//soilinfl//' with the I/O unit ',sfcunit, &
'The model will STOP in subroutine INITSFC.'
CALL arpsstop ("arpsstop called from initsfc reading sfc data file-2",1)
END SUBROUTINE initsfc
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE FLZERO ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE flzero(a,n) 98
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Fill in an entire array with zeros.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 10/10/1991.
!
! MODIFICATION HISTORY:
!
! 5/02/92 (M. Xue)
! Added full documentation.
!
! 5/03/92 (M. Xue)
! Further documentation.
!
! 9/10/94 (Weygandt & Y. Lu)
! Cleaned up documentation.
!
!-----------------------------------------------------------------------
!
! INPUT :
!
! n The dimension of 1-D array a.
!
! OUTPUT:
!
! a 1-D array filled with zeros.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, n
REAL :: a(n) ! 1-D array filled with zeros
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
DO i=1,n
a(i)=0.0
END DO
RETURN
END SUBROUTINE flzero
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE INITLKTB ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE initlktb 2,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Initializes arrays used for lookup table functions.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Adwait Sathye
! 06/02/94
!
! MODIFICATION HISTORY:
!
! 2/17/97 (J. Zong)
! Corrected definitions of the power functions in loop 100.
!
! 2/24/97 (Jinxing Zong, Ming Xue and Yuhe Liu)
! Defined five pwr arrays for lookup tables to replace fractional
! power calculations in Tao ice microphysics.
!
! 8 November 2002 (Eric Kemp)
! Added pwr lookup tables for Ferrier fall speed options, and further
! optimized previous tables.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! OUTPUT:
! pwr arrays filled with evenly spaced data points
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
!-----------------------------------------------------------------------
!
! INCLUDE FILES
!
!-----------------------------------------------------------------------
!
INCLUDE 'phycst.inc'
REAL :: tnw,tns,tng,roqr,roqs,roqg
COMMON /size/ tnw,tns,tng,roqr,roqs,roqg ! Set in subroutine STCSTICE
!
!-----------------------------------------------------------------------
!
! LOCAL VARIABLES
!
!-----------------------------------------------------------------------
!
INTEGER :: i
REAL :: temper
REAL :: cpi, rhoqx, lambda ! EMK
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
DO i = 0, 1001
pwr2046(i) = ( 0.05 * i / 1000.0 ) ** 0.2046
pwr525(i) = ( 0.05 * i / 1000.0 ) ** 0.525
pwr875(i) = ( 0.05 * i / 1000.0 ) ** 0.875
pwr1364(i) = ( 0.05 * i / 1000000.0 ) ** 0.1364
END DO
!-----------------------------------------------------------------------
!
! Build a look up table for the Latent heat of vaporation, calculated
! in the temperature range of (-100,50) degree Celcius
! according to formula
!
! Lv = lathv * (273.15/tbar)**(0.167+3.67E-4*tbar)
!
! Lv for t(K) is given by
!
! index = max( min(151, NINT(t-172.15)), 1)
! Lv = latheatv(index)
!
! where lathv = 2.500780e6 is set in phycst.inc, and t is the
!
!-----------------------------------------------------------------------
DO i=-100,50
temper = i+273.15
latheatv(i+101)=lathv * (273.15/temper)**(0.167+3.67E-4*temper)
END DO
!-----------------------------------------------------------------------
!
! Build lookup tables for T**0.81 and (rhobar/mu/psi**2)**one6th,
! where mu and psi stand for dynamic viscosity of air and diffusivity
! of water vapor in air, respectively. The temerature ranges from
! -100 to 50 degree Celcius, pressure from 0 to 1500 hPa, and air
! density from 0 to 1.5 kg/m**3 in the calculations of the tables.
! With the above ranges of T, p and air density, (rhobar/mu/psi**2)
! is between 0.0 and 3000.0.
!
!-----------------------------------------------------------------------
DO i = 0, 151
pwr81(i) = ( 173.15 + i ) ** 0.81
END DO
DO i = 0, 10001
pwr1666(i) = ( 3000.0 * i / 10000.0 ) ** 0.1666667
END DO
!-----------------------------------------------------------------------
!
! Lookup tables for (rhobar*q)**a, where q can be qr, qs or qh.
! rhobar is in g/cm***3. rhobar*q ranges from 0 to 50.e-6. The
! increment of the tables is 50.e-9.
!
!-----------------------------------------------------------------------
cpi = 4.*ATAN(1.) ! EMK
CALL stcstice
() ! EMK Initialize Lin-Tao scheme parameters
DO i = 0, 10001
! pwr2 (i) = ( 0.05 * i / 10000000.0 ) ** 0.2
! pwr0625 (i) = ( 0.05 * i / 10000000.0 ) ** 0.0625
! pwr15625(i) = ( 0.05 * i / 10000000.0 ) ** 0.15625
! pwr105(i) = ( 0.05 * i / 10000000.0 ) ** 0.105 ! EMK
! pwr1596(i) = ( 0.05 * i / 10000000.0 ) ** 0.1596 ! EMK
! rhoqx = 0.05 * i / 10000000.0 ! EMK cgs units
rhoqx = 0.05 * i * 1.0E-7 ! EMK cgs units
pwr2 (i) = ( rhoqx ) ** 0.2
pwr0625 (i) = ( rhoqx ) ** 0.0625
pwr15625(i) = ( rhoqx ) ** 0.15625
pwr105(i) = ( rhoqx ) ** 0.105 ! EMK
pwr1596(i) = ( rhoqx ) ** 0.1596 ! EMK
! EMK 18 November 2002
IF(i == 0)THEN
pwrlam195ratio(i) = 0.0
ELSE
lambda = SQRT(SQRT(cpi*roqr*tnw/rhoqx)) ! EMK cgs units
pwrlam195ratio(i) = ( lambda + 1.95 ) ** 5 ! EMK
pwrlam195ratio(i) = (lambda**4)/pwrlam195ratio(i)
! pwrlam195ratio(i) = SQRT(SQRT(rhoqx/(cpi*roqr*tnw))) ! EMK cgs units
! pwrlam195ratio(i) = ( 1. + (1.95*pwrlam195ratio(i))) ** 5 ! EMK
! pwrlam195ratio(i) = rhoqx/pwrlam195ratio(i)
END IF
END DO
RETURN
END SUBROUTINE initlktb
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GTSINLAT ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE gtsinlat(nx,ny, x,y, sinlat, xs, ys, temxy) 2,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the sin of the lattitude of each grid point, to be used
! in the calculation of latitude-dependent Coriolis parameters.
!
!-----------------------------------------------------------------------
!
!
! AUTHOR: Ming Xue
! 3/21/95.
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! x x-coordinate of grid points in computational space (m)
! y y-coordinate of grid points in computational space (m)
!
! OUTPUT:
!
! sinlat Sin of latitude at each grid point
!
! WORK ARRAYS:
!
! xs x-coordinate at scalar points.
! ys y-coordinate at scalar points.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny ! Dimensions of model grid.
REAL :: x (nx) ! The x-coord. of the u points.
REAL :: y (ny) ! The y-coord. of the v points.
REAL :: sinlat(nx,ny) ! Sin of latitude at each grid point
REAL :: xs (nx) ! x-coord. of scalar points.
REAL :: ys (ny) ! y-coord. of scalar points.
REAL :: temxy (nx,ny) ! Work array.
REAL :: r2d
INTEGER :: i,j
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
DO i=1,nx-1
xs(i) = (x(i)+x(i+1))*0.5
END DO
xs(nx) = -xs(nx-2)+2.0*xs(nx-1)
DO j=1,ny-1
ys(j) = (y(j)+y(j+1))*0.5
END DO
ys(ny) = -ys(ny-2)+2.0*ys(ny-1)
!
CALL xytoll
(nx,ny,xs,ys,sinlat,temxy)
r2d = ATAN(1.0)*4.0/180.0
DO j=1,ny
DO i=1,nx
sinlat(i,j) = SIN( r2d * sinlat(i,j) )
END DO
END DO
RETURN
END SUBROUTINE gtsinlat
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE SETPPI ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE setppi(nx,ny,nz,nt,tlvl,pprt,pbar,ppi) 2
IMPLICIT NONE
INTEGER :: nx,ny,nz,nt,tlvl
REAL :: pprt(nx,ny,nz,nt)
REAL :: pbar(nx,ny,nz)
REAL :: ppi (nx,ny,nz)
INCLUDE 'phycst.inc'
INTEGER :: i,j,k
REAL :: p0inv
p0inv=1./p0
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
ppi(i,j,k)=((pprt(i,j,k,tlvl)+pbar(i,j,k))*p0inv)**rddcp
END DO
END DO
END DO
RETURN
END SUBROUTINE setppi
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE STCSTICE ######
!###### ######
!###### Developed by ######
!###### ######
!###### Goddard Cumulus Ensemble Modeling Group, NASA ######
!###### ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
!
SUBROUTINE stcstice 2
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Set constants used by the ice microphyscs parameterization routine
! ICECVT
!
! Lin et.al. J. Clim. Appl. Meteor. 22, 1065-1092
! Modified and coded by tao and simpson (JAS, 1989; Tao, 1993)
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! AUTHOR: W.G. Tao, Goddard Cumulus Ensemble Modeling Group, NASA
! 01/01/1990
!
! Modification history:
!
! 9/8/1994 (M. Xue)
! Defined inline function CVMGP to replace external function CVMGP.
!
! 2/24/1997 (J. Zong, M. Xue and Yuhe Liu)
! Constants rn5, rn6, rn22, rn17a, rn19a, rn20b and rn101 are
! redefined to facilitate use of lookup tables to replace power
! calculations for microphysical conversions and terminal velocity.
!
! 08/27/2002 (D. Weber)
! Added fallopt option to provide a choice of fall velocity
! computations.
!
!-----------------------------------------------------------------------
!
include "globcst.inc"
COMMON/size/ tnw,tns,tng,roqr,roqs,roqg
COMMON/cont/ c76,c358,c172,c409,c218,c580,c610,c149,c879,c141
COMMON/b3cs/ ag,bg,as,bs,aww,bww,bgh,bgq,bsh,bsq,bwh,bwq
COMMON/bterv/ zrc,zgc,zsc,vrc,vgc,vsc
COMMON/bsnw/ alv,alf,als,t0,t00,avc,afc,asc,rn1,bnd1,rn2,bnd2, &
rn3,rn4,rn5,rn6,rn7,rn8,rn9,rn10,rn101,rn10a,rn11,rn11a, &
rn12,rn12a(31),rn12b(31),rn13(31),rn14,rn15,rn15a,rn16,rn17, &
rn17a,rn17b,rn17c,rn18,rn18a,rn19,rn19a,rn19b,rn20,rn20a,rn20b, &
bnd3,rn21,rn22,rn23,rn23a,rn23b,rn25,rn25a(31),rn30a,rn30b, &
rn30c,rn31,beta,rn32
!
DIMENSION a1(31),a2(31)
DATA a1/.7939E-7,.7841E-6,.3369E-5,.4336E-5,.5285E-5,.3728E-5, &
.1852E-5,.2991E-6,.4248E-6,.7434E-6,.1812E-5,.4394E-5,.9145E-5, &
.1725E-4,.3348E-4,.1725E-4,.9175E-5,.4412E-5,.2252E-5,.9115E-6, &
.4876E-6,.3473E-6,.4758E-6,.6306E-6,.8573E-6,.7868E-6,.7192E-6, &
.6513E-6,.5956E-6,.5333E-6,.4834E-6/
DATA a2/.4006,.4831,.5320,.5307,.5319,.5249,.4888,.3894,.4047, &
.4318,.4771,.5183,.5463,.5651,.5813,.5655,.5478,.5203,.4906, &
.4447,.4126,.3960,.4149,.4320,.4506,.4483,.4460,.4433,.4413, &
.4382,.4361/
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Define the density and size distribution of precipitation
!
!-----------------------------------------------------------------------
!
roqr = 1.
tnw = .08
roqs = .1
tns = .03
roqg = .913
tng = .0004
!
cpi = 4.*ATAN(1.)
cpi2 = cpi*cpi
grvt = 980.
tca = 2.43E3
dwv = .226
dva = 1.718E-4
amw = 18.016
ars = 8.314E7
scv = 2.2904487
t0 = 273.16
t00 = 238.16
alv = 2.5E10
alf = 3.336E9
als = 2.8336E10
!%%%
cp = 1.003E7 ! Missing in the original Tao's code
!%%%
avc = alv/cp
afc = alf/cp
asc = als/cp
rw = 4.615E6
cw = 4.187E7
ci = 2.093E7
c76 = 7.66
c358 = 35.86
c172 = 17.26939
c409 = 4098.026
c218 = 21.87456
c580 = 5807.695
c610 = 6.1078E3
c149 = 1.496286E-5
c879 = 8.794142
c141 = 1.4144354E7
!
!-----------------------------------------------------------------------
!
! Define the coefficients used in terminal velocity
!
!-----------------------------------------------------------------------
!
ag = 1400.
bg = .5
as = 152.93
bs = .25
aww= 2115.
bww= .8
! print *,fallopt
IF(fallopt.eq.2)THEN ! compute Ferrier version of the fall vel.
! ferrier numbers for rain.
aww= 4854.
bww= 1.0
! ferrier numbers for snow.
as = 129.6
bs = 0.42
! ferrier numbers for graupel/hail.
ag = 1094.3
bg = 0.6384
END IF
bgh = .5*bg
bsh = .5*bs
bwh = .5*bww
bgq = .25*bg
bsq = .25*bs
bwq = .25*bww
ga3 = 2.
ga4 = 6.
ga5 = 24.
ga6 = 120.
ga7 = 720.
ga8 = 5040.
ga9 = 40320.
ga3b = 4.6941552
IF(fallopt.eq.2)THEN ! Ferrier formulation...
ga4b = 4.0
ELSE ! original Lin configuration
ga4b = 17.83779
END IF
ga4b = 17.83779
ga6b = 496.6041
ga5bh = 1.827363
ga4g = 11.63177
ga3g = 3.3233625
ga5gh = 1.608355
IF (bg == 0.37) THEN
ga4g = 9.730877
ga3g = 2.8875
ga5gh = 1.526425
END IF
ga3d = 2.54925
ga4d = 8.285063
ga5dh = 1.456943
IF (bs == 0.57) THEN
ga3d = 3.59304
ga4d = 12.82715
ga5dh = 1.655588
END IF
IF(bs == 0.11) THEN
ga3d = 2.218906
ga4d = 6.900796
ga5dh = 1.382792
END IF
!
!-----------------------------------------------------------------------
!
! Lin et al., 1983
!
!-----------------------------------------------------------------------
!
ac1 = aww
bc1 = bww
cc1 = as
dc1 = bs
cd1 = 6.e-1
cd2 = 4.*grvt/(3.*cd1)
zrc = (cpi*roqr*tnw)**0.25
zsc = (cpi*roqs*tns)**0.25
zgc = (cpi*roqg*tng)**0.25
vrc = ac1*ga4b/(6.*zrc**bww)
vsc = cc1*ga4d/(6.*zsc**bs)
vgc = ga4g*SQRT(cd2*roqg/zgc)/6.
! Added by D. Weber 8/27/02
! for rain we have a more complicated modification
! vtr = 4854*sqrt(rho0/rho)* [gamma(5)*lambda**(4)/
! gamma(4)*(lambda+f)**(5)
! gamma (5) = 5-1! = 24, gamma (4) = 4-1! = 4
IF (fallopt == 2) THEN
! ferrier equation for rain partial calc for lambda....
vrc = 19416.0/SQRT(SQRT(cpi*roqr*tnw)) ! EMK 19 November 2002
vsc = 225.12/((cpi*roqs*tns)**0.105)
! ferrier equation for hail
vgc = 2577.6419/((cpi*roqg*tng)**.1596)
END IF
! print *,ag,ga4d,zgc,bg
! print *,'vrc,vsc,vgc= ',vrc,vsc,vgc
rn1 = 1.e-3
bnd1 = 6.e-4
rn2 = 1.e-3
bnd2 = 1.e-3
rn3 = .25*cpi*tns*cc1*ga3d
esw = 1.
rn4 = .25*cpi*esw*tns*cc1*ga3d
eri = 1.
rn5 = .25*cpi*eri*tnw*ac1*ga3b / zrc**bww
ami = 1./(24.*4.19E-10)
rn6 = cpi2*eri*tnw*ac1*roqr*ga6b*ami / zrc**bww
esr = 1.
rn7 = cpi2*esr*tnw*tns*roqs
rn8 = cpi2*esr*tnw*tns*roqr
rn9 = cpi2*tns*tng*roqs
rn10 = 2.*cpi*tns
rn101 = .31*ga5dh*SQRT(cc1) / zsc**0.625
rn10a = als*als/rw
rn11 = 2.*cpi*tns/alf
rn11a = cw/alf
ami50 = 4.8E-7
ami40 = 3.84E-9
eiw = 1.
ui50 = 100.
ri50 = 5.e-3
cmn = 1.05E-15
rn12 = cpi*eiw*ui50*ri50**2
DO k = 1,31
y1 = 1.-a2(k)
rn13(k) = a1(k)*y1/(ami50**y1-ami40**y1)
rn12a(k) = rn13(k)/ami50
rn12b(k) = a1(k)*ami50**a2(k)
rn25a(k) = a1(k)*cmn**a2(k)
END DO
egw = 1.
rn14 = .25*cpi*egw*tng*ga3g*SQRT(cd2*roqg)
egi = .1
rn15 = .25*cpi*egi*tng*ga3g*SQRT(cd2*roqg)
egi = 1.
rn15a = .25*cpi*egi*tng*ga3g*SQRT(cd2*roqg)
egr = 1.
!n16 = cpi2*egr*tng*tnw*roqr
rn17 = 2.*cpi*tng
rn17a = .31*ga5gh*(cd2*roqg)**.25 * zgc**0.25
rn17b = cw-ci
rn17c = cw
apri = .66
bpri = 1.e-4
rn18 = 20.*cpi2*bpri*tnw*roqr
rn18a = apri
rn19 = 2.*cpi*tng/alf
rn19a = .31*ga5gh*(cd2*roqg)**.25 * zgc**0.25
rn19b = cw/alf
rn20 = 2.*cpi*tng
rn20a = als*als/rw
rn20b = .31*ga5gh*(cd2*roqg)**.25 * zgc**0.25
bnd3 = 2.e-3
rn21 = 1.e3*1.569E-12/0.15
erw = 1.
rn22 = .25*cpi*erw*ac1*tnw*ga3b / zrc**bww
rn23 = 2.*cpi*tnw
rn23a = .31*ga5bh*SQRT(ac1)
rn23b = alv*alv/rw
! cn0 = 1.e-8
cn0 = 1.e-5
rn25 = cn0/1000.
rn30a = alv*als*amw/(tca*ars)
rn30b = alv/tca
rn30c = ars/(dwv*amw)
rn31 = 1.e-17
beta = -.6
rn32 = 4.*51.545E-4
RETURN
END SUBROUTINE stcstice