Skip to content

Commit

Permalink
Merge pull request #2944 from eagles-project/singhbalwinder/branch_mj…
Browse files Browse the repository at this point in the history
…s/mam4xx/emissionsIntegration

Adds MAM4xx Surface emissions process interface for EAMxx
  • Loading branch information
ambrad authored Sep 4, 2024
2 parents 504eb56 + c6d0711 commit 42ab514
Show file tree
Hide file tree
Showing 29 changed files with 1,781 additions and 33 deletions.
40 changes: 36 additions & 4 deletions components/eamxx/cime_config/namelist_defaults_scream.xml
Original file line number Diff line number Diff line change
Expand Up @@ -242,8 +242,7 @@ be lost if SCREAM_HACK_XML is not enabled.
</mam4_aci>

<!-- MAM4xx-Dry Deposition -->
<mam4_drydep inherit="atm_proc_base">
</mam4_drydep>
<mam4_drydep inherit="atm_proc_base" />

<!-- CLD fraction -->
<cldFraction inherit="atm_proc_base"/>
Expand All @@ -266,8 +265,41 @@ be lost if SCREAM_HACK_XML is not enabled.
</mam4_optics>

<!-- MAM4xx-Wetscav -->
<mam4_wetscav inherit="atm_proc_base">
</mam4_wetscav>
<mam4_wetscav inherit="atm_proc_base" />

<!-- MAM4xx-Surface-Emissions -->
<mam4_srf_online_emiss inherit="atm_proc_base">

<srf_emis_specifier_for_DMS hgrid="ne4np4.pg2" type="file" doc="File containing surface emissions data for DMS">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne4pg2/surface/DMSflux.2010.ne4pg2_conserv.POPmonthlyClimFromACES4BGC_c20240814.nc</srf_emis_specifier_for_DMS>
<srf_emis_specifier_for_SO2 hgrid="ne4np4.pg2" type="file" doc="File containing surface emissions data for SO2">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne4pg2/surface/cmip6_mam4_so2_surf_ne4pg2_2010_clim_c20240815.nc</srf_emis_specifier_for_SO2>
<srf_emis_specifier_for_bc_a4 hgrid="ne4np4.pg2" type="file" doc="File containing surface emissions data for bc_a4">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne4pg2/surface/cmip6_mam4_bc_a4_surf_ne4pg2_2010_clim_c20240815.nc</srf_emis_specifier_for_bc_a4>
<srf_emis_specifier_for_num_a1 hgrid="ne4np4.pg2" type="file" doc="File containing surface emissions data for num_a1">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne4pg2/surface/cmip6_mam4_num_a1_surf_ne4pg2_2010_clim_c20240815.nc</srf_emis_specifier_for_num_a1>
<srf_emis_specifier_for_num_a2 hgrid="ne4np4.pg2" type="file" doc="File containing surface emissions data for num_a2">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne4pg2/surface/cmip6_mam4_num_a2_surf_ne4pg2_2010_clim_c20240815.nc</srf_emis_specifier_for_num_a2>
<srf_emis_specifier_for_num_a4 hgrid="ne4np4.pg2" type="file" doc="File containing surface emissions data for num_a4">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne4pg2/surface/cmip6_mam4_num_a4_surf_ne4pg2_2010_clim_c20240815.nc</srf_emis_specifier_for_num_a4>
<srf_emis_specifier_for_pom_a4 hgrid="ne4np4.pg2" type="file" doc="File containing surface emissions data for pom_a4">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne4pg2/surface/cmip6_mam4_pom_a4_surf_ne4pg2_2010_clim_c20240815.nc</srf_emis_specifier_for_pom_a4>
<srf_emis_specifier_for_so4_a1 hgrid="ne4np4.pg2" type="file" doc="File containing surface emissions data for so4_a1">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne4pg2/surface/cmip6_mam4_so4_a1_surf_ne4pg2_2010_clim_c20240815.nc</srf_emis_specifier_for_so4_a1>
<srf_emis_specifier_for_so4_a2 hgrid="ne4np4.pg2" type="file" doc="File containing surface emissions data for so4_a2">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne4pg2/surface/cmip6_mam4_so4_a2_surf_ne4pg2_2010_clim_c20240815.nc</srf_emis_specifier_for_so4_a2>
<!-- For all other grids -->
<srf_emis_specifier_for_DMS type="file" doc="File containing surface emissions data for DMS">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne30pg2/surface/DMSflux.2010.ne30pg2_conserv.POPmonthlyClimFromACES4BGC_c20240816.nc</srf_emis_specifier_for_DMS>
<srf_emis_specifier_for_SO2 type="file" doc="File containing surface emissions data for SO2">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne30pg2/surface/cmip6_mam4_so2_surf_ne30pg2_2010_clim_c20240816.nc</srf_emis_specifier_for_SO2>
<srf_emis_specifier_for_bc_a4 type="file" doc="File containing surface emissions data for bc_a4">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne30pg2/surface/cmip6_mam4_bc_a4_surf_ne30pg2_2010_clim_c20240816.nc</srf_emis_specifier_for_bc_a4>
<srf_emis_specifier_for_num_a1 type="file" doc="File containing surface emissions data for num_a1">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne30pg2/surface/cmip6_mam4_num_a1_surf_ne30pg2_2010_clim_c20240816.nc</srf_emis_specifier_for_num_a1>
<srf_emis_specifier_for_num_a2 type="file" doc="File containing surface emissions data for num_a2">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne30pg2/surface/cmip6_mam4_num_a2_surf_ne30pg2_2010_clim_c20240816.nc</srf_emis_specifier_for_num_a2>
<srf_emis_specifier_for_num_a4 type="file" doc="File containing surface emissions data for num_a4">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne30pg2/surface/cmip6_mam4_num_a4_surf_ne30pg2_2010_clim_c20240816.nc</srf_emis_specifier_for_num_a4>
<srf_emis_specifier_for_pom_a4 type="file" doc="File containing surface emissions data for pom_a4">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne30pg2/surface/cmip6_mam4_pom_a4_surf_ne30pg2_2010_clim_c20240816.nc</srf_emis_specifier_for_pom_a4>
<srf_emis_specifier_for_so4_a1 type="file" doc="File containing surface emissions data for so4_a1">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne30pg2/surface/cmip6_mam4_so4_a1_surf_ne30pg2_2010_clim_c20240816.nc</srf_emis_specifier_for_so4_a1>
<srf_emis_specifier_for_so4_a2 type="file" doc="File containing surface emissions data for so4_a2">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne30pg2/surface/cmip6_mam4_so4_a2_surf_ne30pg2_2010_clim_c20240816.nc</srf_emis_specifier_for_so4_a2>

