diff --git a/physics/GFS_rrtmg_pre.F90 b/physics/GFS_rrtmg_pre.F90 index 7e7d9750b..15845d4b3 100644 --- a/physics/GFS_rrtmg_pre.F90 +++ b/physics/GFS_rrtmg_pre.F90 @@ -36,7 +36,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, & gasvmr_ccl4, gasvmr_cfc113, aerodp, clouds6, clouds7, clouds8, & clouds9, cldsa, cldfra, cldfra2d, lwp_ex,iwp_ex, lwp_fc,iwp_fc, & faersw1, faersw2, faersw3, faerlw1, faerlw2, faerlw3, alpha, & - errmsg, errflg) + spp_wts_rad, spp_rad, errmsg, errflg) use machine, only: kind_phys @@ -104,6 +104,9 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, & uni_cld, effr_in, do_mynnedmf, & lmfshal, lmfdeep2, pert_clds + integer, intent(in) :: spp_rad + real(kind_phys), intent(in) :: spp_wts_rad(:,:) + real(kind=kind_phys), intent(in) :: fhswr, fhlwr, solhr, sup, julian, sppt_amp real(kind=kind_phys), intent(in) :: con_eps, epsm1, fvirt, rog, rocp, con_rd @@ -1060,6 +1063,24 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, & enddo enddo + if ( spp_rad == 1 ) then + do k=1,lm + if (k < levs) then + do i=1,im + clouds3(i,k) = clouds3(i,k) - spp_wts_rad(i,k) * clouds3(i,k) + clouds5(i,k) = clouds5(i,k) - spp_wts_rad(i,k) * clouds5(i,k) + clouds9(i,k) = clouds9(i,k) - spp_wts_rad(i,k) * clouds9(i,k) + enddo + else + do i=1,im + clouds3(i,k) = clouds3(i,k) - spp_wts_rad(i,k) * clouds3(i,k) + clouds5(i,k) = clouds5(i,k) - spp_wts_rad(i,k) * clouds5(i,k) + clouds9(i,k) = clouds9(i,k) - spp_wts_rad(i,k) * clouds9(i,k) + enddo + endif + enddo + endif + ! mg, sfc-perts ! --- scale random patterns for surface perturbations with ! perturbation size diff --git a/physics/GFS_rrtmg_pre.meta b/physics/GFS_rrtmg_pre.meta index 48fc31c49..1eac8a571 100644 --- a/physics/GFS_rrtmg_pre.meta +++ b/physics/GFS_rrtmg_pre.meta @@ -532,7 +532,7 @@ [sfc_wts] standard_name = surface_stochastic_weights_from_coupled_process long_name = weights for stochastic surface physics perturbation - units = none + units = 1 dimensions = (horizontal_loop_extent,number_of_perturbed_land_surface_variables) type = real kind = kind_phys @@ -1082,6 +1082,21 @@ type = real kind = kind_phys intent = out +[spp_wts_rad] + standard_name = spp_weights_for_radiation_scheme + long_name = spp weights for radiation scheme + units = 1 + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + intent = in +[spp_rad] + standard_name = control_for_radiation_spp_perturbations + long_name = control for radiation spp perturbations + units = count + dimensions = () + type = integer + intent = in [errmsg] standard_name = ccpp_error_message long_name = error message for error handling in CCPP diff --git a/physics/GFS_surface_generic.meta b/physics/GFS_surface_generic.meta index 6ad2953a6..28c88c5ea 100644 --- a/physics/GFS_surface_generic.meta +++ b/physics/GFS_surface_generic.meta @@ -310,7 +310,7 @@ [sfc_wts] standard_name = surface_stochastic_weights_from_coupled_process long_name = weights for stochastic surface physics perturbation - units = none + units = 1 dimensions = (horizontal_loop_extent,number_of_perturbed_land_surface_variables) type = real kind = kind_phys diff --git a/physics/drag_suite.F90 b/physics/drag_suite.F90 index d2d435e4c..7fea98b13 100644 --- a/physics/drag_suite.F90 +++ b/physics/drag_suite.F90 @@ -218,7 +218,8 @@ subroutine drag_suite_run( & & do_gsl_drag_ls_bl, do_gsl_drag_ss, do_gsl_drag_tofd, & & dtend, dtidx, index_of_process_orographic_gwd, & & index_of_temperature, index_of_x_wind, & - & index_of_y_wind, ldiag3d, errmsg, errflg) + & index_of_y_wind, ldiag3d, & + & spp_wts_gwd, spp_gwd, errmsg, errflg) ! ******************************************************************** ! -----> I M P L E M E N T A T I O N V E R S I O N <---------- @@ -365,6 +366,11 @@ subroutine drag_suite_run( & real(kind=kind_phys), dimension(im,km) :: zl ! = PHIL/g !SPP + real(kind=kind_phys), dimension(im) :: var_stoch, varss_stoch, & + varmax_ss_stoch, varmax_fd_stoch + real(kind=kind_phys), intent(in) :: spp_wts_gwd(:,:) + integer, intent(in) :: spp_gwd + real(kind=kind_phys), dimension(im) :: rstoch !Output: @@ -595,6 +601,23 @@ subroutine drag_suite_run( & endif enddo +! SPP, if spp_gwd is 0, no perturbations are applied. +if ( spp_gwd==1 ) then + do i = its,im + var_stoch(i) = var(i) + var(i)*0.75*spp_wts_gwd(i,1) + varss_stoch(i) = varss(i) + varss(i)*0.75*spp_wts_gwd(i,1) + varmax_ss_stoch(i) = varmax_ss + varmax_ss*0.75*spp_wts_gwd(i,1) + varmax_fd_stoch(i) = varmax_fd + varmax_fd*0.75*spp_wts_gwd(i,1) + enddo +else + do i = its,im + var_stoch(i) = var(i) + varss_stoch(i) = varss(i) + varmax_ss_stoch(i) = varmax_ss + varmax_fd_stoch(i) = varmax_fd + enddo +endif + !--- calculate length of grid for flow-blocking drag ! do i=1,im @@ -711,7 +734,7 @@ subroutine drag_suite_run( & ! determine reference level: maximum of 2*var and pbl heights ! do i = its,im - zlowtop(i) = 2. * var(i) + zlowtop(i) = 2. * var_stoch(i) enddo ! do i = its,im @@ -867,7 +890,7 @@ subroutine drag_suite_run( & ! ldrag(i) = ldrag(i) .or. bnv2(i,1).le.0.0 ldrag(i) = ldrag(i) .or. ulow(i).eq.1.0 - ldrag(i) = ldrag(i) .or. var(i) .le. 0.0 + ldrag(i) = ldrag(i) .or. var_stoch(i) .le. 0.0 ! ! set all ri low level values to the low level value ! @@ -877,7 +900,7 @@ subroutine drag_suite_run( & ! if (.not.ldrag(i)) then bnv(i) = sqrt( bnv2(i,1) ) - fr(i) = bnv(i) * rulow(i) * 2. * var(i) * od(i) + fr(i) = bnv(i) * rulow(i) * 2. * var_stoch(i) * od(i) fr(i) = min(fr(i),frmax) xn(i) = ubar(i) * rulow(i) yn(i) = vbar(i) * rulow(i) @@ -961,7 +984,7 @@ subroutine drag_suite_run( & exit ENDIF enddo - if((xland(i)-1.5).le.0. .and. 2.*varss(i).le.hpbl(i))then + if((xland(i)-1.5).le.0. .and. 2.*varss_stoch(i).le.hpbl(i))then if(br1(i).gt.0. .and. thvx(i,kpbl2)-thvx(i,kts) > 0.)then cleff_ss = sqrt(dxy(i)**2 + dxyp(i)**2) ! WRF ! cleff_ss = 3. * max(dx(i),cleff_ss) @@ -980,8 +1003,8 @@ subroutine drag_suite_run( & !tauwavex0=0.5*XNBV*xlinv(i)*(2*MIN(varss(i),75.))**2*ro(i,kts)*u1(i,kpbl(i)) !tauwavex0=0.5*XNBV*xlinv(i)*(2.*MIN(varss(i),40.))**2*ro(i,kts)*u1(i,kpbl2) !tauwavex0=0.5*XNBV*xlinv(i)*(2.*MIN(varss(i),40.))**2*ro(i,kts)*u1(i,3) - var_temp = MIN(varss(i),varmax_ss) + & - MAX(0.,beta_ss*(varss(i)-varmax_ss)) + var_temp = MIN(varss_stoch(i),varmax_ss_stoch(i)) + & + MAX(0.,beta_ss*(varss_stoch(i)-varmax_ss_stoch(i))) ! Note: This is a semi-implicit treatment of the time differencing var_temp2 = 0.5*XNBV*xlinv(i)*(2.*var_temp)**2*ro(i,kvar) ! this is greater than zero tauwavex0=var_temp2*u1(i,kvar)/(1.+var_temp2*deltim) @@ -995,8 +1018,8 @@ subroutine drag_suite_run( & !tauwavey0=0.5*XNBV*xlinv(i)*(2*MIN(varss(i),75.))**2*ro(i,kts)*v1(i,kpbl(i)) !tauwavey0=0.5*XNBV*xlinv(i)*(2.*MIN(varss(i),40.))**2*ro(i,kts)*v1(i,kpbl2) !tauwavey0=0.5*XNBV*xlinv(i)*(2.*MIN(varss(i),40.))**2*ro(i,kts)*v1(i,3) - var_temp = MIN(varss(i),varmax_ss) + & - MAX(0.,beta_ss*(varss(i)-varmax_ss)) + var_temp = MIN(varss_stoch(i),varmax_ss_stoch(i)) + & + MAX(0.,beta_ss*(varss_stoch(i)-varmax_ss_stoch(i))) ! Note: This is a semi-implicit treatment of the time differencing var_temp2 = 0.5*XNBV*xlinv(i)*(2.*var_temp)**2*ro(i,kvar) ! this is greater than zero tauwavey0=var_temp2*v1(i,kvar)/(1.+var_temp2*deltim) @@ -1060,8 +1083,8 @@ subroutine drag_suite_run( & IF ((xland(i)-1.5) .le. 0.) then !(IH*kflt**n1)**-1 = (0.00102*0.00035**-1.9)**-1 = 0.00026615161 - var_temp = MIN(varss(i),varmax_fd) + & - MAX(0.,beta_fd*(varss(i)-varmax_fd)) + var_temp = MIN(varss_stoch(i),varmax_fd_stoch(i)) + & + MAX(0.,beta_fd*(varss_stoch(i)-varmax_fd_stoch(i))) var_temp = MIN(var_temp, 250.) a1=0.00026615161*var_temp**2 ! a1=0.00026615161*MIN(varss(i),varmax)**2 @@ -1069,7 +1092,7 @@ subroutine drag_suite_run( & ! k1**(n1-n2) = 0.003**(-1.9 - -2.8) = 0.003**0.9 = 0.005363 a2=a1*0.005363 ! Revise e-folding height based on PBL height and topographic std. dev. -- M. Toy 3/12/2018 - H_efold = max(2*varss(i),hpbl(i)) + H_efold = max(2*varss_stoch(i),hpbl(i)) H_efold = min(H_efold,1500.) DO k=kts,km wsp=SQRT(u1(i,k)**2 + v1(i,k)**2) diff --git a/physics/drag_suite.meta b/physics/drag_suite.meta index c7af87f0b..8de3610f5 100644 --- a/physics/drag_suite.meta +++ b/physics/drag_suite.meta @@ -624,6 +624,21 @@ dimensions = () type = logical intent = in +[spp_wts_gwd] + standard_name = spp_weights_for_gravity_wave_drag_scheme + long_name = spp weights for gravity wave drag scheme + units = 1 + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + intent = in +[spp_gwd] + standard_name = control_for_gravity_wave_drag_spp_perturbations + long_name = control for gravity wave drag spp perturbations + units = count + dimensions = () + type = integer + intent = in [errmsg] standard_name = ccpp_error_message long_name = error message for error handling in CCPP diff --git a/physics/module_MYNNPBL_wrapper.F90 b/physics/module_MYNNPBL_wrapper.F90 index 834e22db0..7c0ba1ba4 100644 --- a/physics/module_MYNNPBL_wrapper.F90 +++ b/physics/module_MYNNPBL_wrapper.F90 @@ -108,7 +108,7 @@ SUBROUTINE mynnedmf_wrapper_run( & & icloud_bl, do_mynnsfclay, & & imp_physics, imp_physics_gfdl, & & imp_physics_thompson, imp_physics_wsm6, & - & ltaerosol, lprnt, huge, errmsg, errflg ) + & ltaerosol, spp_wts_pbl, spp_pbl, lprnt, huge, errmsg, errflg ) ! should be moved to inside the mynn: use machine , only : kind_phys @@ -209,7 +209,8 @@ SUBROUTINE mynnedmf_wrapper_run( & & bl_mynn_output, & & grav_settling, & & imp_physics, imp_physics_wsm6, & - & imp_physics_thompson, imp_physics_gfdl + & imp_physics_thompson, imp_physics_gfdl, & + & spp_pbl !TENDENCY DIAGNOSTICS real(kind=kind_phys), intent(inout), optional :: dtend(:,:,:) @@ -220,8 +221,8 @@ SUBROUTINE mynnedmf_wrapper_run( & !MISC CONFIGURATION OPTIONS INTEGER, PARAMETER :: & - & spp_pbl=0, & - & bl_mynn_mixscalars=1 + & bl_mynn_mixscalars=1, & + & levflag=2 REAL, PARAMETER :: & & closure=2.6 !2.5, 2.6 or 3.0 LOGICAL :: & @@ -231,7 +232,7 @@ SUBROUTINE mynnedmf_wrapper_run( & LOGICAL, PARAMETER :: cycling = .false. INTEGER, PARAMETER :: param_first_scalar = 1 INTEGER :: & - & p_qc, p_qr, p_qi, p_qs, p_qg, p_qnc, p_qni + & p_qc, p_qr, p_qi, p_qs, p_qg, p_qnc, p_qni !MYNN-1D REAL(kind=kind_phys), intent(in) :: delt, dtf @@ -275,6 +276,9 @@ SUBROUTINE mynnedmf_wrapper_run( & & Tsq, Qsq, Cov, exch_h, exch_m real(kind=kind_phys), dimension(:), intent(in) :: xmu real(kind=kind_phys), dimension(:,:), intent(in) :: htrsw, htrlw + ! spp_wts_pbl only allocated if spp_pbl == 1 + real(kind_phys), dimension(:,:), intent(in) :: spp_wts_pbl + !LOCAL real(kind=kind_phys), dimension(im,levs) :: & & sqv,sqc,sqi,qnc,qni,ozone,qnwfa,qnifa, & @@ -282,8 +286,7 @@ SUBROUTINE mynnedmf_wrapper_run( & & RUBLTEN, RVBLTEN, RTHBLTEN, RQVBLTEN, & & RQCBLTEN, RQNCBLTEN, RQIBLTEN, RQNIBLTEN, & & RQNWFABLTEN, RQNIFABLTEN, & - & dqke,qWT,qSHEAR,qBUOY,qDISS, & - & pattern_spp_pbl + & dqke,qWT,qSHEAR,qBUOY,qDISS real(kind=kind_phys), allocatable :: old_ozone(:,:) !MYNN-CHEM arrays @@ -525,9 +528,9 @@ SUBROUTINE mynnedmf_wrapper_run( & ! qi(i,k)=qi(i,k)/(1.0 - qvsh(i,k)) rho(i,k)=prsl(i,k)/(r_d*t3d(i,k)) w(i,k) = -omega(i,k)/(rho(i,k)*g) - pattern_spp_pbl(i,k)=0.0 enddo enddo + do i=1,im if (slmsk(i)==1. .or. slmsk(i)==2.) then !sea/land/ice mask (=0/1/2) in FV3 xland(i)=1.0 !but land/water = (1/2) in SFCLAY_mynn @@ -703,7 +706,7 @@ SUBROUTINE mynnedmf_wrapper_run( & & ,det_thl3D=det_thl,det_sqv3D=det_sqv & & ,nupdraft=nupdraft,maxMF=maxMF & !output & ,ktop_plume=ktop_plume & !output - & ,spp_pbl=spp_pbl,pattern_spp_pbl=pattern_spp_pbl & !input + & ,spp_pbl=spp_pbl,pattern_spp_pbl=spp_wts_pbl & !input & ,RTHRATEN=htrlw & !input & ,FLAG_QI=flag_qi,FLAG_QNI=flag_qni & !input & ,FLAG_QC=flag_qc,FLAG_QNC=flag_qnc & !input diff --git a/physics/module_MYNNPBL_wrapper.meta b/physics/module_MYNNPBL_wrapper.meta index d1a74fdb9..3e3267668 100644 --- a/physics/module_MYNNPBL_wrapper.meta +++ b/physics/module_MYNNPBL_wrapper.meta @@ -1257,6 +1257,21 @@ dimensions = () type = logical intent = in +[spp_wts_pbl] + standard_name = spp_weights_for_pbl_scheme + long_name = spp weights for pbl scheme + units = 1 + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + intent = in +[spp_pbl] + standard_name = control_for_pbl_spp_perturbations + long_name = control for pbl spp perturbations + units = count + dimensions = () + type = integer + intent = in [lprnt] standard_name = flag_print long_name = control flag for diagnostic print out diff --git a/physics/module_MYNNSFC_wrapper.F90 b/physics/module_MYNNSFC_wrapper.F90 index 4595bf163..150a66472 100644 --- a/physics/module_MYNNSFC_wrapper.F90 +++ b/physics/module_MYNNSFC_wrapper.F90 @@ -88,6 +88,7 @@ SUBROUTINE mynnsfc_wrapper_run( & & FLHC, FLQC, & & U10, V10, TH2, T2, Q2, & & wstar, CHS2, CQS2, & + & spp_wts_sfc, spp_sfc, & ! & CP, G, ROVCP, R, XLV, & ! & SVP1, SVP2, SVP3, SVPT0, & ! & EP1,EP2,KARMAN, & @@ -143,7 +144,6 @@ SUBROUTINE mynnsfc_wrapper_run( & !MISC CONFIGURATION OPTIONS INTEGER, PARAMETER :: & - & spp_pbl = 0, & & isftcflx = 0, & !control: 0 & iz0tlnd = 0, & !control: 0 & isfflx = 1 @@ -155,12 +155,15 @@ SUBROUTINE mynnsfc_wrapper_run( & integer, intent(in) :: ivegsrc integer, intent(in) :: sfc_z0_type ! option for calculating surface roughness length over ocean logical, intent(in) :: redrag ! reduced drag coeff. flag for high wind over sea (j.han) + integer, intent(in) :: spp_sfc ! flag for using SPP perturbations + real(kind=kind_phys), intent(in) :: delt !Input data integer, dimension(:), intent(in) :: vegtype real(kind=kind_phys), dimension(:), intent(in) :: & & sigmaf,shdmax,z0pert,ztpert + real(kind_phys), dimension(:,:), intent(in) :: spp_wts_sfc real(kind=kind_phys), dimension(:,:), & & intent(in) :: phii @@ -207,7 +210,7 @@ SUBROUTINE mynnsfc_wrapper_run( & & cpm, qgh, qfx, snowh_wat real(kind=kind_phys), dimension(im,levs) :: & - & pattern_spp_pbl, dz, th, qv + & dz, th, qv !MYNN-1D INTEGER :: k, i @@ -228,7 +231,6 @@ SUBROUTINE mynnsfc_wrapper_run( & ! endif ! prep MYNN-only variables - pattern_spp_pbl(:,:) = 0 dz(:,:) = 0 th(:,:) = 0 qv(:,:) = 0 @@ -243,6 +245,7 @@ SUBROUTINE mynnsfc_wrapper_run( & qv(i,k)=qvsh(i,k)/(1.0 - qvsh(i,k)) enddo enddo + do i=1,im if (slmsk(i)==1. .or. slmsk(i)==2.)then !sea/land/ice mask (=0/1/2) in FV3 xland(i)=1.0 !but land/water = (1/2) in SFCLAY_mynn @@ -336,7 +339,7 @@ SUBROUTINE mynnsfc_wrapper_run( & QGH=qgh,QSFC=qsfc, & U10=u10,V10=v10,TH2=th2,T2=t2,Q2=q2, & GZ1OZ0=GZ1OZ0,WSPD=wspd,wstar=wstar, & - spp_pbl=spp_pbl,pattern_spp_pbl=pattern_spp_pbl, & + spp_sfc=spp_sfc,pattern_spp_sfc=spp_wts_sfc, & ids=1,ide=im, jds=1,jde=1, kds=1,kde=levs, & ims=1,ime=im, jms=1,jme=1, kms=1,kme=levs, & its=1,ite=im, jts=1,jte=1, kts=1,kte=levs, & diff --git a/physics/module_MYNNSFC_wrapper.meta b/physics/module_MYNNSFC_wrapper.meta index ef5025886..4e73504d7 100644 --- a/physics/module_MYNNSFC_wrapper.meta +++ b/physics/module_MYNNSFC_wrapper.meta @@ -834,6 +834,21 @@ type = real kind = kind_phys intent = inout +[spp_wts_sfc] + standard_name = spp_weights_for_surface_layer_scheme + long_name = spp weights for surface layer scheme + units = 1 + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + intent = in +[spp_sfc] + standard_name = control_for_surface_layer_spp_perturbations + long_name = control for surface layer spp perturbations + units = count + dimensions = () + type = integer + intent = in [lprnt] standard_name = flag_print long_name = control flag for diagnostic print out diff --git a/physics/module_bl_mynn.F90 b/physics/module_bl_mynn.F90 index a492e50e0..3b0150e9e 100644 --- a/physics/module_bl_mynn.F90 +++ b/physics/module_bl_mynn.F90 @@ -4669,9 +4669,10 @@ SUBROUTINE mynn_bl_driver( & LOGICAL :: INITIALIZE_QKE ! Stochastic fields - INTEGER, INTENT(IN) ::spp_pbl - REAL, DIMENSION( ims:ime, kms:kme), INTENT(IN),OPTIONAL ::pattern_spp_pbl - REAL, DIMENSION(KTS:KTE) :: rstoch_col + INTEGER, INTENT(IN) :: spp_pbl + !GJF: this array must be assumed-shape since it's conditionally-allocated + REAL, DIMENSION(:,:), INTENT(IN) :: pattern_spp_pbl + REAL, DIMENSION(KTS:KTE) :: rstoch_col ! Substepping TKE INTEGER :: nsub diff --git a/physics/module_mp_thompson.F90 b/physics/module_mp_thompson.F90 index 30496e501..c23b6d1d8 100644 --- a/physics/module_mp_thompson.F90 +++ b/physics/module_mp_thompson.F90 @@ -1026,7 +1026,7 @@ SUBROUTINE mp_gt_driver(qv, qc, qr, qi, qs, qg, ni, nr, nc, & REAL, DIMENSION(ims:ime, kms:kme, jms:jme), OPTIONAL, INTENT(INOUT):: & re_cloud, re_ice, re_snow INTEGER, INTENT(IN) :: rand_perturb_on, kme_stoch - REAL, DIMENSION(ims:ime,kms:kme_stoch,jms:jme), INTENT(IN), OPTIONAL:: & + REAL, DIMENSION(:,:), INTENT(IN) :: & rand_pert INTEGER, INTENT(IN):: has_reqc, has_reqi, has_reqs @@ -1122,23 +1122,7 @@ SUBROUTINE mp_gt_driver(qv, qc, qr, qi, qs, qg, ni, nr, nc, & ! No need to test for every subcycling step test_only_once: if (first_time_step .and. istep==1) then - ! DH* 2020-06-05: The stochastic perturbations code was retrofitted - ! from a newer version of the Thompson MP scheme, but it has not been - ! tested yet. - if (rand_perturb_on .ne. 0) then - errmsg = 'Logic error in mp_gt_driver: the stochastic perturbations code ' // & - 'has not been tested yet with this version of the Thompson scheme' - errflg = 1 - return - end if ! Activate this code when removing the guard above - !if (rand_perturb_on .ne. 0 .and. .not. present(rand_pert)) then - ! errmsg = 'Logic error in mp_gt_driver: random perturbations are on, ' // & - ! 'but optional argument rand_pert is not present' - ! errflg = 1 - ! return - !end if - ! *DH 2020-06-05 if ( (present(tt) .and. (present(th) .or. present(pii))) .or. & (.not.present(tt) .and. .not.(present(th) .and. present(pii))) ) then @@ -1290,7 +1274,7 @@ SUBROUTINE mp_gt_driver(qv, qc, qr, qi, qs, qg, ni, nr, nc, & !+---+-----------------------------------------------------------------+ !..Introduce stochastic parameter perturbations by creating as many scalar rand1, rand2, ... !.. variables as needed to perturb different pieces of microphysics. gthompsn 21Mar2018 -! Setting spp_mp to 1 gives graupel Y-intercept pertubations (2^0) +! Setting spp_mp_opt to 1 gives graupel Y-intercept pertubations (2^0) ! 2 gives cloud water distribution gamma shape parameter perturbations (2^1) ! 4 gives CCN & IN activation perturbations (2^2) ! 3 gives both 1+2 @@ -1304,11 +1288,11 @@ SUBROUTINE mp_gt_driver(qv, qc, qr, qi, qs, qg, ni, nr, nc, & rand2 = 0.0 rand3 = 0.0 if (rand_perturb_on .ne. 0) then - if (MOD(rand_perturb_on,2) .ne. 0) rand1 = rand_pert(i,1,j) + if (MOD(rand_perturb_on,2) .ne. 0) rand1 = rand_pert(i,1) m = RSHIFT(ABS(rand_perturb_on),1) - if (MOD(m,2) .ne. 0) rand2 = rand_pert(i,1,j)*2. + if (MOD(m,2) .ne. 0) rand2 = rand_pert(i,1)*2. m = RSHIFT(ABS(rand_perturb_on),2) - if (MOD(m,2) .ne. 0) rand3 = 0.25*(rand_pert(i,1,j)+ABS(min_rand)) + if (MOD(m,2) .ne. 0) rand3 = 0.25*(rand_pert(i,1)+ABS(min_rand)) m = RSHIFT(ABS(rand_perturb_on),3) endif !+---+-----------------------------------------------------------------+ diff --git a/physics/module_sf_mynn.F90 b/physics/module_sf_mynn.F90 index 1eeefd2b1..5f227750a 100644 --- a/physics/module_sf_mynn.F90 +++ b/physics/module_sf_mynn.F90 @@ -161,7 +161,7 @@ SUBROUTINE SFCLAY_mynn( & QGH,QSFC, & U10,V10,TH2,T2,Q2, & GZ1OZ0,WSPD,WSTAR, & - spp_pbl,pattern_spp_pbl, & + spp_sfc,pattern_spp_sfc, & ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & its,ite, jts,jte, kts,kte, & @@ -274,7 +274,7 @@ SUBROUTINE SFCLAY_mynn( & !NAMELIST/CONFIGURATION OPTIONS: INTEGER, INTENT(IN) :: ISFFLX, LSM, LSM_RUC INTEGER, OPTIONAL, INTENT(IN) :: ISFTCFLX, IZ0TLND - INTEGER, OPTIONAL, INTENT(IN) :: spp_pbl, psi_opt + INTEGER, OPTIONAL, INTENT(IN) :: spp_sfc, psi_opt integer, intent(in) :: ivegsrc integer, intent(in) :: sfc_z0_type ! option for calculating surface roughness length over ocean logical, intent(in) :: redrag ! reduced drag coeff. flag for high wind over sea (j.han) @@ -295,8 +295,9 @@ SUBROUTINE SFCLAY_mynn( & U3D,V3D, & th3d,pi3d - REAL, DIMENSION( ims:ime, kms:kme), OPTIONAL, & - INTENT(IN) :: pattern_spp_pbl + !GJF: This array must be assumed-shape since it is conditionally-allocated + REAL, DIMENSION( :,: ), & + INTENT(IN) :: pattern_spp_sfc !=================================== ! 2D VARIABLES !=================================== @@ -403,8 +404,8 @@ SUBROUTINE SFCLAY_mynn( & QC1D(i)=QC3D(i,kts) P1D(i) =P3D(i,kts) T1D(i) =T3D(i,kts) - if (spp_pbl==1) then - rstoch1D(i)=pattern_spp_pbl(i,kts) + if (spp_sfc==1) then + rstoch1D(i)=pattern_spp_sfc(i,kts) else rstoch1D(i)=0.0 endif @@ -467,7 +468,7 @@ SUBROUTINE SFCLAY_mynn( & HFLX,HFX,QFLX,QFX,LH,FLHC,FLQC, & QGH,QSFC,U10,V10,TH2,T2,Q2, & GZ1OZ0,WSPD,wstar,qstar, & - spp_pbl,rstoch1D, & + spp_sfc,rstoch1D, & ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & its,ite, jts,jte, kts,kte, & @@ -515,7 +516,7 @@ SUBROUTINE SFCLAY1D_mynn(flag_iter, & QGH,QSFC, & U10,V10,TH2,T2,Q2, & GZ1OZ0,WSPD,wstar,qstar, & - spp_pbl,rstoch1D, & + spp_sfc,rstoch1D, & ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & its,ite, jts,jte, kts,kte, & @@ -542,7 +543,7 @@ SUBROUTINE SFCLAY1D_mynn(flag_iter, & !----------------------------- INTEGER, INTENT(IN) :: ISFFLX INTEGER, OPTIONAL, INTENT(IN ) :: ISFTCFLX, IZ0TLND - INTEGER, INTENT(IN) :: spp_pbl, psi_opt + INTEGER, INTENT(IN) :: spp_sfc, psi_opt integer, intent(in) :: ivegsrc integer, intent(in) :: sfc_z0_type ! option for calculating surface roughness length over ocean logical, intent(in) :: redrag ! reduced drag coeff. flag for high wind over sea (j.han) @@ -1122,7 +1123,7 @@ SUBROUTINE SFCLAY1D_mynn(flag_iter, & endif !-end wave model check ! add stochastic perturbation of ZNT - if (spp_pbl==1) then + if (spp_sfc==1) then ZNTstoch_wat(I) = MAX(ZNT_wat(I) + ZNT_wat(I)*1.0*rstoch1D(i), 1e-6) else ZNTstoch_wat(I) = ZNT_wat(I) @@ -1151,29 +1152,29 @@ SUBROUTINE SFCLAY1D_mynn(flag_iter, & IF ( ISFTCFLX .EQ. 0 ) THEN IF (COARE_OPT .EQ. 3.0) THEN CALL fairall_etal_2003(ZT_wat(i),ZQ_wat(i),restar,UST_wat(i),visc,& - rstoch1D(i),spp_pbl) + rstoch1D(i),spp_sfc) ELSE !presumably, this will be published soon, but hasn't yet CALL fairall_etal_2014(ZT_wat(i),ZQ_wat(i),restar,UST_wat(i),visc,& - rstoch1D(i),spp_pbl) + rstoch1D(i),spp_sfc) ENDIF ELSEIF ( ISFTCFLX .EQ. 1 ) THEN IF (COARE_OPT .EQ. 3.0) THEN CALL fairall_etal_2003(ZT_wat(i),ZQ_wat(i),restar,UST_wat(i),visc,& - rstoch1D(i),spp_pbl) + rstoch1D(i),spp_sfc) ELSE CALL fairall_etal_2014(ZT_wat(i),ZQ_wat(i),restar,UST_wat(i),visc,& - rstoch1D(i),spp_pbl) + rstoch1D(i),spp_sfc) ENDIF ELSEIF ( ISFTCFLX .EQ. 2 ) THEN CALL garratt_1992(ZT_wat(i),ZQ_wat(i),ZNTstoch_wat(i),restar,2.0) ELSEIF ( ISFTCFLX .EQ. 3 ) THEN IF (COARE_OPT .EQ. 3.0) THEN CALL fairall_etal_2003(ZT_wat(i),ZQ_wat(i),restar,UST_wat(i),visc,& - rstoch1D(i),spp_pbl) + rstoch1D(i),spp_sfc) ELSE CALL fairall_etal_2014(ZT_wat(i),ZQ_wat(i),restar,UST_wat(i),visc,& - rstoch1D(i),spp_pbl) + rstoch1D(i),spp_sfc) ENDIF ELSEIF ( ISFTCFLX .EQ. 4 ) THEN !GFS zt formulation @@ -1184,10 +1185,10 @@ SUBROUTINE SFCLAY1D_mynn(flag_iter, & !DEFAULT TO COARE 3.0/3.5 IF (COARE_OPT .EQ. 3.0) THEN CALL fairall_etal_2003(ZT_wat(i),ZQ_wat(i),restar,UST_wat(i),visc,& - rstoch1D(i),spp_pbl) + rstoch1D(i),spp_sfc) ELSE CALL fairall_etal_2014(ZT_wat(i),ZQ_wat(i),restar,UST_wat(i),visc,& - rstoch1D(i),spp_pbl) + rstoch1D(i),spp_sfc) ENDIF ENDIF IF (debug_code > 1) THEN @@ -1212,7 +1213,7 @@ SUBROUTINE SFCLAY1D_mynn(flag_iter, & endif ! add stochastic perturbaction of ZNT - if (spp_pbl==1) then + if (spp_sfc==1) then ZNTstoch_lnd(I) = MAX(ZNT_lnd(I) + ZNT_lnd(I)*1.0*rstoch1D(i), 1e-6) else ZNTstoch_lnd(I) = ZNT_lnd(I) @@ -1233,7 +1234,7 @@ SUBROUTINE SFCLAY1D_mynn(flag_iter, & IF ( PRESENT(IZ0TLND) ) THEN IF ( IZ0TLND .LE. 1 ) THEN CALL zilitinkevich_1995(ZNTstoch_lnd(i),ZT_lnd(i),ZQ_lnd(i),restar,& - UST_lnd(I),KARMAN,1.0,IZ0TLND,spp_pbl,rstoch1D(i)) + UST_lnd(I),KARMAN,1.0,IZ0TLND,spp_sfc,rstoch1D(i)) ELSEIF ( IZ0TLND .EQ. 2 ) THEN ! DH note - at this point, qstar is either not initialized ! or initialized to zero, but certainly not set correctly @@ -1253,7 +1254,7 @@ SUBROUTINE SFCLAY1D_mynn(flag_iter, & ELSE !DEFAULT TO ZILITINKEVICH CALL zilitinkevich_1995(ZNTSTOCH_lnd(i),ZT_lnd(i),ZQ_lnd(i),restar,& - UST_lnd(I),KARMAN,1.0,0,spp_pbl,rstoch1D(i)) + UST_lnd(I),KARMAN,1.0,0,spp_sfc,rstoch1D(i)) ENDIF ENDIF IF (ZNTstoch_lnd(i) < 1E-8 .OR. Zt_lnd(i) < 1E-10) THEN @@ -1279,7 +1280,7 @@ SUBROUTINE SFCLAY1D_mynn(flag_iter, & IF (icy(I)) THEN ! add stochastic perturbaction of ZNT - if (spp_pbl==1) then + if (spp_sfc==1) then ZNTstoch_ice(I) = MAX(ZNT_ice(I) + ZNT_ice(I)*1.0*rstoch1D(i), 1e-6) else ZNTstoch_ice(I) = ZNT_ice(I) @@ -2262,7 +2263,7 @@ END SUBROUTINE SFCLAY1D_mynn !! to work with the Noah LSM and may be specific for that !! LSM only. Tests with RUC LSM showed no improvements. SUBROUTINE zilitinkevich_1995(Z_0,Zt,Zq,restar,ustar,KARMAN,& - & landsea,IZ0TLND2,spp_pbl,rstoch) + & landsea,IZ0TLND2,spp_sfc,rstoch) IMPLICIT NONE REAL, INTENT(IN) :: Z_0,restar,ustar,KARMAN,landsea @@ -2271,7 +2272,7 @@ SUBROUTINE zilitinkevich_1995(Z_0,Zt,Zq,restar,ustar,KARMAN,& REAL :: CZIL !=0.100 in Chen et al. (1997) !=0.075 in Zilitinkevich (1995) !=0.500 in Lemone et al. (2008) - INTEGER, INTENT(IN) :: spp_pbl + INTEGER, INTENT(IN) :: spp_sfc REAL, INTENT(IN) :: rstoch @@ -2312,7 +2313,7 @@ SUBROUTINE zilitinkevich_1995(Z_0,Zt,Zq,restar,ustar,KARMAN,& ! stochastically perturb thermal and moisture roughness length. ! currently set to half the amplitude: - if (spp_pbl==1) then + if (spp_sfc==1) then Zt = Zt + Zt * 0.5 * rstoch Zt = MAX(Zt, 0.0001) Zq = Zt @@ -2477,11 +2478,11 @@ END SUBROUTINE garratt_1992 !!(1992, p. 102), is available for flows with Ren < 2. !! !!This is for use over water only. - SUBROUTINE fairall_etal_2003(Zt,Zq,Ren,ustar,visc,rstoch,spp_pbl) + SUBROUTINE fairall_etal_2003(Zt,Zq,Ren,ustar,visc,rstoch,spp_sfc) IMPLICIT NONE REAL, INTENT(IN) :: Ren,ustar,visc,rstoch - INTEGER, INTENT(IN):: spp_pbl + INTEGER, INTENT(IN):: spp_sfc REAL, INTENT(OUT) :: Zt,Zq IF (Ren .le. 2.) then @@ -2500,7 +2501,7 @@ SUBROUTINE fairall_etal_2003(Zt,Zq,Ren,ustar,visc,rstoch,spp_pbl) ENDIF - if (spp_pbl==1) then + if (spp_sfc==1) then Zt = Zt + Zt * 0.5 * rstoch Zq = Zt endif @@ -2521,18 +2522,18 @@ END SUBROUTINE fairall_etal_2003 !! COARE 3.5/4.0 formulation, empirically derived from COARE and HEXMAX data !! [Fairall et al. (2014? coming soon, not yet published as of July 2014)]. !! This is for use over water only. - SUBROUTINE fairall_etal_2014(Zt,Zq,Ren,ustar,visc,rstoch,spp_pbl) + SUBROUTINE fairall_etal_2014(Zt,Zq,Ren,ustar,visc,rstoch,spp_sfc) IMPLICIT NONE REAL, INTENT(IN) :: Ren,ustar,visc,rstoch - INTEGER, INTENT(IN):: spp_pbl + INTEGER, INTENT(IN):: spp_sfc REAL, INTENT(OUT) :: Zt,Zq !Zt = (5.5e-5)*(Ren**(-0.60)) Zt = MIN(1.6E-4, 5.8E-5/(Ren**0.72)) Zq = Zt - IF (spp_pbl ==1) THEN + IF (spp_sfc ==1) THEN Zt = MAX(Zt + Zt*0.5*rstoch,2.0e-9) Zq = MAX(Zt + Zt*0.5*rstoch,2.0e-9) ELSE @@ -3765,4 +3766,3 @@ REAL function psih_unstable(zolf,psi_opt) !======================================================================== END MODULE module_sf_mynn - diff --git a/physics/mp_thompson.F90 b/physics/mp_thompson.F90 index cc4d99f77..7c76ea933 100644 --- a/physics/mp_thompson.F90 +++ b/physics/mp_thompson.F90 @@ -308,6 +308,7 @@ subroutine mp_thompson_run(ncol, nlev, con_g, con_rd, & refl_10cm, reset_dBZ, do_radar_ref, & mpicomm, mpirank, mpiroot, blkno, & ext_diag, diag3d, reset_diag3d, & + spp_wts_mp, spp_mp, & errmsg, errflg) implicit none @@ -372,6 +373,10 @@ subroutine mp_thompson_run(ncol, nlev, con_g, con_rd, & ! CCPP error handling character(len=*), intent( out) :: errmsg integer, intent( out) :: errflg + + ! SPP + integer, intent(in) :: spp_mp + real(kind_phys), intent(in) :: spp_wts_mp(:,:) ! Local variables @@ -402,11 +407,8 @@ subroutine mp_thompson_run(ncol, nlev, con_g, con_rd, & integer, parameter :: has_reqc = 0 integer, parameter :: has_reqi = 0 integer, parameter :: has_reqs = 0 - ! Random perturbations are turned off in CCPP for now, - ! hasn't been tested yet with this version of module_mp_thompson.F90 - integer, parameter :: rand_perturb_on = 0 integer, parameter :: kme_stoch = 1 - !real(kind_phys) :: rand_pert(1:ncol,1:kme_stoch) + integer :: spp_mp_opt ! Dimensions used in mp_gt_driver integer :: ids,ide, jds,jde, kds,kde, & ims,ime, jms,jme, kms,kme, & @@ -492,6 +494,13 @@ subroutine mp_thompson_run(ncol, nlev, con_g, con_rd, & end if end if + ! Set stochastic physics selection to apply all perturbations + if ( spp_mp==7 ) then + spp_mp_opt=7 + else + spp_mp_opt=0 + endif + ! Set reduced time step if subcycling is used if (nsteps>1) then dtstep = dtp/real(nsteps, kind=kind_phys) @@ -634,10 +643,8 @@ subroutine mp_thompson_run(ncol, nlev, con_g, con_rd, & refl_10cm=refl_10cm, & diagflag=diagflag, do_radar_ref=do_radar_ref_mp, & has_reqc=has_reqc, has_reqi=has_reqi, has_reqs=has_reqs, & - rand_perturb_on=rand_perturb_on, kme_stoch=kme_stoch, & - ! DH* 2020-06-05 not passing this optional argument, see - ! comment in module_mp_thompson.F90 / mp_gt_driver - !rand_pert=rand_pert, & + rand_perturb_on=spp_mp_opt, kme_stoch=kme_stoch, & + rand_pert=spp_wts_mp, & 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, & @@ -673,10 +680,8 @@ subroutine mp_thompson_run(ncol, nlev, con_g, con_rd, & refl_10cm=refl_10cm, & diagflag=diagflag, do_radar_ref=do_radar_ref_mp, & has_reqc=has_reqc, has_reqi=has_reqi, has_reqs=has_reqs, & - rand_perturb_on=rand_perturb_on, kme_stoch=kme_stoch, & - ! DH* 2020-06-05 not passing this optional argument, see - ! comment in module_mp_thompson.F90 / mp_gt_driver - !rand_pert=rand_pert, & + rand_perturb_on=spp_mp_opt, kme_stoch=kme_stoch, & + rand_pert=spp_wts_mp, & 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, & diff --git a/physics/mp_thompson.meta b/physics/mp_thompson.meta index efd44e2ff..a3bc20615 100644 --- a/physics/mp_thompson.meta +++ b/physics/mp_thompson.meta @@ -638,6 +638,21 @@ dimensions = () type = logical intent = in +[spp_wts_mp] + standard_name = spp_weights_for_microphysics_scheme + long_name = spp weights for microphysics scheme + units = 1 + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + intent = in +[spp_mp] + standard_name = control_for_microphysics_spp_perturbations + long_name = control for microphysics spp perturbations + units = count + dimensions = () + type = integer + intent = in [errmsg] standard_name = ccpp_error_message long_name = error message for error handling in CCPP diff --git a/physics/ugwpv1_gsldrag.F90 b/physics/ugwpv1_gsldrag.F90 index 71193ed88..41290ed68 100644 --- a/physics/ugwpv1_gsldrag.F90 +++ b/physics/ugwpv1_gsldrag.F90 @@ -321,7 +321,8 @@ subroutine ugwpv1_gsldrag_run(me, master, im, levs, ntrac, lonr, dtp, fhzero,kd zogw, zlwb, zobl, zngw, dusfcg, dvsfcg, dudt, dvdt, dtdt, rdxzb, & dtend, dtidx, index_of_x_wind, index_of_y_wind, index_of_temperature, & index_of_process_orographic_gwd, index_of_process_nonorographic_gwd, & - lprnt, ipr, errmsg, errflg) + lprnt, ipr, spp_wts_gwd, spp_gwd, errmsg, errflg) + ! !######################################################################## ! Attention New Arrays and Names must be ADDED inside @@ -436,6 +437,9 @@ subroutine ugwpv1_gsldrag_run(me, master, im, levs, ntrac, lonr, dtp, fhzero,kd real(kind=kind_phys), intent(out), dimension(:) :: rdxzb ! for stoch phys. mtb-level + real(kind=kind_phys), intent(in) :: spp_wts_gwd(:,:) + integer, intent(in) :: spp_gwd + character(len=*), intent(out) :: errmsg integer, intent(out) :: errflg @@ -558,7 +562,8 @@ subroutine ugwpv1_gsldrag_run(me, master, im, levs, ntrac, lonr, dtp, fhzero,kd do_gsl_drag_ls_bl,do_gsl_drag_ss,do_gsl_drag_tofd, & dtend, dtidx, index_of_process_orographic_gwd, & index_of_temperature, index_of_x_wind, & - index_of_y_wind, ldiag3d, errmsg, errflg) + index_of_y_wind, ldiag3d, spp_wts_gwd, spp_gwd, & + errmsg, errflg) ! ! dusfcg = du_ogwcol + du_oblcol + du_osscol + du_ofdcol ! diff --git a/physics/ugwpv1_gsldrag.meta b/physics/ugwpv1_gsldrag.meta index 4865f5a6a..0e1f6ddf1 100644 --- a/physics/ugwpv1_gsldrag.meta +++ b/physics/ugwpv1_gsldrag.meta @@ -1082,6 +1082,21 @@ dimensions = () type = integer intent = in +[spp_wts_gwd] + standard_name = spp_weights_for_gravity_wave_drag_scheme + long_name = spp weights for gravity wave drag scheme + units = 1 + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + intent = in +[spp_gwd] + standard_name = control_for_gravity_wave_drag_spp_perturbations + long_name = control for gravity wave drag spp perturbations + units = count + dimensions = () + type = integer + intent = in [errmsg] standard_name = ccpp_error_message long_name = error message for error handling in CCPP diff --git a/physics/unified_ugwp.F90 b/physics/unified_ugwp.F90 index da79ecde8..9e93bd5fc 100644 --- a/physics/unified_ugwp.F90 +++ b/physics/unified_ugwp.F90 @@ -218,7 +218,7 @@ subroutine unified_ugwp_run(me, master, im, levs, ntrac, dtp, fhzero, kdt, index_of_process_orographic_gwd, index_of_process_nonorographic_gwd, & ldiag3d, lssav, flag_for_gwd_generic_tend, do_ugwp_v0, do_ugwp_v0_orog_only, & do_ugwp_v0_nst_only, do_gsl_drag_ls_bl, do_gsl_drag_ss, do_gsl_drag_tofd, & - gwd_opt, errmsg, errflg) + gwd_opt, spp_wts_gwd, spp_gwd, errmsg, errflg) implicit none @@ -296,6 +296,9 @@ subroutine unified_ugwp_run(me, master, im, levs, ntrac, dtp, fhzero, kdt, do_gsl_drag_ls_bl, do_gsl_drag_ss, & do_gsl_drag_tofd + real(kind=kind_phys), intent(in) :: spp_wts_gwd(:,:) + integer, intent(in) :: spp_gwd + character(len=*), intent(out) :: errmsg integer, intent(out) :: errflg @@ -343,7 +346,8 @@ subroutine unified_ugwp_run(me, master, im, levs, ntrac, dtp, fhzero, kdt, do_gsl_drag_ls_bl,do_gsl_drag_ss,do_gsl_drag_tofd, & dtend, dtidx, index_of_process_orographic_gwd, & index_of_temperature, index_of_x_wind, & - index_of_y_wind, ldiag3d, errmsg, errflg) + index_of_y_wind, ldiag3d, spp_wts_gwd, spp_gwd, & + errmsg, errflg) ! ! put zeros due to xy GSL-drag style: dtaux2d_bl,dtauy2d_bl,dtaux2d_ss.......dusfc_ls,dvsfc_ls ! diff --git a/physics/unified_ugwp.meta b/physics/unified_ugwp.meta index cf6350f58..2ff65e3d3 100644 --- a/physics/unified_ugwp.meta +++ b/physics/unified_ugwp.meta @@ -1178,6 +1178,21 @@ dimensions = () type = integer intent = in +[spp_wts_gwd] + standard_name = spp_weights_for_gravity_wave_drag_scheme + long_name = spp weights for gravity wave drag scheme + units = 1 + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + intent = in +[spp_gwd] + standard_name = control_for_gravity_wave_drag_spp_perturbations + long_name = control for gravity wave drag spp perturbations + units = count + dimensions = () + type = integer + intent = in [errmsg] standard_name = ccpp_error_message long_name = error message for error handling in CCPP