Skip to content

Commit 0af3b66

Browse files
authored
Merge pull request #3083 from E3SM-Project/mjs/eamxx/aero_emis_interface
2 parents e98c12b + 71e4bc5 commit 0af3b66

File tree

16 files changed

+1102
-85
lines changed

16 files changed

+1102
-85
lines changed

components/eamxx/cime_config/namelist_defaults_scream.xml

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -372,17 +372,11 @@ be lost if SCREAM_HACK_XML is not enabled.
372372
<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>
373373
<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>
374374

375+
<soil_erodibility_file type="file" doc="File containing soil erodibility">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne30pg2/dst_ne30pg2_c20241028.nc</soil_erodibility_file>
376+
<soil_erodibility_file hgrid="ne4np4.pg2" type="file" doc="File containing soil erodibility">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne4pg2/dst_ne4pg2_c20241028.nc</soil_erodibility_file>
375377

376-
<!-- For ne4pg2 grid -->
377-
<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>
378-
<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>
379-
<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>
380-
<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>
381-
<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>
382-
<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>
383-
<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>
384-
<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>
385-
<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>
378+
<marine_organics_file type="file" doc="File containing marine organics emissions">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne30pg2/monthly_macromolecules_0.1deg_bilinear_year01_merge_ne30pg2_c20241030.nc</marine_organics_file>
379+
<marine_organics_file hgrid="ne4np4.pg2" type="file" doc="File containing marine organics emissions">${DIN_LOC_ROOT}/atm/scream/mam4xx/emissions/ne4pg2/monthly_macromolecules_0.1deg_bilinear_year01_merge_ne4pg2_c20241030.nc</marine_organics_file>
386380

387381
<!-- Mapping Files for finer resolutions -->
388382
<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."/>
@@ -639,6 +633,7 @@ be lost if SCREAM_HACK_XML is not enabled.
639633
<dgnum type="array(real)" doc="Dry aerosol particles diameters (one per mode) [m]">1.37146e-07 ,3.45899e-08 ,1.00000e-06 ,9.99601e-08</dgnum>
640634
<dgnumwet type="array(real)" doc="Wet aerosol particles diameter [m]">1.37452e-07 ,3.46684e-08 ,1.00900e-06 ,9.99601e-08</dgnumwet>
641635
<wetdens type="array(real)" doc="Wet density of interstitial aerosol [kg/m3]">5.08262e-12 ,1.54035e-13 ,3.09018e-13 ,9.14710e-22</wetdens>
636+
<constituent_fluxes type="real">0.0</constituent_fluxes>
642637
<bc_c1 type="real">0.0</bc_c1>
643638
<bc_c3 type="real">0.0</bc_c3>
644639
<bc_c4 type="real">0.0</bc_c4>

