!######################################################################## !######################################################################## !######### ######### !######### SUBROUTINE interface_wrf_bmjdrv ######### !######### ######### !######### Developed by ######### !######### Center for Analysis and Prediction of Storms ######### !######### University of Oklahoma ######### !######### ######### !######################################################################## !######################################################################## SUBROUTINE interface_wrf_bmjdrv(nx,ny,nz,pprt,ptprt,qv,pbar,ptbar,zp, &,2 ptcumsrc,qcumsrc,bmjraincv,prcrate, & cldefi,xland) !------------------------------------------------------------------------ ! ! PURPOSE: ! ! Interfaces with the WRF version of the Betts-Miller-Janjic convective ! adjustment scheme. ! !------------------------------------------------------------------------ ! ! AUTHOR: Eric Kemp, 10 October 2001 ! ! MODIFICATION HISTORY: ! ! Eric Kemp, 1 November 2001. Fixed dimension error with array wrf_t. ! ! Eric Kemp, 12 March 2002. Removed lowlyr array from argument list. ! Replaced with new automatic array wrf_lowlyr. ! !------------------------------------------------------------------------ ! ! Use WRF Betts-Miller-Janjic module. ! !------------------------------------------------------------------------ USE module_cu_bmj !------------------------------------------------------------------------ ! ! Force explicit declarations. ! !------------------------------------------------------------------------ IMPLICIT NONE !------------------------------------------------------------------------ ! ! List include files. ! !------------------------------------------------------------------------ INCLUDE 'globcst.inc' INCLUDE 'grid.inc' INCLUDE 'phycst.inc' !------------------------------------------------------------------------ ! ! Arguments. ! !------------------------------------------------------------------------ INTEGER,INTENT(IN) :: nx,ny,nz ! Grid dimensions. REAL,INTENT(IN) :: pprt(nx,ny,nz) ! Perturbation pressure (Pa). REAL,INTENT(IN) :: ptprt(nx,ny,nz) ! Perturbation potential ! temperature (K). REAL,INTENT(IN) :: qv(nx,ny,nz) ! Specific humidity (kg/kg). REAL,INTENT(IN) :: pbar(nx,ny,nz) ! Base-state pressure (Pa). REAL,INTENT(IN) :: ptbar(nx,ny,nz) ! Base-state potential ! temperature (K). REAL,INTENT(IN) :: zp(nx,ny,nz) ! Height at w-points (m). REAL,INTENT(INOUT) :: ptcumsrc(nx,ny,nz) ! Potential temperature ! tendency. REAL,INTENT(INOUT) :: qcumsrc(nx,ny,nz,5)! Moisture tendencies. ! qcumsrc(1,1,1,1) for qv ! qcumsrc(1,1,1,2) for qc ! qcumsrc(1,1,1,3) for qr ! qcumsrc(1,1,1,4) for qi ! qcumsrc(1,1,1,5) for qs REAL,INTENT(INOUT) :: bmjraincv(nx,ny) ! BMJ rainfall (cm). REAL,INTENT(INOUT) :: prcrate(nx,ny) ! Precipitation rate (mm/s) REAL,INTENT(INOUT) :: cldefi(nx,ny) ! Cloud efficiency ! (dimensionless). REAL,INTENT(IN) :: xland(nx,ny) ! Land-sea mask (1.0 for land; ! 2.0 for water) !------------------------------------------------------------------------ ! ! WRF 3-D arrays (dimensioned i,k,j). ! !------------------------------------------------------------------------ REAL :: wrf_rr(nx,nz,ny) ! Dry air density (kg/m^3) REAL :: wrf_rthcuten(nx,nz,ny) ! Rho_dTheta_m tendency due to ! cumulus scheme ! precipitation ! (kg/m^3 . K) REAL :: wrf_rqvcuten(nx,nz,ny) ! Rho_dQv tendency due to ! cumulus scheme ! precipitation ! (kg/m^3 . kg/kg) REAL :: wrf_th(nx,nz,ny) ! Potential temperature (K) REAL :: wrf_t(nx,nz,ny) ! Temperature (K) REAL :: wrf_qvmix(nx,nz,ny) ! Water vapor mixing ratio ! (kg/kg) REAL :: wrf_pint(nx,nz,ny) ! Pressure at w-points (Pa) REAL :: wrf_pmid(nx,nz,ny) ! Pressure (Pa) REAL :: wrf_pi(nx,nz,ny) ! Exner function ! (dimensionless) REAL :: wrf_rho(nx,nz,ny) ! Density (kg/m^3) REAL :: wrf_dz8w(nx,nz,ny) ! dz between full levels (m) !------------------------------------------------------------------------ ! ! Other local arrays and variables. ! !------------------------------------------------------------------------ INTEGER :: wrf_lowlyr(nx,ny) ! Index of lowest model level. REAL :: wrf_raincv(nx,ny) ! Cumulus scheme ! precipitation (mm) INTEGER :: ids,ide,jds,jde,kds,kde, & ims,ime,jms,jme,kms,kme, & its,ite,jts,jte,kts,kte INTEGER :: itimestep ! Number of timestep. INTEGER :: stepcu ! Number of fundamental ! timesteps between ! convection calls. REAL :: d608 ! rvovrd - 1. INTEGER :: i,j,k REAL :: qvcumsrctmp,ptcumsrctmp !------------------------------------------------------------------------ ! ! Local parameters. ! !------------------------------------------------------------------------ REAL,PARAMETER :: trfz = 273.15 ! Freezing point (273.15 K) !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ wrf_lowlyr(:,:) = 2 wrf_raincv(:,:) = 0 !------------------------------------------------------------------------ ! ! Set the WRF "domain," "memory," and "tile" dimensions based on the ! ARPS dimensions. ! !------------------------------------------------------------------------ CALL interface_wrf_dims(nx,ny,nz, & ids,ide,jds,jde,kds,kde, & ims,ime,jms,jme,kms,kme, & its,ite,jts,jte,kts,kte) !------------------------------------------------------------------------ ! ! Set several scalar arguments. ! !------------------------------------------------------------------------ d608 = rvdrd - 1. stepcu = confrq/dtbig ! Number of actual time steps per convection ! time step. itimestep = (curtim-tstart)/dtbig ! Current actual time step. !------------------------------------------------------------------------ ! ! Fill WRF 3-D arrays. Note that WRF arrays are indexed i,k,j. ! !------------------------------------------------------------------------ DO k = 1,nz-1 DO j = 1,ny-1 DO i = 1,nx-1 wrf_pmid(i,k,j) = pprt(i,j,k) + pbar(i,j,k) wrf_pi(i,k,j) = (wrf_pmid(i,k,j)*1.0E-5)**rddcp wrf_th(i,k,j) = ptprt(i,j,k) + ptbar(i,j,k) wrf_t(i,k,j) = wrf_th(i,k,j)*wrf_pi(i,k,j) wrf_rr(i,k,j) = wrf_pmid(i,k,j)/(rd*wrf_t(i,k,j)) ! Dry air ! density. wrf_qvmix(i,k,j) = MAX(0.,qv(i,j,k)/(1. - qv(i,j,k))) wrf_rho(i,k,j) = wrf_rr(i,k,j)/(1. + 0.608*wrf_qvmix(i,k,j)) wrf_dz8w(i,k,j) = zp(i,j,k+1) - zp(i,j,k) END DO ! DO i = 1,nx-1 END DO ! DO j = 1,ny-1 END DO ! DO k = 1,nz-1 wrf_pint(:,:,:) = wrf_pmid(:,:,:) ! Not actually used by WRF code, ! but passed as argument. !------------------------------------------------------------------------ ! ! Call WRF Betts-Miller-Janjic code. ! !------------------------------------------------------------------------ CALL bmjdrv(dtbig,itimestep,stepcu,wrf_rr,wrf_rthcuten,wrf_rqvcuten, & wrf_raincv,wrf_th,wrf_t,wrf_qvmix,wrf_pint,wrf_pmid, & wrf_pi,wrf_rho,wrf_dz8w,cp,rd,rvdrd,lathv, & g,trfz,d608,cldefi,wrf_lowlyr,xland, & ids,ide,jds,jde,kds,kde, & ims,ime,jms,jme,kms,kme, & its,ite,jts,jte,kts,kte) !------------------------------------------------------------------------ ! ! Save precipitation rate and accumulation. ! !------------------------------------------------------------------------ prcrate(:,:) = wrf_raincv(:,:)/dtbig ! mm to mm/s bmjraincv(:,:) = wrf_raincv(:,:)*1.E-1 ! mm to cm !------------------------------------------------------------------------ ! ! Convert rho_dthetam_dt and rho_dqvmix_dt to dtheta_dt and dqv_dt. ! !------------------------------------------------------------------------ DO k = 2,nz-2 DO j = 1,ny-1 DO i = 1,nx-1 qvcumsrctmp = wrf_rqvcuten(i,k,j)* & (1. - (wrf_qvmix(i,k,j)*wrf_qvmix(i,k,j)))/ & (wrf_rr(i,k,j)) qcumsrc(i,j,k,1) = qcumsrc(i,j,k,1) + qvcumsrctmp ptcumsrctmp = (wrf_rthcuten(i,k,j)/wrf_rr(i,k,j)) - & (rvdrd*wrf_th(i,k,j)*qvcumsrctmp) ptcumsrctmp = ptcumsrctmp / & (1. + (rvdrd*wrf_qvmix(i,k,j))) ptcumsrc(i,j,k) = ptcumsrc(i,j,k) + ptcumsrctmp END DO ! DO i = 1,nx-1 END DO ! DO j = 1,ny-1 END DO ! DO k = 2,nz-2 !------------------------------------------------------------------------ ! ! The end. ! !------------------------------------------------------------------------ RETURN END SUBROUTINE interface_wrf_bmjdrv !######################################################################## !######################################################################## !######### ######### !######### SUBROUTINE interface_wrf_bmjinit ######### !######### ######### !######### Developed by ######### !######### Center for Analysis and Prediction of Storms ######### !######### University of Oklahoma ######### !######### ######### !######################################################################## !######################################################################## SUBROUTINE interface_wrf_bmjinit(nx,ny,nz,cldefi,restart),2 !------------------------------------------------------------------------ ! ! PURPOSE: ! ! Initializes variables and look-up tables used by the WRF version of ! the Betts-Miller-Janjic convective adjustment scheme. ! !------------------------------------------------------------------------ ! ! AUTHOR: Eric Kemp, 12 October 2001 ! ! MODIFICATION HISTORY: ! ! Eric Kemp, 12 March 2002. Removed lowlyr array. ! !------------------------------------------------------------------------ ! ! Use WRF Betts-Miller-Janjic module. ! !------------------------------------------------------------------------ USE module_cu_bmj !------------------------------------------------------------------------ ! ! Force explicit declarations. ! !------------------------------------------------------------------------ IMPLICIT NONE !------------------------------------------------------------------------ ! ! List include files. ! !------------------------------------------------------------------------ INCLUDE 'phycst.inc' !------------------------------------------------------------------------ ! ! Declare arguments. ! !------------------------------------------------------------------------ INTEGER,INTENT(IN) :: nx,ny,nz ! Grid dimensions LOGICAL,INTENT(IN) :: restart ! Restart flag REAL,INTENT(INOUT) :: cldefi(nx,ny) ! BMJ cloud efficiency. !------------------------------------------------------------------------ ! ! Local variables. Note that the arrays, while passed as arguments ! to the BMJ code, are not actually used by ARPS. Also, the 3-D ! arrays are dimensioned i,k,j. ! !------------------------------------------------------------------------ REAL :: wrf_rthcuten(nx,nz,ny) REAL :: wrf_rqvcuten(nx,nz,ny) REAL :: wrf_rqccuten(nx,nz,ny) REAL :: wrf_rqrcuten(nx,nz,ny) INTEGER :: wrf_lowlyr(nx,ny) INTEGER :: ids,ide,jds,jde,kds,kde, & ims,ime,jms,jme,kms,kme, & its,ite,jts,jte,kts,kte !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ !------------------------------------------------------------------------ ! ! Set the WRF "domain," "memory," and "tile" dimensions based on the ! ARPS dimensions. ! !------------------------------------------------------------------------ CALL interface_wrf_dims(nx,ny,nz, & ids,ide,jds,jde,kds,kde, & ims,ime,jms,jme,kms,kme, & its,ite,jts,jte,kts,kte) !------------------------------------------------------------------------ ! ! Call WRF Betts-Miller-Janjic initializer. ! !------------------------------------------------------------------------ CALL bmjinit(wrf_rthcuten,wrf_rqvcuten,wrf_rqccuten,wrf_rqrcuten, & cldefi,wrf_lowlyr,cp,rd,restart, & ids,ide,jds,jde,kds,kde, & ims,ime,jms,jme,kms,kme, & its,ite,jts,jte,kts,kte) !------------------------------------------------------------------------ ! ! The end. ! !------------------------------------------------------------------------ RETURN END SUBROUTINE interface_wrf_bmjinit !######################################################################## !######################################################################## !######### ######### !######### SUBROUTINE interface_wrf_dims ######### !######### ######### !######### Developed by ######### !######### Center for Analysis and Prediction of Storms ######### !######### University of Oklahoma ######### !######### ######### !######################################################################## !######################################################################## SUBROUTINE interface_wrf_dims(nx,ny,nz, & ids,ide,jds,jde,kds,kde, & ims,ime,jms,jme,kms,kme, & its,ite,jts,jte,kts,kte) !------------------------------------------------------------------------ ! ! PURPOSE: ! ! Assigns WRF "domain," "memory," and "tile" dimensions based on ARPS ! dimensions. ! !------------------------------------------------------------------------ ! ! AUTHOR: Eric Kemp, 11 October 2001 ! !------------------------------------------------------------------------ ! ! Force explicit declarations. ! !------------------------------------------------------------------------ IMPLICIT NONE !------------------------------------------------------------------------ ! ! Arguments ! !------------------------------------------------------------------------ INTEGER,INTENT(IN) :: nx,ny,nz ! ARPS grid dimensions INTEGER,INTENT(OUT) :: ids,ide,jds,jde,kds,kde ! WRF "domain" dims. INTEGER,INTENT(OUT) :: ims,ime,jms,jme,kms,kme ! WRF "memory" dims. INTEGER,INTENT(OUT) :: its,ite,jts,jte,kts,kte ! WRF "tile" dims. !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ !------------------------------------------------------------------------ ! ! The "domain" dimensions, while passed as arguments, are not actually ! used by the WRF BMJ scheme. ! !------------------------------------------------------------------------ ids = 1 ide = nx jds = 1 jde = ny kds = 1 kde = nz-2 !------------------------------------------------------------------------ ! ! The "memory" dimensions are used to allocate the 3-D and 2-D argument ! arrays in the WRF BMJ code. ! !------------------------------------------------------------------------ ims = 1 ime = nx jms = 1 jme = ny kms = 1 kme = nz !------------------------------------------------------------------------ ! ! The "tile" dimensions are used to allocate the 1-D arrays and are ! used as constraints for the DO loops in the WRF BMJ code. ! Also, KTE + 1 = KME. ! !------------------------------------------------------------------------ its = 1 ite = nx-1 jts = 1 jte = ny-1 kts = 1 kte = nz-3 ! kts = 2 ! kte = nz-1 !------------------------------------------------------------------------ ! ! The end. ! !------------------------------------------------------------------------ RETURN END SUBROUTINE interface_wrf_dims