<!-- Mapping Files for finer resolutions -->
<srf_remap_file type="file" doc="File containing mapping data from the grid of emission files to the model grid. Unused if the grid is the same."/>
<srf_remap_file hgrid="ne120np4.pg2">${DIN_LOC_ROOT}/atm/scream/maps/map_ne30pg2_to_ne120pg2_20231201.nc</srf_remap_file>
<srf_remap_file hgrid="ne256np4.pg2">${DIN_LOC_ROOT}/atm/scream/maps/map_ne30pg2_to_ne256pg2_20231201.nc</srf_remap_file>
<srf_remap_file hgrid="ne512np4.pg2">${DIN_LOC_ROOT}/atm/scream/maps/map_ne30pg2_to_ne512pg2_20231201.nc</srf_remap_file>
<srf_remap_file hgrid="ne1024np4.pg2">${DIN_LOC_ROOT}/atm/scream/maps/map_ne30pg2_to_ne1024pg2_20231201.nc</srf_remap_file>
</mam4_srf_online_emiss>

<!-- MAM4xx-constituent fluxes -->
<mam4_constituent_fluxes inherit="atm_proc_base" />

<!-- nudging -->
<nudging inherit="atm_proc_base">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@

#!/bin/sh
#------------------------------------------------------
# MAM4xx adds additionaltracers to the simulation
# Increase number of tracers for MAM4xx simulations
#------------------------------------------------------

$CIMEROOT/../components/eamxx/cime_config/testdefs/testmods_dirs/scream/mam4xx/update_eamxx_num_tracers.sh -b

