!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE CORDINTG ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
!EMK BMJ
SUBROUTINE cordintg(mptr,frstep, nx,ny,nz,nxndg,nyndg,nzndg, & 3,69
rbufsz,nstyps,exbcbufsz, &
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke,pbldpth, &
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, mapfct, j1,j2,j3,aj3x,aj3y,aj3z,j3inv, &
trigs1,trigs2,ifax1,ifax2, &
wsave1,wsave2,vwork1,vwork2, &
sinlat,kmh,kmv,rprntl, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth,ptsfc,qvsfc, &
ptcumsrc,qcumsrc,raing,rainc,prcrate,w0avg,nca,kfraincv, &
cldefi,xland,bmjraincv, &
radfrc,radsw,rnflx,rad2d,radbuf,exbcbuf,bcrlx, &
usflx,vsflx,ptsflx,qvsflx, &
uincr,vincr,wincr,pincr,ptincr,qvincr, &
qcincr,qrincr,qiincr,qsincr,qhincr, &
phydro,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)
!EMK END
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Coordinate the forward integration of all model time-dependent
! variables.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 10/01/1991.
!
! MODIFICATION HISTORY:
!
! 4/26/92 (K. Droegemeier)
! Added full documentation.
!
! 4/10/93 (M. Xue & Hao Jin)
! Add the terrain.
!
! 01/24/94 (Yuhe Liu)
! Added array tsfc, qvsfc, tsoil, wetsfc, wetdp, wetcanp, and some of
! temporary arrays to the arguments of subroutine SFCFLX, for
! prediction of the surface temperature and specific humidity
!
! 9/10/94 (D. Weber & Y. Lu)
! Cleaned up documentation.
!
! 02/07/1995 (Yuhe Liu)
! Added a new 2-D array, veg(nx,ny), to the argument list
!
! 7/6/1995 (M. Xue)
! Pressure detrending is applied to the base grid (as opposed to
! nested grids) only.
!
! 10/31/95 (D. Weber)
! Added trigs1,trigs2,ifax1,ifax2 for use in the upper w-p
! radiation condition.
!
! 01/25/96 (Donghai Wang & Yuhe Liu)
! Added the map projection factor to ARPS governing equations.
!
! 01/31/1996 (V. Wong and X. Song)
! Added a parameter, qpfgfrq, that controls the frequency of calling
! the subroutine QPFGRID.
!
! 08/14/1996 (Yuhe Liu)
! Moved the definition of radiation buffer to the ARPS main program
! and passed it through argument list.
!
! 07/22/97 (D. Weber)
! Added wsave1,wsave2,vwork1,vwork2 for use in the upper w-p
! radiation condition (fftopt=2).
!
! 08/01/97 (Zonghui Huo)
! Added Kain-fritsch cumulus parameterization scheme.
!
! 10/21/97 (Donghai Wang)
! Using total density (rho) in the calculation of the pressure
! gradient force terms, and added the second order terms
! in the linerized buoyancy terms.
!
! 11/05/97 (D. Weber)
! Added phydro array for use in the bottom boundary condition for
! perturbation 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.
!
! 2/11/1998 (M. Xue)
! Corrections made to ensure no moist process is activatived when
! moist=0.
!
! 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/18/98 (D. Weber)
! Added precomputed averages of j3 in the x,y, and z directions
! to improve code efficiency.
!
! 8/31/1998 (K. Brewster)
! Added call to NUDGEALL for nudging to observation increments.
!
! 11/18/98 (Keith Brewster)
! Changed pibar to ppi (full pi).
!
! 12/09/1998 (Donghai Wang)
! Added the snow cover.
!
! 12/05/2001 (Yunheng Wang)
! Replaced sfcflx call with sfcphysics call which was a structure
! change by M. Xue.
!
! 07/10/2001 (K. Brewster)
! Added increment arrays to argument list and to call to nudgeall
!
! 07/23/2001 (K. Brewster)
! Added mptr to call to tinteg, needed for printing of diagnostic noise
! parameter.
!
! 13 March 2002 (Eric Kemp)
! Added arrays for WRF BMJ cumulus scheme.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! mptr Grid identifier.
! frstep Flag to determine if this is the initial time step.
! 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
!
! 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)
! wcont Contravariant vertical velocity (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 Turbulent Kinetic Energy ((m/s)**2)
! pbldpth Planetary boundary layer depth (m)
!
! 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)
!
! phydro Big time step forcing term for use in computing the
! hydrostatic pressure at k=1.
!
! 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.
!
! 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)
! 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
! 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 Jacobian d(zp)/dz
!
! 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.
! vwork2 2-D work array for fftopt=2.
! wsave1 Work array for fftopt=2.
! wsave2 Work array for fftopt=2.
!
! soiltyp Soil type
! vegtyp Vegetation type
! lai Leaf Area Index
! roufns Surface roughness
! veg Vegetation fraction
!
! tsfc Ground surface temperature (K)
! tsoil Deep soil temperature (K) (in deep 1 m layer)
! qvsfc Effective qv at sfc.
! wetsfc Surface soil moisture
! wetdp Deep soil moisture
! wetcanp Canopy water amount
!
! ptsfc Ground surface potential temperature (K)
! qvsfc Effective S.H. at sfc.
!
! OUTPUT:
! u Updated (by dtbig) x velocity component at times tpast
! and tpresent (m/s).
! v Updated (by dtbig) y velocity component at times tpast
! and tpresent (m/s).
! w Updated (by dtbig) z velocity component at times tpast
! and tpresent (m/s).
! ptprt Updated (by dtbig) perturbation potential temperature
! at times tpast and tpresent (K).
! pprt Updated (by dtbig) perturbation pressure at times tpast
! and tpresent (Pascal).
! qv Updated (by dtbig) water vapor specific humidity at times
! tpast and tpresent (kg/kg).
! qc Updated (by dtbig) cloud water mixing ratio at times
! tpast and tpresent (kg/kg).
! qr Updated (by dtbig) rainwater mixing ratio at times tpast
! and tpresent (kg/kg).
! qi Updated (by dtbig) cloud ice mixing ratio at times tpast
! and tpresent (kg/kg).
! qs Updated (by dtbig) snow mixing ratio at times tpast and
! tpresent (kg/kg).
! qh Updated (by dtbig) hail mixing ratio at times tpast and
! tpresent (kg/kg).
!
! 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)
!
! 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
!
! tsfc Ground surface temperature (K)
! qvsfc Effective qv at sfc.
! wetsfc Surface soil moisture
! wetdp Deep soil moisture
! 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
! raing Grid supersaturation rain
! rainc Cumulus convective rain
! 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/s)
! radsw Solar radiation reaching the ground surface (W/m**2)
! rnflx Net radiation flux at the ground surface (W/m**2)
! rad2d 2-D arrays for radiation calculation
! radbuf Buffer array to carry temporary working arrays for
! radiation calculation
!
! WORK ARRAYS:
!
! 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)
!
! 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)
!
! ptdteb Time tendency of ptprt field at east boundary (K/s)
! ptdtwb Time tendency of ptprt field at west boundary (K/s)
! ptdtnb Time tendency of ptprt field at north boundary(K/s)
! ptdtsb Time tendency of ptprt field at south boundary(K/s)
!
! sdteb Time tendency of a scalar at e-boundary
! sdtwb Time tendency of a scalar at w-boundary
! sdtnb Time tendency of a scalar at n-boundary
! sdtsb Time tendency of a scalar at s-boundary
!
! 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))
!
! 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 ! Force explicit declarations
INTEGER :: mptr ! Grid identifier.
INCLUDE 'timelvls.inc'
INTEGER :: nx, ny, nz ! Number of grid points in 3 directions
INTEGER :: nxndg,nyndg,nzndg ! Number of grid points in 3 directions
INTEGER :: frstep ! Indicator of the first time step call
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 (K)
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 :: pbldpth(nx,ny,nt) ! Planetary boundary layer depth (m)
REAL :: udteb (ny,nz) ! Time tendency of u at e-boundary (m/s**2)
REAL :: udtwb (ny,nz) ! Time tendency of u at w-boundary (m/s**2)
REAL :: udtnb (nx,nz) ! Time tendency of u at n-boundary (m/s**2)
REAL :: udtsb (nx,nz) ! Time tendency of u at s-boundary (m/s**2)
REAL :: vdteb (ny,nz) ! Time tendency of v at e-boundary (m/s**2)
REAL :: vdtwb (ny,nz) ! Time tendency of v at w-boundary (m/s**2)
REAL :: vdtnb (nx,nz) ! Time tendency of v at n-boundary (m/s**2)
REAL :: vdtsb (nx,nz) ! Time tendency of v at s-boundary (m/s**2)
REAL :: wdteb (ny,nz) ! Time tendency of w at e-boundary (m/s**2)
REAL :: wdtwb (ny,nz) ! Time tendency of w at w-boundary (m/s**2)
REAL :: wdtnb (nx,nz) ! Time tendency of w at n-boundary (m/s**2)
REAL :: wdtsb (nx,nz) ! Time tendency of w at s-boundary (m/s**2)
REAL :: pdteb (ny,nz) ! Time tendency of pprt at e-boundary (Pascal/s)
REAL :: pdtwb (ny,nz) ! Time tendency of pprt at w-boundary (Pascal/s)
REAL :: pdtnb (nx,nz) ! Time tendency of pprt at n-boundary (Pascal/s)
REAL :: pdtsb (nx,nz) ! Time tendency of pprt at s-boundary (Pascal/s)
REAL :: phydro(nx,ny) ! Big time step forcing for computing
! hydrostatic pprt at k=1.
REAL :: sdteb (ny,nz) ! Time tendency of a scalar at e-boundary
REAL :: sdtwb (ny,nz) ! Time tendency of a scalar at w-boundary
REAL :: sdtnb (nx,nz) ! Time tendency of a scalar at n-boundary
REAL :: sdtsb (nx,nz) ! Time tendency of a scalar at s-boundary
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 of staggered grid.
REAL :: mapfct(nx,ny,8) ! Map factors at scalar, u and v points
REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian -d(zp)/d(x)
REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian -d(zp)/d(y)
REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian d(zp)/d(z)
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) ! Coordinate transformation Jacobian d(zp)/d(z)
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 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 :: tsfc (nx,ny,0:nstyps) ! Temperature at ground(K)(in top 1 cm layer)
REAL :: tsoil (nx,ny,0:nstyps) ! Deep soil temperature(K)(in deep 1 m layer)
REAL :: wetsfc (nx,ny,0:nstyps) ! Surface soil moisture in the top 1 cm layer
REAL :: wetdp (nx,ny,0:nstyps) ! Deep soil moisture in the deep 1 m layer
REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount
REAL :: snowdpth(nx,ny) ! Snow depth (m)
REAL :: ptsfc (nx,ny) ! Potential temperature at the ground level (K)
REAL :: qvsfc (nx,ny,0:nstyps) ! Effective qv at the surface (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 :: 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(IN) :: 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 :: raing (nx,ny) ! Gridscale rainfall (mm)
REAL :: rainc (nx,ny) ! Cumulus rainfall (mm)
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
!
!-----------------------------------------------------------------------
!
! Arrays for radiation
!
!-----------------------------------------------------------------------
!
INCLUDE 'radcst.inc' ! Radiation constants and parameters
INTEGER :: rbufsz ! Radiation buffer size
REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s)
REAL :: radsw (nx,ny) ! Solar radiation reaching the surface
REAL :: rnflx (nx,ny) ! Net absorbed radiation flux at surface
REAL :: rad2d(nx,ny,nrad2d)
! Buffur array to carry the variables calculated or used in
! radiation calculation. The last index defines the variables:
! 1 = nrsirbm, Solar IR surface albedo for beam
! 2 = nrsirdf, Solar IR surface albedo for diffuse
! 3 = nrsuvbm, Solar UV surface albedo for beam
! 4 = nrsuvdf, Solar UV surface albedo for diffuse
! 5 = ncosz, Cosine of zenith
! 6 = ncosss, Cosine of angle between sun light and slope
! 7 = nfdirir, all-sky direct downward IR flux (0.7-10 micron)
! at the surface
! 8 = nfdifir, all-sky diffuse downward IR flux
! at the surface
! 9 = nfdirpar, all-sky direct downward and par flux
! (0.4-0.7 micron) at the surface
! 10 = nfdifpar, all-sky diffuse downward and par flux
! at thediffuse downward and par flux
! at the surface
REAL :: radbuf(rbufsz) ! Buffer array storing temporary working
! arrays for radiation computing
INTEGER :: exbcbufsz ! EXBC buffer size
REAL :: exbcbuf( exbcbufsz ) ! EXBC buffer array
REAL :: bcrlx(nx,ny) ! EXBC relaxation coefficients
!
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 :: 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
!
!-----------------------------------------------------------------------
!
! Temporary arrays
!
!-----------------------------------------------------------------------
!
REAL :: cdm (nx,ny) ! Drag coefficient for surface momentum flux
REAL :: cdh (nx,ny) ! Drag coefficient for surface heat flux
REAL :: cdq (nx,ny) ! Drag coefficient for surface moisture flux
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' ! Global constants that control model execution
INCLUDE 'bndry.inc' ! Boundary condition control parameters
INCLUDE 'phycst.inc' ! Physical constants
INCLUDE 'exbc.inc' ! EXBC constants and parameters
INCLUDE 'nudging.inc' ! variables for nudging assimilation
INCLUDE 'mp.inc' ! Message passing parameters.
!
!-----------------------------------------------------------------------
!
! Miscellaneous local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: nocalls
SAVE nocalls
DATA nocalls / 0 /
INTEGER :: i,j,k
INTEGER :: ireturn ! Return status indicator
REAL :: dtbig1
REAL :: pisum
INTEGER :: tstrtlvl
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
mgrid = mptr
!
!-----------------------------------------------------------------------
!
! Calculate the radiation forcing and surface fluxes if desired.
!
!-----------------------------------------------------------------------
!
CALL set_acct
(rad_acct)
IF ( radopt /= 0 .AND. MOD(nstep-1, nradstp) == 0 ) THEN
IF (myproc == 0) &
WRITE(6,'(a,i8,a,f10.2,a)') &
' Compute radiation at time step,', nstep, &
', model time=',curtim,' (s)'
CALL radiation
(nx,ny,nz,rbufsz, &
ptprt(1,1,1,1),pprt(1,1,1,1), &
qv(1,1,1,1),qc(1,1,1,1),qr(1,1,1,1), &
qi(1,1,1,1),qs(1,1,1,1),qh(1,1,1,1), &
ptbar,pbar,ppi,rhostr, &
x,y,z,zp, j3inv, &
soiltyp(1,1,1),tsfc(1,1,0),wetsfc(1,1,0), &
snowdpth,radfrc,radsw,rnflx, &
rad2d(1,1,nrsirbm), rad2d(1,1,nrsirdf), &
rad2d(1,1,nrsuvbm), rad2d(1,1,nrsuvdf), &
rad2d(1,1,ncosz), rad2d(1,1,ncosss), &
rad2d(1,1,nfdirir), rad2d(1,1,nfdifir), &
rad2d(1,1,nfdirpar),rad2d(1,1,nfdifpar), &
tem1, tem2, tem3, tem4, tem5, &
tem6, tem7, tem8, tem9, tem10, &
tem11,tem12,tem13,tem14,tem15,tem16, &
radbuf)
IF( lvldbg >= 2 ) THEN
CALL checkshx
(radfrc, nx,ny,nz,1,nx-1,1,ny-1,2,nz-2, &
'radfrc', tem1)
CALL checkshy
(radfrc, nx,ny,nz,1,nx-1,1,ny-1,2,nz-2, &
'radfrc', tem1)
CALL checkshx
(radsw,nx,ny,1,1,nx-1,1,ny-1,1,1, &
'radsw', tem1)
CALL checkshy
(radsw,nx,ny,1,1,nx-1,1,ny-1,1,1, &
'radsw', tem1)
CALL checkshx
(rnflx,nx,ny,1,1,nx-1,1,ny-1,1,1, &
'rnflx', tem1)
CALL checkshy
(rnflx,nx,ny,1,1,nx-1,1,ny-1,1,1, &
'rnflx', tem1)
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Calculate the surface fluxes of momentum, heat, and water
! vapor for use in the turbulent mixing subroutine
!
!-----------------------------------------------------------------------
!
CALL set_acct
(misc_acct)
IF(sadvopt /= 4) THEN ! Leapfrop scheme
tstrtlvl = tpast
ELSE ! Forward-based scheme
tstrtlvl = tpresent
END IF
CALL sfcphysics
(nx,ny,nz,nstyps, &
u(1,1,1,tstrtlvl),v(1,1,1,tstrtlvl), &
w(1,1,1,tstrtlvl),ptprt(1,1,1,tstrtlvl), &
pprt(1,1,1,tstrtlvl),qv(1,1,1,tstrtlvl), &
qr(1,1,1,tstrtlvl), &
rhostr,ptbar,pbar,qvbar, &
x,y,z, zp, j1,j2,j3,j3inv, prcrate(1,1,1), &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth,qvsfc, &
radsw,rnflx, &
cdm,cdh,cdq,usflx,vsflx,ptsflx,qvsflx,pbldpth )
!call test_dump(usflx,"XXXAsfcflx_usflx",nx,ny,1,1,1)
!call test_dump(vsflx,"XXXAsfcflx_vsflx",nx,ny,1,2,1)
!call test_dump(ptsflx,"XXXAsfcflx_ptsflx",nx,ny,1,0,1)
!call test_dump(qvsflx,"XXXAsfcflx_qvsflx",nx,ny,1,0,1)
!call test_dump(pbldpth,"XXXAsfcflx_pbldpth",nx,ny,3,0,1)
!
CALL set_acct
(bc_acct)
IF( lbcopt == 2 .AND. mgrid == 1 ) THEN
!
!-----------------------------------------------------------------------
!
! Read in variables from an external boundary file, and
! calculate the linear time tendencies of the external data.
!
!-----------------------------------------------------------------------
!
CALL extbdt
(nx,ny,nz, ptbar,pbar, ireturn, &
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), &
tem1,tem2,tem3,tem4,tem5,tem6, &
tem7,tem8,tem9,tem10,tem11)
IF( ireturn == 0 ) THEN
GO TO 112
ELSE 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.'
GO TO 111
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.'
GO TO 111
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.'
GO TO 111
ELSE
WRITE (6,'(a/a)') &
'Other errors in getting the external boundary data. Dump the', &
'history file and restart file and then STOP the model.'
GO TO 111
END IF
111 CONTINUE
CALL set_acct
(output_acct)
!
!-----------------------------------------------------------------------
!
! Write out external data arrays and stop the program if data read
! failed.
!
!-----------------------------------------------------------------------
!
IF (mp_opt > 0) THEN
CALL arpsstop
("arpstop called from CORDINTG ",1)
END IF
CALL abortdmp
(mptr,nx,ny,nz,nstyps, &
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
ubar,vbar,ptbar,pbar,rhostr,qvbar,kmh,kmv, &
x,y,z,zp,zp(1,1,2),mapfct, j1,j2,j3, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
tem1,tem2,tem3, tem4)
! blocking inserted for ordering i/o for message passing
DO i=0,nprocs-1,max_fopen
IF(myproc >= i.AND.myproc <= i+max_fopen-1)THEN
!EMK BMJ
CALL rstout
(nx,ny,nz,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,zp(1,1,2),mapfct, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth,qvsfc, &
ptcumsrc,qcumsrc,w0avg,nca,kfraincv, &
cldefi,xland,bmjraincv, &
radfrc,radsw,rnflx, &
raing,rainc,prcrate,exbcbuf,tem1)
!EMK END
END IF
IF (mp_opt > 0) CALL mpbarrier
END DO
CALL arpsstop
("arpsstop called from CORDINTG run unstable, aborted",1)
112 CONTINUE
END IF
!
!-----------------------------------------------------------------------
!
! Adjust potential temperature and Qv fields with grid condensation
! or warm rain microphysics
!
!-----------------------------------------------------------------------
!
CALL set_acct
(qpfgrd_acct)
IF ( (moist /= 0) .AND. (cnvctopt == 1) .AND. &
(MOD(curtim+0.001,qpfgfrq) < (0.5*dtbig)) ) THEN
CALL qpfgrid
(nx,ny,nz,prcrate(1,1,2), &
pprt(1,1,1,2),ptprt(1,1,1,2),qv(1,1,1,2),pbar,ptbar, &
rhostr,zp,j3,j3inv,raing, tem1(1,1,1),tem1(1,1,2), &
tem1(1,1,3),tem1(1,1,4))
IF ( lbcopt == 2 .AND. mgrid == 1 ) THEN
CALL acct_interrupt
(bc_acct)
CALL exbcpt
( nx,ny,nz, curtim, ptprt(1,1,1,2), &
exbcbuf(npt0exb),exbcbuf(nptdtexb) )
CALL exbcq
( nx,ny,nz, 1,curtim, qv(1,1,1,2), &
exbcbuf(nqv0exb),exbcbuf(nqvdtexb) )
CALL acct_stop_inter
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Integrate the conservation equations of momentum, heat, pressure
! and water variables forward by one timestep
!
!-----------------------------------------------------------------------
!
CALL set_acct
(tinteg_acct)
!EMK BMJ
CALL tinteg
(mptr, frstep, nx,ny,nz,exbcbufsz, &
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke,pbldpth, &
udteb,udtwb,udtnb,udtsb,vdteb,vdtwb,vdtnb,vdtsb, &
wdteb,wdtwb,wdtnb,wdtsb,pdteb,pdtwb,pdtnb,pdtsb, &
phydro,sdteb,sdtwb,sdtnb,sdtsb, &
ubar,vbar,ptbar,pbar,ptbari,pbari, &
rhostr,rhostri,qvbar,ppi,csndsq, &
x,y,z,zp,mapfct, &
j1,j2,j3,aj3x,aj3y,aj3z,j3inv, &
trigs1,trigs2,ifax1,ifax2, &
wsave1,wsave2,vwork1,vwork2,sinlat, &
ptsfc,qvsfc(1,1,0),prcrate, radfrc, &
usflx,vsflx,ptsflx,qvsflx,kmh,kmv,rprntl, &
ptcumsrc,qcumsrc,raing,rainc,w0avg,nca,kfraincv, &
cldefi,xland,bmjraincv, &
exbcbuf, bcrlx, &
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)
!EMK END
!call test_dump (pprt(1,1,1,2),"XXXAtinteg_pprt2",nx,ny,nz,0,1)
!call test_dump (pprt(1,1,1,3),"XXXAtinteg_pprt3",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tpast),"XXXAtinteg_qr1",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tpresent),"XXXAtinteg_qr2",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tfuture),"XXXAtinteg_qr3",nx,ny,nz,0,1)
CALL set_acct
(misc_acct)
IF( pdetrnd == 1 .AND. mptr == 1 ) THEN
!
!-----------------------------------------------------------------------
!
! Detrend pressure. This should be used only when unwanted trend
! develops in the pressure field. The precedure forces the
! domain averaged Exner function to zero.
!
! Pressure detrending is sometimes necessary when open lateral
! boundary condition is used. Pressure detrending is applied
! to the base grid (as opposed to nested grids) only.
!
!-----------------------------------------------------------------------
!
pisum = 0.0
DO k=2,nz-2
DO j=2,ny-2
DO i=2,nx-2
pisum = pisum + ppi(i,j,k)/(pbar(i,j,k)+pprt(i,j,k,3)) &
* pprt(i,j,k,3)
END DO
END DO
END DO
IF (mp_opt > 0) THEN
CALL mptotal
(pisum)
pisum = pisum/(nproc_x*nproc_y)
END IF
pisum = pisum/((nx-3)*(ny-3)*(nz-3))
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
pprt(i,j,k,3) = pprt(i,j,k,3) &
- pisum*(pbar(i,j,k)+pprt(i,j,k,3))/ppi(i,j,k)
END DO
END DO
END DO
!call test_dump (pprt(1,1,1,3),"XXXApdtrnmd_pprt3",nx,ny,nz,0,1)
END IF
!
!-----------------------------------------------------------------------
!
! Call the microphysics routines which adjust the thermodynamic
! and water variables.
!
! Upon exiting this subroutine, supersaturation is removed.
!
!-----------------------------------------------------------------------
!
IF( moist /= 0 ) THEN
IF( mphyopt == 1 .OR. (mphyopt == 0.AND.moist == 1) ) THEN
IF ( cnvctopt /= 1 ) THEN
!-----------------------------------------------------------------------
!
! Kessler warm rain microphysics or saturation adjustment only.
!
!-----------------------------------------------------------------------
IF(frstep == 1) THEN
dtbig1 = dtbig/2
ELSE
dtbig1 = dtbig
END IF
CALL set_acct
(warmrain_acct)
!call test_dump (qr(1,1,1,tpast),"XXXBmicroph_qr1",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tpresent),"XXXBmicroph_qr2",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tfuture),"XXXBmicroph_qr3",nx,ny,nz,0,1)
CALL microph
(nx,ny,nz,dtbig1, &
ptprt,pprt,qv,qc,qr,qi,qs,qh, &
raing,prcrate(1,1,4), &
rhostr,pbar,ptbar,ppi,j3,j3inv, &
tem1,tem2,tem3,tem4,tem5,tem6)
!call test_dump (qr(1,1,1,tpast),"XXXAmicroph_qr1",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tpresent),"XXXAmicroph_qr2",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tfuture),"XXXAmicroph_qr3",nx,ny,nz,0,1)
END IF
!
!-----------------------------------------------------------------------
!
! The microphysics may change the boundary values of both the
! potential temperature and specific humidity. For the choice of
! external boundary conditions, we must adjust them to the external
! BC.
!
!-----------------------------------------------------------------------
!
IF ( lbcopt == 2 .AND. mgrid == 1 ) THEN
CALL acct_interrupt
(bc_acct)
CALL exbcpt
(nx,ny,nz, curtim+dtbig, ptprt(1,1,1,tfuture), &
exbcbuf(npt0exb), exbcbuf(nptdtexb))
CALL exbcq
( nx,ny,nz, 1,curtim+dtbig, qv(1,1,1,tfuture), &
exbcbuf(nqv0exb),exbcbuf(nqvdtexb))
CALL exbcq
( nx,ny,nz, 2,curtim+dtbig, qc(1,1,1,tfuture), &
exbcbuf(nqc0exb),exbcbuf(nqcdtexb) )
CALL exbcq
( nx,ny,nz, 3,curtim+dtbig, qr(1,1,1,tfuture), &
exbcbuf(nqr0exb),exbcbuf(nqrdtexb) )
CALL acct_stop_inter
END IF
ELSE IF( mphyopt == 2 ) THEN ! Ice microphysics.
IF(frstep == 1) THEN
dtbig1 = dtbig/2
ELSE
dtbig1 = dtbig
END IF
!
!-----------------------------------------------------------------------
!
! Lin ice microphysics scheme with modifications by W.G. Tao.
! (Lin, Y.-L., R. D. Farley, and H. D. Orville, 1983:
! Bulk parameterization of the snow field in a cloud model.
! J. Climate Appl. Meteor., 22, 1065-1092.
! Tao, W.-K., and J. Simpson, 1993: Goddard cumulus ensemble model.
! Part I: Model description. Terres. Atmos. Ocean Sci., 4, 35-72.)
!
!-----------------------------------------------------------------------
!
CALL set_acct
(linice_acct)
!call test_dump (qr(1,1,1,tpast),"XXXBmicroph_ice_qr1",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tpresent),"XXXBmicroph_ice_qr2",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tfuture),"XXXBmicroph_ice_qr3",nx,ny,nz,0,1)
!call test_dump2(qr(1,1,1,tpast),"XXXBmicroph_ice_qr1",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qr(1,1,1,tpresent),"XXXBmicroph_ice_qr2",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qr(1,1,1,tfuture),"XXXBmicroph_ice_qr3",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
CALL microph_ice
(nx,ny,nz,dtbig1, &
ptprt,pprt,qv,qc,qr,qi,qs,qh, &
raing,prcrate(1,1,4), &
rhostr,pbar,ptbar,qvbar,ppi,j3,j3inv, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7, &
tem8,tem9,tem10,tem11,tem12,tem13,tem14,tem15)
!call test_dump (qr(1,1,1,tpast),"XXXAmicroph_ice_qr1",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tpresent),"XXXAmicroph_ice_qr2",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tfuture),"XXXAmicroph_ice_qr3",nx,ny,nz,0,1)
!call test_dump2(qr(1,1,1,tpast),"XXXAmicroph_ice_qr1",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qr(1,1,1,tpresent),"XXXAmicroph_ice_qr2",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qr(1,1,1,tfuture),"XXXAmicroph_ice_qr3",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!
!-----------------------------------------------------------------------
!
! The microphysics may change the boundary values of both the
! potential temperature and specific humidity. For the choice of
! external boundary conditions, we must adjust them to the external
! BC.
!
!-----------------------------------------------------------------------
!
IF ( lbcopt == 2 .AND. mgrid == 1 ) THEN
CALL acct_interrupt
(bc_acct)
CALL exbcpt
( nx,ny,nz, curtim+dtbig, ptprt(1,1,1,tfuture), &
exbcbuf(npt0exb),exbcbuf(nptdtexb) )
CALL exbcq
( nx,ny,nz, 1,curtim+dtbig, qv(1,1,1,tfuture), &
exbcbuf(nqv0exb),exbcbuf(nqvdtexb) )
CALL exbcq
( nx,ny,nz, 2,curtim+dtbig, qc(1,1,1,tfuture), &
exbcbuf(nqc0exb),exbcbuf(nqcdtexb) )
CALL exbcq
( nx,ny,nz, 3,curtim+dtbig, qr(1,1,1,tfuture), &
exbcbuf(nqr0exb),exbcbuf(nqrdtexb) )
CALL exbcq
( nx,ny,nz, 4,curtim+dtbig, qi(1,1,1,tfuture), &
exbcbuf(nqi0exb),exbcbuf(nqidtexb) )
CALL exbcq
( nx,ny,nz, 5,curtim+dtbig, qs(1,1,1,tfuture), &
exbcbuf(nqs0exb),exbcbuf(nqsdtexb) )
CALL exbcq
( nx,ny,nz, 6,curtim+dtbig, qh(1,1,1,tfuture), &
exbcbuf(nqh0exb),exbcbuf(nqhdtexb) )
CALL acct_stop_inter
END IF
!call test_dump (qr(1,1,1,tpast),"XXXAexbcq_qr1",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tpresent),"XXXAexbcq_qr2",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tfuture),"XXXAexbcq_qr3",nx,ny,nz,0,1)
!call test_dump2(qr(1,1,1,tpast),"XXXAexbcq_qr1",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qr(1,1,1,tpresent),"XXXAexbcq_qr2",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qr(1,1,1,tfuture),"XXXAexbcq_qr3",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
ELSE IF ( mphyopt == 3 ) THEN
IF(frstep == 1) THEN
dtbig1 = dtbig/2
ELSE
dtbig1 = dtbig
END IF
!
!-----------------------------------------------------------------------
!
! Schultz ice microphysics scheme (Schultz, P., 1995: An explicit
! cloud physics parameterization for operational numerical
! weather prediction. Mon. Wea. Rev., 123, 3331-3343).
!
!-----------------------------------------------------------------------
!
CALL set_acct
(nemice_acct)
!call test_dump (qr(1,1,1,tpast),"XXXBmicroph_nem_qr1",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tpresent),"XXXBmicroph_nem_qr2",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tfuture),"XXXBmicroph_nem_qr3",nx,ny,nz,0,1)
CALL microph_nem
(nx,ny,nz,dtbig1,ptprt,pprt,qv,qc, &
qr,qi,qs,qh,raing,prcrate(1,1,4),rhostr, &
pbar,ptbar,ppi,j3,j3inv, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7, &
tem8,tem9,tem10,tem11,tem12,tem13, &
tem14,tem15,tem16)
!call test_dump2(qr(1,1,1,tpast),"XXXAmicroph_nem_qr1",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qr(1,1,1,tpresent),"XXXAmicroph_nem_qr2",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qr(1,1,1,tfuture),"XXXAmicroph_nem_qr3",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!
!-----------------------------------------------------------------------
!
! The microphysics may change the boundary values of both the
! potential temperature and specific humidity. For the choice of
! external boundary conditions, we must adjust them to the external
! BC.
!
!-----------------------------------------------------------------------
!
IF ( lbcopt == 2 .AND. mgrid == 1 ) THEN
!call test_dump (qr(1,1,1,tpast),"XXXBmicroph_nembc_qr1",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tpresent),"XXXBmicroph_nembc_qr2",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tfuture),"XXXBmicroph_nembc_qr3",nx,ny,nz,0,1)
CALL acct_interrupt
(bc_acct)
CALL exbcpt
( nx,ny,nz, curtim+dtbig, ptprt(1,1,1,tfuture), &
exbcbuf(npt0exb),exbcbuf(nptdtexb) )
CALL exbcq
( nx,ny,nz, 1,curtim+dtbig, qv(1,1,1,tfuture), &
exbcbuf(nqv0exb),exbcbuf(nqvdtexb) )
CALL exbcq
( nx,ny,nz, 2,curtim+dtbig, qc(1,1,1,tfuture), &
exbcbuf(nqc0exb),exbcbuf(nqcdtexb) )
CALL exbcq
( nx,ny,nz, 3,curtim+dtbig, qr(1,1,1,tfuture), &
exbcbuf(nqr0exb),exbcbuf(nqrdtexb) )
CALL exbcq
( nx,ny,nz, 4,curtim+dtbig, qi(1,1,1,tfuture), &
exbcbuf(nqi0exb),exbcbuf(nqidtexb) )
CALL exbcq
( nx,ny,nz, 5,curtim+dtbig, qs(1,1,1,tfuture), &
exbcbuf(nqs0exb),exbcbuf(nqsdtexb) )
CALL exbcq
( nx,ny,nz, 6,curtim+dtbig, qh(1,1,1,tfuture), &
exbcbuf(nqh0exb),exbcbuf(nqhdtexb) )
CALL acct_stop_inter
END IF
!call test_dump (qr(1,1,1,tpast),"XXXAmicroph_nembc_qr1",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tpresent),"XXXAmicroph_nembc_qr2",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tfuture),"XXXAmicroph_nembc_qr3",nx,ny,nz,0,1)
!call test_dump2(qr(1,1,1,tpast),"XXXAmicroph_nembc_qr1",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qr(1,1,1,tpresent),"XXXAmicroph_nembc_qr2",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qr(1,1,1,tfuture),"XXXAmicroph_nembc_qr3",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
ELSE ! Invalid option
WRITE(6,'(1x,a,/1x,a,i3)') &
'Invalid option for microphysics parameterization.', &
'Job stopped here. MPHYOPT was ',mphyopt
CALL arpsstop
("arpsstop called from CORDINTG improper mphyopt",1)
END IF
DO j=1,ny-1
DO i=1,nx-1
prcrate(i,j,1)=prcrate(i,j,2)+prcrate(i,j,3)+prcrate(i,j,4)
END DO
END DO
END IF ! moist.ne.0
!
!-----------------------------------------------------------------------
!
! Apply nudging
!
!-----------------------------------------------------------------------
!
CALL set_acct
(misc_acct)
IF(nudgopt > 0 .AND. curtim < ndstop .AND. curtim >= ndstart .AND. &
MOD(nstep, nudgstp) == 0 ) THEN
WRITE(6,'(a,f10.1)') &
' Nudging forecast at ',(curtim+dtbig)
CALL nudgeall
(nx,ny,nz, nxndg,nyndg,nzndg, &
u(1,1,1,tpresent),v(1,1,1,tpresent), &
w(1,1,1,tpresent),pprt(1,1,1,tpresent),ptprt(1,1,1,tpresent), &
qv(1,1,1,tpresent),qc(1,1,1,tpresent),qr(1,1,1,tpresent), &
qi(1,1,1,tpresent),qs(1,1,1,tpresent),qh(1,1,1,tpresent), &
uincr,vincr,wincr,pincr,ptincr,qvincr, &
qcincr,qrincr,qiincr,qsincr,qhincr)
CALL nudgeall
(nx,ny,nz, nxndg,nyndg,nzndg, &
u(1,1,1,tfuture),v(1,1,1,tfuture), &
w(1,1,1,tfuture),pprt(1,1,1,tfuture),ptprt(1,1,1,tfuture), &
qv(1,1,1,tfuture),qc(1,1,1,tfuture),qr(1,1,1,tfuture), &
qi(1,1,1,tfuture),qs(1,1,1,tfuture),qh(1,1,1,tfuture), &
uincr,vincr,wincr,pincr,ptincr,qvincr, &
qcincr,qrincr,qiincr,qsincr,qhincr)
END IF
!
!-----------------------------------------------------------------------
!
! Apply the Asselin time filter to all variables
!
!-----------------------------------------------------------------------
!
IF( flteps /= 0 .AND. frstep /= 1 ) THEN
CALL tfilt
(nx,ny,nz, u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke)
!call test_dump2(qr(1,1,1,tpast),"XXXAtfilt_qr1",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qr(1,1,1,tpresent),"XXXAtfilt_qr2",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
!call test_dump2(qr(1,1,1,tfuture),"XXXAtfilt_qr3",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
END IF
!
!-----------------------------------------------------------------------
!
!
! Call the Klemp-Lilly (1978)/Durran (1983) version of the radiation
!
!
!-----------------------------------------------------------------------
!
IF(rbcopt == 2.OR.rbcopt == 3.OR.rbcopt == 4)THEN
CALL set_acct
(bc_acct)
IF(frstep == 1) THEN
dtbig1 = dtbig/2
ELSE
dtbig1 = dtbig
END IF
CALL bdtu
(nx,ny,nz,dtbig1, u,ubar,udteb,udtwb)
CALL bdtv
(nx,ny,nz,dtbig1, v,vbar,vdtnb,vdtsb)
END IF
!
!-----------------------------------------------------------------------
!
! To prepare for the next timestep integration, swap time levels
! for all time-dependent variables.
!
! The swap is as follows:
!
! Fields at time tpresent are assigned to tpast,
! Fields at time tfuture are assigned to tpresent,
! Fields at time tfuture are not changed.
!
!-----------------------------------------------------------------------
!
CALL set_acct
(misc_acct)
!call test_dump (u(1,1,1,tpast),"XXXBflip_u1",nx,ny,nz,0,1)
!call test_dump (u(1,1,1,tpresent),"XXXBflip_u2",nx,ny,nz,0,1)
!call test_dump (u(1,1,1,tfuture),"XXXBflip_u3",nx,ny,nz,0,1)
!call test_dump (v(1,1,1,tpast),"XXXBflip_v1",nx,ny,nz,0,1)
!call test_dump (v(1,1,1,tpresent),"XXXBflip_v2",nx,ny,nz,0,1)
!call test_dump (v(1,1,1,tfuture),"XXXBflip_v3",nx,ny,nz,0,1)
!call test_dump (w(1,1,1,tpast),"XXXBflip_w1",nx,ny,nz,0,1)
!call test_dump (w(1,1,1,tpresent),"XXXBflip_w2",nx,ny,nz,0,1)
!call test_dump (w(1,1,1,tfuture),"XXXBflip_w3",nx,ny,nz,0,1)
!call test_dump (ptprt(1,1,1,tpast),"XXXBflip_ptprt1",nx,ny,nz,0,1)
!call test_dump (ptprt(1,1,1,tpresent),"XXXBflip_ptprt2",nx,ny,nz,0,1)
!call test_dump (ptprt(1,1,1,tfuture),"XXXBflip_ptprt3",nx,ny,nz,0,1)
!call test_dump (pprt(1,1,1,tpast),"XXXBflip_pprt1",nx,ny,nz,0,1)
!call test_dump (pprt(1,1,1,tpresent),"XXXBflip_pprt2",nx,ny,nz,0,1)
!call test_dump (pprt(1,1,1,tfuture),"XXXBflip_pprt3",nx,ny,nz,0,1)
!call test_dump (qv(1,1,1,tpast),"XXXBflip_qv1",nx,ny,nz,0,1)
!call test_dump (qv(1,1,1,tpresent),"XXXBflip_qv2",nx,ny,nz,0,1)
!call test_dump (qv(1,1,1,tfuture),"XXXBflip_qv3",nx,ny,nz,0,1)
!call test_dump (qc(1,1,1,tpast),"XXXBflip_qc1",nx,ny,nz,0,1)
!call test_dump (qc(1,1,1,tpresent),"XXXBflip_qc2",nx,ny,nz,0,1)
!call test_dump (qc(1,1,1,tfuture),"XXXBflip_qc3",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tpast),"XXXBflip_qr1",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tpresent),"XXXBflip_qr2",nx,ny,nz,0,1)
!call test_dump (qr(1,1,1,tfuture),"XXXBflip_qr3",nx,ny,nz,0,1)
!call test_dump (qi(1,1,1,tpast),"XXXBflip_qi1",nx,ny,nz,0,1)
!call test_dump (qi(1,1,1,tpresent),"XXXBflip_qi2",nx,ny,nz,0,1)
!call test_dump (qi(1,1,1,tfuture),"XXXBflip_qi3",nx,ny,nz,0,1)
!call test_dump (qs(1,1,1,tpast),"XXXBflip_qs1",nx,ny,nz,0,1)
!call test_dump (qs(1,1,1,tpresent),"XXXBflip_qs2",nx,ny,nz,0,1)
!call test_dump (qs(1,1,1,tfuture),"XXXBflip_qs3",nx,ny,nz,0,1)
!call test_dump (qh(1,1,1,tpast),"XXXBflip_qh1",nx,ny,nz,0,1)
!call test_dump (qh(1,1,1,tpresent),"XXXBflip_qh2",nx,ny,nz,0,1)
!call test_dump (qh(1,1,1,tfuture),"XXXBflip_qh3",nx,ny,nz,0,1)
!call test_dump (tke(1,1,1,tpast),"XXXBflip_tke1",nx,ny,nz,0,0)
!call test_dump (tke(1,1,1,tpresent),"XXXBflip_tke2",nx,ny,nz,0,0)
!call test_dump (tke(1,1,1,tfuture),"XXXBflip_tke3",nx,ny,nz,0,0)
CALL tflip
(nx,ny,nz, u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke)
!
!-----------------------------------------------------------------------
!
! Print max./min. for the nested grid case.
!
!-----------------------------------------------------------------------
! IF( mgrid.eq.1 .and. nestgrd.eq.1 ) THEN
curtim = curtim + dtbig
! CALL maxmin(mptr,nx,ny,nz,tlevel,rhobar,
! : u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke,kmh,kmv,
! : x,y,z,zp,mapfct,
! : tsfc,tsoil,wetsfc,wetdp,wetcanp,
! : tem1,tem2,tem3)
!
!-----------------------------------------------------------------------
!
! Check the stability of the integration. If the model solution
! appears to be exceeding the linear stability condition, then
! perform a data dump for post-mortem.
!
!-----------------------------------------------------------------------
!
CALL chkstab
(mgrid,nx,ny,nz,nstyps, &
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke, &
ubar,vbar,ptbar,pbar,rhostr,qvbar,kmh,kmv, &
x,y,z,zp,zp(1,1,2),mapfct,j1,j2,j3, &
soiltyp,stypfrct,vegtyp,lai,roufns,veg, &
tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, &
raing,rainc,prcrate, &
radfrc,radsw,rnflx, &
usflx,vsflx,ptsflx,qvsflx, &
tem1,tem2,tem3, tem4)
curtim = curtim - dtbig
! ENDIF
RETURN
END SUBROUTINE cordintg
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE TINTEG ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
!EMK BMJ
SUBROUTINE tinteg(mptr, frstep, nx,ny,nz,exbcbufsz, & 1,66
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke,pbldpth, &
udteb,udtwb,udtnb,udtsb,vdteb,vdtwb,vdtnb,vdtsb, &
wdteb,wdtwb,wdtnb,wdtsb,pdteb,pdtwb,pdtnb,pdtsb, &
phydro,sdteb,sdtwb,sdtnb,sdtsb, &
ubar,vbar,ptbar,pbar,ptbari,pbari, &
rhostr,rhostri,qvbar,ppi,csndsq, &
x,y,z,zp, mapfct, &
j1,j2,j3,aj3x,aj3y,aj3z,j3inv, &
trigs1,trigs2,ifax1,ifax2, &
wsave1,wsave2,vwork1,vwork2,sinlat, &
ptsfc,qvsfc,prcrate, radfrc, &
usflx,vsflx,ptsflx,qvsflx,kmh,kmv,rprntl, &
ptcumsrc,qcumsrc,raing,rainc,w0avg,nca,kfraincv, &
cldefi,xland,bmjraincv, &
exbcbuf,bcrlx, &
rhofct,defsq,lenscl, &
uforce,vforce,wforce,pforce,ptforce, &
tem1,tem2,tem3,tem4,tem5,tem6, &
tem7,tem8,tem9,tem10,tem11,tem12,tem13,tem14,tem15, &
tem16,tem17,tem18, &
tem1_0,tem2_0,tem3_0)
!EMK END
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Orchestrate the time integration of the dynamics of the basic governing
! equations for a single time step. Note that the time tendencies of the
! non-conservative processes (e.g., microphysics, radiation, etc.)
! are not included in this routine but are applied in their
! corresponding routines.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 3/21/92.
!
! MODIFICATION HISTORY:
!
! 5/03/92 (K. Droegemeier)
! Added full documentation.
!
! 5/20/92 (M. Xue)
! Reformatted certain documentations.
!
! 4/10/93 (M. Xue & Hao Jin)
! Add the terrain.
!
! 5/26/93 (M. Xue)
! Added w into the solvpt argument list.
!
! 9/7/94 (M.Xue)
! Call to ADVP modified.
!
! 9/10/94 (D. Weber & Y. Lu)
! Cleaned up documentation.
!
! 8/20/95 (M. Xue)
! Bug fix with the use of ptcumsrc.
!
! 10/31/95 (D. Weber)
! Added trigs1,trigs2,ifax1,ifax2 for use in the upper w-p
! radiation condition.
!
! 01/23/1996 (Donghai Wang, Ming Xue and Yuhe Liu)
! Added the map projection factor to ARPS governing equations.
!
! 03/11/96 (M. Xue)
! Modified the call to SOLVTKE, so that all three time levels of
! ptprt, pprt etc are passed into the routine.
!
! 03/19/96 (Yuhe Liu)
! Added radiation forcing
!
! 07/10/1997 (Fanyou Kong - CMRP)
! Fixed a bug in 'solvtke' with corrected temporary arga
!
! 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.
!
! 10/21/97 (Donghai Wang)
! Using total density (rho) in the calculation of the pressure
! gradient force terms, and added the second order terms
! in the linerized buoyancy terms.
!
! 11/05/97 (D. Weber)
! Added phydro array for use in the bottom boundary condition for
! perturbation 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/18/98 (D. Weber)
! Added precomputed averages of j3 in the x, y, and z directions
! to improve the code efficiency.
!
! 07/23/2001 (K. Brewster)
! Added mptr to argument list, needed for printing of diagnostic
! noise parameter. Also added mptr to calls to smlstep, solvuw,
! solvwpex, and solvwpim.
!
! 13 March 2002 (Eric Kemp)
! Added arrays for WRF BMJ cumulus scheme.
!
! April 2002 (Fanyou Kong)
! Added cnvctopt=5 option for the new WRF K-F (KF_ETA) scheme
!
!-----------------------------------------------------------------------
!
! INPUT :
!
! frstep Initial time step flag.
! 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
!
! 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)
! wcont Contravariant vertical velocity (m/s)
! computational coordinates (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)
!
! 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)
!
! phydro Big time step forcing term for use in computing the
! hydrostatic pressure at k=1.
!
! 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)
! cnsd Sound wave speed.
!
! 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)
! 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
! 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
! 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.
! vwork2 2-D work array for fftopt=2.
! wsave1 Work array for fftopt=2.
! wsave2 Work array for fftopt=2.
!
! sinlat Sin of latitude at each grid point
!
! 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 (kg/(m**2 * s))
!
! 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)
!
! 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
!
! radfrc Radiation forcing (K/s)
!
! OUTPUT:
!
! u x component of velocity at time tfuture (m/s)
! v y component of velocity at time tfuture (m/s)
! w Vertical component of Cartesian velocity at tfuture (m/s)
! ptprt Perturbation potential temperature at time tfuture (K)
! pprt Perturbation pressure at time tfuture (Pascal)
! qv Water vapor specific humidity at time tfuture (kg/kg)
! qc Cloud water mixing ratio at time tfuture (kg/kg)
! qr Rainwater mixing ratio at time tfuture (kg/kg)
! qi Cloud ice mixing ratio at time tfuture (kg/kg)
! qs Snow mixing ratio at time tfuture (kg/kg)
! qh Hail mixing ratio at time tfuture (kg/kg)
!
! 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)
!
! phydro Big time step forcing term for use in computing the
! hydrostatic pressure at k=1.
!
! tke Turbulent Kinetic Energy ((m/s)**2)
! pbldpth Planetary boundary layer depth (m)
!
! 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
!
! WORK ARRAYS:
!
! defsq Deformation squared (1/s**2)
! lenscl Turbulent mixing length scale (m)
! uforce Acoustically inactive forcing terms in u-Eq. ((kg/(m*s)**2)
! vforce Acoustically inactive forcing terms in v-Eq. ((kg/(m*s)**2)
! wforce Acoustically inactive forcing terms in w-Eq. ((kg/(m*s)**2)
! pforce Acoustically inactive forcing terms in p-eq. (Pascal/s)
! ptforce Gravity wave inactive forcing terms in pt-eq. (K*kg/(m**3*s))
!
! rhofct rho-factor: rhobar/rho
!
! 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)
!
! 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)
!
! ptdteb Time tendency of ptprt field at east boundary (K/s)
! ptdtwb Time tendency of ptprt field at west boundary (K/s)
! ptdtnb Time tendency of ptprt field at north boundary(K/s)
! ptdtsb Time tendency of ptprt field at south boundary(K/s)
!
! sdteb Time tendency of a scalar at e-boundary
! sdtwb Time tendency of a scalar at w-boundary
! sdtnb Time tendency of a scalar at n-boundary
! sdtsb Time tendency of a scalar at s-boundary
!
! 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
!
! tem1_0 Temporary work array.
! tem2_0 Temporary work array.
! tem3_0 Temporary work array.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE ! Force explicit declarations
INCLUDE 'timelvls.inc'
INTEGER :: mptr
INTEGER :: nx, ny, nz ! 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 (K)
REAL :: pprt (nx,ny,nz,nt) ! Perturbation pressure (Pascal)
REAL :: tke (nx,ny,nz,nt) ! Turbulent Kinetic Energy ((m/s)**2)
REAL :: pbldpth(nx,ny,nt) ! Planetary boundary layer depth (m)
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 :: udteb (ny,nz) ! Time tendency of u at e-boundary (m/s**2)
REAL :: udtwb (ny,nz) ! Time tendency of u at w-boundary (m/s**2)
REAL :: udtnb (nx,nz) ! Time tendency of u at n-boundary (m/s**2)
REAL :: udtsb (nx,nz) ! Time tendency of u at s-boundary (m/s**2)
REAL :: vdteb (ny,nz) ! Time tendency of v at e-boundary (m/s**2)
REAL :: vdtwb (ny,nz) ! Time tendency of v at w-boundary (m/s**2)
REAL :: vdtnb (nx,nz) ! Time tendency of v at n-boundary (m/s**2)
REAL :: vdtsb (nx,nz) ! Time tendency of v at s-boundary (m/s**2)
REAL :: wdteb (ny,nz) ! Time tendency of w at e-boundary (m/s**2)
REAL :: wdtwb (ny,nz) ! Time tendency of w at w-boundary (m/s**2)
REAL :: wdtnb (nx,nz) ! Time tendency of w at n-boundary (m/s**2)
REAL :: wdtsb (nx,nz) ! Time tendency of w at s-boundary (m/s**2)
REAL :: pdteb (ny,nz) ! Time tendency of pprt at e-boundary (Pascal/s)
REAL :: pdtwb (ny,nz) ! Time tendency of pprt at w-boundary (Pascal/s)
REAL :: pdtnb (nx,nz) ! Time tendency of pprt at n-boundary (Pascal/s)
REAL :: pdtsb (nx,nz) ! Time tendency of pprt at s-boundary (Pascal/s)
REAL :: phydro(nx,ny) ! Pressure at k=1 computed using pert.
! hydrostatic relation.
REAL :: sdteb (ny,nz) ! Time tendency of a variable at e-boundary
REAL :: sdtwb (ny,nz) ! Time tendency of a variable at w-boundary
REAL :: sdtnb (nx,nz) ! Time tendency of a variable at n-boundary
REAL :: sdtsb (nx,nz) ! Time tendency of a variable at s-boundary
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 of the staggered grid.
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 :: 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) ! Coordinate transformation Jacobian defined as
! d( zp )/d( z ).
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 :: ptsfc (nx,ny) ! Potential temperature at the ground level (K)
REAL :: qvsfc (nx,ny) ! Effective qv at the surface (kg/kg)
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
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 :: 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
REAL :: defsq (nx,ny,nz) ! Deformation squared (1/s**2)
REAL :: lenscl(nx,ny,nz) ! Turbulent mixing length scale (m)
REAL :: uforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in u-momentum equation (kg/(m*s)**2)
REAL :: vforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in v-momentum equation (kg/(m*s)**2)
REAL :: wforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in w-momentum equation (kg/(m*s)**2)
REAL :: pforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in pressure equation (Pascal/s)
REAL :: ptforce(nx,ny,nz) ! Gravity wave inactive forcing terms
! in pressure equation (Pascal/s)
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(IN) :: 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 :: raing(nx,ny) ! Grid supersaturation rain
REAL :: rainc(nx,ny) ! Cumulus convective rain
REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s)
INTEGER :: exbcbufsz ! EXBC buffer size
REAL :: exbcbuf( exbcbufsz ) ! EXBC buffer array
REAL :: bcrlx (nx,ny) ! EXBC relaxation coefficients
REAL :: rhofct(nx,ny,nz) ! rho-factor: rhobar/rho
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 :: 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.
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
REAL :: dtbig1 ! Local value of big time step size
REAL :: dtsml1 ! Local value of small time step size
INTEGER :: frstep ! Flag for the initial time step
INTEGER :: i,j,k
INTEGER :: qflag ! Indicator for the water/ice type
! when calling SOLVQ.
INTEGER :: ntst
REAL :: tst
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'phycst.inc'
INCLUDE 'globcst.inc'
INCLUDE 'bndry.inc'
INCLUDE 'exbc.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! To initialize the three-time level scheme, we assume for
! the first step that the values of all variables at time
! past equal the values at time present. We then perform a
! forward-in-time integration for the first step only and
! then, using the same algorithm, we perform a centered-in-time
! integration for all subsequent steps. The size of the
! timestep is adjusted accordingly, such that the leapfrog step
! size is twice that of the first forward-in-time step.
!
!-----------------------------------------------------------------------
!
IF(frstep == 1) THEN ! frstep=1 on the first time step
! only - indicating a forward-in-
! time integration.
dtbig1 = dtbig/2
dtsml1 = dtsml/2
ELSE
dtbig1 = dtbig
dtsml1 = dtsml
END IF
!
!-----------------------------------------------------------------------
!
! Calculate wcont at time tpresent. wcont will be used in FRCUVW
! and FRCP. rhostr averaged to u, v, w points. They are stored
! in tem1, tem2 and tem3.
!
!-----------------------------------------------------------------------
!
CALL rhouvw
(nx,ny,nz,rhostr,tem1,tem2,tem3)
!call test_dump (w(1,1,1,tpresent),"XXX1Bwc_w1",nx,ny,nz,1,0)
CALL wcontra
(nx,ny,nz, &
u(1,1,1,tpresent),v(1,1,1,tpresent), &
w(1,1,1,tpresent),mapfct,j1,j2,j3,aj3z, &
rhostr,tem1,tem2,tem3,wcont,tem4,tem5)
!
!-----------------------------------------------------------------------
!
! Compute the acoustically inactive terms in the momentum and
! pressure equations that are held fixed during the small time
! step computations. This includes advection, buoyancy, mixing
! (both physical and computational), and the Coriolis terms.
! These forcing terms are accumulated into arrays for each
! of the momentum equations, e.g., uforce for the u-equation,
! vforce for the v-equation, wforce for the w-equation and
! pforce for the p-equation.
!
! Note: Arrays, pforce and ptforce, are used as work arrays in
! subroutine frcuvw.
!
!-----------------------------------------------------------------------
!
!call test_dump2(rhofct,"XXXBfrcuvw_rhofct",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
CALL frcuvw
(nx,ny,nz,exbcbufsz,dtbig1, &
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke,pbldpth, &
ubar,vbar,ptbar,pbar,ptbari,pbari,rhostr,qvbar, &
usflx,vsflx, x,y,z,zp, mapfct, &
j1,j2,j3,aj3x,aj3y,aj3z,j3inv, sinlat, ptsfc, &
uforce,vforce,wforce,kmh,kmv,rprntl,lenscl,defsq, &
exbcbuf, bcrlx,rhofct,phydro, &
pforce,ptforce, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7, &
tem8,tem9,tem10,tem11,tem12,tem13,tem14)
!call test_dump (uforce,"XXX2uforce",nx,ny,nz,1,0)
!call test_dump2(rhofct,"XXXAfrcuvw_rhofct",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
IF (tmixopt == 4) THEN
!
!-----------------------------------------------------------------------
!
! Integrate the TKE equation.
! NOTE: Arrays lenscl and defsq should NOT be changed between
! calls to frcuvw and solvtke.
! Note: ptforce is used as a work array in the following call.
!
!-----------------------------------------------------------------------
!
CALL solvtke
(nx,ny,nz,dtbig1,u,v,wcont,ptprt,pprt, &
qv,qc,qr,qi,qs,qh,tke, &
ubar,vbar,ptbar,pbar,ptbari,rhostr,rhostri,qvbar, &
x,y,z,zp, mapfct, j1,j2,j3,aj3x,aj3y,j3inv, &
kmh,kmv,rprntl,lenscl,defsq, &
ptsflx,qvsflx, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8, &
tem9,tem10,tem11,ptforce, & ! ptforce used as a tem array
tem1_0,tem2_0,tem3_0)
END IF
CALL frcp
(nx,ny,nz,exbcbufsz, dtbig1, &
u,v,w,wcont,ptprt,pprt,qv,qc,qr,qi,qs,qh, &
ptbar,pbar,rhostr,qvbar,mapfct,j1,j2,j3,aj3x,aj3y,aj3z, &
pforce, &
exbcbuf, bcrlx, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8,tem9)
!call test_dump (pprt(1,1,1,2),"XXXAfrcp_pprt2",nx,ny,nz,0,0)
!call test_dump (pprt(1,1,1,3),"XXXAfrcp_pprt3",nx,ny,nz,0,0)
!call test_dump (pforce,"XXXAfrcp_pforce",nx,ny,nz,0,0)
!
!-----------------------------------------------------------------------
!
! Calculate gravity wave or acoustic wave inactive terms in the
! potential temperature equation.
!
! The force terms are stored in ptforce.
!
!-----------------------------------------------------------------------
!
CALL frcpt
(nx,ny,nz, exbcbufsz, dtbig1,ptprt,u,v,w,wcont, &
ptbar,rhostr,rhostri,kmh,kmv,rprntl, &
usflx,vsflx,ptsflx,pbldpth, &
x,y,z,zp,mapfct, j1,j2,j3,aj3x,aj3y,j3inv,ptsfc, &
ptforce, &
exbcbuf, bcrlx, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7, &
tem8,tem9,tem10,tem11, &
tem1_0,tem2_0,tem3_0,tem12)
CALL set_acct
(tinteg_acct)
IF ( radopt == 2 ) THEN
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
ptforce(i,j,k) = ptforce(i,j,k) &
+ rhostr(i,j,k)*radfrc(i,j,k)
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Calculate source and sink terms in temperature (ptprt) and
! moisture (qv) equations that are due to subgrid scale cumulus
! convection.
!
!-----------------------------------------------------------------------
!
!EMK BMJ
! IF (cnvctopt == 1 .OR. cnvctopt == 2 .OR. cnvctopt == 3) THEN
IF (cnvctopt == 1 .OR. cnvctopt == 2 .OR. cnvctopt == 3 .OR. &
cnvctopt == 4 .OR. cnvctopt == 5) THEN
!END EMK
IF (cnvctopt == 3 .OR. cnvctopt == 5) THEN
CALL set_acct
(kfcum_acct)
!EMK BMJ
ELSE IF (cnvctopt == 4 ) THEN
CALL set_acct
(bmjcum_acct)
!EMK END
ELSE
CALL set_acct
(kuocum_acct)
ENDIF
!-----------------------------------------------------------------------
!
! Calculate w0avg, is close to a running mean vertical velocity,
! tst is the number of time steps in 10min for K-F scheme
!
!-----------------------------------------------------------------------
!
IF (cnvctopt == 3 .OR. cnvctopt == 5) THEN
ntst=nint( 600.0/dtbig )
tst=FLOAT(ntst)
IF( (curtim-tstart) <= 300.0 .AND. initopt /= 2 ) THEN
DO k=1,nz
DO j=1,ny-1
DO i=1,nx-1
w0avg(i,j,k)= (w(i,j,k,1)+w(i,j,k,2))*0.5
END DO
END DO
END DO
ELSE IF ( (curtim-tstart) > 300.0 .OR. initopt == 2) THEN
DO k=1,nz
DO j=1,ny-1
DO i=1,nx-1
w0avg(i,j,k)=(w0avg(i,j,k)*(tst-1.)+w(i,j,k,2))/tst
END DO
END DO
END DO
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Calculate vertical velocity for KUO scheme, or running-average
! vertical velocity (m/s) for Kain Fritsch scheme
!
!-----------------------------------------------------------------------
!
! IF( cnvctopt == 3 .AND. MOD(curtim+0.001,confrq) <= (0.5*dtbig) &
! .AND. ((curtim-tstart) > 300.0 &
IF( (cnvctopt == 3 .OR. cnvctopt == 5) .AND. MOD(curtim+0.001,confrq) &
<= (0.5*dtbig) .AND. ((curtim-tstart) > 300.0 &
.OR. initopt == 2)) THEN
DO k=1,nz
DO j=1,ny-1
DO i=1,nx-1
! tem1(i,j,k) = (w(i,j,k,1)+w(i,j,k,2))*0.5
tem1(i,j,k) = w0avg(i,j,k)
END DO
END DO
END DO
ELSE IF( MOD(curtim+0.001,confrq) <= (0.5*dtbig).OR. &
nstep == 1 ) THEN
DO k=1,nz
DO j=1,ny-1
DO i=1,nx-1
tem1(i,j,k) = wcont(i,j,k)*j3(i,j,k)
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Call cumulus parameterization schemes
! Make sure to reset kfraincv, ptcumsrc and qcumsrc to 0 once nca<=0
!
!-----------------------------------------------------------------------
!
IF( (moist /= 0) .AND. ((curtim-tstart) > 300.0 .OR. initopt == 2) .AND. &
(MOD(curtim+0.001,confrq) <= (0.5*dtbig))) THEN
DO j=1,ny-1
DO i=1,nx-1
IF (nca(i,j) <= 0) THEN
kfraincv(i,j) = 0.0
prcrate(i,j,3) = 0.0
END IF
END DO
END DO
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
IF (nca(i,j) <= 0) THEN
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 IF
END DO
END DO
END DO
!EMK BMJ
CALL qpfcums
(nx,ny,nz,prcrate(1,1,3),qvsflx, &
u(1,1,1,2),v(1,1,1,2),tem1, &
pprt(1,1,1,2),ptprt(1,1,1,2),qv(1,1,1,2), &
pbar,ptbar,qvbar,rhostr,zp,j3, &
ptcumsrc,qcumsrc,rainc,nca,kfraincv, &
cldefi,xland,bmjraincv, &
tem2,tem3,tem4,tem5,tem6, &
tem7,tem8,tem9,tem10,tem11)
!EMK END
END IF
!
! Accumulate rainc and update nca. Note: raincv is in cm.
!
DO j=1,ny-1
DO i=1,nx-1
rainc(i,j) = rainc(i,j) + 10.0*kfraincv(i,j) + 10.0*bmjraincv(i,j)
IF ( nca(i,j) >= 1 ) nca(i,j) = nca(i,j) - 1
END DO
END DO
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
ptforce(i,j,k) = ptforce(i,j,k) &
+ rhostr(i,j,k)*ptcumsrc(i,j,k)
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! End of cumulus parameterization
!
!-----------------------------------------------------------------------
!
CALL set_acct
(misc_acct)
IF( lvldbg >= 2 ) THEN
CALL checkuhx
(uforce, nx,ny,nz,2,nx-1,1,ny-1,2,nz-2, &
'ufrcx', tem1)
CALL checkuhy
(uforce, nx,ny,nz,2,nx-1,1,ny-1,2,nz-2, &
'ufrcy', tem1)
CALL checkvhx
(vforce, nx,ny,nz,1,nx-1,2,ny-1,2,nz-2, &
'vfrcx', tem1)
CALL checkvhy
(vforce, nx,ny,nz,1,nx-1,2,ny-1,2,nz-2, &
'vfrcy', tem1)
CALL checkwhx
(wforce, nx,ny,nz,1,nx-1,1,ny-1,2,nz-1, &
'wfrcx', tem1)
CALL checkwhy
(wforce, nx,ny,nz,1,nx-1,1,ny-1,2,nz-1, &
'wfrcy', tem1)
CALL checkshx
(pforce, nx,ny,nz,1,nx-1,1,ny-1,2,nz-2, &
'pfrcx', tem1)
CALL checkshy
(pforce, nx,ny,nz,1,nx-1,1,ny-1,2,nz-2, &
'pfrcy', tem1)
CALL checkshx
(ptforce, nx,ny,nz,1,nx-1,1,ny-1,2,nz-2, &
'ptfrcx', tem1)
CALL checkshy
(ptforce, nx,ny,nz,1,nx-1,1,ny-1,2,nz-2, &
'ptfrcy', tem1)
END IF
!
!-----------------------------------------------------------------------
!
! Integrate the momentum and pressure equations (i.e., the
! acoustically-active equations) in time using a mode-splitting
! approach. The momentum components are advanced in time using
! a forward scheme (relative to the pressure gradient force terms)
! and the pressure is advanced using a backward scheme (relative to
! the divergence term, which is evaluated using the newly updated
! velocities hence the backward scheme). These small time steps
! bring the momentum and pressure from time tpast to tfuture.
! During these steps, the acoustically-inactive forcing terms (e.g.,
! uforce, pforce, etc.) are held fixed at time tpresent (i.e. they
! are evaluated only once, at time tpresent, for each large time
! step integration), hence the time integration is leapfrog-
! in-time relative to these forcing terms.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! When this solver is called for a nested grid (not the base grid),
! the information stored in u, v, w and pprt is used to set the
! time tendency of these variables at the lateral boundaries.
!
!-----------------------------------------------------------------------
!
IF( mgrid /= 1 .AND. nestgrd == 1 ) THEN
CALL nestbdt
(nx,ny,nz,u, 1,nx,1,ny-1,1,nz-1,dtbig, &
udteb,udtwb,udtnb,udtsb)
CALL nestbdt
(nx,ny,nz,v, 1,nx-1,1,ny,1,nz-1,dtbig, &
vdteb,vdtwb,vdtnb,vdtsb)
CALL nestbdt
(nx,ny,nz,w, 1,nx-1,1,ny-1,1,nz,dtbig, &
wdteb,wdtwb,wdtnb,wdtsb)
CALL nestbdt
(nx,ny,nz,pprt, 1,nx-1,1,ny-1,1,nz-1,dtbig, &
pdteb,pdtwb,pdtnb,pdtsb)
CALL nestbdt
(nx,ny,nz,ptprt,1,nx-1,1,ny-1,1,nz-1,dtbig, &
sdteb,sdtwb,sdtnb,sdtsb)
!
!-----------------------------------------------------------------------
!
! For the first forward time step, make sure that the fields at
! tpast equal those at tpresent. This can only be done after
! the time tendencies on the boundaries are calculated and stored
! in the time tendency arrays.
!
!-----------------------------------------------------------------------
!
IF( frstep == 1 ) THEN
DO k=1,nz
DO j=1,ny
DO i=1,nx
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)
pprt (i,j,k,tpast)=pprt (i,j,k,tpresent)
ptprt(i,j,k,tpast)=ptprt(i,j,k,tpresent)
END DO
END DO
END DO
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Note here defsq is used as a work array by ACOUST.
!
!-----------------------------------------------------------------------
!
CALL set_acct
(smlstp_acct)
CALL smlstep
(mptr, nx,ny,nz, exbcbufsz, dtbig1,dtsml1, &
u,v,w,wcont,pprt,ptprt, &
udteb,udtwb,udtnb,udtsb,vdteb,vdtwb,vdtnb,vdtsb, &
wdteb,wdtwb,wdtnb,wdtsb,pdteb,pdtwb,pdtnb,pdtsb, &
phydro,sdteb,sdtwb,sdtnb,sdtsb, &
ubar,vbar,ptbar,pbar,ptbari,pbari,rhostr,rhostri, &
csndsq, &
uforce,vforce,wforce,pforce,ptforce, &
x,y,z,zp,mapfct, j1,j2,j3,aj3x,aj3y,aj3z,j3inv, &
trigs1,trigs2,ifax1,ifax2, &
wsave1,wsave2,vwork1,vwork2, &
exbcbuf,rhofct, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8,tem9,defsq, &
tem10,tem11,tem12,tem13,tem14,tem15,tem16,tem17, &
tem18,tem1_0,tem2_0,tem3_0)
!call test_dump (pprt(1,1,1,2),"XXXAsmlstep_pprt2",nx,ny,nz,0,1)
!call test_dump (pprt(1,1,1,3),"XXXAsmlstep_pprt3",nx,ny,nz,0,1)
CALL set_acct
(misc_acct)
IF( lvldbg >= 1 ) THEN
CALL checkuhx
( nx,ny,nz,1,nx,1,ny-1,1,nz-1, 'uxbig', tem1)
CALL checkuhy
( nx,ny,nz,1,nx,1,ny-1,1,nz-1, 'uybig', tem1)
CALL checkvhx
( nx,ny,nz,1,nx-1,1,ny,1,nz-1, 'vxbig', tem1)
CALL checkvhy
( nx,ny,nz,1,nx-1,1,ny,1,nz-1, 'vybig', tem1)
CALL checkwhx
( nx,ny,nz,1,nx-1,1,ny-1,1,nz, 'wxbig', tem1)
CALL checkwhy
( nx,ny,nz,1,nx-1,1,ny-1,1,nz, 'wybig', tem1)
CALL checkshx
(pprt(1,1,1,tfuture), &
nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, 'pxbig', tem1)
CALL checkshy
(pprt(1,1,1,tfuture), &
nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, 'pybig', tem1)
CALL checkshx
(ptprt(1,1,1,tfuture), &
nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, 'ptxbig', tem1)
CALL checkshy
(ptprt(1,1,1,tfuture), &
nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, 'ptybig', tem1)
END IF
!
!-----------------------------------------------------------------------
!
! Since wcont was reset in SMLSTP. Now need to re-calculate its
! value at tpresent. Which will be used in SOLVQV and SOLVQ.
!
!-----------------------------------------------------------------------
!
CALL set_acct
(tinteg_acct)
CALL rhouvw
(nx,ny,nz,rhostr,tem1,tem2,tem3)
!call test_dump (w(1,1,1,tpresent),"XXX2Bwc_w1",nx,ny,nz,1,0)
CALL wcontra
(nx,ny,nz, &
u(1,1,1,tpresent),v(1,1,1,tpresent), &
w(1,1,1,tpresent),mapfct,j1,j2,j3,aj3z, &
rhostr,tem1,tem2,tem3,wcont,tem4,tem5)
!
!-----------------------------------------------------------------------
!
! Since pressure was reset in SMLSTP. Now need to re-calculate its
! value at tfuture which will be used in microphysics.
!
!-----------------------------------------------------------------------
!
CALL setppi
(nx,ny,nz,nt,tfuture,pprt,pbar,ppi)
!call test_dump (pprt(1,1,1,2),"XXXAsetppi_pprt2",nx,ny,nz,0,1)
!call test_dump (pprt(1,1,1,3),"XXXAsetppi_pprt3",nx,ny,nz,0,1)
IF( lvldbg >= 1 ) THEN
CALL acct_interrupt
(misc_acct)
CALL checkwhx
(wcont, nx,ny,nz,1,nx-1,1,ny-1,2,nz-1, &
'wcxbig', tem1)
CALL checkwhy
(wcont, nx,ny,nz,1,nx-1,1,ny-1,2,nz-1, &
'wcybig', tem1)
CALL acct_stop_inter
END IF
!
!-----------------------------------------------------------------------
!
! Integrate the liquid water substance continuity equations
! forward one timestep.
!
! Sources and sinks due to phase changes and radiative processes
! are handled separately.
!
! If the simulation is for dry dynamics, then we skip over
! the moisture computations to save computer resources.
! The flag for this choice is "moist", i.e.,
!
! Moist = 0 for dry run
! Moist = 1 for moist run
!
!-----------------------------------------------------------------------
!
IF( moist == 1) THEN ! Determine if this run is dry or moist.
!
!-----------------------------------------------------------------------
!
! Water vapor equation. Array uforce and vforce are used as work
! arrays.
! Before we call the solve routine for the water varaibles, we
! need to compute ustr,vstr,wstr and store them into tem9,10,and 11
! These arrays cannot be altered and will be used in the
! following six moisture solve calls.
!
!
!-----------------------------------------------------------------------
!
IF (sadvopt == 1 .OR. sadvopt == 2 .OR. sadvopt == 3 ) THEN
! 2nd or 4th order advection
CALL rhouvw
(nx,ny,nz,rhostr,tem1,tem2,tem3)
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
tem9(i,j,k)=u(i,j,k,2)*tem1(i,j,k)
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
tem10(i,j,k)=v(i,j,k,2)*tem2(i,j,k)
END DO
END DO
END DO
DO k=1,nz
DO j=1,ny-1
DO i=1,nx-1
tem11(i,j,k)=wcont(i,j,k)*tem3(i,j,k)
END DO
END DO
END DO
ELSE IF( sadvopt == 4.OR.sadvopt == 5) THEN ! FCT advection
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem3_0(i,j,k)=rhostr(i,j,k)
END DO
END DO
END DO
CALL acct_interrupt
(bc_acct)
CALL extndsbc
(tem3_0,nx,ny,nz,0,ebc,wbc,nbc,sbc,tbc,bbc)
CALL acct_stop_inter
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx
tem9(i,j,k)=u(i,j,k,2)*(tem3_0(i-1,j,k)+tem3_0(i,j,k)) &
*mapfct(i,j,5)*0.5
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny
DO i=1,nx-1
tem10(i,j,k)=v(i,j,k,2)*(tem3_0(i,j-1,k)+tem3_0(i,j,k)) &
*mapfct(i,j,6)*0.5
END DO
END DO
END DO
DO k=1,nz
DO j=1,ny-1
DO i=1,nx-1
tem11(i,j,k)=wcont(i,j,k) &
*(tem3_0(i,j,k-1)+tem3_0(i,j,k))*0.5
END DO
END DO
END DO
END IF
!-----------------------------------------------------------------------
!
! Water vapor equation. Array uforce and vforce are used as work
! arrays. Tem9,10,11 cannot be altered until after the last
! call to a solvq routine. They contain the appropriate
! ustr,vstr, and wstr.
! Water vapor equation. Array uforce and vforce are used as work
! arrays.
!
!-----------------------------------------------------------------------
CALL solvqv
(nx,ny,nz, exbcbufsz, dtbig1, &
qv,u,v,wcont, tem9,tem10,tem11, &
sdteb,sdtwb,sdtnb,sdtsb, &
rhostr,rhostri,qvbar,kmh,kmv,rprntl,qvsflx,pbldpth, &
x,y,z,zp,mapfct, j1,j2,j3,aj3x,aj3y,j3inv, &
qcumsrc(1,1,1,1), &
usflx,vsflx,ptsflx,ptsfc,qvsfc,ptbar,ptprt, &
exbcbuf, bcrlx, &
uforce,vforce, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8, &
tem1_0,tem2_0,tem3_0)
!-----------------------------------------------------------------------
!
! Cloud water equation. Array uforce and vforce are used as work
! arrays. Tem9,10,11 cannot be altered until after the last
! call to a solvq routine. They contain the appropriate
! ustr,vstr, and wstr.
!
!-----------------------------------------------------------------------
qflag = 2
CALL solvq
(nx,ny,nz, exbcbufsz, dtbig1, qflag, &
qc,u,v,wcont, tem9,tem10,tem11, &
sdteb,sdtwb,sdtnb,sdtsb, rhostr,rhostri, &
kmh,kmv,rprntl,x,y,z,zp,mapfct, &
j1,j2,j3,aj3x,aj3y,j3inv, &
qcumsrc(1,1,1,2),qcumsrc(1,1,1,3), &
qcumsrc(1,1,1,4),qcumsrc(1,1,1,5), &
exbcbuf, bcrlx, &
uforce,vforce, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8, &
tem1_0,tem2_0,tem3_0)
IF( mphyopt /= 0) THEN
!
!-----------------------------------------------------------------------
!
! Rain water equation. Array uforce and vforce are used as work
! arrays. Tem9,10,11 cannot be altered until after the last
! call to a solvq routine. They contain the appropriate
! ustr,vstr, and wstr.
!
!-----------------------------------------------------------------------
!
qflag = 3
CALL solvq
(nx,ny,nz, exbcbufsz, dtbig1, qflag, &
qr,u,v,wcont, tem9,tem10,tem11, &
sdteb,sdtwb,sdtnb,sdtsb, rhostr,rhostri, &
kmh,kmv,rprntl,x,y,z,zp,mapfct, &
j1,j2,j3,aj3x,aj3y,j3inv, &
qcumsrc(1,1,1,2),qcumsrc(1,1,1,3), &
qcumsrc(1,1,1,4),qcumsrc(1,1,1,5), &
exbcbuf, bcrlx, &
uforce,vforce, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8, &
tem1_0,tem2_0,tem3_0)
END IF
IF( lvldbg >= 1 ) THEN
CALL acct_interrupt
(misc_acct)
CALL checkshx
(qv(1,1,1,tfuture), &
nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, 'qvx', tem1)
CALL checkshy
(qv(1,1,1,tfuture), &
nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, 'qvy', tem1)
CALL checkshx
(qc(1,1,1,tfuture), &
nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, 'qcx', tem1)
CALL checkshy
(qc(1,1,1,tfuture), &
nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, 'qcy', tem1)
CALL checkshx
(qr(1,1,1,tfuture), &
nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, 'qrx', tem1)
CALL checkshy
(qr(1,1,1,tfuture), &
nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, 'qry', tem1)
CALL acct_stop_inter
END IF
END IF
!
!-----------------------------------------------------------------------
!
! Integrate the frozen water substance continuity equations
! forward one timestep.
!
! Sources and sinks due to phase changes and radiative processes
! are handled separately.
!
! If the simulation does not include ice processes then, to save
! computer resources, we skip ice variable computations.
! The flags for these options are "moist" and "ice", i.e.,
!
! Moist = 0 dry run
! Moist = 1, Ice = 0, moist run without ice processes
! Moist = 1, Ice = 1, moist run with ice processes.
!
!-----------------------------------------------------------------------
!
IF( moist == 1 .AND. ice == 1 ) THEN
!
!-----------------------------------------------------------------------
!
! Cloud ice equation. Array uforce and vforce are used as work
! arrays. Tem9,10,11 cannot be altered until after the last
! call to a solvq routine. They contain the appropriate
! ustr,vstr, and wstr.
!
!-----------------------------------------------------------------------
!
qflag = 4
CALL solvq
(nx,ny,nz, exbcbufsz, dtbig1, qflag, &
qi,u,v,wcont, tem9,tem10,tem11, &
sdteb,sdtwb,sdtnb,sdtsb, rhostr,rhostri, &
kmh,kmv,rprntl,x,y,z,zp,mapfct, &
j1,j2,j3,aj3x,aj3y,j3inv, &
qcumsrc(1,1,1,2),qcumsrc(1,1,1,3), &
qcumsrc(1,1,1,4),qcumsrc(1,1,1,5), &
exbcbuf, bcrlx, &
uforce,vforce, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8, &
tem1_0,tem2_0,tem3_0)
!
!-----------------------------------------------------------------------
!
! Snow equation. Array uforce and vforce are used as work
! arrays. Tem9,10,11 cannot be altered until after the last
! call to a solvq routine. They contain the appropriate
! ustr,vstr, and wstr.
!
!-----------------------------------------------------------------------
!
qflag = 5
CALL solvq
(nx,ny,nz, exbcbufsz, dtbig1, qflag, &
qs,u,v,wcont, tem9,tem10,tem11, &
sdteb,sdtwb,sdtnb,sdtsb, rhostr,rhostri, &
kmh,kmv,rprntl,x,y,z,zp,mapfct, &
j1,j2,j3,aj3x,aj3y,j3inv, &
qcumsrc(1,1,1,2),qcumsrc(1,1,1,3), &
qcumsrc(1,1,1,4),qcumsrc(1,1,1,5), &
exbcbuf, bcrlx, &
uforce,vforce, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8, &
tem1_0,tem2_0,tem3_0)
!
!-----------------------------------------------------------------------
!
! Hail equation. Array uforce and vforce are used as work
! arrays. Tem9,10,11 cannot be altered until after the last
! call to a solvq routine. They contain the appropriate
! ustr,vstr, and wstr.
!
!-----------------------------------------------------------------------
!
qflag = 6
CALL solvq
(nx,ny,nz, exbcbufsz, dtbig1, qflag, &
qh,u,v,wcont, tem9,tem10,tem11, &
sdteb,sdtwb,sdtnb,sdtsb, rhostr,rhostri, &
kmh,kmv,rprntl,x,y,z,zp,mapfct, &
j1,j2,j3,aj3x,aj3y,j3inv, &
qcumsrc(1,1,1,2),qcumsrc(1,1,1,3), &
qcumsrc(1,1,1,4),qcumsrc(1,1,1,5), &
exbcbuf, bcrlx, &
uforce,vforce, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8, &
tem1_0,tem2_0,tem3_0)
END IF
RETURN
END SUBROUTINE tinteg
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE SMLSTEP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE smlstep(mptr, nx,ny,nz, exbcbufsz, dtbig1,dtsml1, & 1,21
u,v,w,wcont,pprt,ptprt, &
udteb,udtwb,udtnb,udtsb,vdteb,vdtwb,vdtnb,vdtsb, &
wdteb,wdtwb,wdtnb,wdtsb,pdteb,pdtwb,pdtnb,pdtsb, &
phydro,ptdteb,ptdtwb,ptdtnb,ptdtsb, &
ubar,vbar,ptbar,pbar,ptbari,pbari,rhostr,rhostri, &
csndsq, &
uforce,vforce,wforce,pforce,ptforce, &
x,y,z,zp,mapfct, j1,j2,j3,aj3x,aj3y,aj3z,j3inv, &
trigs1,trigs2,ifax1,ifax2, &
wsave1,wsave2,vwork1,vwork2, &
exbcbuf,rhofct, &
rhostru,rhostrv,rhostrw, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8,tem9,tem10, &
tem11,tem12,tem13,tem14,tem15,tem16,tem17,tem18,tem19)
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Coordinate the integration of the acoustically active parts of
! the dynamic equations.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 3/21/92.
!
! MODIFICATION HISTORY:
!
! 5/20/92 (K. Droegemeier and M. Xue)
! Added full documentation.
!
! 4/10/93 (M. Xue & Hao Jin)
! Add the terrain.
!
! 9/10/94 (D. Weber & Y. Lu)
! Cleaned up documentation.
!
! 10/31/95 (D. Weber)
! Added trigs1,trigs2,ifax1,ifax2 for use in the upper w-p
! radiation condition.
!
! 1/25/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).
!
! 10/21/97 (Donghai Wang)
! Using total density (rho) in the calculation of the pressure
! gradient force terms, and added the second order terms
! in the linerized buoyancy terms.
!
! 11/05/97 (D. Weber)
! Added phydro array for use in the bottom boundary condition for
! perturbation 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.
!
! 9/18/98 (D. Weber)
! Added arrays aj3x,y,z, rhostri,ptbari,pbari, and tem9-12 for
! use in optimizing this routine.
! Tem9-19 is used to store commonly used groups of constants.
!
!-----------------------------------------------------------------------
!
! 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
!
! dtbig1 Large time step size for this call.
! dtsml1 Small time step size for this call.
!
! 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)
! wcont Contravariant vertical velocity (m/s)
! pprt Perturbation pressure at times tpast and tpresent (Pascal)
! ptprt Perturbation potential temperature at times tpast and
! tpresent (K)
!
! 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)
!
! ptdteb Time tendency of ptprt field at east boundary (K/s)
! ptdtwb Time tendency of ptprt field at west boundary (K/s)
! ptdtnb Time tendency of ptprt field at north boundary(K/s)
! ptdtsb Time tendency of ptprt field at south boundary(K/s)
!
! phydro Big time step forcing term for use in computing the
! hydrostatic pressure at k=1.
!
! 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)
! csndsq Sound wave speed squared.
!
! uforce Acoustically inactive forcing terms in u-eq. (kg/(m*s)**2)
! vforce Acoustically inactive forcing terms in v-eq. (kg/(m*s)**2)
! wforce Acoustically inactive forcing terms in w-eq. (kg/(m*s)**2)
! pforce Acoustically inactive forcing terms in p-eq. (Pascal/s)
! ptforce Gravity wave inactive forcing terms in pt-eq. (K*kg/(m**3*s))
!
! 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)
!
! 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
! 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
! 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.
! vwork2 2-D work array for fftopt = 2.
! wsave1 Work array for fftopt = 2.
! wsave2 Work array for fftopt = 2.
!
! rhostru Averaged rhostr at u points (kg/m**3).
! rhostrv Averaged rhostr at v points (kg/m**3).
! rhostrw Averaged rhostr at w points (kg/m**3).
!
! OUTPUT:
!
! u x component of velocity at time tfuture (m/s)
! v y component of velocity at time tfuture (m/s)
! w Vertical component of Cartesian velocity at tfuture (m/s)
! pprt Perturbation pressure at time tfuture (Pascal)
! ptprt Perturbation potential temperature at time tfuture (K)
!
! WORK ARRAYS:
!
! 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
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE ! Force explicit declarations
INCLUDE 'timelvls.inc'
INTEGER :: mptr
INTEGER :: nx, ny, nz ! Number of grid points in 3 directions
REAL :: dtbig1 ! Large time step size for this call.
REAL :: dtsml1 ! Small time step size for this call.
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 :: pprt (nx,ny,nz,nt) ! Perturbation pressure (Pascal)
REAL :: ptprt (nx,ny,nz,nt) ! Perturbation potential temperature (K)
REAL :: udteb (ny,nz) ! Time tendency of u at e-boundary (m/s**2)
REAL :: udtwb (ny,nz) ! Time tendency of u at w-boundary (m/s**2)
REAL :: udtnb (nx,nz) ! Time tendency of u at n-boundary (m/s**2)
REAL :: udtsb (nx,nz) ! Time tendency of u at s-boundary (m/s**2)
REAL :: vdteb (ny,nz) ! Time tendency of v at e-boundary (m/s**2)
REAL :: vdtwb (ny,nz) ! Time tendency of v at w-boundary (m/s**2)
REAL :: vdtnb (nx,nz) ! Time tendency of v at n-boundary (m/s**2)
REAL :: vdtsb (nx,nz) ! Time tendency of v at s-boundary (m/s**2)
REAL :: wdteb (ny,nz) ! Time tendency of w at e-boundary (m/s**2)
REAL :: wdtwb (ny,nz) ! Time tendency of w at w-boundary (m/s**2)
REAL :: wdtnb (nx,nz) ! Time tendency of w at n-boundary (m/s**2)
REAL :: wdtsb (nx,nz) ! Time tendency of w at s-boundary (m/s**2)
REAL :: pdteb (ny,nz) ! Time tendency of pprt at e-boundary (Pascal/s)
REAL :: pdtwb (ny,nz) ! Time tendency of pprt at w-boundary (Pascal/s)
REAL :: pdtnb (nx,nz) ! Time tendency of pprt at n-boundary (Pascal/s)
REAL :: pdtsb (nx,nz) ! Time tendency of pprt at s-boundary (Pascal/s)
REAL :: phydro(nx,ny) ! Big time step forcing for computing
! hydrostatic pprt at k=1.
REAL :: ptdteb(ny,nz) ! Time tendency of ptprt at e-boundary (K/s)
REAL :: ptdtwb(ny,nz) ! Time tendency of ptprt at w-boundary (K/s)
REAL :: ptdtnb(nx,nz) ! Time tendency of ptprt at n-boundary (K/s)
REAL :: ptdtsb(nx,nz) ! Time tendency of ptprt at s-boundary (K/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) ! Inverse base state density rhobar times j3.
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 of the staggered grid.
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 :: 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) ! Coordinate transformation Jacobian defined as
! d( zp )/d( z ).
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 :: uforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in u-momentum equation (kg/(m*s)**2)
REAL :: vforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in v-momentum equation (kg/(m*s)**2)
REAL :: wforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in w-momentum equation (kg/(m*s)**2)
REAL :: pforce(nx,ny,nz) ! Acoustically inactive forcing terms
! in pressure equation (Pascal/s)
REAL :: ptforce(nx,ny,nz) ! Gravity wave inactive forcing terms
! in potential temperature eq. (K*kg/(m**3*s))
REAL :: rhostru(nx,ny,nz) ! Averaged rhostr at u points (kg/m**3).
REAL :: rhostrv(nx,ny,nz) ! Averaged rhostr at v points (kg/m**3).
REAL :: rhostrw(nx,ny,nz) ! Averaged rhostr at w points (kg/m**3).
INTEGER :: exbcbufsz ! EXBC buffer size
REAL :: exbcbuf( exbcbufsz ) ! EXBC buffer array
REAL :: rhofct(nx,ny,nz) ! rho-factor: rhobar/rho
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
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k
INTEGER :: ismstp
REAL :: curtsml ! Current time during small time step
! integration.
REAL :: tem,tema,temb
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'phycst.inc'
INCLUDE 'globcst.inc'
INCLUDE 'grid.inc' ! Grid & map parameters.
INCLUDE 'bndry.inc'
INCLUDE 'exbc.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Integrate the momentum equations using a forward-in-time (relative
! to the pressure gradient terms) scheme and the pressure equation
! using a backward-in-time (relative to the mass divergence term)
! scheme.
!
! dtsml = (2*dtbig)/nsmstp is used so that after nsmstp small time
! step integrations, the fields are brought from time t-dtbig
! to t+dtbig, i.e. from time tpast to time future.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! The first time through the small timestep loop, set the values
! at time tfuture equal to those at tpast. By doing this, we
! simplify the forward-in-time integration because the equations
! take the form:
!
! u(i,j,k,future) = u(i,j,k,future)
! : + dtsml*( acoustic + non-acoustic forcing terms )
!
! i.e., we only use a single time level in this two-time level
! scheme and automatically finish with u at time tfuture.
!
!-----------------------------------------------------------------------
!
!call test_dump(w(1,1,tfuture),"XXXsml_wfut",nx,ny,nz,3,1)
!call test_dump(w(1,1,tpast),"XXXsml_wpast",nx,ny,nz,3,1)
!call test_dump(w(1,1,tpresent),"XXXsml_wpres",nx,ny,nz,3,1)
DO k=1,nz
DO j=1,ny
DO i=1,nx
u (i,j,k,tfuture)=u (i,j,k,tpast)
v (i,j,k,tfuture)=v (i,j,k,tpast)
w (i,j,k,tfuture)=w (i,j,k,tpast)
pprt (i,j,k,tfuture)=pprt (i,j,k,tpast)
END DO
END DO
END DO
IF(ptsmlstp == 1) THEN
IF( sadvopt == 4 ) THEN
!-----------------------------------------------------------------------
!
! When FCT is used to advect ptprt, all (e.g., advection,
! mixing) except for ptbar advection terms were evaluated at tpresent,
! and the large time step integration is forward in time.
! We have to do somthing special here, so that the same ptprt(tfuture)
! results had the ptbar advection not been included when ptprt is
! is updated in small steps. Therefore, we require
!
! (ptprt(tfuture)-ptprt(tpast))/(2*dtbig1)
! = (ptprt(tfuture)-ptprt(tpresent))/dtbig
!
!-----------------------------------------------------------------------
tem = 2*dtbig1/dtbig
IF(nestgrd == 1.AND.mgrid /= 1) THEN
! Don't touch the boundary values at tpast for nested grids.
DO k=1,nz-1
DO j=2,ny-2
DO i=2,nx-2
ptprt(i,j,k,tpast)=ptprt(i,j,k,tfuture) &
-(ptprt(i,j,k,tfuture)-ptprt(i,j,k,tpresent))*tem
END DO
END DO
END DO
ELSE
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
ptprt(i,j,k,tpast)=ptprt(i,j,k,tfuture) &
-(ptprt(i,j,k,tfuture)-ptprt(i,j,k,tpresent))*tem
END DO
END DO
END DO
END IF
END IF
DO k=1,nz
DO j=1,ny
DO i=1,nx
ptprt(i,j,k,tfuture)=ptprt(i,j,k,tpast)
END DO
END DO
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Calculate wcont at future time level.
!
!-----------------------------------------------------------------------
!
CALL rhouvw
(nx,ny,nz,rhostr,rhostru,rhostrv,rhostrw)
!call test_dump (w(1,1,1,tfuture),"XXX3Bwc_w1",nx,ny,nz,1,0)
CALL wcontra
(nx,ny,nz, &
u(1,1,1,tfuture),v(1,1,1,tfuture), &
w(1,1,1,tfuture),mapfct,j1,j2,j3,aj3z, &
rhostr,rhostru,rhostrv,rhostrw,wcont,tem1,tem2)
IF( lvldbg >= 3 ) THEN
CALL checkwhx
(wcont, nx,ny,nz,1,nx-1,1,ny-1,2,nz-1, &
'wcxsml', tem1)
CALL checkwhy
(wcont, nx,ny,nz,1,nx-1,1,ny-1,2,nz-1, &
'wcysml', tem1)
END IF
!-----------------------------------------------------------------------
!
! Compute a number of static variables (wrt small time step) and
! pass into the appropriate subroutines.
! NOTE: ALL OF THE COMPUTATIONS ASSUME THAT THE VARIABLES USED
! ARE CONSTANT DURING THE SMALL TIME STEP!!!!!!!
! THEY CANNOT BE OVERWRITTEN UNTIL AFTER THE W-P SOLVER.
!
!-----------------------------------------------------------------------
temb = 0.5*dtsml1
DO k=2,nz-2
DO j=1,ny-1
DO i=2,nx-1
tema = 1.0/rhostru(i,j,k)
tem13(i,j,k) =temb*(rhofct(i,j,k)+rhofct(i-1,j,k)) &
*mapfct(i,j,2)*tema
uforce(i,j,k) = dtsml1*uforce(i,j,k)*tema
END DO
END DO
END DO
!call test_dump (uforce,"XXX1uforce",nx,ny,nz,1,0)
!call test_dump (rhostru,"XXXrhostru",nx,ny,nz,1,0)
!call test_dump (tem13,"XXXdtmrxrsu_tem13",nx,ny,nz,1,0)
!call test_dump2(rhofct,"XXXdtmrxrsu_rhofct",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2)
DO k=2,nz-2
DO j=2,ny-1
DO i=1,nx-1
tema = 1.0/rhostrv(i,j,k)
tem14(i,j,k) =temb*(rhofct(i,j,k)+rhofct(i,j-1,k)) &
*mapfct(i,j,3)*tema
vforce(i,j,k) = dtsml1*vforce(i,j,k)*tema
END DO
END DO
END DO
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem17(i,j,k)=1.0/(pbar(i,j,k)+pbar(i,j,k-1)) ! used in solvwp
END DO
END DO
END DO
DO k=1,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem12(i,j,k)=1.0/rhostrw(i,j,k) ! used in solvwp
tem9 (i,j,k)=rhostr(i,j,k)*j3inv(i,j,k) ! used in solvwp
tem10(i,j,k)=csndsq(i,j,k)*j3inv(i,j,k)*tem9(i,j,k) ! solvwp
tem11(i,j,k)=rhostr(i,j,k)*pbari(i,j,k) ! used in solvwp
tem18(i,j,k)=rhostr(i,j,k)*ptbari(i,j,k) ! used in solvwp
END DO
END DO
END DO
IF(vimplct == 0)THEN ! pre-compute wforce, etc.. for wp-ex.
DO k=2,nz-1
DO j=1,ny-1
DO i=1,nx-1
tem19(i,j,k) =temb*(rhofct(i,j,k)+rhofct(i,j,k-1)) &
*tem12(i,j,k)
wforce(i,j,k) = dtsml1*wforce(i,j,k)*tem12(i,j,k)
END DO
END DO
END DO
END IF
tema = dtsml1*dxinv
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx
tem15(i,j,k)=tema*aj3x(i,j,k)*mapfct(i,j,5) ! used in solvwp's
END DO
END DO
END DO
temb = dtsml1*dyinv
DO k=2,nz-2
DO j=1,ny
DO i=1,nx-1
tem16(i,j,k)=temb*aj3y(i,j,k)*mapfct(i,j,6) ! used in solvwp's
END DO
END DO
END DO
!
!-----------------------------------------------------------------------
!
! For peqopt=2, set
!
! pforce=pforce (containging exbc damping only)
! + rhostr*cs**2/ptbar*d(pt)/dt
! =pforce (containging exbc damping only)
! + cs**2/ptbar * (ptforce + buoyancy if not already included).
!
! Note that adiabet heating/colling is not included in ptforce,
! therefore is not accounted for in p equation.
!
!-----------------------------------------------------------------------
!
IF(peqopt == 2) THEN
IF( ptsmlstp == 0 ) THEN
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
pforce(i,j,k)=pforce(i,j,k) &
+csndsq(i,j,k)*ptforce(i,j,k)*ptbari(i,j,k)
END DO
END DO
END DO
ELSE
DO k=2,nz-2
DO j=1,ny-1
DO i=1,nx-1
pforce(i,j,k)=pforce(i,j,k)+csndsq(i,j,k)*ptbari(i,j,k) &
*(ptforce(i,j,k)-tem9(i,j,k)* &
0.25*(ptbar(i,j,k+1)-ptbar(i,j,k-1))*dzinv* &
(w(i,j,k+1,2)+w(i,j,k,2)) )
END DO
END DO
END DO
END IF
END IF
DO k=2,nz-2 ! preparing pforce...for all solvwp codes...
DO j=1,ny-1
DO i=1,nx-1
pforce(i,j,k) = dtsml1*pforce(i,j,k)*j3inv(i,j,k)
END DO
END DO
END DO
DO ismstp =1, nsmstp
!
!-----------------------------------------------------------------------
!
! Calculate the current time within small time step. It will be
! used to calculate the external boundary fields.
!
!-----------------------------------------------------------------------
!
curtsml = curtim + dtbig - 2*dtbig1 + ismstp*dtsml1
!
!-----------------------------------------------------------------------
!
! Advance the three momentum equations one small timestep.
! (Arguments such as u(1,1,1,tfuture) indicate the passing of
! array values at time tfuture into the subroutine. Inside the
! subroutine, these arrays are defined at a single time level.
! u, v, w at tfuture and wcont are updated in time exiting
! this routine.
!
! Advance the pressure (p at tfuture) one small timestep.
!
! tem7 is used to transfer wpgrad between subroutine SOLVUV and
! subroutine SOLVWPIM or SOLVWPEX.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Calculate the boundary time tendencies of u and v using Klemp &
! Wilhelmson type open boundary condition (rbcopt=1).
!
!-----------------------------------------------------------------------
!
IF( rbcopt == 1 .AND. mgrid == 1 ) THEN
CALL bkwsmldt
(nx,ny,nz, u(1,1,1,tfuture),v(1,1,1,tfuture), &
ubar,vbar,udteb,udtwb,vdtnb,vdtsb)
END IF
CALL solvuv
(mptr, nx,ny,nz, exbcbufsz, dtsml1, curtsml, &
u(1,1,1,tfuture),v(1,1,1,tfuture), &
wcont,pprt(1,1,1,tfuture), &
udteb,udtwb,udtnb,udtsb, &
vdteb,vdtwb,vdtnb,vdtsb, &
rhostr, uforce,vforce,ubar,vbar, &
x,y,z,zp,mapfct, j1,j2,j3,j3inv, &
exbcbuf,rhofct, &
rhostru,rhostrv,rhostrw,tem13,tem14,tem7, &
tem1,tem2,tem3,tem4,tem5)
!
!-----------------------------------------------------------------------
!
! Warning: tem7 is carrying wpgrad can not be overwritten before
! the subroutine for w and p-equations are called.
!
!-----------------------------------------------------------------------
!
IF( lvldbg >= 3 ) THEN
CALL checkuhx
( nx,ny,nz,1,nx, 1,ny-1,1,nz-1, 'uxsml', tem1)
CALL checkuhy
( nx,ny,nz,1,nx, 1,ny-1,1,nz-1, 'uysml', tem1)
CALL checkvhx
( nx,ny,nz,1,nx-1,1,ny, 1,nz-1, 'vxsml', tem1)
CALL checkvhy
( nx,ny,nz,1,nx-1,1,ny, 1,nz-1, 'vysml', tem1)
END IF
!
!-----------------------------------------------------------------------
!
! Advance the w and pressure (at tfuture) one small timestep.
!
!-----------------------------------------------------------------------
!
IF( vimplct == 0 ) THEN ! Not implicit
!
!-----------------------------------------------------------------------
!
! Integrate the w and pressure equations one small time step
! using explicit scheme.
!
! NOTE: tem11,tem18,tem12,tem15,tem16,tem9 are assumed to be
! constant during the small time step!!!
!
!-----------------------------------------------------------------------
!
CALL solvwpex
(mptr, nx,ny,nz, exbcbufsz, dtsml1, curtsml, &
u(1,1,1,tfuture),v(1,1,1,tfuture), &
w(1,1,1,tfuture),wcont, &
ptprt(1,1,1,tfuture),pprt(1,1,1,tfuture),phydro, &
wdteb,wdtwb,wdtnb,wdtsb,pdteb,pdtwb,pdtnb,pdtsb, &
rhostr,ptbar,ptbari,pbari,csndsq, &
wforce,tem7,pforce, &
x,y,z,zp, mapfct, j1,j2,j3,aj3x,aj3y,aj3z,j3inv, &
rhostru,rhostrv,rhostrw, &
exbcbuf,rhofct, &
tem1,tem2,tem3,tem4,tem5, &
tem11,tem18,tem19,tem15,tem16,tem9)
!call test_dump(w(1,1,tfuture),"XXXAsolvwpex_w",nx,ny,nz,3,1)
ELSE ! Implicit
!
!-----------------------------------------------------------------------
!
! Integrate the w and pressure equations one small time step
! using vertically implicit scheme.
!
! NOTE: tem9,tem10,tem11,tem12,tem15,tem16,tem17,tem18
! are assumed to be constant during the small time step!!!
!
!-----------------------------------------------------------------------
!
IF(peqopt == 1) THEN
CALL solvwpim
(mptr,nx,ny,nz,exbcbufsz, dtsml1, curtsml, &
u(1,1,1,tfuture),v(1,1,1,tfuture), &
w(1,1,1,tfuture),wcont, &
ptprt(1,1,1,tfuture),pprt(1,1,1,tfuture),phydro, &
wdteb,wdtwb,wdtnb,wdtsb,pdteb,pdtwb,pdtnb,pdtsb, &
rhostr,ptbar,ptbari,pbari,csndsq, &
wforce,tem7,pforce, &
x,y,z,zp,mapfct, &
j1,j2,j3,aj3x,aj3y,aj3z,j3inv, &
trigs1,trigs2,ifax1,ifax2, &
wsave1,wsave2,vwork1,vwork2, &
rhostru,rhostrv,rhostrw, &
exbcbuf,rhofct, &
tem1,tem2,tem3,tem4,tem5,tem6,tem8, &
tem9,tem10,tem11,tem12,tem15,tem16,tem17)
!call test_dump(w(1,1,tfuture),"XXXAsolvwpim_w",nx,ny,nz,3,1)
ELSE
CALL solvwpim1
(nx,ny,nz,exbcbufsz, dtsml1, curtsml, &
u(1,1,1,tfuture),v(1,1,1,tfuture), &
w(1,1,1,tfuture),wcont, &
ptprt(1,1,1,tfuture),pprt(1,1,1,tfuture),phydro, &
wdteb,wdtwb,wdtnb,wdtsb,pdteb,pdtwb,pdtnb,pdtsb, &
rhostr,ptbar,ptbari,pbari,csndsq, &
wforce,tem7,pforce, &
x,y,z,zp,mapfct, &
j1,j2,j3,aj3z,j3inv, &
trigs1,trigs2,ifax1,ifax2, &
wsave1,wsave2,vwork1,vwork2, &
rhostru,rhostrv,rhostrw, &
exbcbuf,rhofct, &
tem1,tem2,tem3,tem4,tem5,tem6,tem8, &
tem11,tem18,tem12,tem17,tem9)
!call test_dump(w(1,1,tfuture),"XXXAsolvwpim_w",nx,ny,nz,3,1)
END IF
END IF
IF( lvldbg >= 3 ) THEN
CALL checkwhx
( nx,ny,nz,1,nx-1,1,ny-1,1,nz, 'wxsml', tem1)
CALL checkwhy
( nx,ny,nz,1,nx-1,1,ny-1,1,nz, 'wysml', tem1)
CALL checkshx
(pprt(1,1,1,tfuture), &
nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, 'pxsml', tem1)
CALL checkshy
(pprt(1,1,1,tfuture), &
nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, 'pysml', tem1)
END IF
!-----------------------------------------------------------------------
!
! Integrate the potential temperature equation one small time step
! when ptsmlstp=1.
!
!-----------------------------------------------------------------------
!
IF( ptsmlstp == 1 ) THEN
CALL solvpt_sml
(nx,ny,nz, exbcbufsz, dtbig1,dtsml1,curtsml, &
ptprt,w, ptdteb,ptdtwb,ptdtnb,ptdtsb, &
ptbar,rhostr,rhostri,rhostrw,j3,aj3z, &
ptforce, exbcbuf, &
tem1,tem2)
IF( lvldbg >= 3) THEN
CALL checkshx
(ptprt(1,1,1,tfuture), &
nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, 'ptsmlx',tem1)
CALL checkshy
(ptprt(1,1,1,tfuture), &
nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, 'ptsmly',tem1)
END IF
END IF
END DO
!
!-----------------------------------------------------------------------
!
! Integrate the potential temperature equation one large time step
! when ptsmlstp=0.
!
!-----------------------------------------------------------------------
!
IF( ptsmlstp == 0 ) THEN
CALL solvpt_lrg
(nx,ny,nz, exbcbufsz, dtbig1, ptprt, &
ptdteb,ptdtwb,ptdtnb,ptdtsb,rhostr,rhostri, &
ptforce,exbcbuf,tem1)
END IF
RETURN
END SUBROUTINE smlstep
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE TFILT ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE tfilt(nx,ny,nz, & 1,12
u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Apply the Asselin time filter to all time-dependent variables.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 10/10/91.
!
! MODIFICATION HISTORY:
!
! 5/20/92 (K. Droegemeier and M. Xue)
! Added full documentation.
!
! 9/10/94 (D. Weber & 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
!
! 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)
! 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)
!
! OUTPUT:
!
! u x component of velocity at time tpresent (m/s)
! v y component of velocity at time tpresent(m/s)
! w Vertical component of Cartesian velocity at tpresent (m/s)
! ptprt Perturbation potential temperature at time tpresent (K)
! pprt Perturbation pressure at time tpresent (Pascal)
! qv Water vapor specific humidity at time tpresent (kg/kg)
! qc Cloud water mixing ratio at time tpresent (kg/kg)
! qr Rainwater mixing ratio at time tpresent (kg/kg)
! qi Cloud ice mixing ratio at time tpresent (kg/kg)
! qs Snow mixing ratio at time tpresent (kg/kg)
! qh Hail mixing ratio at time tpresent (kg/kg)
! tke Turbulent Kinetic Energy ((m/s)**2)
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'timelvls.inc'
INTEGER :: nx, ny, nz ! 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 :: ptprt (nx,ny,nz,nt) ! Perturbation potential temperature (K)
REAL :: pprt (nx,ny,nz,nt) ! Perturbation pressure (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
!
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
!
!-----------------------------------------------------------------------
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
CALL aselin
(u, nx,ny,nz, 1,nx,1,ny-1,1,nz-1, flteps)
CALL aselin
(v, nx,ny,nz, 1,nx-1,1,ny,1,nz-1, flteps)
CALL aselin
(w, nx,ny,nz, 1,nx-1,1,ny-1,1,nz, flteps)
IF(sadvopt /= 4) CALL aselin
(ptprt, nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, flteps)
CALL aselin
(pprt, nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, flteps)
IF( tmixopt == 4) THEN
IF(sadvopt /= 4) CALL aselin
(tke, nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, flteps)
END IF
IF( moist /= 0 .AND. sadvopt /= 4 ) THEN
CALL aselin
(qv, nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, flteps)
CALL aselin
(qc, nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, flteps)
CALL aselin
(qr, nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, flteps)
IF( ice /= 0 ) THEN
CALL aselin
(qi, nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, flteps)
CALL aselin
(qs, nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, flteps)
CALL aselin
(qh, nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, flteps)
END IF
END IF
RETURN
END SUBROUTINE tfilt
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE ASELIN ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE aselin(a, nx,ny,nz, nx1,nx2,ny1,ny2,nz1,nz2, flteps) 12
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Apply Asselin time filter.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 10/10/91.
!
! MODIFICATION HISTORY:
!
! 5/20/92 (K. Droegemeier and M. Xue)
! Added full documentation.
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! a A variable at three time levels.
!
! nx1,nx2 i-index array bounds where the time filter is applied
! ny1,ny2 j-index array bounds where the time filter is applied
! nz1,nz2 k-index array bounds where the time filter is applied
!
! flteps The asselin time filter coefficient.
! Defined in globcst.inc
!
! OUTPUT:
!
! a The new array values at time tpresent after the time
! filter is applied.
!
!-----------------------------------------------------------------------
!
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'timelvls.inc'
INTEGER :: nx, ny, nz ! Number of grid points in 3 directions
REAL :: a(nx,ny,nz,nt)
INTEGER :: nx1, nx2
INTEGER :: ny1, ny2
INTEGER :: nz1, nz2
REAL :: flteps ! Coefficient of the Asselin time filter
!
!-----------------------------------------------------------------------
!
! Misc. local variable:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
DO k=nz1,nz2
DO j=ny1,ny2
DO i=nx1,nx2
a(i,j,k,tpresent)=a(i,j,k,tpresent)+flteps* &
(a(i,j,k,tfuture)-2*a(i,j,k,tpresent)+a(i,j,k,tpast))
END DO
END DO
END DO
RETURN
END SUBROUTINE aselin
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE TFLIP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE tflip(nx,ny,nz, u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke) 1,12
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Update the fields u, v, w, ptprt ,pprt ,qv ,qc ,qr ,qi ,qs ,qh and
! tke in time. The fields at tpast are replaced by those at tpresent.
! The fields at tpresent are replaced by those at tfuture. The fields
! at tfuture are not changed.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 10/10/91.
!
! MODIFICATION HISTORY:
!
! 5/20/92 (K. Droegemeier and M. Xue)
! Added full 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
!
! 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)
! 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)
!
! OUTPUT:
!
! u x-velocity at tpast and tpresent updated in time (m/s)
! v y-velocity at tpast and tpresent updated in time (m/s)
! w Vertical component of Cartesian velocity at tpast
! and tpresent updated in time (m/s)
! ptprt Perturbation potential temperature at tpast and tpresent
! updated in time (K)
! pprt Perturbation pressure at tpast and tpresent
! updated in time (Pascal)
! qv Water vapor specific humidity at tpast and tpresent
! updated in time (kg/kg)
! qc Cloud water mixing ratio at tpast and tpresent
! updated in time (kg/kg)
! qr Rainwater mixing ratio at tpast and tpresent
! updated in time (kg/kg)
! qi Cloud ice mixing ratio at tpast and tpresent
! updated in time (kg/kg)
! qs Snow mixing ratio at tpast and tpresent
! updated in time (kg/kg)
! qh Hail mixing ratio at tpast and tpresent
! updated in time (kg/kg)
! tke Turbulent Kinetic Energy ((m/s)**2)
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'timelvls.inc'
INTEGER :: nx, ny, nz ! 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 :: ptprt (nx,ny,nz,nt) ! Perturbation potential temperature (K)
REAL :: pprt (nx,ny,nz,nt) ! Perturbation pressure (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
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
!
!-----------------------------------------------------------------------
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
CALL tswap
(nx,ny,nz, u)
CALL tswap
(nx,ny,nz, v)
CALL tswap
(nx,ny,nz, w)
CALL tswap
(nx,ny,nz, ptprt)
CALL tswap
(nx,ny,nz, pprt)
IF( tmixopt == 4 ) THEN
CALL tswap
(nx,ny,nz,tke )
END IF
IF( moist /= 0 ) THEN
CALL tswap
(nx,ny,nz, qv)
CALL tswap
(nx,ny,nz, qc)
CALL tswap
(nx,ny,nz, qr)
IF( ice /= 0 ) THEN
CALL tswap
(nx,ny,nz, qi)
CALL tswap
(nx,ny,nz, qs)
CALL tswap
(nx,ny,nz, qh)
END IF
END IF
RETURN
END SUBROUTINE tflip
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE TSWAP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE tswap(nx,ny,nz, a) 12
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Update the time levels of a time-dependent array.
!
! a(*,*,*,tpast ) = a(*,*,*,tpresent)
! a(*,*,*,tpresent) = a(*,*,*,tfuture )
! a(*,*,*,tfuture ) is not changed.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Ming Xue
! 10/10/91.
!
! MODIFICATION HISTORY:
!
! 5/20/92 (K. Droegemeier and M. Xue)
! Added full 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
!
! a A 3-D array at three time levels that will be updated
! in time.
!
! OUPTUT:
!
! a Its new values at time tpast and tfuture.
!
!-----------------------------------------------------------------------
!
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INCLUDE 'timelvls.inc'
INTEGER :: nx, ny, nz ! Number of grid points in 3 directions
REAL :: a(nx,ny,nz,nt) ! Array whose values will be updated in time
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
DO k=1,nz
DO j=1,ny
DO i=1,nx
a(i,j,k,tpast )=a(i,j,k,tpresent)
a(i,j,k,tpresent)=a(i,j,k,tfuture )
END DO
END DO
END DO
RETURN
END SUBROUTINE tswap