diff --git a/src/core_atmosphere/CMakeLists.txt b/src/core_atmosphere/CMakeLists.txt index c8de66f3c7..863f9585fc 100644 --- a/src/core_atmosphere/CMakeLists.txt +++ b/src/core_atmosphere/CMakeLists.txt @@ -135,6 +135,7 @@ set(ATMOSPHERE_CORE_PHYSICS_SMOKE_SOURCES seas_ngac_mod.F90 ssalt_mod.F90 module_anthro_emissions.F90 + module_mp_aero_emissions.F90 ) list(TRANSFORM ATMOSPHERE_CORE_PHYSICS_SMOKE_SOURCES PREPEND physics/physics_noaa/SMOKE/) diff --git a/src/core_atmosphere/physics/mpas_atmphys_driver_smoke.F b/src/core_atmosphere/physics/mpas_atmphys_driver_smoke.F index dc37bc12f3..6a75d361b8 100644 --- a/src/core_atmosphere/physics/mpas_atmphys_driver_smoke.F +++ b/src/core_atmosphere/physics/mpas_atmphys_driver_smoke.F @@ -42,6 +42,7 @@ subroutine allocate_smoke(configs) character(len=StrKIND),pointer :: config_dust_scheme character(len=StrKIND),pointer :: config_anthro_scheme character(len=StrKIND),pointer :: config_rwc_scheme + logical, pointer :: config_tempo_aerosolaware integer, pointer :: ebb_dcycle integer, pointer :: wetdep_ls_opt @@ -55,6 +56,7 @@ subroutine allocate_smoke(configs) call mpas_pool_get_config(configs,'config_dust_scheme', config_dust_scheme) call mpas_pool_get_config(configs,'config_anthro_scheme',config_anthro_scheme) call mpas_pool_get_config(configs,'config_rwc_scheme',config_rwc_scheme) + call mpas_pool_get_config(configs,'config_tempo_aerosolaware',config_tempo_aerosolaware) call mpas_pool_get_config(configs,'ebb_dcycle', ebb_dcycle) call mpas_pool_get_config(configs,'plumerise_opt',plumerise_opt) @@ -149,10 +151,8 @@ subroutine allocate_smoke(configs) if(.not.allocated(clayfrac_in_p)) allocate(clayfrac_in_p(ims:ime,jms:jme)) if(.not.allocated(sandfrac_in_p)) allocate(sandfrac_in_p(ims:ime,jms:jme)) if(.not.allocated(uthres_in_p)) allocate(uthres_in_p(ims:ime,jms:jme)) - if(.not.allocated(uthres_sg_in_p)) allocate(uthres_sg_in_p(ims:ime,jms:jme)) - if(.not.allocated(albedo_drag_p)) allocate(albedo_drag_p(ims:ime,jms:jme)) - if(.not.allocated(sep_in_p)) allocate(sep_in_p(ims:ime,jms:jme)) - if(.not.allocated(feff_p)) allocate(feff_p(ims:ime,jms:jme)) + if(.not.allocated(rdrag_p)) allocate(rdrag_p(ims:ime,jms:jme)) + if(.not.allocated(ssm_in_p)) allocate(ssm_in_p(ims:ime,jms:jme)) endif if ( wetdep_ls_opt .ne. 0 ) then @@ -192,6 +192,11 @@ subroutine allocate_smoke(configs) if(.not.allocated(RWC_annual_sum_unspc_coarse_p)) allocate(RWC_annual_sum_unspc_coarse_p(ims:ime,1:kreswoodcomb,jms:jme)) endif + if (config_tempo_aerosolaware ) then + if(.not.allocated(nwfa2d_p)) allocate(nwfa2d_p(ims:ime,jms:jme)) + if(.not.allocated(nifa2d_p)) allocate(nifa2d_p(ims:ime,jms:jme)) + endif + end subroutine allocate_smoke !================================================================================================================= @@ -260,10 +265,8 @@ subroutine deallocate_smoke(configs) if(allocated(clayfrac_in_p) ) deallocate(clayfrac_in_p ) if(allocated(sandfrac_in_p) ) deallocate(sandfrac_in_p ) if(allocated(uthres_in_p) ) deallocate(uthres_in_p ) - if(allocated(uthres_sg_in_p) ) deallocate(uthres_sg_in_p ) - if(allocated(albedo_drag_p) ) deallocate(albedo_drag_p ) - if(allocated(feff_p) ) deallocate(feff_p ) - if(allocated(sep_in_p) ) deallocate(sep_in_p ) + if(allocated(rdrag_p) ) deallocate(rdrag_p ) + if(allocated(ssm_in_p) ) deallocate(ssm_in_p ) if(allocated(ddvel_p) ) deallocate(ddvel_p ) if(allocated(wetdep_resolved_p)) deallocate(wetdep_resolved_p) @@ -283,6 +286,9 @@ subroutine deallocate_smoke(configs) if(allocated(e_bb_out_p) ) deallocate(e_bb_out_p ) if(allocated(e_dust_out_p) ) deallocate(e_dust_out_p ) if(allocated(e_ant_out_p) ) deallocate(e_ant_out_p ) + + if(allocated(nwfa2d_p) ) deallocate(nwfa2d_p ) + if(allocated(nifa2d_p) ) deallocate(nifa2d_p ) !----------------------------------------------------------------------------------------------------------------- @@ -330,8 +336,8 @@ subroutine smoke_from_MPAS(dt_dyn, time_lev, emission_input, state, configs, & integer,dimension(:),pointer :: eco_id real(kind=RKIND),dimension(:),pointer :: hfx_bb, qfx_bb, frac_grid_burned integer,dimension(:),pointer :: min_bb_plume, max_bb_plume - real(kind=RKIND),dimension(:),pointer :: sandfrac_in, clayfrac_in, uthres_in, uthres_sg_in, & - sep_in, albedo_drag,feff + real(kind=RKIND),dimension(:),pointer :: sandfrac_in, clayfrac_in, uthres_in, & + ssm_in, rdrag real(kind=RKIND),dimension(:),pointer :: RWC_denominator real(kind=RKIND),dimension(:,:), pointer :: RWC_annual_sum, RWC_annual_sum_smoke_fine, & RWC_annual_sum_smoke_coarse,RWC_annual_sum_unspc_fine, & @@ -348,6 +354,7 @@ subroutine smoke_from_MPAS(dt_dyn, time_lev, emission_input, state, configs, & character(len=StrKIND),pointer :: config_anthro_scheme character(len=StrKIND),pointer :: config_rwc_scheme character(len=StrKIND),pointer :: config_convection_scheme + logical,pointer:: config_tempo_aerosolaware integer, pointer :: wetdep_ls_opt integer, pointer :: drydep_opt integer, pointer :: plumerise_opt @@ -356,6 +363,7 @@ subroutine smoke_from_MPAS(dt_dyn, time_lev, emission_input, state, configs, & real(kind=RKIND),dimension(:,:,:),pointer :: scalars real(kind=RKIND),dimension(:,:,:),pointer :: chem integer, pointer :: bb_input_prevh !JR + real(kind=RKIND),dimension(:),pointer :: nwfa2d, nifa2d integer:: i,j,k,n,h,t integer:: nblocks, blk !JR @@ -374,6 +382,7 @@ subroutine smoke_from_MPAS(dt_dyn, time_lev, emission_input, state, configs, & call mpas_pool_get_config(configs,'wetdep_ls_opt',wetdep_ls_opt) call mpas_pool_get_config(configs,'drydep_opt',drydep_opt) call mpas_pool_get_config(configs,'config_convection_scheme',config_convection_scheme) + call mpas_pool_get_config(configs,'config_tempo_aerosolaware',config_tempo_aerosolaware) call mpas_pool_get_config(configs,'plumerise_opt',plumerise_opt) call mpas_pool_get_config(configs,'add_fire_heat_flux',add_fire_heat_flux) @@ -429,10 +438,8 @@ subroutine smoke_from_MPAS(dt_dyn, time_lev, emission_input, state, configs, & call mpas_pool_get_array(diag_physics, 'clayfrac_in',clayfrac_in) call mpas_pool_get_array(diag_physics, 'sandfrac_in',sandfrac_in) call mpas_pool_get_array(diag_physics, 'uthres_in',uthres_in) - call mpas_pool_get_array(diag_physics, 'uthres_sg_in',uthres_sg_in) - call mpas_pool_get_array(diag_physics, 'albedo_drag',albedo_drag) ! these have been updated to select - call mpas_pool_get_array(diag_physics, 'feff',feff) ! the correct month - call mpas_pool_get_array(diag_physics, 'sep_in',sep_in) + call mpas_pool_get_array(diag_physics, 'rdrag',rdrag) ! these have been updated to select + call mpas_pool_get_array(diag_physics, 'ssm_in',ssm_in) endif if (config_smoke_scheme .ne. 'off' .and. num_e_bb_in .gt. 0 ) then @@ -494,6 +501,11 @@ subroutine smoke_from_MPAS(dt_dyn, time_lev, emission_input, state, configs, & if ( num_e_ant_out .gt. 0 .and. config_anthro_scheme .ne. 'off') then call mpas_pool_get_array(diag_physics, 'e_ant_out',e_ant_out) endif + + if (config_tempo_aerosolaware ) then + call mpas_pool_get_array(diag_physics,'nifa2d',nifa2d) + call mpas_pool_get_array(diag_physics,'nwfa2d',nwfa2d) + endif chem => scalars(chemistry_start:chemistry_end,:,:) @@ -693,6 +705,10 @@ subroutine smoke_from_MPAS(dt_dyn, time_lev, emission_input, state, configs, & rainncv_p(i,j) = rainncv(i) dpt2m_p(i,j) = 280. !dewpoint_surface(i) mavail_p(i,j) = mavail(i) + if ( config_tempo_aerosolaware ) then + nifa2d_p(i,j) = nifa2d(i) + nwfa2d_p(i,j) = nwfa2d(i) + endif enddo enddo ! @@ -704,10 +720,8 @@ subroutine smoke_from_MPAS(dt_dyn, time_lev, emission_input, state, configs, & sandfrac_in_p(i,j) = sandfrac_in(i) clayfrac_in_p(i,j) = clayfrac_in(i) uthres_in_p(i,j) = uthres_in(i) - uthres_sg_in_p(i,j) = uthres_sg_in(i) - albedo_drag_p(i,j) = albedo_drag(i) - feff_p(i,j) = feff(i) - sep_in_p(i,j) = sep_in(i) + rdrag_p(i,j) = rdrag(i) + ssm_in_p(i,j) = ssm_in(i) enddo enddo endif @@ -803,12 +817,14 @@ subroutine smoke_to_MPAS(configs,time_lev,state,diag_physics,tend_physics,its,it real(kind=RKIND),dimension(:,:,:),pointer:: e_bb_out, e_dust_out, e_ant_out real(kind=RKIND),dimension(:),pointer :: aero_emis_for_enhmix integer,dimension(:),pointer:: min_bb_plume, max_bb_plume + real(kind=RKIND),dimension(:), pointer:: nwfa2d, nifa2d integer,pointer :: chemistry_start,chemistry_end integer,pointer :: ebb_dcycle character(len=StrKIND),pointer :: config_smoke_scheme character(len=StrKIND),pointer :: config_dust_scheme character(len=StrKIND),pointer :: config_anthro_scheme + logical,pointer:: config_tempo_aerosolaware integer, pointer :: wetdep_ls_opt integer, pointer :: drydep_opt integer, pointer :: plumerise_opt @@ -838,6 +854,7 @@ subroutine smoke_to_MPAS(configs,time_lev,state,diag_physics,tend_physics,its,it call mpas_pool_get_config(configs,'config_smoke_scheme', config_smoke_scheme) call mpas_pool_get_config(configs,'config_dust_scheme', config_dust_scheme) call mpas_pool_get_config(configs,'config_anthro_scheme',config_anthro_scheme) + call mpas_pool_get_config(configs,'config_tempo_aerosolaware',config_tempo_aerosolaware) call mpas_pool_get_config(configs,'ebb_dcycle', ebb_dcycle) call mpas_pool_get_config(configs,'wetdep_ls_opt',wetdep_ls_opt) call mpas_pool_get_config(configs,'drydep_opt',drydep_opt) @@ -876,6 +893,11 @@ subroutine smoke_to_MPAS(configs,time_lev,state,diag_physics,tend_physics,its,it endif endif + if (config_tempo_aerosolaware ) then + call mpas_pool_get_array(diag_physics,'nifa2d',nifa2d) + call mpas_pool_get_array(diag_physics,'nwfa2d',nwfa2d) + endif + chem => scalars(chemistry_start:chemistry_end,:,:) do j = jts,jte @@ -989,6 +1011,10 @@ subroutine smoke_to_MPAS(configs,time_lev,state,diag_physics,tend_physics,its,it qfx_bb(i) = qfx_bb_p(i,j) endif endif + if (config_tempo_aerosolaware ) then + nifa2d(i) = nifa2d_p(i,j) + nwfa2d(i) = nwfa2d_p(i,j) + endif enddo enddo @@ -1063,6 +1089,7 @@ subroutine driver_smoke(itimestep,time_lev,emission_input,state,configs, & logical,pointer :: calc_bb_emis_online logical,pointer :: add_fire_heat_flux logical,pointer :: add_fire_moist_flux + logical,pointer :: config_mp_aero_emission integer,pointer :: plumerisefire_frq real(kind=RKIND),pointer :: dust_alpha, dust_gamma real(kind=RKIND),pointer :: dust_drylimit_factor, dust_moist_correction @@ -1100,7 +1127,9 @@ subroutine driver_smoke(itimestep,time_lev,emission_input,state,configs, & call mpas_pool_get_config(configs,'bb_beta',bb_beta) call mpas_pool_get_config(configs,'bb_qv_scale_factor',bb_qv_scale_factor) call mpas_pool_get_config(configs,'config_rwc_scheme',config_rwc_scheme) - call mpas_pool_get_config(configs,'rwc_emis_scale_factor',rwc_emis_scale_factor) + call mpas_pool_get_config(configs,'rwc_emis_scale_factor',rwc_emis_scale_factor) +! Namelist: aerosol emission for tempo mp + call mpas_pool_get_config(configs,'config_mp_aero_emission',config_mp_aero_emission) ! Namelist: Wet/dry deposition call mpas_pool_get_config(configs,'wetdep_ls_opt',wetdep_ls_opt) call mpas_pool_get_config(configs,'wetdep_ls_alpha',wetdep_ls_alpha) @@ -1199,10 +1228,9 @@ subroutine driver_smoke(itimestep,time_lev,emission_input,state,configs, & frac_grid_burned = frac_grid_burned_p, & min_bb_plume = min_bb_plume_p, max_bb_plume = max_bb_plume_p, & coef_bb_dc = coef_bb_dc_p, nblocks = nblocks, & -! --- Dust related arrays +! --- (FENGSHA) Dust related arrays sandfrac_in = sandfrac_in_p, clayfrac_in = clayfrac_in_p, & - uthres_in = uthres_in_p, uthres_sg_in = uthres_sg_in_p, & - albedo_drag_in = albedo_drag_p, feff_in = feff_p, sep_in = sep_in_p, & + uthres_in = uthres_in_p, rdrag_in = rdrag_p, ssm_in = ssm_in_p, & ! --- Dry/Wet deposition, settling wetdep_ls_opt = wetdep_ls_opt, drydep_flux = drydep_flux_p, & tend_chem_settle = tend_chem_settle_p, ddvel = ddvel_p, & @@ -1239,16 +1267,17 @@ subroutine driver_smoke(itimestep,time_lev,emission_input,state,configs, & v_phy = v_p , qv = qv_p , vvel = w_p , & qc_vis = qc_p, qr_vis = qr_p, qi_vis = qi_p, qs_vis = qs_p, qg_vis = qg_p, & blcldw_vis = qcbl_p, blcldi_vis = qibl_p, & - coszen = coszr_p, & + coszen = coszr_p , config_mp_aero_emission = config_mp_aero_emission, & aod3d_smoke = aod3d_smoke_p, aod3d = aod3d_p, vis = vis_p , & pi_phy = pi_p , rho_phy = rho_p , kpbl = kpbl_p , & nsoil = num_soils , smois = smois_p , tslb = tslb_p , & ivgtyp = ivgtyp_p , isltyp = isltyp_p , nlcat = num_landcat, & swdown = swdown_p , z0 = z0_p , snowh = snowh_p , & julian = curr_julday , rmol = rmol_p , raincv = raincv_p , & - rainncv = rainncv_p , dpt2m = dpt2m_p , znt = znt_p , & + rainncv = rainncv_p , dpt2m = dpt2m_p , znt = znt_p , & mavail = mavail_p , g = gravity , vegfra = vegfra_p , & landusef = landusef_p , cldfrac = cldfrac_p , ktop_deep= ktop_deep_p, & + nwfa2d = nwfa2d_p , nifa2d = nifa2d_p , & cp = cp , rd = R_d , gmt = gmt , & ids = ids , ide = ide , jds = jds , jde = jde , kds = kds , kde = kde , & ims = ims , ime = ime , jms = jms , jme = jme , kms = kds , kme = kme , & diff --git a/src/core_atmosphere/physics/mpas_atmphys_update_surface.F b/src/core_atmosphere/physics/mpas_atmphys_update_surface.F index 801ae41e28..2a57e7e80f 100644 --- a/src/core_atmosphere/physics/mpas_atmphys_update_surface.F +++ b/src/core_atmosphere/physics/mpas_atmphys_update_surface.F @@ -78,10 +78,8 @@ subroutine physics_update_surface(current_date,config_sfc_albedo,config_gvf_upda real(kind=RKIND),dimension(:,:),pointer:: lai12m real(kind=RKIND),dimension(:) ,pointer:: lai - real(kind=RKIND),dimension(:,:),pointer:: feff_m_in - real(kind=RKIND),dimension(:,:),pointer:: albedo_drag_m_in - real(kind=RKIND),dimension(:),pointer :: feff - real(kind=RKIND),dimension(:),pointer :: albedo_drag + real(kind=RKIND),dimension(:,:),pointer:: rdrag_m_in + real(kind=RKIND),dimension(:),pointer :: rdrag !local variables: integer:: iCell @@ -101,10 +99,8 @@ subroutine physics_update_surface(current_date,config_sfc_albedo,config_gvf_upda call mpas_pool_get_array(sfc_input,'lai12m' , lai12m ) call mpas_pool_get_array(diag_physics,'lai ' , lai ) - call mpas_pool_get_array(diag_physics,'feff_m_in' , feff_m_in ) - call mpas_pool_get_array(diag_physics,'albedo_drag_m_in', albedo_drag_m_in) - call mpas_pool_get_array(diag_physics,'feff' , feff ) - call mpas_pool_get_array(diag_physics,'albedo_drag' , albedo_drag ) + call mpas_pool_get_array(diag_physics,'rdrag_m_in', rdrag_m_in) + call mpas_pool_get_array(diag_physics,'rdrag' , rdrag ) !updates the surface background albedo for the current date as a function of the monthly-mean !surface background albedo valid on the 15th day of the month, if config_sfc_albedo is true: @@ -121,8 +117,7 @@ subroutine physics_update_surface(current_date,config_sfc_albedo,config_gvf_upda ! Updates the dust input data to the current month if(config_dust_scheme .ne. 'off') then - call monthly_interp_to_date(nCellsSolve,current_date,feff_m_in,feff) - call monthly_interp_to_date(nCellsSolve,current_date,albedo_drag_m_in,albedo_drag) + call monthly_interp_to_date(nCellsSolve,current_date,rdrag_m_in,rdrag) endif !updates the green-ness fraction for the current date as a function of the monthly-mean green- diff --git a/src/core_atmosphere/physics/mpas_atmphys_vars.F b/src/core_atmosphere/physics/mpas_atmphys_vars.F index 856e1e16b4..e4b54c325d 100644 --- a/src/core_atmosphere/physics/mpas_atmphys_vars.F +++ b/src/core_atmosphere/physics/mpas_atmphys_vars.F @@ -293,10 +293,8 @@ module mpas_atmphys_vars clayfrac_in_p, &! sandfrac_in_p, &! uthres_in_p, &! - uthres_sg_in_p, &! - albedo_drag_p, &! - feff_p, &! - sep_in_p ! + rdrag_p, &! + ssm_in_p ! ! Input biomass burning emissions - JLS real(kind=RKIND),dimension(:,:,:,:),allocatable:: & e_ant_in_p, e_bb_in_p, e_bio_in_p, e_vol_in_p diff --git a/src/core_atmosphere/physics/physics_noaa/SMOKE b/src/core_atmosphere/physics/physics_noaa/SMOKE index 9652bbf152..c31b8552fc 160000 --- a/src/core_atmosphere/physics/physics_noaa/SMOKE +++ b/src/core_atmosphere/physics/physics_noaa/SMOKE @@ -1 +1 @@ -Subproject commit 9652bbf152f8b946bf04f72a2b48ff67e15d7973 +Subproject commit c31b8552fc1c3ddd95d413b2c43a53bbd094b5bb diff --git a/src/core_atmosphere/physics/registry.chemistry.xml b/src/core_atmosphere/physics/registry.chemistry.xml index 6b5141613f..5a55b68d5c 100644 --- a/src/core_atmosphere/physics/registry.chemistry.xml +++ b/src/core_atmosphere/physics/registry.chemistry.xml @@ -192,6 +192,10 @@ units="-" description="Flag that controls artificially enhancing the PBL exhange coefs" possbile_values=".true. or .false."/> + @@ -269,10 +273,8 @@ - - - - + + - - - - -