diff --git a/ccpp/physics b/ccpp/physics index 5c2d490b8..ba7ed8f17 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 5c2d490b888aecb7b6ac0021007d0ce58a4d1c20 +Subproject commit ba7ed8f173b6c91d6180be16051ce0d4c54cb2ad diff --git a/scm/src/GFS_typedefs.F90 b/scm/src/GFS_typedefs.F90 index 54b9558c5..a20d73be3 100644 --- a/scm/src/GFS_typedefs.F90 +++ b/scm/src/GFS_typedefs.F90 @@ -244,7 +244,8 @@ module GFS_typedefs 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_RRFS(:,:,:) => null() !< RRFS fire input + real (kind=kind_phys), pointer :: smoke_RRFS(:,:,:) => null() !< RRFS fire input hourly + real (kind=kind_phys), pointer :: smoke2d_RRFS(:,:) => null() !< RRFS fire input daily 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 @@ -449,10 +450,9 @@ module GFS_typedefs real (kind=kind_phys), pointer :: emseas (:) => null() !< instantaneous sea salt emission real (kind=kind_phys), pointer :: emanoc (:) => null() !< instantaneous anthro. oc emission - !--- Smoke. 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 + !--- Smoke. These 2 arrays are input smoke emission and frp + real (kind=kind_phys), pointer :: ebb_smoke_in(:) => null() !< input smoke emission + real (kind=kind_phys), pointer :: frp_input (:) => null() !< input FRP !--- For fire diurnal cycle real (kind=kind_phys), pointer :: fhist (:) => null() !< instantaneous fire coef_bb @@ -607,7 +607,7 @@ module GFS_typedefs real (kind=kind_phys), pointer :: nifa2d (:) => null() !< instantaneous ice-friendly sfc aerosol source !--- For fire diurnal cycle - real (kind=kind_phys), pointer :: ebu_smoke (:,:) => null() !< 3D ebu array + 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 @@ -616,12 +616,19 @@ module GFS_typedefs !--- For MYNN PBL transport of smoke and dust real (kind=kind_phys), pointer :: chem3d (:,:,:) => null() !< 3D aod array real (kind=kind_phys), pointer :: ddvel (:,: ) => null() !< 2D dry deposition velocity + !--- For convective wet removal of smoke and dust + real (kind=kind_phys), pointer :: wetdpc_flux (:,:) => null() !< 2D wet deposition array + !--- For large-scale wet removal of smoke and dust + real (kind=kind_phys), pointer :: wetdpr_flux (:,:) => null() !< 2D wet deposition array + !--- For dry deposition of smoke and dust + real (kind=kind_phys), pointer :: drydep_flux (:,:) => null() !< 2D dry deposition flux of smoke !--- 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 + 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 + real (kind=kind_phys), pointer :: rrfs_hwp (:) => null() !< hourly fire potential index + real (kind=kind_phys), pointer :: rrfs_hwp_ave (:) => null() !< *Average* hourly fire potential index !--- instantaneous quantities for chemistry coupling real (kind=kind_phys), pointer :: ushfsfci(:) => null() !< instantaneous upward sensible heat flux (w/m**2) @@ -1442,8 +1449,8 @@ module GFS_typedefs integer :: ntsmoke !< tracer index for smoke integer :: ntdust !< tracer index for dust integer :: ntcoarsepm !< tracer index for coarse PM - integer :: nchem = 3 !< number of prognostic chemical species (vertically mixied) - integer :: ndvel = 3 !< number of prognostic chemical species (which are deposited, usually =nchem) + 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 @@ -1504,10 +1511,13 @@ module GFS_typedefs real(kind=kind_phys) :: dust_alpha !< alpha parameter for fengsha dust scheme real(kind=kind_phys) :: dust_gamma !< gamma parameter for fengsha dust scheme real(kind=kind_phys) :: wetdep_ls_alpha !< alpha parameter for wet deposition + integer :: ebb_dcycle !< 1:retro; 2:forecast of fire emission integer :: seas_opt integer :: dust_opt integer :: drydep_opt integer :: coarsepm_settling + integer :: plume_wind_eff + logical :: extended_sd_diags integer :: wetdep_ls_opt logical :: do_plumerise integer :: addsmoke_flag @@ -1516,9 +1526,11 @@ module GFS_typedefs logical :: aero_ind_fdb ! WFA/IFA indirect logical :: aero_dir_fdb ! smoke/dust direct logical :: rrfs_smoke_debug + logical :: do_smoke_transport logical :: mix_chem logical :: enh_mix real(kind=kind_phys) :: smoke_dir_fdb_coef(7) !< smoke & dust direct feedbck coefficents + real(kind=kind_phys) :: smoke_conv_wet_coef(3) !< smoke & dust convective wet removal coefficents !--- debug flags logical :: debug @@ -2298,7 +2310,8 @@ subroutine sfcprop_create (Sfcprop, IM, Model) allocate (Sfcprop%weasdi (IM)) allocate (Sfcprop%hprime (IM,Model%nmtvr)) allocate (Sfcprop%dust12m_in (IM,12,5)) - allocate (Sfcprop%smoke_RRFS(IM,24,3)) + allocate (Sfcprop%smoke_RRFS(IM,24,2)) + allocate (Sfcprop%smoke2d_RRFS(IM,4)) allocate (Sfcprop%emi_in (IM,1)) allocate(Sfcprop%albdirvis_lnd (IM)) allocate(Sfcprop%albdirnir_lnd (IM)) @@ -2356,6 +2369,7 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%dust12m_in= clear_val Sfcprop%emi_in = clear_val Sfcprop%smoke_RRFS= clear_val + Sfcprop%smoke2d_RRFS= clear_val Sfcprop%albdirvis_lnd = clear_val Sfcprop%albdirnir_lnd = clear_val Sfcprop%albdifvis_lnd = clear_val @@ -2780,9 +2794,8 @@ subroutine sfcprop_create (Sfcprop, IM, Model) allocate (Sfcprop%emdust (IM)) allocate (Sfcprop%emseas (IM)) allocate (Sfcprop%emanoc (IM)) - allocate (Sfcprop%ebb_smoke_hr (IM)) - allocate (Sfcprop%frp_hr (IM)) - allocate (Sfcprop%frp_std_hr(IM)) + allocate (Sfcprop%ebb_smoke_in (IM)) + allocate (Sfcprop%frp_input (IM)) allocate (Sfcprop%fhist (IM)) allocate (Sfcprop%coef_bb_dc(IM)) allocate (Sfcprop%fire_in (IM,Model%fire_aux_data_levels)) @@ -2791,9 +2804,8 @@ subroutine sfcprop_create (Sfcprop, IM, Model) Sfcprop%emdust = clear_val Sfcprop%emseas = clear_val Sfcprop%emanoc = clear_val - Sfcprop%ebb_smoke_hr = clear_val - Sfcprop%frp_hr = clear_val - Sfcprop%frp_std_hr = clear_val + Sfcprop%ebb_smoke_in = clear_val + Sfcprop%frp_input = clear_val Sfcprop%fhist = 1. Sfcprop%coef_bb_dc = clear_val Sfcprop%fire_in = clear_val @@ -3139,17 +3151,25 @@ subroutine coupling_create (Coupling, IM, Model) allocate (Coupling%dust_ext (IM,Model%levs)) allocate (Coupling%chem3d (IM,Model%levs,Model%nchem)) allocate (Coupling%ddvel (IM,Model%ndvel)) + allocate (Coupling%wetdpc_flux(IM,Model%nchem)) + allocate (Coupling%wetdpr_flux(IM,Model%nchem)) + allocate (Coupling%drydep_flux(IM,Model%ndvel)) allocate (Coupling%min_fplume(IM)) allocate (Coupling%max_fplume(IM)) allocate (Coupling%rrfs_hwp (IM)) + allocate (Coupling%rrfs_hwp_ave (IM)) Coupling%ebu_smoke = clear_val Coupling%smoke_ext = clear_val Coupling%dust_ext = clear_val Coupling%chem3d = clear_val Coupling%ddvel = clear_val + Coupling%wetdpc_flux = clear_val + Coupling%wetdpr_flux = clear_val + Coupling%drydep_flux = clear_val Coupling%min_fplume = clear_val Coupling%max_fplume = clear_val Coupling%rrfs_hwp = clear_val + Coupling%rrfs_hwp_ave = clear_val endif if (Model%imfdeepcnv == Model%imfdeepcnv_gf .or. Model%imfdeepcnv == Model%imfdeepcnv_c3) then @@ -3839,10 +3859,13 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & real(kind=kind_phys) :: dust_gamma = 0. real(kind=kind_phys) :: wetdep_ls_alpha = 0. integer :: dust_moist_opt = 1 ! fecan :1 else shao + integer :: ebb_dcycle = 1 ! 1:retro; 2:forecast integer :: seas_opt = 2 integer :: dust_opt = 5 integer :: drydep_opt = 1 integer :: coarsepm_settling = 1 + integer :: plume_wind_eff = 1 + logical :: extended_sd_diags = .false. integer :: wetdep_ls_opt = 1 logical :: do_plumerise = .false. integer :: addsmoke_flag = 1 @@ -3851,9 +3874,11 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & logical :: aero_ind_fdb = .false. ! RRFS-sd wfa/ifa emission logical :: aero_dir_fdb = .false. ! RRFS-sd smoke/dust radiation feedback logical :: rrfs_smoke_debug = .false. ! RRFS-sd plumerise debug + logical :: do_smoke_transport = .true.! RRFS-sd convective transport of smoke/dust logical :: mix_chem = .false. ! tracer mixing option by MYNN PBL logical :: enh_mix = .false. ! enhance vertmix option by MYNN PBL real(kind=kind_phys) :: smoke_dir_fdb_coef(7) =(/ 0.33, 0.67, 0.02, 0.13, 0.85, 0.05, 0.95 /) !< smoke & dust direct feedbck coefficents + real(kind=kind_phys) :: smoke_conv_wet_coef(3) =(/ 0.50, 0.50, 0.50 /) !< smoke & dust convective wet removal coefficents !-- Lightning threat index logical :: lightning_threat = .false. @@ -4025,9 +4050,11 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & dust_drylimit_factor, dust_moist_correction, dust_moist_opt, & dust_alpha, dust_gamma, wetdep_ls_alpha, & seas_opt, dust_opt, drydep_opt, coarsepm_settling, & + plume_wind_eff,ebb_dcycle, extended_sd_diags, & wetdep_ls_opt, smoke_forecast, aero_ind_fdb, aero_dir_fdb, & rrfs_smoke_debug, do_plumerise, plumerisefire_frq, & addsmoke_flag, enh_mix, mix_chem, smoke_dir_fdb_coef, & + do_smoke_transport,smoke_conv_wet_coef, & !--- C3/GF closures ichoice,ichoicem,ichoice_s, & !--- (DFI) time ranges with radar-prescribed microphysics tendencies @@ -4300,10 +4327,13 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%dust_alpha = dust_alpha Model%dust_gamma = dust_gamma Model%wetdep_ls_alpha = wetdep_ls_alpha + Model%ebb_dcycle = ebb_dcycle Model%seas_opt = seas_opt Model%dust_opt = dust_opt Model%drydep_opt = drydep_opt Model%coarsepm_settling = coarsepm_settling + Model%plume_wind_eff = plume_wind_eff + Model%extended_sd_diags = extended_sd_diags Model%wetdep_ls_opt = wetdep_ls_opt Model%do_plumerise = do_plumerise Model%plumerisefire_frq = plumerisefire_frq @@ -4312,11 +4342,13 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%aero_ind_fdb = aero_ind_fdb Model%aero_dir_fdb = aero_dir_fdb Model%rrfs_smoke_debug = rrfs_smoke_debug + Model%do_smoke_transport= do_smoke_transport Model%mix_chem = mix_chem Model%enh_mix = enh_mix Model%smoke_dir_fdb_coef = smoke_dir_fdb_coef + Model%smoke_conv_wet_coef = smoke_conv_wet_coef - Model%fire_aux_data_levels = 10 + Model%fire_aux_data_levels = 1 Model%ichoice_s = ichoice_s Model%ichoicem = ichoicem @@ -6430,10 +6462,13 @@ subroutine control_print(Model) print *, 'dust_alpha : ',Model%dust_alpha print *, 'dust_gamma : ',Model%dust_gamma print *, 'wetdep_ls_alpha : ',Model%wetdep_ls_alpha + print *, 'ebb_dcycle : ',Model%ebb_dcycle print *, 'seas_opt : ',Model%seas_opt print *, 'dust_opt : ',Model%dust_opt print *, 'drydep_opt : ',Model%drydep_opt print *, 'coarsepm_settling: ',Model%coarsepm_settling + print *, 'plume_wind_eff : ',Model%plume_wind_eff + print *, 'extended_sd_diags: ',Model%extended_sd_diags print *, 'wetdep_ls_opt : ',Model%wetdep_ls_opt print *, 'do_plumerise : ',Model%do_plumerise print *, 'plumerisefire_frq: ',Model%plumerisefire_frq @@ -6442,9 +6477,11 @@ subroutine control_print(Model) 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 *, 'do_smoke_transport : ',Model%do_smoke_transport print *, 'mix_chem : ',Model%mix_chem print *, 'enh_mix : ',Model%enh_mix print *, 'smoke_dir_fdb_coef : ',Model%smoke_dir_fdb_coef + print *, 'smoke_conv_wet_coef: ',Model%smoke_conv_wet_coef endif print *, ' ' print *, ' lsidea : ', Model%lsidea diff --git a/scm/src/GFS_typedefs.meta b/scm/src/GFS_typedefs.meta index 4a5238096..a0db09e2d 100644 --- a/scm/src/GFS_typedefs.meta +++ b/scm/src/GFS_typedefs.meta @@ -921,7 +921,7 @@ standard_name = fengsha_dust12m_input long_name = fengsha dust input units = various - dimensions = (horizontal_dimension,12,5) + dimensions = (horizontal_loop_extent,12,5) type = real kind = kind_phys active = (do_smoke_coupling) @@ -929,7 +929,7 @@ standard_name = anthropogenic_background_input long_name = anthropogenic background input units = various - dimensions = (horizontal_dimension,1) + dimensions = (horizontal_loop_extent,1) type = real kind = kind_phys active = (do_smoke_coupling) @@ -937,7 +937,15 @@ standard_name = emission_smoke_RRFS long_name = emission fire RRFS units = various - dimensions = (horizontal_dimension,24,3) + dimensions = (horizontal_loop_extent,24,2) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[smoke2d_RRFS] + standard_name = emission_smoke_prvd_RRFS + long_name = emission fire RRFS daily + units = various + dimensions = (horizontal_loop_extent,4) type = real kind = kind_phys active = (do_smoke_coupling) @@ -2286,7 +2294,7 @@ type = real kind = kind_phys active = (do_smoke_coupling) -[ebb_smoke_hr] +[ebb_smoke_in] standard_name = surface_smoke_emission long_name = emission of surface smoke units = ug m-2 s-1 @@ -2294,7 +2302,7 @@ type = real kind = kind_phys active = (do_smoke_coupling) -[frp_hr] +[frp_input] standard_name = frp_hourly long_name = hourly fire radiative power units = MW @@ -2302,14 +2310,6 @@ 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 @@ -3026,6 +3026,30 @@ type = real kind = kind_phys active = (do_smoke_coupling) +[wetdpc_flux] + standard_name = conv_wet_deposition_smoke_dust + long_name = convective wet removal of smoke and dust + units = kg kg-1 + dimensions = (horizontal_loop_extent,number_of_chemical_species_vertically_mixed) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[wetdpr_flux] + standard_name = mp_wet_deposition_smoke_dust + long_name = large scale wet deposition of smoke and dust + units = kg kg-1 + dimensions = (horizontal_loop_extent,number_of_chemical_species_vertically_mixed) + type = real + kind = kind_phys + active = (do_smoke_coupling) +[drydep_flux] + standard_name = dry_deposition_flux + long_name = rrfs dry deposition flux + units = ug m-2 + dimensions = (horizontal_loop_extent,number_of_chemical_species_deposited) + 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 @@ -3050,6 +3074,14 @@ type = real kind = kind_phys active = (do_smoke_coupling) +[rrfs_hwp_ave] + standard_name = hourly_wildfire_potential_average + long_name = rrfs hourly fire weather potential average + 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 @@ -6535,6 +6567,14 @@ type = real kind = kind_phys active = (do_smoke_coupling) +[smoke_conv_wet_coef] + standard_name = smoke_dust_conv_wet_coef + long_name = smoke dust convetive wet scavanging coefficents + units = none + dimensions = (3) + type = real + kind = kind_phys + active = (do_smoke_coupling) [dust_moist_correction] standard_name = dust_moist_correction_fengsha_dust_scheme long_name = moisture correction term for fengsha dust emission @@ -6582,6 +6622,13 @@ type = real kind = kind_phys active = (do_smoke_coupling) +[ebb_dcycle] + standard_name = control_for_diurnal_cycle_of_biomass_burning_emissions + long_name = rrfs smoke diurnal cycle option + units = index + dimensions = () + type = integer + active = (do_smoke_coupling) [seas_opt] standard_name = control_for_smoke_sea_salt long_name = rrfs smoke sea salt emission option @@ -6604,12 +6651,26 @@ type = integer active = (do_smoke_coupling) [coarsepm_settling] - standard_name = control_for_smoke_coarsepm_settling + standard_name = control_for_smoke_pm_settling long_name = rrfs smoke coarsepm settling option units = index dimensions = () type = integer active = (do_smoke_coupling) +[plume_wind_eff] + standard_name = option_for_wind_effects_on_smoke_plumerise + long_name = wind effect plumerise option + units = index + dimensions = () + type = integer + active = (do_smoke_coupling) +[extended_sd_diags] + standard_name = flag_for_extended_smoke_dust_diagnostics + long_name = flag for extended smoke dust diagnostics + units = flag + dimensions = () + type = logical + active = (do_smoke_coupling) [wetdep_ls_opt] standard_name = control_for_smoke_wet_deposition long_name = rrfs smoke large scale wet deposition option @@ -6666,6 +6727,13 @@ dimensions = () type = logical active = (do_smoke_coupling) +[do_smoke_transport] + standard_name = do_smoke_conv_transport + long_name = flag for rrfs smoke convective transport + 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