#------------------------------------------------------
#Update IC file and add the processes
#------------------------------------------------------
$CIMEROOT/../components/eamxx/scripts/atmchange initial_conditions::Filename='$DIN_LOC_ROOT/atm/scream/init/screami_mam4xx_ne4np4L72_c20240208.nc' -b
$CIMEROOT/../components/eamxx/scripts/atmchange physics::atm_procs_list="mam4_constituent_fluxes,mac_aero_mic,rrtmgp,mam4_srf_online_emiss" -b



4 changes: 3 additions & 1 deletion components/eamxx/src/physics/mam/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@ add_library(mam
eamxx_mam_optics_process_interface.cpp
eamxx_mam_dry_deposition_process_interface.cpp
eamxx_mam_aci_process_interface.cpp
eamxx_mam_wetscav_process_interface.cpp)
eamxx_mam_wetscav_process_interface.cpp
eamxx_mam_srf_and_online_emissions_process_interface.cpp
eamxx_mam_constituent_fluxes_interface.cpp)
target_compile_definitions(mam PUBLIC EAMXX_HAS_MAM)
add_dependencies(mam mam4xx)
target_include_directories(mam PUBLIC
Expand Down
19 changes: 1 addition & 18 deletions components/eamxx/src/physics/mam/eamxx_mam_aci_functions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,23 +198,6 @@ void store_liquid_cloud_fraction(
});
}

void compute_recipical_pseudo_density(haero::ThreadTeamPolicy team_policy,
MAMAci::const_view_2d pdel,
const int nlev,
// output
MAMAci::view_2d rpdel) {
Kokkos::parallel_for(
team_policy, KOKKOS_LAMBDA(const haero::ThreadTeam &team) {
const int icol = team.league_rank();
Kokkos::parallel_for(
Kokkos::TeamVectorRange(team, 0, nlev), [&](int kk) {
EKAT_KERNEL_ASSERT_MSG(0 < pdel(icol, kk),
"Error: pdel should be > 0.\n");
rpdel(icol, kk) = 1 / pdel(icol, kk);
});
});
}

