@@ -10,6 +10,7 @@ namespace scream {
10
10
MAMGenericInterface::MAMGenericInterface (const ekat::Comm &comm,
11
11
const ekat::ParameterList ¶ms)
12
12
: AtmosphereProcess(comm, params) {
13
+ use_prescribed_ozone_ = m_params.get <bool >(" use_mam4_precribed_ozone" , false );
13
14
/* Anything that can be initialized without grid information can be
14
15
* initialized here. Like universal constants, mam wetscav options.
15
16
*/
@@ -50,8 +51,7 @@ void MAMGenericInterface::set_aerosol_and_gas_ranges() {
50
51
}
51
52
52
53
for (int g = 0 ; g < mam_coupling::num_aero_gases (); ++g) {
53
- const std::string gas_mmr_field_name = mam_coupling::gas_mmr_field_name (g);
54
- limits_aerosol_gas_tracers_[gas_mmr_field_name] =
54
+ limits_aerosol_gas_tracers_[std::string (mam_coupling::gas_mmr_name[g])] =
55
55
mam_coupling::physical_min_max (mmr_label);
56
56
} // end for loop num gases
57
57
}
@@ -99,6 +99,7 @@ void MAMGenericInterface::add_fields_cloudborne_aerosol() {
99
99
auto n_unit = 1 / kg; // units of number mixing ratios of tracers
100
100
const auto &grid_name = grid_->name ();
101
101
102
+ // Layout for 3D scalar fields at midpoints(col, level))
102
103
FieldLayout scalar3d_mid = grid_->get_3d_scalar_layout (true );
103
104
104
105
// ---------------------------------------------------------------------
@@ -167,11 +168,31 @@ void MAMGenericInterface::add_tracers_interstitial_aerosol() {
167
168
// ================================================================
168
169
169
170
void MAMGenericInterface::add_tracers_gases () {
171
+ // Note that the gas list in MAM4 is:
172
+ // {"O3", "H2O2", "H2SO4", "SO2", "DMS", "SOAG"}
170
173
using namespace ekat ::units;
171
- auto q_unit = kg / kg; // units of mass mixing ratios of tracers
172
- for (int g = 0 ; g < mam_coupling::num_aero_gases (); ++g) {
173
- const std::string gas_mmr_field_name = mam_coupling::gas_mmr_field_name (g);
174
- add_tracer<Updated>(gas_mmr_field_name, grid_, q_unit);
174
+ constexpr auto q_unit = kg / kg; // units of mass mixing ratios of tracers
175
+
176
+ const auto &grid_name = grid_->name ();
177
+
178
+ // Layout for 3D scalar fields at midpoints(col, level))
179
+ const FieldLayout scalar3d_mid = grid_->get_3d_scalar_layout (true );
180
+
181
+
182
+ // Special treatmenet for Ozone (O3):
183
+ // O3 can be prescribed or prognostic depending upon the user input
184
+ constexpr int o3_id = 0 ; // Index of Ozone in the gas list
185
+ if (use_prescribed_ozone_) {
186
+ // If using prescribed O3, we add it as a field
187
+ add_field<Updated>(std::string (mam_coupling::gas_mmr_name[o3_id]), scalar3d_mid, q_unit, grid_name);
188
+ } else {
189
+ // If not using prescribed O3 (i.e., prognostic O3), we add it as a tracer
190
+ add_tracer<Updated>(std::string (mam_coupling::gas_mmr_name[o3_id]), grid_, q_unit);
191
+ }
192
+
193
+ // add other gases as tracers (note that the index of gases starts from 1)
194
+ for (int g = 1 ; g < mam_coupling::num_aero_gases (); ++g) {
195
+ add_tracer<Updated>(std::string (mam_coupling::gas_mmr_name[g]), grid_, q_unit);
175
196
} // end for loop num gases
176
197
}
177
198
// ================================================================
@@ -252,8 +273,7 @@ void MAMGenericInterface::set_buffer_scratch_to_zero(
252
273
void MAMGenericInterface::populate_gases_wet_aero (
253
274
mam_coupling::AerosolState &wet_aero) {
254
275
for (int g = 0 ; g < mam_coupling::num_aero_gases (); ++g) {
255
- const std::string gas_mmr_field_name = mam_coupling::gas_mmr_field_name (g);
256
- wet_aero.gas_mmr [g] = get_field_out (gas_mmr_field_name).get_view <Real **>();
276
+ wet_aero.gas_mmr [g] = get_field_out (std::string (mam_coupling::gas_mmr_name[g])).get_view <Real **>();
257
277
}
258
278
}
259
279
0 commit comments