components/eamxx/src/control/atmosphere_surface_coupling_importer.cpp

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -28,35 +28,41 @@ void SurfaceCouplingImporter::set_grids(const std::shared_ptr<const GridsManager
2828

2929
// The units of mixing ratio Q are technically non-dimensional.
3030
// Nevertheless, for output reasons, we like to see 'kg/kg'.
31-
auto nondim = Units::nondimensional();
32-
Units m2 (m*m,"m2");
31+
constexpr auto nondim = Units::nondimensional();
32+
constexpr auto m2 = pow(m, 2);
3333

3434
// Define the different field layouts that will be used for this process
3535
using namespace ShortFieldTagsNames;
3636

37-
FieldLayout scalar2d_layout { {COL }, {m_num_cols } };
38-
FieldLayout vector2d_layout { {COL, CMP}, {m_num_cols, 2} };
39-
40-
add_field<Computed>("sfc_alb_dir_vis", scalar2d_layout, nondim, grid_name);
41-
add_field<Computed>("sfc_alb_dir_nir", scalar2d_layout, nondim, grid_name);
42-
add_field<Computed>("sfc_alb_dif_vis", scalar2d_layout, nondim, grid_name);
43-
add_field<Computed>("sfc_alb_dif_nir", scalar2d_layout, nondim, grid_name);
44-
add_field<Computed>("surf_lw_flux_up", scalar2d_layout, W/m2, grid_name);
45-
add_field<Computed>("surf_sens_flux", scalar2d_layout, W/m2, grid_name);
46-
add_field<Computed>("surf_evap", scalar2d_layout, kg/m2/s, grid_name);
47-
add_field<Computed>("surf_mom_flux", vector2d_layout, N/m2, grid_name);
48-
add_field<Computed>("surf_radiative_T", scalar2d_layout, K, grid_name);
49-
add_field<Computed>("T_2m", scalar2d_layout, K, grid_name);
50-
add_field<Computed>("qv_2m", scalar2d_layout, kg/kg, grid_name);
51-
add_field<Computed>("wind_speed_10m", scalar2d_layout, m/s, grid_name);
52-
add_field<Computed>("snow_depth_land", scalar2d_layout, m, grid_name);
53-
add_field<Computed>("ocnfrac", scalar2d_layout, nondim, grid_name);
54-
add_field<Computed>("landfrac", scalar2d_layout, nondim, grid_name);
55-
add_field<Computed>("icefrac", scalar2d_layout, nondim, grid_name);
37+
const FieldLayout scalar2d = m_grid->get_2d_scalar_layout();
38+
const FieldLayout vector2d = m_grid->get_2d_vector_layout(2);
39+
const FieldLayout vector4d = m_grid->get_2d_vector_layout(4);
40+
41+
add_field<Computed>("sfc_alb_dir_vis", scalar2d, nondim, grid_name);
42+
add_field<Computed>("sfc_alb_dir_nir", scalar2d, nondim, grid_name);
43+
add_field<Computed>("sfc_alb_dif_vis", scalar2d, nondim, grid_name);
44+
add_field<Computed>("sfc_alb_dif_nir", scalar2d, nondim, grid_name);
45+
add_field<Computed>("surf_lw_flux_up", scalar2d, W/m2, grid_name);
46+
add_field<Computed>("surf_sens_flux", scalar2d, W/m2, grid_name);
47+
add_field<Computed>("surf_evap", scalar2d, kg/m2/s, grid_name);
48+
add_field<Computed>("surf_mom_flux", vector2d, N/m2, grid_name);
49+
add_field<Computed>("surf_radiative_T", scalar2d, K, grid_name);
50+
add_field<Computed>("T_2m", scalar2d, K, grid_name);
51+
add_field<Computed>("qv_2m", scalar2d, kg/kg, grid_name);
52+
add_field<Computed>("wind_speed_10m", scalar2d, m/s, grid_name);
53+
add_field<Computed>("snow_depth_land", scalar2d, m, grid_name);
54+
add_field<Computed>("ocnfrac", scalar2d, nondim, grid_name);
55+
add_field<Computed>("landfrac", scalar2d, nondim, grid_name);
56+
add_field<Computed>("icefrac", scalar2d, nondim, grid_name);
5657
// Friction velocity [m/s]
57-
add_field<Computed>("fv", scalar2d_layout, m/s, grid_name);
58+
add_field<Computed>("fv", scalar2d, m/s, grid_name);
5859
// Aerodynamical resistance
59-
add_field<Computed>("ram1", scalar2d_layout, s/m, grid_name);
60+
add_field<Computed>("ram1", scalar2d, s/m, grid_name);
61+
// Sea surface temperature [K]
62+
add_field<Computed>("sst", scalar2d, K, grid_name);
63+
//dust fluxes [kg/m^2/s]: Four flux values for eacch column
64+
add_field<Computed>("dstflx", vector4d, kg/m2/s, grid_name);
65+
6066
}
6167
// =========================================================================================
6268
void SurfaceCouplingImporter::setup_surface_coupling_data(const SCDataManager &sc_data_manager)

components/eamxx/src/mct_coupling/scream_cpl_indices.F90

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ module scream_cpl_indices
66
private
77

88
! Focus only on the ones that scream imports/exports (subsets of x2a and a2x)
9-
integer, parameter, public :: num_scream_imports = 19
9+
integer, parameter, public :: num_scream_imports = 24
1010
integer, parameter, public :: num_scream_exports = 17
1111
integer, public :: num_cpl_imports, num_cpl_exports, import_field_size, export_field_size
1212

@@ -92,6 +92,11 @@ subroutine scream_set_cpl_indices (x2a, a2x)
9292
import_field_names(17) = 'icefrac'
9393
import_field_names(18) = 'fv'
9494
import_field_names(19) = 'ram1'
95+
import_field_names(20) = 'sst'
96+
import_field_names(21) = 'dstflx'
97+
import_field_names(22) = 'dstflx'
98+
import_field_names(23) = 'dstflx'
99+
import_field_names(24) = 'dstflx'
95100

96101
! CPL indices
97102
import_cpl_indices(1) = mct_avect_indexra(x2a,'Sx_avsdr')
@@ -113,10 +118,23 @@ subroutine scream_set_cpl_indices (x2a, a2x)
113118
import_cpl_indices(17) = mct_avect_indexra(x2a,'Sf_ifrac')
114119
import_cpl_indices(18) = mct_avect_indexra(x2a,'Sl_fv')
115120
import_cpl_indices(19) = mct_avect_indexra(x2a,'Sl_ram1')
121+
!sst
122+
import_cpl_indices(20) = mct_avect_indexra(x2a,'So_t')
123+
!dust fluxes
124+
import_cpl_indices(21) = mct_avect_indexra(x2a,'Fall_flxdst1')
125+
import_cpl_indices(22) = mct_avect_indexra(x2a,'Fall_flxdst2')
126+
import_cpl_indices(23) = mct_avect_indexra(x2a,'Fall_flxdst3')
127+
import_cpl_indices(24) = mct_avect_indexra(x2a,'Fall_flxdst4')
116128