void call_function_dropmixnuc(
haero::ThreadTeamPolicy team_policy, const Real dt,
mam_coupling::DryAtmosphere &dry_atmosphere, const MAMAci::view_2d rpdel,
Expand Down Expand Up @@ -397,7 +380,7 @@ void call_function_dropmixnuc(
progs_at_col, haero_atm, state_q_at_lev_col, klev);

// get the start index for aerosols species in the state_q array
int istart = mam4::aero_model::pcnst - mam4::ndrop::ncnst_tot;
int istart = mam4::utils::aero_start_ind();

// create colum views of state_q
for(int icnst = istart; icnst < mam4::aero_model::pcnst;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ void MAMAci::set_grids(
frz_unit, grid_name);

// heterogeneous freezing by deposition nucleation [cm^-3 s^-1]
add_field<Computed>("hetfrz_depostion_nucleation_tend", scalar3d_layout_mid,
add_field<Computed>("hetfrz_deposition_nucleation_tend", scalar3d_layout_mid,
frz_unit, grid_name);
} // function set_grids ends

Expand Down Expand Up @@ -390,8 +390,8 @@ void MAMAci::initialize_impl(const RunType run_type) {
get_field_out("hetfrz_immersion_nucleation_tend").get_view<Real **>();
hetfrz_contact_nucleation_tend_ =
get_field_out("hetfrz_contact_nucleation_tend").get_view<Real **>();
hetfrz_depostion_nucleation_tend_ =
get_field_out("hetfrz_depostion_nucleation_tend").get_view<Real **>();
hetfrz_deposition_nucleation_tend_ =
get_field_out("hetfrz_deposition_nucleation_tend").get_view<Real **>();

//---------------------------------------------------------------------------------
// Allocate memory for the class members
Expand Down Expand Up @@ -597,7 +597,7 @@ void MAMAci::run_impl(const double dt) {
// output
cloud_frac_, cloud_frac_prev_);

compute_recipical_pseudo_density(team_policy, dry_atm_.p_del, nlev_,
mam_coupling::compute_recipical_pseudo_density(team_policy, dry_atm_.p_del, nlev_,
// output
rpdel_);

Expand Down Expand Up @@ -642,7 +642,7 @@ void MAMAci::run_impl(const double dt) {
team_policy, hetfrz_, dry_atm_, dry_aero_, factnum_, dt, nlev_,
// ## output to be used by the other processes ##
hetfrz_immersion_nucleation_tend_, hetfrz_contact_nucleation_tend_,
hetfrz_depostion_nucleation_tend_,
hetfrz_deposition_nucleation_tend_,
// work arrays
diagnostic_scratch_);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ class MAMAci final : public scream::AtmosphereProcess {
// added correctly to the cloud-micorphysics scheme.
view_2d hetfrz_immersion_nucleation_tend_;
view_2d hetfrz_contact_nucleation_tend_;
view_2d hetfrz_depostion_nucleation_tend_;
view_2d hetfrz_deposition_nucleation_tend_;

view_2d diagnostic_scratch_[hetro_scratch_];

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#ifndef EAMXX_MAM_CONSTITUTE_FLUXES_FUNCTIONS_HPP
#define EAMXX_MAM_CONSTITUTE_FLUXES_FUNCTIONS_HPP

#include <mam4xx/mam4.hpp>
#include <physics/mam/eamxx_mam_constituent_fluxes_interface.hpp>

namespace scream {

namespace {

void update_gas_aerosols_using_constituents(
const int ncol, const int nlev, const double dt,
const mam_coupling::DryAtmosphere &dry_atm,
const MAMConstituentFluxes::const_view_2d &constituent_fluxes,
// output
const mam_coupling::AerosolState &wet_aero) {
using C = physics::Constants<Real>;
static constexpr auto gravit = C::gravit; // Gravity [m/s2]
static constexpr int pcnst = mam4::aero_model::pcnst;

// Declare local variables
const int surface_lev = nlev - 1;

// get the start index for gas species in the state_q array
int istart = mam4::utils::gasses_start_ind();

// number of constituents to update (currently updating only MAM4xx
// constituents)
const int nconstituents = pcnst - istart;

// Create a policy to loop over columns annd number of constituents
// to update
// FIXME: TODO:We don't need a team for "nconstituents", so we can make the
// kookos_for simple by using just ncols
const auto policy = ekat::ExeSpaceUtils<MAMConstituentFluxes::KT::ExeSpace>::
get_default_team_policy(ncol, nconstituents);

// Loop through all columns to update tracer mixing rations
Kokkos::parallel_for(
policy, KOKKOS_LAMBDA(const haero::ThreadTeam &team) {
const int icol = team.league_rank();

//----------------------------------------------------------------------
// To form EAM like state%q array, we need prognostics (gas and aerosol
// mmrs) atmosphere (qv, qc, nc, ni, etc.)
//----------------------------------------------------------------------

// Get prognostics
mam4::Prognostics progs_at_col =
mam_coupling::aerosols_for_column(wet_aero, // output
icol); // input
// Get atmospheric quantities
const haero::Atmosphere haero_atm =
atmosphere_for_column(dry_atm, // output
icol); // input

// Form state%q like array at surface level
Real state_q_at_surf_lev[pcnst] = {};
mam4::utils::extract_stateq_from_prognostics(
progs_at_col, haero_atm, // input
state_q_at_surf_lev, // output
surface_lev); // input

// Compute the units conversion factor (kg/m2/s to kg/kg)
EKAT_KERNEL_ASSERT_MSG(dry_atm.p_del(icol, surface_lev) != 0,
"Error! dry_atm.pdel must be non-zero!\n");
const Real rpdel = 1.0 / dry_atm.p_del(icol, surface_lev);
const Real unit_factor = dt * gravit * rpdel;

// Update state vector with constituent fluxes
for(int icnst = istart; icnst < pcnst; ++icnst) {
state_q_at_surf_lev[icnst] +=
constituent_fluxes(icol, icnst) * unit_factor;
}
mam4::utils::inject_stateq_to_prognostics(state_q_at_surf_lev, // input
progs_at_col, // output
surface_lev); // input
}); // icol loop
}

} // namespace
} // namespace scream

#endif // ifdef EAMXX_MAM_CONSTITUTE_FLUXES_FUNCTIONS_HPP
Loading

0 comments on commit 42ab514

Please sign in to comment.