!WRF:MEDIATION_LAYER:PHYSICS ! MODULE module_shallowcu_driver 1 CONTAINS SUBROUTINE shallowcu_driver( & 1,11 ! Order dependent args for domain, mem, and tile dims ids,ide, jds,jde, kds,kde & ,ims,ime, jms,jme, kms,kme & ,ips,ipe, jps,jpe, kps,kpe & ,i_start,i_end,j_start,j_end,kts,kte,num_tiles & ! Order independent args (use VAR= in call) ! --Prognostic ,u,v,th,t & ,p,pi,rho,moist & ! --Other arguments ,num_moist & ,itimestep,dt,dx,cudt,curr_secs,adapt_step_flag & ,rainsh,pratesh,nca,rainshv & ,z,z_at_w,dz8w,mavail,pblh,p8w & ,tke_pbl & ,cldfra,cldfra_old,cldfra_old_mp,cldfra_conv & ,cldfrash & ,htop,hbot & ! Package selection variables ,shcu_physics & ! Optional moisture tracers ,qv_curr, qc_curr, qr_curr & ,qi_curr, qs_curr, qg_curr & ,qnc_curr,qni_curr & #ifdef WRF_CHEM ,chem, chem_opt & #endif ! Optional output arguments for CAMZM scheme ,dlf, rliq, rliq2,dlf2 & ,cmfmc, cmfmc2 & ! Optional output arguments for CAMUW scheme ,cush, snowsh, icwmrsh, rprdsh, cbmf, cmfsl & ,cmflq, evapcsh & ! Optional moisture and other tendencies ,rqvshten,rqcshten,rqrshten & ,rqishten,rqsshten,rqgshten & ,rqcnshten,rqinshten & ,rqvblten,rqvften & ,rushten,rvshten & ,rthshten,rthraten,rthblten,rthften & ! Optional moisture tracer flags ,f_qv,f_qc,f_qr & ,f_qi,f_qs,f_qg & ,ht,shfrc3d,is_CAMMGMP_used & ! for grims shallow convection with ysupbl ,wstar,delta,kpbl,znu,raincv & ) !---------------------------------------------------------------------- USE module_model_constants USE module_state_description, ONLY: CAMUWSHCUSCHEME & # if (EM_CORE == 1) , CAMMGMPSCHEME & # endif , G3SHCUSCHEME & , GRIMSSHCUSCHEME ! *** add new modules of schemes here USE module_shcu_camuwshcu_driver, ONLY : camuwshcu_driver USE module_shcu_grims USE module_dm USE module_domain, ONLY: domain #ifdef WRF_CHEM USE module_state_description, ONLY: num_chem #endif ! This driver calls subroutines for the shallow cumulus ! parameterizations. ! ! 1. G3 shallow cumulus ! 2. UW shallow cumulus from CAM ! 3. GRIMs shallow cumulus from GRIMs (available only with ysupbl) ! !---------------------------------------------------------------------- IMPLICIT NONE !====================================================================== ! Grid structure in physics part of WRF !---------------------------------------------------------------------- ! The horizontal velocities used in the physics are unstaggered ! relative to temperature/moisture variables. All predicted ! variables are carried at half levels except w, which is at full ! levels. Some arrays with names (*8w) are at w (full) levels. ! !---------------------------------------------------------------------- ! In WRF, kms (smallest number) is the bottom level and kme (largest ! number) is the top level. In your scheme, if 1 is at the top level, ! then you have to reverse the order in the k direction. ! ! kme - half level (no data at this level) ! kme ----- full level ! kme-1 - half level ! kme-1 ----- full level ! . ! . ! . ! kms+2 - half level ! kms+2 ----- full level ! kms+1 - half level ! kms+1 ----- full level ! kms - half level ! kms ----- full level ! !====================================================================== ! Definitions !----------- ! Rho_d dry density (kg/m^3) ! Theta_m moist potential temperature (K) ! Qv water vapor mixing ratio (kg/kg) ! Qc cloud water mixing ratio (kg/kg) ! Qr rain water mixing ratio (kg/kg) ! Qi cloud ice mixing ratio (kg/kg) ! Qs snow mixing ratio (kg/kg) !----------------------------------------------------------------- !-- DT time step (second) !-- CUDT cumulus time step (minute) !-- curr_secs current forecast time (seconds) !-- itimestep number of time step (integer) !-- DX horizontal space interval (m) !-- rr dry air density (kg/m^3) ! !-- RUSHTEN Zonal wind tendency due to shallow ! cumulus scheme precipitation (m/s/s) !-- RVSHTEN Meridional wind tendency due to ! cumulus scheme precipitation (m/s/s) !-- RTHSHTEN Theta tendency due to shallow ! cumulus scheme precipitation (K/s) !-- RQVSHTEN Qv tendency due to shallow ! cumulus scheme precipitation (kg/kg/s) !-- RQRSHTEN Qr tendency due to shallow ! cumulus scheme precipitation (kg/kg/s) !-- RQCSHTEN Qc tendency due to shallow ! cumulus scheme precipitation (kg/kg/s) !-- RQSSHTEN Qs tendency due to shallow ! cumulus scheme precipitation (kg/kg/s) !-- RQISHTEN Qi tendency due to shallow ! cumulus scheme precipitation (kg/kg/s) !-- RQGSHTEN Qg tendency due to shallow ! cumulus scheme precipitation (kg/kg/s) ! !-- RAINSH accumulated total shallow cumulus scheme precipitation (mm) !-- RAINSHV time-step shallow cumulus scheme precipitation (mm) !-- PRATESH precipitiation rate from shallow cumulus scheme (mm/s) !-- NCA counter of the cloud relaxation ! time in KF cumulus scheme (integer) !-- u_phy u-velocity interpolated to theta points (m/s) !-- v_phy v-velocity interpolated to theta points (m/s) !-- th_phy potential temperature (K) !-- t_phy temperature (K) !-- tke_pbl turbulent kinetic energy from PBL scheme (m2/s2) !-- w vertical velocity (m/s) !-- moist moisture array (4D - last index is species) (kg/kg) !-- z height above sea level at middle of layers (m) !-- z_at_w height above sea level at layer interfaces (m) !-- dz8w dz between full levels (m) !-- pblh planetary boundary layer height (m) !-- mavail soil moisture availability !-- p8w pressure at full levels (Pa) !-- p_phy pressure (Pa) !-- pi_phy the exner function, (p/p0)**(R/Cp) (dimensionless) ! points (dimensionless) !-- hfx upward heat flux at surface (W/m2) !-- RTHRATEN radiative temp forcing for Grell-Devenyi scheme !-- RTHBLTEN PBL temp forcing for Grell-Devenyi scheme !-- RQVBLTEN PBL moisture forcing for Grell-Devenyi scheme !-- RTHFTEN !-- RQVFTEN !-- cldfra cloud fraction !-- cldfra_old cloud fraction from previous time step !-- cldfrash cloud fraction from shallow Cu !-- cldfra_old_mp cloud fraction from previous time step if CAMMGMP microphysics is used !-- cldfra_conv convective cloud fraction !-- rho density (kg/m^3) !-- XLV0 latent heat of vaporization constant ! used in temperature dependent formula (J/kg) !-- XLV1 latent heat of vaporization constant ! used in temperature dependent formula (J/kg/K) !-- XLS0 latent heat of sublimation constant ! used in temperature dependent formula (J/kg) !-- XLS1 latent heat of sublimation constant ! used in temperature dependent formula (J/kg/K) !-- R_d gas constant for dry air ( 287. J/kg/K) !-- R_v gas constant for water vapor (461 J/k/kg) !-- Cp specific heat at constant pressure (1004 J/k/kg) !-- rvovrd R_v divided by R_d (dimensionless) !-- G acceleration due to gravity (m/s^2) !-- EP_1 constant for virtual temperature ! (R_v/R_d - 1) (dimensionless) !--shfrc3d Shallow cloud fraction !-- cmfmc Deep + Shallow Convective m !-- ids start index for i in domain !-- ide end index for i in domain !-- jds start index for j in domain !-- jde end index for j in domain !-- kds start index for k in domain !-- kde end index for k in domain !-- ims start index for i in memory !-- ime end index for i in memory !-- jms start index for j in memory !-- jme end index for j in memory !-- kms start index for k in memory !-- kme end index for k in memory !-- i_start start indices for i in tile !-- i_end end indices for i in tile !-- j_start start indices for j in tile !-- j_end end indices for j in tile !-- kts start index for k in tile !-- kte end index for k in tile !-- num_tiles number of tiles !-- HBOT index of lowest model layer with convection !-- HTOP index of highest model layer with convection !-- LBOT index of lowest model layer with convection !-- LTOP index of highest model layer with convection !-- periodic_x T/F this is using periodic lateral boundaries in the X direction !-- periodic_y T/F this is using periodic lateral boundaries in the Y-direction ! !====================================================================== LOGICAL, INTENT(IN ) :: is_CAMMGMP_used !BSINGH:01/31/2013: Added for CAMUWSHCU INTEGER, INTENT(IN ) :: & ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & kts,kte, & itimestep, num_tiles #ifdef WRF_CHEM INTEGER, INTENT(IN ) :: chem_opt #endif INTEGER, DIMENSION(num_tiles), INTENT(IN) :: & & i_start,i_end,j_start,j_end INTEGER, INTENT(IN ) :: & num_moist INTEGER, INTENT(IN ) :: shcu_physics REAL, DIMENSION( ims:ime, kms:kme, jms:jme, num_moist ), & INTENT(INOUT) :: & moist #ifdef WRF_CHEM REAL, DIMENSION( ims:ime, kms:kme, jms:jme, num_chem ), & INTENT(INOUT) :: & chem #endif REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), & INTENT(IN ) :: & cldfra & ,cldfra_old & ,cldfra_old_mp & ,cldfra_conv & , z & , z_at_w & , dz8w & , p8w & , p & , pi & , u & , v & , th & , t & , tke_pbl & , rho REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN) :: & MAVAIL,PBLH,ht REAL, DIMENSION( ims:ime , jms:jme ), & INTENT(INOUT) :: RAINSH & , NCA & , HTOP & , HBOT REAL, DIMENSION( ims:ime , jms:jme ),INTENT(INOUT),OPTIONAL :: & PRATESH, RAINSHV REAL, DIMENSION( ims:ime , jms:jme ) :: tmppratesh REAL, INTENT(IN ) :: DT, DX INTEGER, INTENT(IN ),OPTIONAL :: & ips,ipe, jps,jpe, kps,kpe REAL, INTENT(IN ),OPTIONAL :: CUDT REAL, INTENT(IN ),OPTIONAL :: CURR_SECS LOGICAL,INTENT(IN ),OPTIONAL :: adapt_step_flag REAL :: cudt_pass, curr_secs_pass LOGICAL :: adapt_step_flag_pass ! ! optional arguments ! REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), & OPTIONAL, INTENT(INOUT) :: & ! optional moisture tracers qv_curr, qc_curr, qr_curr & ,qi_curr, qs_curr, qg_curr & ! optional scalar tracers !BSINGH ,qnc_curr,qni_curr & ! optional moisture and other tendencies ,rqvshten,rqcshten,rqrshten & ,rqishten,rqsshten,rqgshten & ,rqcnshten,rqinshten & ,rqvblten,rqvften & ,rthraten,rthblten & ,rthften,rushten,rvshten,rthshten REAL, DIMENSION( ims:ime , jms:jme ), & OPTIONAL, INTENT(INOUT) :: & rliq, rliq2 & ,cbmf, cush, snowsh REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), & OPTIONAL, INTENT(INOUT) :: & cldfrash, cmfsl, cmflq, icwmrsh, & dlf, evapcsh, & cmfmc, cmfmc2, rprdsh REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), & INTENT(OUT) :: & dlf2 ! Required by CAMMGMP Microphysics REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), & INTENT(OUT) :: & shfrc3d ! Required by wet scavenging code in WRF_CHEM ! for grims shallow convection with ysupbl ! REAL, DIMENSION( ims:ime, jms:jme ) , & OPTIONAL, INTENT(IN ) :: wstar REAL, DIMENSION( ims:ime, jms:jme ) , & OPTIONAL, INTENT(IN ) :: delta REAL, DIMENSION( ims:ime, jms:jme ) , & OPTIONAL, INTENT(IN ) :: raincv REAL, DIMENSION( kms:kme ) , & OPTIONAL, INTENT(IN ) :: znu INTEGER, DIMENSION( ims:ime , jms:jme ) , & OPTIONAL, INTENT(IN) :: kpbl ! ! Flags relating to the optional tendency arrays declared above ! Models that carry the optional tendencies will provdide the ! optional arguments at compile time; these flags all the model ! to determine at run-time whether a particular tracer is in ! use or not. ! LOGICAL, INTENT(IN), OPTIONAL :: & f_qv & ,f_qc & ,f_qr & ,f_qi & ,f_qs & ,f_qg ! LOCAL VAR INTEGER :: i,j,k,its,ite,jts,jte,ij CHARACTER(len=200) :: message !----------------------------------------------------------------- if (.not. PRESENT(CURR_SECS)) then curr_secs_pass = -1 else curr_secs_pass = curr_secs endif if (.not. PRESENT(CUDT)) then cudt_pass = -1 else cudt_pass = cudt endif if (.not. PRESENT(adapt_step_flag)) then adapt_step_flag_pass = .false. else adapt_step_flag_pass = adapt_step_flag endif ! Initialize tmppratesh to pratesh if ( PRESENT ( pratesh ) ) then tmppratesh(:,:) = pratesh(:,:) else tmppratesh(:,:) = 0. end if IF (shcu_physics .eq. 0) return ! DON'T JUDGE TIME STEP HERE, SINCE KF NEEDS ACCUMULATED W FIELD. ! DO IT INSIDE THE INDIVIDUAL CUMULUS SCHEME ! SET START AND END POINTS FOR TILES !$OMP PARALLEL DO & !$OMP PRIVATE ( ij ,its,ite,jts,jte, i,j,k) DO ij = 1 , num_tiles its = i_start(ij) ite = i_end(ij) jts = j_start(ij) jte = j_end(ij) scps_select: SELECT CASE(shcu_physics) CASE (G3SHCUSCHEME) ! This setting takes the place of ishallow in v3.1.1+ CASE (CAMUWSHCUSCHEME) CALL wrf_debug(100,'in camuw_scps') IF(.not.f_qi)THEN WRITE( message , * ) 'This shallow cumulus option requires ice microphysics option: f_qi = ', f_qi CALL wrf_error_fatal ( message ) ENDIF CALL camuwshcu_driver( & IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde & ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme & ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte & ,NUM_MOIST=num_moist, DT=dt & ,P=p, P8W=p8w, PI_PHY=pi & ,Z=z, Z_AT_W=z_at_w, DZ8W=dz8w & ,T_PHY=t, U_PHY=u, V_PHY=v & ,MOIST=moist, QV=qv_curr, QC=qc_curr, QI=qi_curr & ,QNC=qnc_curr, QNI=qni_curr & #ifdef WRF_CHEM ,CHEM=chem, CHEM_OPT=chem_opt & #endif ,PBLH_IN=pblh, TKE_PBL=tke_pbl & ,CLDFRA=cldfra, CLDFRA_OLD=cldfra_old & ,CLDFRA_OLD_MP=cldfra_old_mp & ,CLDFRA_CONV=cldfra_conv,IS_CAMMGMP_USED=is_CAMMGMP_used & ,CLDFRASH=cldfrash & ,CUSH_INOUT=cush, PRATESH=tmppratesh & ,SNOWSH=snowsh & ,ICWMRSH=icwmrsh, CMFMC=cmfmc, CMFMC2_INOUT=cmfmc2 & ,RPRDSH_INOUT=rprdsh, CBMF_INOUT=cbmf & ,CMFSL=cmfsl, CMFLQ=cmflq, DLF=dlf,DLF2=dlf2 & !DLF2 is required by CAMMGMP microphysics ,EVAPCSH_INOUT=evapcsh & ,RLIQ=rliq, RLIQ2_INOUT=rliq2, CUBOT=hbot, CUTOP=htop & ,RUSHTEN=rushten, RVSHTEN=rvshten, RTHSHTEN=rthshten & ,RQVSHTEN=rqvshten, RQCSHTEN=rqcshten, RQRSHTEN=rqrshten & ,RQISHTEN=rqishten, RQSSHTEN=rqsshten, RQGSHTEN=rqgshten & ,RQCNSHTEN=rqcnshten,RQINSHTEN=rqinshten & ,HT=ht,SHFRC3D=shfrc3d,ITIMESTEP=itimestep & ) CASE (GRIMSSHCUSCHEME) CALL wrf_debug(100,'in grims_scps') IF ( PRESENT( wstar ) ) THEN CALL grims( & QV3D=qv_curr,T3D=t & ,P3DI=p8w,P3D=p,PI3D=pi,Z3DI=Z_AT_W & ,WSTAR=wstar,HPBL=pblh,DELTA=delta & ,RTHSHTEN=rthshten,RQVSHTEN=rqvshten & ,DT=dt,G=g,XLV=xlv,RD=r_d,RV=r_v & ,RCP=rcp,P1000MB=p1000mb & ,KPBL2D=kpbl,ZNU=znu,RAINCV=raincv & ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde & ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme & ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte & ) ENDIF CASE DEFAULT WRITE( message , * ) 'The shallow cumulus option does not exist: shcu_physics = ', shcu_physics CALL wrf_error_fatal ( message ) END SELECT scps_select ENDDO !$OMP END PARALLEL DO ! ! Copy pratesh back to output array, if necessary. ! if (PRESENT(PRATESH)) then pratesh(:,:) = tmppratesh(:,:) if (PRESENT(RAINSHV)) then rainshv(:,:) = pratesh(:,:)*dt endif endif END SUBROUTINE shallowcu_driver END MODULE module_shallowcu_driver