117129
! Vector components
130+
!(Faxx_taux and Faxx_tauy)
118131
import_vector_components(11) = 0
119132
import_vector_components(12) = 1
133+
!(dust fluxes)
134+
import_vector_components(21) = 0
135+
import_vector_components(22) = 1
136+
import_vector_components(23) = 2
137+
import_vector_components(24) = 3
120138

121139
! Constant multiples
122140
import_constant_multiple(10) = -1
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#ifndef EAMXX_MAM_SRF_AND_ONLINE_EMISSIONS_FUNCTIONS_HPP
2+
#define EAMXX_MAM_SRF_AND_ONLINE_EMISSIONS_FUNCTIONS_HPP
3+
4+
namespace scream {
5+
6+
namespace {
7+
8+
using KT = ekat::KokkosTypes<DefaultDevice>;
9+
using view_1d = typename KT::template view_1d<Real>;
10+
using view_2d = typename KT::template view_2d<Real>;
11+
using const_view_1d = typename KT::template view_1d<const Real>;
12+
using const_view_2d = typename KT::template view_2d<const Real>;
13+
14+
//-------- Inititlize gas and aerosol fluxes ------
15+
void init_fluxes(const int &ncol,
16+
view_2d &constituent_fluxes) { // input-output
17+
18+
constexpr int pcnst = mam4::aero_model::pcnst;
19+
const int gas_start_ind = mam4::utils::gasses_start_ind();
20+
21+
const auto policy =
22+
ekat::ExeSpaceUtils<KT::ExeSpace>::get_default_team_policy(
23+
ncol, pcnst - gas_start_ind);
24+
25+
// Parallel loop over all the columns
26+
Kokkos::parallel_for(
27+
policy, KOKKOS_LAMBDA(const KT::MemberType &team) {
28+
const int icol = team.league_rank();
29+
view_1d flux_col = ekat::subview(constituent_fluxes, icol);
30+
31+
// Zero out constituent fluxes only for gasses and aerosols
32+
Kokkos::parallel_for(
33+
Kokkos::TeamVectorRange(team, gas_start_ind, pcnst),
34+
[&](int icnst) { flux_col(icnst) = 0; });
35+
});
36+
} // init_fluxes ends
37+
38+
//-------- compute online emissions for dust, sea salt and marine organics -----
39+
void compute_online_dust_nacl_emiss(
40+
const int &ncol, const int &nlev, const const_view_1d &ocnfrac,
41+
const const_view_1d &sst, const const_view_2d &u_wind,
42+
const const_view_2d &v_wind, const const_view_2d &dstflx,
43+
const const_view_1d &mpoly, const const_view_1d &mprot,
44+
const const_view_1d &mlip, const const_view_1d &soil_erodibility,
45+
const const_view_2d &z_mid,
46+
// output
47+
view_2d &constituent_fluxes) {
48+
const int surf_lev = nlev - 1; // surface level
49+
50+
Kokkos::parallel_for(
51+
"online_emis_fluxes", ncol, KOKKOS_LAMBDA(int icol) {
52+
// Input
53+
const const_view_1d dstflx_icol = ekat::subview(dstflx, icol);
54+
55+
// Output
56+
view_1d fluxes_col = ekat::subview(constituent_fluxes, icol);
57+
58+
// Compute online emissions
59+
// NOTE: mam4::aero_model_emissions calculates mass and number emission
60+
// fluxes in units of [kg/m2/s or #/m2/s] (MKS), so no need to convert
61+
mam4::aero_model_emissions::aero_model_emissions(
62+
sst(icol), ocnfrac(icol), u_wind(icol, surf_lev),
63+
v_wind(icol, surf_lev), z_mid(icol, surf_lev), dstflx_icol,
64+
soil_erodibility(icol), mpoly(icol), mprot(icol), mlip(icol),
65+
// out
66+
fluxes_col);
67+
});
68+
} // compute_online_dust_nacl_emiss ends
69+
70+
} // namespace
71+
} // namespace scream
72+
73+
#endif // EAMXX_MAM_SRF_AND_ONLINE_EMISSIONS_FUNCTIONS_HPP

0 commit comments

Comments
 (0)