diff --git a/ccpp/config/ccpp_prebuild_config.py b/ccpp/config/ccpp_prebuild_config.py index 8652aa877..a95b86203 100755 --- a/ccpp/config/ccpp_prebuild_config.py +++ b/ccpp/config/ccpp_prebuild_config.py @@ -176,7 +176,7 @@ 'physics/physics/satmedmfvdifq.F', 'physics/physics/shinhongvdif.F90', 'physics/physics/ysuvdif.F90', - 'physics/physics/mynnpbl_wrapper.F90', + 'physics/physics/mynnedmf_wrapper.F90', 'physics/physics/mynnsfc_wrapper.F90', 'physics/physics/sgscloud_radpre.F90', 'physics/physics/sgscloud_radpost.F90', @@ -213,6 +213,10 @@ 'physics/physics/sfc_sice.f', # HAFS FER_HIRES 'physics/physics/mp_fer_hires.F90', + # SMOKE + 'physics/smoke/rrfs_smoke_wrapper.F90', + 'physics/smoke/rrfs_smoke_postpbl.F90', + 'physics/smoke/rrfs_smoke_lsdep_wrapper.F90', # RRTMGP 'physics/physics/rrtmgp_lw_gas_optics.F90', 'physics/physics/rrtmgp_lw_cloud_optics.F90', diff --git a/ccpp/data/CCPP_typedefs.meta b/ccpp/data/CCPP_typedefs.meta index 217889784..fcdaa0e8a 100644 --- a/ccpp/data/CCPP_typedefs.meta +++ b/ccpp/data/CCPP_typedefs.meta @@ -1824,6 +1824,13 @@ dimensions = (horizontal_loop_extent,vertical_layer_dimension) type = real kind = kind_phys +[save_q(:,:,index_of_snow_mixing_ratio_in_tracer_concentration_array)] + standard_name = snow_mixing_ratio_save + long_name = ratio of mass of snow water to mass of dry air plus vapor (without condensates) before entering a physics scheme + units = kg kg-1 + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys [save_q(:,:,index_of_cloud_ice_mixing_ratio_in_tracer_concentration_array)] standard_name = ice_water_mixing_ratio_save long_name = cloud ice water mixing ratio before entering a physics scheme @@ -2156,13 +2163,6 @@ units = count dimensions = () type = integer -[ud_mf] - standard_name = instantaneous_atmosphere_updraft_convective_mass_flux - long_name = (updraft mass flux) * delt - units = kg m-2 - dimensions = (horizontal_loop_extent,vertical_layer_dimension) - type = real - kind = kind_phys [uustar_water] standard_name = surface_friction_velocity_over_water long_name = surface friction velocity over water diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index f125489af..9c8735b95 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -33,6 +33,7 @@ module GFS_typedefs real(kind=kind_phys), parameter :: limit_unspecified = 1e12 !< special constant for "namelist value was not provided" in radar-derived temperature tendency limit range + !> \section arg_table_GFS_typedefs !! \htmlinclude GFS_typedefs.html !! @@ -227,6 +228,9 @@ module GFS_typedefs real (kind=kind_phys), pointer :: snodi (:) => null() !< snow depth over ice real (kind=kind_phys), pointer :: weasdi (:) => null() !< weasd over ice real (kind=kind_phys), pointer :: hprime (:,:) => null() !< orographic metrics + real (kind=kind_phys), pointer :: dust12m_in (:,:,:) => null() !< fengsha dust input + real (kind=kind_phys), pointer :: emi_in (:,:) => null() !< anthropogenic background input + real (kind=kind_phys), pointer :: smoke_GBBEPx(:,:,:) => null() !< GBBEPx fire input real (kind=kind_phys), pointer :: z0base (:) => null() !< background or baseline surface roughness length in m real (kind=kind_phys), pointer :: semisbase(:) => null() !< background surface emissivity real (kind=kind_phys), pointer :: sfalb_lnd (:) => null() !< surface albedo over land for LSM @@ -532,12 +536,42 @@ module GFS_typedefs real (kind=kind_phys), pointer :: nwfa2d (:) => null() !< instantaneous water-friendly sfc aerosol source real (kind=kind_phys), pointer :: nifa2d (:) => null() !< instantaneous ice-friendly sfc aerosol source + !--- aerosol surface emissions for Thompson microphysics & smoke + real (kind=kind_phys), pointer :: emdust (:) => null() !< instantaneous dust emission + real (kind=kind_phys), pointer :: emseas (:) => null() !< instantaneous sea salt emission + real (kind=kind_phys), pointer :: emanoc (:) => null() !< instantaneous anthro. oc emission + + !--- These 3 arrays are hourly, so their dimension is imx24 (output is hourly) + real (kind=kind_phys), pointer :: ebb_smoke_hr(:) => null() !< hourly smoke emission + real (kind=kind_phys), pointer :: frp_hr (:) => null() !< hourly FRP + real (kind=kind_phys), pointer :: frp_std_hr (:) => null() !< hourly std. FRP + + !--- For fire diurnal cycle + real (kind=kind_phys), pointer :: fhist (:) => null() !< instantaneous fire coef_bb + real (kind=kind_phys), pointer :: coef_bb_dc (:) => null() !< instantaneous fire coef_bb + real (kind=kind_phys), pointer :: ebu_smoke (:,:) => null() !< 3D ebu array + + !--- For smoke and dust optical extinction + real (kind=kind_phys), pointer :: smoke_ext (:,:) => null() !< 3D aod array + real (kind=kind_phys), pointer :: dust_ext (:,:) => null() !< 3D aod array + !--- For MYNN PBL transport of smoke and dust + real (kind=kind_phys), pointer :: chem3d (:,:,:) => null() !< 3D aod array + + !--- Fire plume rise diagnostics + real (kind=kind_phys), pointer :: min_fplume (:) => null() !< minimum plume rise level + real (kind=kind_phys), pointer :: max_fplume (:) => null() !< maximum plume rise level + !--- hourly fire potential index + real (kind=kind_phys), pointer :: rrfs_hwp (:) => null() !< hourly fire potential index + !--- instantaneous quantities for chemistry coupling real (kind=kind_phys), pointer :: ushfsfci(:) => null() !< instantaneous upward sensible heat flux (w/m**2) real (kind=kind_phys), pointer :: qci_conv(:,:) => null() !< convective cloud condesate after rainout real (kind=kind_phys), pointer :: pfi_lsan(:,:) => null() !< instantaneous 3D flux of ice nonconvective precipitation (kg m-2 s-1) real (kind=kind_phys), pointer :: pfl_lsan(:,:) => null() !< instantaneous 3D flux of liquid nonconvective precipitation (kg m-2 s-1) + !--- instantaneous total moisture tendency for smoke coupling: + real (kind=kind_phys), pointer :: dqdti (:,:) => null() !< rrfs_smoke=true only; instantaneous total moisture tendency (kg/kg/s) + contains procedure :: create => coupling_create !< allocate array data end type GFS_coupling_type @@ -630,6 +664,8 @@ module GFS_typedefs logical :: cplwav2atm !< default no wav->atm coupling logical :: cplaqm !< default no cplaqm collection logical :: cplchm !< default no cplchm collection + logical :: rrfs_smoke !< default no rrfs_smoke collection + integer :: dust_smoke_rrtmg_band_number !< band number to affect in rrtmg_pre from smoke and dust logical :: use_cice_alb !< default .false. - i.e. don't use albedo imported from the ice model logical :: cpl_imp_mrg !< default no merge import with internal forcings logical :: cpl_imp_dbg !< default no write import data to file post merge @@ -1025,19 +1061,22 @@ module GFS_typedefs logical :: do_mynnedmf logical :: do_mynnsfclay ! DH* TODO - move this to MYNN namelist section - integer :: grav_settling !< flag for initalizing fist time step - integer :: bl_mynn_tkebudget !< flag for activating TKE budget + logical :: bl_mynn_tkebudget !< flag for activating TKE budget logical :: bl_mynn_tkeadvect !< activate computation of TKE advection (not yet in use for FV3) integer :: bl_mynn_cloudpdf !< flag to determine which cloud PDF to use integer :: bl_mynn_mixlength !< flag for different version of mixing length formulation integer :: bl_mynn_edmf !< flag to activate the mass-flux scheme integer :: bl_mynn_edmf_mom !< flag to activate the transport of momentum integer :: bl_mynn_edmf_tke !< flag to activate the transport of TKE - integer :: bl_mynn_edmf_part !< flag to partitioning og the MF and ED areas integer :: bl_mynn_cloudmix !< flag to activate mixing of cloud species integer :: bl_mynn_mixqt !< flag to mix total water or individual species integer :: bl_mynn_output !< flag to initialize and write out extra 3D arrays integer :: icloud_bl !< flag for coupling sgs clouds to radiation + real(kind=kind_phys) :: bl_mynn_closure !< flag to determine closure level of MYNN + logical :: sfclay_compute_flux!< flag for thermal roughness lengths over water in mynnsfclay + logical :: sfclay_compute_diag!< flag for computing surface diagnostics in mynnsfclay + integer :: isftcflx !< flag for thermal roughness lengths over water in mynnsfclay + integer :: iz0tlnd !< flag for thermal roughness lengths over land in mynnsfclay real(kind=kind_phys) :: var_ric real(kind=kind_phys) :: coef_ric_l real(kind=kind_phys) :: coef_ric_s @@ -1245,6 +1284,10 @@ module GFS_typedefs integer :: nto2 !< tracer index for oxygen integer :: ntwa !< tracer index for water friendly aerosol integer :: ntia !< tracer index for ice friendly aerosol + integer :: ntsmoke !< tracer index for smoke + integer :: ntdust !< tracer index for dust + integer :: nchem !< number of prognostic chemical species (vertically mixied) + integer :: ndvel !< number of prognostic chemical species (which are deposited, usually =nchem) integer :: ntchm !< number of prognostic chemical tracers (advected) integer :: ntchs !< tracer index for first prognostic chemical tracer integer :: ntche !< tracer index for last prognostic chemical tracer @@ -1283,6 +1326,22 @@ module GFS_typedefs integer :: npsdelt !< the index of surface air pressure at the previous timestep for Z-C MP in phy_f2d integer :: ncnvwind !< the index of surface wind enhancement due to convection for MYNN SFC and RAS CNV in phy f2d +!-- chem nml variables for RRFS-Smoke + integer :: seas_opt + integer :: dust_opt + integer :: biomass_burn_opt + integer :: drydep_opt + integer :: wetdep_ls_opt + logical :: do_plumerise + integer :: addsmoke_flag + integer :: plumerisefire_frq + logical :: smoke_forecast + logical :: aero_ind_fdb ! WFA/IFA indirect + logical :: aero_dir_fdb ! smoke/dust direct + logical :: rrfs_smoke_debug + logical :: mix_chem + logical :: fire_turb + !--- debug flags logical :: debug logical :: pre_rad !< flag for testing purpose @@ -1447,6 +1506,7 @@ module GFS_typedefs !--- Diagnostic that needs to be carried over to the next time step (removed from diag_type) real (kind=kind_phys), pointer :: hpbl (:) => null() !< Planetary boundary layer height + real (kind=kind_phys), pointer :: ud_mf (:,:) => null() !< updraft mass flux !--- dynamical forcing variables for Grell-Freitas convection real (kind=kind_phys), pointer :: forcet (:,:) => null() !< @@ -1463,6 +1523,7 @@ module GFS_typedefs real (kind=kind_phys), pointer :: QI_BL (:,:) => null() ! real (kind=kind_phys), pointer :: el_pbl (:,:) => null() ! real (kind=kind_phys), pointer :: Sh3D (:,:) => null() ! + real (kind=kind_phys), pointer :: Sm3D (:,:) => null() ! real (kind=kind_phys), pointer :: qke (:,:) => null() ! real (kind=kind_phys), pointer :: tsq (:,:) => null() ! real (kind=kind_phys), pointer :: qsq (:,:) => null() ! @@ -1648,6 +1709,11 @@ module GFS_typedefs integer, pointer :: ktop_plume (:) => null() ! real (kind=kind_phys), pointer :: exch_h (:,:) => null() ! real (kind=kind_phys), pointer :: exch_m (:,:) => null() ! + real (kind=kind_phys), pointer :: dqke (:,:) => null() !< timestep change of tke + real (kind=kind_phys), pointer :: qwt (:,:) => null() !< vertical transport of tke + real (kind=kind_phys), pointer :: qshear (:,:) => null() !< shear production of tke + real (kind=kind_phys), pointer :: qbuoy (:,:) => null() !< buoyancy production of tke + real (kind=kind_phys), pointer :: qdiss (:,:) => null() !< dissipation of tke ! Output - only in physics real (kind=kind_phys), pointer :: u10m (:) => null() !< 10 meter u/v wind speed @@ -1984,6 +2050,9 @@ subroutine sfcprop_create (Sfcprop, IM, Model) allocate (Sfcprop%snodi (IM)) allocate (Sfcprop%weasdi (IM)) allocate (Sfcprop%hprime (IM,Model%nmtvr)) + allocate (Sfcprop%dust12m_in (IM,12,5)) + allocate (Sfcprop%smoke_GBBEPx(IM,24,3)) + allocate (Sfcprop%emi_in (IM,1)) allocate(Sfcprop%albdirvis_lnd (IM)) allocate(Sfcprop%albdirnir_lnd (IM)) allocate(Sfcprop%albdifvis_lnd (IM)) @@ -2014,6 +2083,9 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%snodi = clear_val Sfcprop%weasdi = clear_val Sfcprop%hprime = clear_val + Sfcprop%dust12m_in= clear_val + Sfcprop%emi_in = clear_val + Sfcprop%smoke_GBBEPx = clear_val Sfcprop%albdirvis_lnd = clear_val Sfcprop%albdirnir_lnd = clear_val Sfcprop%albdifvis_lnd = clear_val @@ -2587,7 +2659,7 @@ subroutine coupling_create (Coupling, IM, Model) endif ! -- Aerosols coupling options - if (Model%cplchm) then + if (Model%cplchm .or. Model%rrfs_smoke) then !--- outgoing instantaneous quantities allocate (Coupling%ushfsfci (IM)) !--- accumulated convective rainfall @@ -2667,6 +2739,42 @@ subroutine coupling_create (Coupling, IM, Model) Coupling%nifa2d = clear_val endif + if(Model%rrfs_smoke) then + !--- needed for smoke aerosol option + allocate (Coupling%emdust (IM)) + allocate (Coupling%emseas (IM)) + allocate (Coupling%emanoc (IM)) + allocate (Coupling%ebb_smoke_hr (IM)) + allocate (Coupling%frp_hr (IM)) + allocate (Coupling%frp_std_hr(IM)) + allocate (Coupling%fhist (IM)) + allocate (Coupling%coef_bb_dc(IM)) + allocate (Coupling%ebu_smoke (IM,Model%levs)) + allocate (Coupling%smoke_ext (IM,Model%levs)) + allocate (Coupling%dust_ext (IM,Model%levs)) + allocate (Coupling%chem3d (IM,Model%levs,2)) + allocate (Coupling%min_fplume(IM)) + allocate (Coupling%max_fplume(IM)) + allocate (Coupling%rrfs_hwp (IM)) + allocate (Coupling%dqdti (IM,Model%levs)) + Coupling%emdust = clear_val + Coupling%emseas = clear_val + Coupling%emanoc = clear_val + Coupling%ebb_smoke_hr = clear_val + Coupling%frp_hr = clear_val + Coupling%frp_std_hr = clear_val + Coupling%fhist = 1. + Coupling%coef_bb_dc = clear_val + Coupling%ebu_smoke = clear_val + Coupling%smoke_ext = clear_val + Coupling%dust_ext = clear_val + Coupling%chem3d = clear_val + Coupling%min_fplume = clear_val + Coupling%max_fplume = clear_val + Coupling%rrfs_hwp = clear_val + Coupling%dqdti = clear_val + endif + if (Model%imfdeepcnv == Model%imfdeepcnv_gf) then allocate (Coupling%qci_conv (IM,Model%levs)) Coupling%qci_conv = clear_val @@ -2763,6 +2871,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & logical :: cplwav2atm = .false. !< default no cplwav2atm coupling logical :: cplaqm = .false. !< default no cplaqm collection logical :: cplchm = .false. !< default no cplchm collection + logical :: rrfs_smoke = .false. !< default no rrfs_smoke collection + integer :: dust_smoke_rrtmg_band_number = 10!< band number to affect in rrtmg_pre from smoke and dust logical :: use_cice_alb = .false. !< default no cice albedo logical :: cpl_imp_mrg = .false. !< default no merge import with internal forcings logical :: cpl_imp_dbg = .false. !< default no write import data to file post merge @@ -3046,19 +3156,24 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & logical :: do_mynnedmf = .false. !< flag for MYNN-EDMF logical :: do_mynnsfclay = .false. !< flag for MYNN Surface Layer Scheme ! DH* TODO - move to MYNN namelist section - integer :: grav_settling = 0 - integer :: bl_mynn_tkebudget = 0 + logical :: bl_mynn_tkebudget = .false. logical :: bl_mynn_tkeadvect = .false. integer :: bl_mynn_cloudpdf = 2 - integer :: bl_mynn_mixlength = 2 - integer :: bl_mynn_edmf = 0 + integer :: bl_mynn_mixlength = 1 + integer :: bl_mynn_edmf = 1 integer :: bl_mynn_edmf_mom = 1 integer :: bl_mynn_edmf_tke = 0 - integer :: bl_mynn_edmf_part = 0 integer :: bl_mynn_cloudmix = 1 integer :: bl_mynn_mixqt = 0 integer :: bl_mynn_output = 0 integer :: icloud_bl = 1 + real(kind=kind_phys) :: bl_mynn_closure = 2.6 !< <= 2.5 only prognose tke + !< 2.5 < and < 3.0, prognose tke and q'2 + !< >= 3.0, prognose tke, q'2, T'2, and T'q' + logical :: sfclay_compute_diag = .false. + logical :: sfclay_compute_flux = .false. + integer :: isftcflx = 0 + integer :: iz0tlnd = 0 real(kind=kind_phys) :: var_ric = 1.0 real(kind=kind_phys) :: coef_ric_l = 0.16 real(kind=kind_phys) :: coef_ric_s = 0.25 @@ -3239,6 +3354,22 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & integer :: spp_gwd = 0 logical :: do_spp = .false. +!-- chem nml variables for RRFS-Smoke + integer :: seas_opt = 2 + integer :: dust_opt = 5 + integer :: biomass_burn_opt = 1 + integer :: drydep_opt = 1 + integer :: wetdep_ls_opt = 1 + logical :: do_plumerise = .false. + integer :: addsmoke_flag = 1 + integer :: plumerisefire_frq = 60 + logical :: smoke_forecast = .false. ! RRFS-smoke diurnal + logical :: aero_ind_fdb = .false. ! RRFS-smoke wfa/ifa emission + logical :: aero_dir_fdb = .false. ! RRFS-smoke smoke/dust radiation feedback + logical :: rrfs_smoke_debug = .false. ! RRFS-smoke plumerise debug + logical :: mix_chem = .false. ! tracer mixing option by MYNN PBL + logical :: fire_turb = .false. ! enh vertmix option by MYNN PBL + !--- aerosol scavenging factors integer, parameter :: max_scav_factors = 183 character(len=40) :: fscav_aero(max_scav_factors) @@ -3255,8 +3386,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & thermodyn_id, sfcpress_id, & !--- coupling parameters cplflx, cplice, cplocn2atm, cplwav, cplwav2atm, cplaqm, & - cplchm, cpl_imp_mrg, cpl_imp_dbg, & - use_cice_alb, & + cplchm, cpl_imp_mrg, cpl_imp_dbg, rrfs_smoke, & + use_cice_alb, dust_smoke_rrtmg_band_number, & #ifdef IDEA_PHYS lsidea, weimer_model, f107_kp_size, f107_kp_interval, & f107_kp_skip_size, f107_kp_data_size, f107_kp_read_in_start, & @@ -3313,8 +3444,10 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & do_mynnedmf, do_mynnsfclay, & ! DH* TODO - move to MYNN namelist section bl_mynn_cloudpdf, bl_mynn_edmf, bl_mynn_edmf_mom, & - bl_mynn_edmf_tke, bl_mynn_edmf_part, bl_mynn_cloudmix, & + bl_mynn_edmf_tke, bl_mynn_mixlength, bl_mynn_cloudmix, & bl_mynn_mixqt, bl_mynn_output, icloud_bl, bl_mynn_tkeadvect, & + bl_mynn_closure, bl_mynn_tkebudget, & + isftcflx, iz0tlnd, sfclay_compute_flux, sfclay_compute_diag, & ! *DH gwd_opt, do_ugwp_v0, do_ugwp_v0_orog_only, & do_ugwp_v0_nst_only, & @@ -3371,6 +3504,11 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & phys_version, & !--- aerosol scavenging factors ('name:value' string array) fscav_aero, & + !--- RRFS smoke namelist + seas_opt, dust_opt, biomass_burn_opt, drydep_opt, & + wetdep_ls_opt, smoke_forecast, aero_ind_fdb, aero_dir_fdb, & + rrfs_smoke_debug, do_plumerise, plumerisefire_frq, & + addsmoke_flag, fire_turb, mix_chem, & !--- (DFI) time ranges with radar-prescribed microphysics tendencies ! and (maybe) convection suppression fh_dfi_radar, radar_tten_limits, do_cap_suppress @@ -3574,6 +3712,24 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%cpl_imp_mrg = cpl_imp_mrg Model%cpl_imp_dbg = cpl_imp_dbg +!--- RRFS Smoke + Model%rrfs_smoke = rrfs_smoke + Model%dust_smoke_rrtmg_band_number = dust_smoke_rrtmg_band_number + Model%seas_opt = seas_opt + Model%dust_opt = dust_opt + Model%biomass_burn_opt = biomass_burn_opt + Model%drydep_opt = drydep_opt + Model%wetdep_ls_opt = wetdep_ls_opt + Model%do_plumerise = do_plumerise + Model%plumerisefire_frq = plumerisefire_frq + Model%addsmoke_flag = addsmoke_flag + Model%smoke_forecast = smoke_forecast + Model%aero_ind_fdb = aero_ind_fdb + Model%aero_dir_fdb = aero_dir_fdb + Model%rrfs_smoke_debug = rrfs_smoke_debug + Model%mix_chem = mix_chem + Model%fire_turb = fire_turb + !--- integrated dynamics through earth's atmosphere Model%lsidea = lsidea if (Model%lsidea) then @@ -4019,10 +4175,14 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%bl_mynn_cloudmix = bl_mynn_cloudmix Model%bl_mynn_mixqt = bl_mynn_mixqt Model%bl_mynn_output = bl_mynn_output - Model%bl_mynn_edmf_part = bl_mynn_edmf_part Model%bl_mynn_tkeadvect = bl_mynn_tkeadvect - Model%grav_settling = grav_settling + Model%bl_mynn_closure = bl_mynn_closure + Model%bl_mynn_tkebudget = bl_mynn_tkebudget Model%icloud_bl = icloud_bl + Model%isftcflx = isftcflx + Model%iz0tlnd = iz0tlnd + Model%sfclay_compute_flux = sfclay_compute_flux + Model%sfclay_compute_diag = sfclay_compute_diag Model%var_ric = var_ric Model%coef_ric_l = coef_ric_l Model%coef_ric_s = coef_ric_s @@ -4232,6 +4392,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%nqrimef = get_tracer_index(Model%tracer_names, 'q_rimef', Model%me, Model%master, Model%debug) Model%ntwa = get_tracer_index(Model%tracer_names, 'liq_aero', Model%me, Model%master, Model%debug) Model%ntia = get_tracer_index(Model%tracer_names, 'ice_aero', Model%me, Model%master, Model%debug) + Model%ntsmoke = get_tracer_index(Model%tracer_names, 'smoke', Model%me, Model%master, Model%debug) + Model%ntdust = get_tracer_index(Model%tracer_names, 'dust', Model%me, Model%master, Model%debug) !--- initialize parameters for atmospheric chemistry tracers call Model%init_chemistry(tracer_types) @@ -4716,9 +4878,19 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & ' bl_mynn_cloudpdf=',Model%bl_mynn_cloudpdf, & ' bl_mynn_mixlength=',Model%bl_mynn_mixlength, & ' bl_mynn_edmf=',Model%bl_mynn_edmf, & - ' bl_mynn_output=',Model%bl_mynn_output + ' bl_mynn_output=',Model%bl_mynn_output, & + ' bl_mynn_closure=',Model%bl_mynn_closure endif + !--- mynn surface layer scheme + if (Model%do_mynnsfclay) then + if (Model%me == Model%master) print *,' MYNN surface layer scheme is used:', & + ' isftcflx=',Model%isftcflx, & + ' iz0tlnd=',Model%iz0tlnd, & + ' sfclay_compute_diag=',Model%sfclay_compute_diag, & + ' sfclay_compute_flux=',Model%sfclay_compute_flux + end if + !--- set number of cloud types if (Model%cscnv) then Model%nctp = nint(Model%cs_parm(5)) @@ -5268,6 +5440,8 @@ subroutine control_chemistry_initialize(Model, tracer_types) integer :: n !--- begin + Model%nchem = 0 + Model%ndvel = 0 Model%ntchm = 0 Model%ntchs = NO_TRACER Model%ntche = NO_TRACER @@ -5275,6 +5449,11 @@ subroutine control_chemistry_initialize(Model, tracer_types) Model%ndchs = NO_TRACER Model%ndche = NO_TRACER + if (Model%rrfs_smoke) then + Model%nchem = 2 + Model%ndvel = 2 + endif + do n = 1, size(tracer_types) select case (tracer_types(n)) case (1) @@ -5406,9 +5585,29 @@ subroutine control_print(Model) print *, ' cplwav2atm : ', Model%cplwav2atm print *, ' cplaqm : ', Model%cplaqm print *, ' cplchm : ', Model%cplchm + print *, ' rrfs_smoke : ', Model%rrfs_smoke print *, ' use_cice_alb : ', Model%use_cice_alb print *, ' cpl_imp_mrg : ', Model%cpl_imp_mrg print *, ' cpl_imp_dbg : ', Model%cpl_imp_dbg + if(model%rrfs_smoke) then + print *, ' ' + print *, 'smoke parameters' + print *, 'dust_smoke_rrtmg_band_number : ',Model%dust_smoke_rrtmg_band_number + print *, 'seas_opt : ',Model%seas_opt + print *, 'dust_opt : ',Model%dust_opt + print *, 'biomass_burn_opt : ',Model%biomass_burn_opt + print *, 'drydep_opt : ',Model%drydep_opt + print *, 'wetdep_ls_opt : ',Model%wetdep_ls_opt + print *, 'do_plumerise : ',Model%do_plumerise + print *, 'plumerisefire_frq: ',Model%plumerisefire_frq + print *, 'addsmoke_flag : ',Model%addsmoke_flag + print *, 'smoke_forecast : ',Model%smoke_forecast + print *, 'aero_ind_fdb : ',Model%aero_ind_fdb + print *, 'aero_dir_fdb : ',Model%aero_dir_fdb + print *, 'rrfs_smoke_debug : ',Model%rrfs_smoke_debug + print *, 'mix_chem : ',Model%mix_chem + print *, 'fire_turb : ',Model%fire_turb + endif print *, ' ' print *, ' lsidea : ', Model%lsidea print *, ' ' @@ -5792,6 +5991,10 @@ subroutine control_print(Model) print *, ' nto2 : ', Model%nto2 print *, ' ntwa : ', Model%ntwa print *, ' ntia : ', Model%ntia + print *, ' ntsmoke : ', Model%ntsmoke + print *, ' ntdust : ', Model%ntdust + print *, ' nchem : ', Model%nchem + print *, ' ndvel : ', Model%ndvel print *, ' ntchm : ', Model%ntchm print *, ' ntchs : ', Model%ntchs print *, ' ntche : ', Model%ntche @@ -6025,6 +6228,11 @@ subroutine tbd_create (Tbd, IM, Model) allocate (Tbd%hpbl (IM)) Tbd%hpbl = clear_val + if (Model%imfdeepcnv .ge. 0 .or. Model%imfshalcnv .ge. 0) then + allocate(Tbd%ud_mf(IM, Model%levs)) + Tbd%ud_mf = zero + endif + if (Model%imfdeepcnv == Model%imfdeepcnv_gf .or. Model%imfdeepcnv == Model%imfdeepcnv_ntiedtke) then allocate(Tbd%forcet(IM, Model%levs)) allocate(Tbd%forceq(IM, Model%levs)) @@ -6053,6 +6261,7 @@ subroutine tbd_create (Tbd, IM, Model) allocate (Tbd%qi_bl (IM,Model%levs)) allocate (Tbd%el_pbl (IM,Model%levs)) allocate (Tbd%sh3d (IM,Model%levs)) + allocate (Tbd%sm3d (IM,Model%levs)) allocate (Tbd%qke (IM,Model%levs)) allocate (Tbd%tsq (IM,Model%levs)) allocate (Tbd%qsq (IM,Model%levs)) @@ -6063,6 +6272,7 @@ subroutine tbd_create (Tbd, IM, Model) Tbd%qi_bl = clear_val Tbd%el_pbl = clear_val Tbd%sh3d = clear_val + Tbd%sm3d = clear_val Tbd%qke = zero Tbd%tsq = clear_val Tbd%qsq = clear_val @@ -6629,6 +6839,13 @@ subroutine diag_create (Diag, IM, Model) allocate (Diag%det_thl (IM,Model%levs)) allocate (Diag%det_sqv (IM,Model%levs)) endif + if (Model%bl_mynn_tkebudget) then + allocate (Diag%dqke (IM,Model%levs)) + allocate (Diag%qwt (IM,Model%levs)) + allocate (Diag%qshear (IM,Model%levs)) + allocate (Diag%qbuoy (IM,Model%levs)) + allocate (Diag%qdiss (IM,Model%levs)) + endif allocate (Diag%nupdraft (IM)) allocate (Diag%maxmf (IM)) allocate (Diag%ktop_plume(IM)) @@ -6646,6 +6863,13 @@ subroutine diag_create (Diag, IM, Model) Diag%det_thl = clear_val Diag%det_sqv = clear_val endif + if (Model%bl_mynn_tkebudget) then + Diag%dqke = clear_val + Diag%qwt = clear_val + Diag%qshear = clear_val + Diag%qbuoy = clear_val + Diag%qdiss = clear_val + endif Diag%nupdraft = 0 Diag%maxmf = clear_val Diag%ktop_plume = 0 diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index aacc64b86..0c7cf73dd 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -309,6 +309,20 @@ dimensions = (horizontal_loop_extent,vertical_layer_dimension) type = real kind = kind_phys +[qgrs(:,:,index_for_smoke_in_tracer_concentration_array)] + standard_name = smoke_tracer_concentration + long_name = concentration of smoke + units = kg kg-1 + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys +[qgrs(:,:,index_for_dust_in_tracer_concentration_array)] + standard_name = dust_tracer_concentration + long_name = concentration of dust + units = kg kg-1 + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys [diss_est] standard_name = dissipation_estimate_of_air_temperature_at_model_layers long_name = dissipation estimate model layer mean temperature @@ -716,6 +730,30 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys +[dust12m_in] + standard_name = fengsha_dust12m_input + long_name = fengsha dust input + units = various + dimensions = (horizontal_dimension,12,5) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[emi_in] + standard_name = anthropogenic_background_input + long_name = anthropogenic background input + units = various + dimensions = (horizontal_dimension,1) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[smoke_GBBEPx] + standard_name = emission_smoke_GBBEPx + long_name = emission fire GBBEPx + units = various + dimensions = (horizontal_dimension,24,3) + type = real + kind = kind_phys + active = (do_smoke_coupling) [z0base] standard_name = baseline_surface_roughness_length long_name = baseline surface roughness length for momentum in meter @@ -2395,6 +2433,14 @@ type = real kind = kind_phys active = (control_for_stochastic_land_surface_perturbation /= 0) +[dqdti] + standard_name = instantaneous_water_vapor_specific_humidity_tendency_due_to_convection + long_name = instantaneous moisture tendency due to convection + units = kg kg-1 s-1 + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + active = (do_smoke_coupling) [nwfa2d] standard_name = tendency_of_hygroscopic_aerosols_at_surface_adjacent_layer long_name = instantaneous water-friendly sfc aerosol source @@ -2411,6 +2457,126 @@ type = real kind = kind_phys active = (control_for_microphysics_scheme == identifier_for_thompson_microphysics_scheme .and. flag_for_aerosol_physics) +[emdust] + standard_name = emission_of_dust_for_smoke + long_name = emission of dust for smoke + units = ug m-2 s-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[emseas] + standard_name = emission_of_seas_for_smoke + long_name = emission of seas for smoke + units = ug m-2 s-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[emanoc] + standard_name = emission_of_anoc_for_thompson_mp + long_name = emission of anoc for thompson mp + units = ug m-2 s-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[ebb_smoke_hr] + standard_name = surface_smoke_emission + long_name = emission of surface smoke + units = ug m-2 s-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[frp_hr] + standard_name = frp_hourly + long_name = hourly fire radiative power + units = MW + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[frp_std_hr] + standard_name = frp_std_hourly + long_name = hourly stdandard deviation of fire radiative power + units = MW + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[fhist] + standard_name = fire_hist + long_name = coefficient to scale the fire activity depending on the fire duration + units = none + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[coef_bb_dc] + standard_name = coef_bb_dc + long_name = coef to estimate the fire emission + units = none + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[ebu_smoke] + standard_name = ebu_smoke + long_name = buffer of vertical fire emission + units = various + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[smoke_ext] + standard_name = extinction_coefficient_in_air_due_to_smoke + long_name = extinction coefficient in air due to smoke + units = various + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[dust_ext] + standard_name = extinction_coefficient_in_air_due_to_dust + long_name = extinction coefficient in air due to dust + units = various + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[chem3d] + standard_name = chem3d_mynn_pbl_transport + long_name = mynn pbl transport of smoke and dust + units = various + dimensions = (horizontal_loop_extent,vertical_layer_dimension,2) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[min_fplume] + standard_name = minimum_fire_plume_sigma_pressure_level + long_name = minimum model level of fire plumerise + units = none + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[max_fplume] + standard_name = maximum_fire_plume_sigma_pressure_level + long_name = maximum model level of fire plumerise + units = none + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[rrfs_hwp] + standard_name = hourly_wildfire_potential + long_name = rrfs hourly fire weather potential + units = none + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + active = (do_smoke_coupling) [ushfsfci] standard_name = surface_upward_sensible_heat_flux_for_chemistry_coupling long_name = instantaneous upward sensible heat flux for chemistry coupling @@ -2767,6 +2933,18 @@ units = flag dimensions = () type = logical +[rrfs_smoke] + standard_name = do_smoke_coupling + long_name = flag controlling rrfs_smoke collection (default off) + units = flag + dimensions = () + type = logical +[dust_smoke_rrtmg_band_number] + standard_name = index_of_shortwave_band_affected_by_smoke + long_name = rrtmg band number that smoke and dust should affect + units = count + dimensions = () + type = integer [cpl_imp_mrg] standard_name = flag_for_merging_imported_data long_name = flag controlling cpl_imp_mrg for imported data (default off) @@ -5223,6 +5401,30 @@ units = index dimensions = () type = integer +[ntsmoke] + standard_name = index_for_smoke_in_tracer_concentration_array + long_name = tracer index for smoke + units = index + dimensions = () + type = integer +[ntdust] + standard_name = index_for_dust_in_tracer_concentration_array + long_name = tracer index for dust + units = index + dimensions = () + type = integer +[nchem] + standard_name = number_of_chemical_species_vertically_mixed + long_name = number of chemical vertically mixed + units = count + dimensions = () + type = integer +[ndvel] + standard_name = number_of_chemical_species_deposited + long_name = number of chemical pbl deposited + units = count + dimensions = () + type = integer [ntchm] standard_name = number_of_chemical_tracers long_name = number of chemical tracers @@ -5320,6 +5522,104 @@ units = index dimensions = () type = integer +[mix_chem] + standard_name = do_planetary_boundary_layer_smoke_mixing + long_name = flag for rrfs smoke mynn tracer mixing + units = flag + dimensions = () + type = logical + active = (do_smoke_coupling) +[fire_turb] + standard_name = do_planetary_boundary_layer_fire_enhancement + long_name = flag for rrfs smoke mynn enh vermix + units = flag + dimensions = () + type = logical + active = (do_smoke_coupling) +[seas_opt] + standard_name = control_for_smoke_sea_salt + long_name = rrfs smoke sea salt emission option + units = index + dimensions = () + type = integer + active = (do_smoke_coupling) +[dust_opt] + standard_name = control_for_smoke_dust + long_name = rrfs smoke dust chem option + units = index + dimensions = () + type = integer + active = (do_smoke_coupling) +[biomass_burn_opt] + standard_name = control_for_smoke_biomass_burn + long_name = rrfs smoke biomass burning option + units = index + dimensions = () + type = integer + active = (do_smoke_coupling) +[drydep_opt] + standard_name = control_for_smoke_dry_deposition + long_name = rrfs smoke dry deposition option + units = index + dimensions = () + type = integer + active = (do_smoke_coupling) +[wetdep_ls_opt] + standard_name = control_for_smoke_wet_deposition + long_name = rrfs smoke large scale wet deposition option + units = index + dimensions = () + type = integer + active = (do_smoke_coupling) +[do_plumerise] + standard_name = do_smoke_plumerise + long_name = rrfs smoke plumerise option + units = index + dimensions = () + type = logical + active = (do_smoke_coupling) +[plumerisefire_frq] + standard_name = smoke_plumerise_frequency + long_name = rrfs smoke add smoke option + units = min + dimensions = () + type = integer + active = (do_smoke_coupling) +[addsmoke_flag] + standard_name = control_for_smoke_biomass_burning_emissions + long_name = rrfs smoke add smoke option + units = index + dimensions = () + type = integer + active = (do_smoke_coupling) +[smoke_forecast] + standard_name = do_smoke_forecast + long_name = flag for rrfs smoke forecast + units = flag + dimensions = () + type = logical + active = (do_smoke_coupling) +[aero_ind_fdb] + standard_name = do_smoke_aerosol_indirect_feedback + long_name = flag for wfa ifa emission indirect feedback + units = flag + dimensions = () + type = logical + active = (do_smoke_coupling) +[aero_dir_fdb] + standard_name = do_smoke_aerosol_direct_feedback + long_name = flag for smoke and dust radiation feedback + units = flag + dimensions = () + type = logical + active = (do_smoke_coupling) +[rrfs_smoke_debug] + standard_name = do_smoke_debug + long_name = flag for rrfs smoke plumerise debug + units = flag + dimensions = () + type = logical + active = (do_smoke_coupling) [ncnvcld3d] standard_name = number_of_convective_cloud_variables_in_xyz_dimensioned_restart_array long_name = number of convective 3d clouds fields @@ -5667,18 +5967,12 @@ units = flag dimensions = () type = logical -[grav_settling] - standard_name = control_for_gravitational_settling_of_cloud_droplets - long_name = flag to activate gravitational setting of fog - units = flag - dimensions = () - type = integer [bl_mynn_tkebudget] standard_name = control_for_tke_budget_output long_name = flag for activating TKE budget units = flag dimensions = () - type = integer + type = logical [bl_mynn_tkeadvect] standard_name = flag_for_tke_advection long_name = flag for activating TKE advection @@ -5715,12 +6009,6 @@ units = flag dimensions = () type = integer -[bl_mynn_edmf_part] - standard_name = control_for_edmf_partitioning_in_mellor_yamada_nakanishi_niino_pbl_scheme - long_name = flag to partitioning og the MF and ED areas - units = flag - dimensions = () - type = integer [bl_mynn_cloudmix] standard_name = control_for_cloud_species_mixing_in_mellor_yamada_nakanishi_niino_pbl_scheme long_name = flag to activate mixing of cloud species @@ -5739,12 +6027,42 @@ units = flag dimensions = () type = integer +[bl_mynn_closure] + standard_name = control_for_closure_level_in_mellor_yamada_nakanishi_niino_pbl_scheme + long_name = flag to determine the closure level for the mynn + units = 1 + dimensions = () + type = real [icloud_bl] standard_name = control_for_sgs_cloud_radiation_coupling_in_mellor_yamamda_nakanishi_niino_pbl_scheme long_name = flag for coupling sgs clouds to radiation units = flag dimensions = () type = integer +[isftcflx] + standard_name = control_for_thermal_roughness_lengths_over_water + long_name = flag for thermal roughness lengths over water in mynnsfclay + units = 1 + dimensions = () + type = integer +[iz0tlnd] + standard_name = control_for_thermal_roughness_lengths_over_land + long_name = flag for thermal roughness lengths over land in mynnsfclay + units = 1 + dimensions = () + type = integer +[sfclay_compute_flux] + standard_name = do_compute_surface_scalar_fluxes + long_name = flag for computing surface scalar fluxes in mynnsfclay + units = flag + dimensions = () + type = logical +[sfclay_compute_diag] + standard_name = do_compute_surface_diagnostics + long_name = flag for computing surface diagnostics in mynnsfclay + units = flag + dimensions = () + type = logical [var_ric] standard_name = control_for_variable_bulk_richardson_number long_name = flag for calculating variable bulk richardson number for hurricane PBL @@ -6148,6 +6466,14 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys +[ud_mf] + standard_name = instantaneous_atmosphere_updraft_convective_mass_flux + long_name = (updraft mass flux) * delt + units = kg m-2 + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + active = ( control_for_deep_convection_scheme .ge. 0 .or. control_for_shallow_convection_scheme .ge. 0 ) [in_nm] standard_name = ice_nucleation_number_from_climatology long_name = ice nucleation number in MG MP @@ -6479,6 +6805,14 @@ type = real kind = kind_phys active = (flag_for_mellor_yamada_nakanishi_niino_pbl_scheme) +[Sm3D] + standard_name = stability_function_for_momentum + long_name = stability function for momentum + units = none + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + active = (flag_for_mellor_yamada_nakanishi_niino_pbl_scheme) [qke] standard_name = nonadvected_turbulent_kinetic_energy_multiplied_by_2 long_name = 2 x tke at mass points @@ -7613,6 +7947,46 @@ type = real kind = kind_phys active = (flag_for_mellor_yamada_nakanishi_niino_pbl_scheme .and. (control_for_additional_diagnostics_in_mellor_yamada_nakanishi_niino_pbl_scheme .ne. 0)) +[dqke] + standard_name = total_time_rate_of_change_of_tke + long_name = total tke tendency + units = m2 s-3 + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + active = (flag_for_mellor_yamada_nakanishi_niino_pbl_scheme .and. control_for_tke_budget_output) +[qwt] + standard_name = tke_tendency_due_to_vertical_transport + long_name = tke tendency due to vertical transport and diffusion + units = m2 s-3 + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + active = (flag_for_mellor_yamada_nakanishi_niino_pbl_scheme .and. control_for_tke_budget_output) +[qshear] + standard_name = tke_tendency_due_to_shear + long_name = tke tendency due to shear + units = m2 s-3 + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + active = (flag_for_mellor_yamada_nakanishi_niino_pbl_scheme .and. control_for_tke_budget_output) +[qbuoy] + standard_name = tke_tendency_due_to_buoyancy + long_name = tke tendency due to buoyancy production or consumption + units = m2 s-3 + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + active = (flag_for_mellor_yamada_nakanishi_niino_pbl_scheme .and. control_for_tke_budget_output) +[qdiss] + standard_name = tke_tendency_due_to_dissipation + long_name = tke tendency due to the dissipation of tke + units = m2 s-3 + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + active = (flag_for_mellor_yamada_nakanishi_niino_pbl_scheme .and. control_for_tke_budget_output) [nupdraft] standard_name = number_of_plumes long_name = number of plumes per grid column @@ -7642,7 +8016,7 @@ type = integer active = (flag_for_mellor_yamada_nakanishi_niino_pbl_scheme) [exch_h] - standard_name = atmosphere_heat_diffusivity_for_mynnpbl + standard_name = atmosphere_heat_diffusivity_for_mynnedmf long_name = diffusivity for heat for MYNN PBL (defined for all mass levels) units = m2 s-1 dimensions = (horizontal_loop_extent,vertical_layer_dimension) @@ -7650,7 +8024,7 @@ kind = kind_phys active = (flag_for_mellor_yamada_nakanishi_niino_pbl_scheme) [exch_m] - standard_name = atmosphere_momentum_diffusivity_for_mynnpbl + standard_name = atmosphere_momentum_diffusivity_for_mynnedmf long_name = diffusivity for momentum for MYNN PBL (defined for all mass levels) units = m2 s-1 dimensions = (horizontal_loop_extent,vertical_layer_dimension) diff --git a/ccpp/driver/GFS_diagnostics.F90 b/ccpp/driver/GFS_diagnostics.F90 index 7b01163d8..dd8eaed80 100644 --- a/ccpp/driver/GFS_diagnostics.F90 +++ b/ccpp/driver/GFS_diagnostics.F90 @@ -1764,6 +1764,20 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ! if(mpp_pe()==mpp_root_pe())print *,'in gfdl_diag_register,af totgrp,idx=',idx +!--- RRFS Smoke --- + if (Model%rrfs_smoke) then + idx = idx + 1 + ExtDiag(idx)%axes = 3 + ExtDiag(idx)%name = 'dqdti' + ExtDiag(idx)%desc = 'dqdti' + ExtDiag(idx)%unit = 'kg kg-1 s-1' + ExtDiag(idx)%mod_name = 'gfs_phys' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var3 => Coupling(nb)%dqdti(:,:) + enddo + endif + !--- physics instantaneous diagnostics --- idx = idx + 1 ExtDiag(idx)%axes = 2 @@ -3531,6 +3545,152 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop enddo end if thompson_extended_diagnostics + if (Model%rrfs_smoke .and. Model%ntsmoke>0) then + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'emdust' + ExtDiag(idx)%desc = 'emission of dust for smoke' + ExtDiag(idx)%unit = 'ug m-2 s-1' + ExtDiag(idx)%mod_name = 'gfs_sfc' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%emdust + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'emseas' + ExtDiag(idx)%desc = 'emission of seas for smoke' + ExtDiag(idx)%unit = 'ug m-2 s-1' + ExtDiag(idx)%mod_name = 'gfs_sfc' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%emseas + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'emanoc' + ExtDiag(idx)%desc = 'emission of anoc for thompson mp' + ExtDiag(idx)%unit = 'ug m-2 s-1' + ExtDiag(idx)%mod_name = 'gfs_sfc' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%emanoc + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'coef_bb_dc' + ExtDiag(idx)%desc = 'coeff bb for smoke' + ExtDiag(idx)%unit = '' + ExtDiag(idx)%mod_name = 'gfs_sfc' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%coef_bb_dc + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'min_fplume' + ExtDiag(idx)%desc = 'minimum smoke plume height' + ExtDiag(idx)%unit = '' + ExtDiag(idx)%mod_name = 'gfs_sfc' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%min_fplume + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'max_fplume' + ExtDiag(idx)%desc = 'maximum smoke plume height' + ExtDiag(idx)%unit = '' + ExtDiag(idx)%mod_name = 'gfs_sfc' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%max_fplume + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'HWP' + ExtDiag(idx)%desc = 'hourly fire weather potential' + ExtDiag(idx)%unit = ' ' + ExtDiag(idx)%mod_name = 'gfs_sfc' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%rrfs_hwp + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'ebb_smoke_hr' + ExtDiag(idx)%desc = 'hourly smoke emission' + ExtDiag(idx)%unit = 'ug m-2 s-1' + ExtDiag(idx)%mod_name = 'gfs_sfc' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%ebb_smoke_hr + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'frp_hr' + ExtDiag(idx)%desc = 'hourly frp' + ExtDiag(idx)%unit = 'mw' + ExtDiag(idx)%mod_name = 'gfs_sfc' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%frp_hr + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'frp_std_hr' + ExtDiag(idx)%desc = 'hourly std frp' + ExtDiag(idx)%unit = 'mw' + ExtDiag(idx)%mod_name = 'gfs_sfc' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => Coupling(nb)%frp_std_hr + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 3 + ExtDiag(idx)%name = 'ebu_smoke' + ExtDiag(idx)%desc = 'smoke emission' + ExtDiag(idx)%unit = 'ug/m2/s' + ExtDiag(idx)%mod_name = 'gfs_phys' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var3 => Coupling(nb)%ebu_smoke(:,:) + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 3 + ExtDiag(idx)%name = 'smoke_ext' + ExtDiag(idx)%desc = 'smoke extinction at 550nm' + ExtDiag(idx)%unit = ' ' + ExtDiag(idx)%mod_name = 'gfs_phys' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var3 => Coupling(nb)%smoke_ext(:,:) + enddo + + idx = idx + 1 + ExtDiag(idx)%axes = 3 + ExtDiag(idx)%name = 'dust_ext' + ExtDiag(idx)%desc = 'dust extinction at 550nm' + ExtDiag(idx)%unit = ' ' + ExtDiag(idx)%mod_name = 'gfs_phys' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var3 => Coupling(nb)%dust_ext(:,:) + enddo + + endif + do i=1,Model%num_dfi_radar idx = idx + 1 ExtDiag(idx)%axes = 3 diff --git a/ccpp/driver/GFS_restart.F90 b/ccpp/driver/GFS_restart.F90 index 8699eae94..73e181b5f 100644 --- a/ccpp/driver/GFS_restart.F90 +++ b/ccpp/driver/GFS_restart.F90 @@ -132,6 +132,10 @@ subroutine GFS_restart_populate (Restart, Model, Statein, Stateout, Sfcprop, & if(Model%lrefres) then Restart%num3d = Model%ntot3d+1 endif + ! General Convection + if (Model%imfdeepcnv == Model%imfdeepcnv_gf) then + Restart%num3d = Restart%num3d + 1 + endif ! GF if (Model%imfdeepcnv == 3) then Restart%num3d = Restart%num3d + 3 @@ -141,6 +145,14 @@ subroutine GFS_restart_populate (Restart, Model, Statein, Stateout, Sfcprop, & Restart%num3d = Restart%num3d + 9 endif + if (Model%num_dfi_radar > 0) then + do itime=1,Model%dfi_radar_max_intervals + if(Model%ix_dfi_radar(itime)>0) then + Restart%num3d = Restart%num3d + 1 + endif + enddo + endif + allocate (Restart%name2d(Restart%num2d)) allocate (Restart%name3d(Restart%num3d)) allocate (Restart%data(nblks,max(Restart%num2d,Restart%num3d))) @@ -419,12 +431,21 @@ subroutine GFS_restart_populate (Restart, Model, Statein, Stateout, Sfcprop, & Restart%data(nb,num)%var3p => IntDiag(nb)%refl_10cm(:,:) enddo endif - if (Model%lrefres) then num = Model%ntot3d+1 else num = Model%ntot3d endif + + !--Convection variable used in CB cloud fraction. Presently this + !--is only needed in sgscloud_radpre for imfdeepcnv == imfdeepcnv_gf. + if (Model%imfdeepcnv == Model%imfdeepcnv_gf) then + num = num + 1 + Restart%name3d(num) = 'cnv_3d_ud_mf' + do nb = 1,nblks + Restart%data(nb,num)%var3p => Tbd(nb)%ud_mf(:,:) + enddo + endif !--- RAP/HRRR-specific variables, 3D ! GF if (Model%imfdeepcnv == Model%imfdeepcnv_gf) then diff --git a/ccpp/physics b/ccpp/physics index 99f32c55b..01e3d6b35 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 99f32c55b66160cfd75f5002d9b5ba7320e443a2 +Subproject commit 01e3d6b35c44b1f32abe8b294b414cc29b0ab554 diff --git a/ccpp/suites/suite_FV3_HRRR.xml b/ccpp/suites/suite_FV3_HRRR.xml index ca3c63468..a4c5b7dbc 100644 --- a/ccpp/suites/suite_FV3_HRRR.xml +++ b/ccpp/suites/suite_FV3_HRRR.xml @@ -42,10 +42,8 @@ mynnsfc_wrapper GFS_surface_loop_control_part1 - sfc_nst_pre - sfc_nst - sfc_nst_post lsm_ruc + flake_driver GFS_surface_loop_control_part2 diff --git a/ccpp/suites/suite_FV3_HRRR_smoke.xml b/ccpp/suites/suite_FV3_HRRR_smoke.xml new file mode 100644 index 000000000..e3f51c14d --- /dev/null +++ b/ccpp/suites/suite_FV3_HRRR_smoke.xml @@ -0,0 +1,83 @@ + + + + + + + GFS_time_vary_pre + GFS_rrtmg_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + sgscloud_radpre + GFS_rrtmg_pre + GFS_radiation_surface + rad_sw_pre + rrtmg_sw + rrtmg_sw_post + rrtmg_lw_pre + rrtmg_lw + sgscloud_radpost + rrtmg_lw_post + GFS_rrtmg_post + + + + + GFS_suite_interstitial_phys_reset + GFS_suite_stateout_reset + get_prs_fv3 + GFS_suite_interstitial_1 + GFS_surface_generic_pre + GFS_surface_composites_pre + dcyc2t3 + GFS_surface_composites_inter + GFS_suite_interstitial_2 + + + + mynnsfc_wrapper + GFS_surface_loop_control_part1 + lsm_ruc + flake_driver + GFS_surface_loop_control_part2 + + + + GFS_surface_composites_post + sfc_diag + sfc_diag_post + GFS_surface_generic_post + rrfs_smoke_wrapper + mynnedmf_wrapper + rrfs_smoke_postpbl + GFS_GWD_generic_pre + drag_suite + GFS_GWD_generic_post + GFS_suite_stateout_update + ozphys_2015 + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_suite_interstitial_4 + GFS_MP_generic_pre + mp_thompson_pre + mp_thompson + mp_thompson_post + GFS_MP_generic_post + maximum_hourly_diagnostics + rrfs_smoke_lsdep_wrapper + phys_tend + + + + + GFS_stochastics + + + + diff --git a/ccpp/suites/suite_FV3_RAP_noah_sfcdiff_ugwpv1.xml b/ccpp/suites/suite_FV3_RAP_noah_sfcdiff_ugwpv1.xml new file mode 100644 index 000000000..00ef6952c --- /dev/null +++ b/ccpp/suites/suite_FV3_RAP_noah_sfcdiff_ugwpv1.xml @@ -0,0 +1,94 @@ + + + + + + + GFS_time_vary_pre + GFS_rrtmg_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + sgscloud_radpre + GFS_rrtmg_pre + GFS_radiation_surface + rad_sw_pre + rrtmg_sw + rrtmg_sw_post + rrtmg_lw_pre + rrtmg_lw + sgscloud_radpost + rrtmg_lw_post + GFS_rrtmg_post + + + + + GFS_suite_interstitial_phys_reset + GFS_suite_stateout_reset + get_prs_fv3 + GFS_suite_interstitial_1 + GFS_surface_generic_pre + GFS_surface_composites_pre + dcyc2t3 + GFS_surface_composites_inter + GFS_suite_interstitial_2 + + + + sfc_diff + GFS_surface_loop_control_part1 + sfc_nst_pre + sfc_nst + sfc_nst_post + lsm_noah + sfc_sice + GFS_surface_loop_control_part2 + + + + GFS_surface_composites_post + sfc_diag + sfc_diag_post + GFS_surface_generic_post + mynnedmf_wrapper + GFS_GWD_generic_pre + ugwpv1_gsldrag + ugwpv1_gsldrag_post + GFS_GWD_generic_post + GFS_suite_stateout_update + ozphys_2015 + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_DCNV_generic_pre + cu_gf_driver_pre + cu_gf_driver + GFS_DCNV_generic_post + GFS_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + mp_thompson_pre + + + mp_thompson + + + mp_thompson_post + GFS_MP_generic_post + cu_gf_driver_post + maximum_hourly_diagnostics + phys_tend + + + + + GFS_stochastics + + + + diff --git a/ccpp/suites/suite_FV3_RAP_noah_sfcdiff_unified_ugwp.xml b/ccpp/suites/suite_FV3_RAP_noah_sfcdiff_unified_ugwp.xml new file mode 100644 index 000000000..5230d75d6 --- /dev/null +++ b/ccpp/suites/suite_FV3_RAP_noah_sfcdiff_unified_ugwp.xml @@ -0,0 +1,90 @@ + + + + + + + GFS_time_vary_pre + GFS_rrtmg_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + sgscloud_radpre + GFS_rrtmg_pre + GFS_radiation_surface + rad_sw_pre + rrtmg_sw + rrtmg_sw_post + rrtmg_lw_pre + rrtmg_lw + sgscloud_radpost + rrtmg_lw_post + GFS_rrtmg_post + + + + + GFS_suite_interstitial_phys_reset + GFS_suite_stateout_reset + get_prs_fv3 + GFS_suite_interstitial_1 + GFS_surface_generic_pre + GFS_surface_composites_pre + dcyc2t3 + GFS_surface_composites_inter + GFS_suite_interstitial_2 + + + + sfc_diff + GFS_surface_loop_control_part1 + sfc_nst_pre + sfc_nst + sfc_nst_post + lsm_noah + sfc_sice + GFS_surface_loop_control_part2 + + + + GFS_surface_composites_post + sfc_diag + sfc_diag_post + GFS_surface_generic_post + mynnedmf_wrapper + GFS_GWD_generic_pre + unified_ugwp + unified_ugwp_post + GFS_GWD_generic_post + GFS_suite_stateout_update + ozphys_2015 + h2ophys + get_phi_fv3 + GFS_suite_interstitial_3 + GFS_DCNV_generic_pre + cu_gf_driver_pre + cu_gf_driver + GFS_DCNV_generic_post + GFS_suite_interstitial_4 + cnvc90 + GFS_MP_generic_pre + mp_thompson_pre + mp_thompson + mp_thompson_post + GFS_MP_generic_post + cu_gf_driver_post + maximum_hourly_diagnostics + phys_tend + + + + + GFS_stochastics + + + + diff --git a/io/FV3GFS_io.F90 b/io/FV3GFS_io.F90 index 041a2d46b..ef7cbf008 100644 --- a/io/FV3GFS_io.F90 +++ b/io/FV3GFS_io.F90 @@ -60,9 +60,12 @@ module FV3GFS_io_mod character(len=32) :: fn_oro_ss = 'oro_data_ss.nc' character(len=32) :: fn_srf = 'sfc_data.nc' character(len=32) :: fn_phy = 'phy_data.nc' + character(len=32) :: fn_dust12m= 'dust12m_data.nc' + character(len=32) :: fn_emi = 'emi_data.nc' + character(len=32) :: fn_gbbepx = 'SMOKE_GBBEPx_data.nc' !--- GFDL FMS netcdf restart data types defined in fms2_io - type(FmsNetcdfDomainFile_t) :: Oro_restart, Sfc_restart, Phy_restart + type(FmsNetcdfDomainFile_t) :: Oro_restart, Sfc_restart, Phy_restart, dust12m_restart, emi_restart, gbbepx_restart type(FmsNetcdfDomainFile_t) :: Oro_ls_restart, Oro_ss_restart !--- GFDL FMS restart containers @@ -71,6 +74,10 @@ module FV3GFS_io_mod character(len=32), allocatable, dimension(:) :: oro_ls_ss_name real(kind=kind_phys), allocatable, target, dimension(:,:,:) :: oro_ls_var, oro_ss_var real(kind=kind_phys), allocatable, target, dimension(:,:,:,:) :: sfc_var3, phy_var3 + character(len=32), allocatable, dimension(:) :: dust12m_name, emi_name, gbbepx_name + real(kind=kind_phys), allocatable, target, dimension(:,:,:,:) :: gbbepx_var + real(kind=kind_phys), allocatable, target, dimension(:,:,:,:) :: dust12m_var + real(kind=kind_phys), allocatable, target, dimension(:,:,:) :: emi_var !--- Noah MP restart containers real(kind=kind_phys), allocatable, target, dimension(:,:,:,:) :: sfc_var3sn,sfc_var3eq,sfc_var3zn @@ -515,6 +522,7 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain, warm_sta integer :: nvar_o2, nvar_s2m, nvar_s2o, nvar_s3 integer :: nvar_oro_ls_ss integer :: nvar_s2r, nvar_s2mp, nvar_s3mp, isnow + integer :: nvar_emi, nvar_dust12m, nvar_gbbepx real(kind=kind_phys), pointer, dimension(:,:) :: var2_p => NULL() real(kind=kind_phys), pointer, dimension(:,:,:) :: var3_p => NULL() real(kind=kind_phys), pointer, dimension(:,:,:) :: var3_p1 => NULL() @@ -534,6 +542,15 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain, warm_sta nvar_o2 = 19 nvar_oro_ls_ss = 10 nvar_s2o = 18 + if(Model%rrfs_smoke) then + nvar_dust12m = 5 + nvar_gbbepx = 3 + nvar_emi = 1 + else + nvar_dust12m = 0 + nvar_gbbepx = 0 + nvar_emi = 0 + endif if (Model%lsm == Model%lsm_ruc .and. warm_start) then if(Model%rdlai) then @@ -675,6 +692,150 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain, warm_sta !--- deallocate containers and free restart container deallocate(oro_name2, oro_var2) + if_smoke: if(Model%rrfs_smoke) then ! for RRFS-Smoke + + !--- Dust input FILE + !--- open file + infile=trim(indir)//'/'//trim(fn_dust12m) + amiopen=open_file(dust12m_restart, trim(infile), 'read', domain=fv_domain, is_restart=.true., dont_add_res_to_filename=.true.) + if (.not.amiopen) call mpp_error( FATAL, 'Error with opening file'//trim(infile) ) + + if (.not. allocated(dust12m_name)) then + !--- allocate the various containers needed for fengsha dust12m data + allocate(dust12m_name(nvar_dust12m)) + allocate(dust12m_var(nx,ny,12,nvar_dust12m)) + + dust12m_name(1) = 'clay' + dust12m_name(2) = 'rdrag' + dust12m_name(3) = 'sand' + dust12m_name(4) = 'ssm' + dust12m_name(5) = 'uthr' + + !--- register axis + call register_axis(dust12m_restart, 'lon', 'X') + call register_axis(dust12m_restart, 'lat', 'Y') + call register_axis(dust12m_restart, 'time', 12) + !--- register the 3D fields + do num = 1,nvar_dust12m + var3_p2 => dust12m_var(:,:,:,num) + call register_restart_field(dust12m_restart, dust12m_name(num), var3_p2, dimensions=(/'time', 'lat ', 'lon '/),& + &is_optional=.not.mand) + enddo + nullify(var3_p2) + endif + + !--- read new GSL created dust12m restart/data + call mpp_error(NOTE,'reading dust12m information from INPUT/dust12m_data.tile*.nc') + call read_restart(dust12m_restart) + call close_file(dust12m_restart) + + do nb = 1, Atm_block%nblks + !--- 3D variables + do ix = 1, Atm_block%blksz(nb) + i = Atm_block%index(nb)%ii(ix) - isc + 1 + j = Atm_block%index(nb)%jj(ix) - jsc + 1 + do k = 1, 12 + Sfcprop(nb)%dust12m_in(ix,k,1) = dust12m_var(i,j,k,1) + Sfcprop(nb)%dust12m_in(ix,k,2) = dust12m_var(i,j,k,2) + Sfcprop(nb)%dust12m_in(ix,k,3) = dust12m_var(i,j,k,3) + Sfcprop(nb)%dust12m_in(ix,k,4) = dust12m_var(i,j,k,4) + Sfcprop(nb)%dust12m_in(ix,k,5) = dust12m_var(i,j,k,5) + enddo + enddo + enddo + + deallocate(dust12m_name,dust12m_var) + + !--- open anthropogenic emission file + infile=trim(indir)//'/'//trim(fn_emi) + amiopen=open_file(emi_restart, trim(infile), 'read', domain=fv_domain, is_restart=.true., dont_add_res_to_filename=.true.) + if (.not.amiopen) call mpp_error( FATAL, 'Error with opening file'//trim(infile) ) + + if (.not. allocated(emi_name)) then + !--- allocate the various containers needed for anthropogenic emission data + allocate(emi_name(nvar_emi)) + allocate(emi_var(nx,ny,nvar_emi)) + + emi_name(1) = 'e_oc' + !--- register axis + call register_axis( emi_restart, "grid_xt", 'X' ) + call register_axis( emi_restart, "grid_yt", 'Y' ) + !--- register the 2D fields + do num = 1,nvar_emi + var2_p => emi_var(:,:,num) + call register_restart_field(emi_restart, emi_name(num), var2_p, dimensions=(/'grid_yt','grid_xt'/)) + enddo + nullify(var2_p) + endif + + !--- read new GSL created emi restart/data + call mpp_error(NOTE,'reading emi information from INPUT/emi_data.tile*.nc') + call read_restart(emi_restart) + call close_file(emi_restart) + + do nb = 1, Atm_block%nblks + !--- 2D variables + do ix = 1, Atm_block%blksz(nb) + i = Atm_block%index(nb)%ii(ix) - isc + 1 + j = Atm_block%index(nb)%jj(ix) - jsc + 1 + Sfcprop(nb)%emi_in(ix,1) = emi_var(i,j,1) + enddo + enddo + + !--- deallocate containers and free restart container + deallocate(emi_name, emi_var) + + !--- Dust input FILE + !--- open file + infile=trim(indir)//'/'//trim(fn_gbbepx) + amiopen=open_file(gbbepx_restart, trim(infile), 'read', domain=fv_domain, is_restart=.true., dont_add_res_to_filename=.true.) + if (.not.amiopen) call mpp_error( FATAL, 'Error with opening file'//trim(infile) ) + + if (.not. allocated(gbbepx_name)) then + !--- allocate the various containers needed for gbbepx fire data + allocate(gbbepx_name(nvar_gbbepx)) + allocate(gbbepx_var(nx,ny,24,nvar_gbbepx)) + + gbbepx_name(1) = 'ebb_smoke_hr' + gbbepx_name(2) = 'frp_avg_hr' + gbbepx_name(3) = 'frp_std_hr' + + !--- register axis + call register_axis(gbbepx_restart, 'lon', 'X') + call register_axis(gbbepx_restart, 'lat', 'Y') + call register_axis(gbbepx_restart, 't', 24) + !--- register the 3D fields + mand = .false. + do num = 1,nvar_gbbepx + var3_p2 => gbbepx_var(:,:,:,num) + call register_restart_field(gbbepx_restart, gbbepx_name(num), var3_p2, dimensions=(/'t ', 'lat', 'lon'/),& + &is_optional=.not.mand) + enddo + nullify(var3_p2) + endif + + !--- read new GSL created gbbepx restart/data + call mpp_error(NOTE,'reading gbbepx information from INPUT/SMOKE_GBBEPx_data.nc') + call read_restart(gbbepx_restart) + call close_file(gbbepx_restart) + + do nb = 1, Atm_block%nblks + !--- 3D variables + do ix = 1, Atm_block%blksz(nb) + i = Atm_block%index(nb)%ii(ix) - isc + 1 + j = Atm_block%index(nb)%jj(ix) - jsc + 1 + !--- assign hprime(1:10) and hprime(15:24) with new oro stat data + do k = 1, 24 + Sfcprop(nb)%smoke_GBBEPx(ix,k,1) = gbbepx_var(i,j,k,1) + Sfcprop(nb)%smoke_GBBEPx(ix,k,2) = gbbepx_var(i,j,k,2) + Sfcprop(nb)%smoke_GBBEPx(ix,k,3) = gbbepx_var(i,j,k,3) + enddo + enddo + enddo + + deallocate(gbbepx_name, gbbepx_var) + endif if_smoke ! RRFS_Smoke + !--- Modify/read-in additional orographic static fields for GSL drag suite if (Model%gwd_opt==3 .or. Model%gwd_opt==33 .or. & Model%gwd_opt==2 .or. Model%gwd_opt==22 ) then