Skip to content

Commit 1e40ce2

Browse files
authored
Merge branch 'tcclevenger/eamxx/add_tracer_with_turbulence_advection' (PR #6789)
Processes can choose for a tracer to be advected only by dynamics (not by SHOC) by passing turbulence_advected=false to add_tracer(). Guards set up to ensure all tracers requests are consistent among processes. [non-BFB for MAMxx]
2 parents 2394009 + c3fb462 commit 1e40ce2

24 files changed

+389
-290
lines changed

components/eamxx/src/control/atmosphere_driver.cpp

Lines changed: 65 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,7 @@ namespace control {
5858
* Note: at this stage, atm procs that act on non-ref grid(s) should be able to create their
5959
* remappers. The AD will *not* take care of remapping inputs/outputs of the process.
6060
* 4) Register all fields and all groups from all atm procs inside the field managers, and proceed
61-
* to allocate fields. Each field manager (there is one FM per grid) will take care of
62-
* accommodating all requests for packing as well as (if possible) bundling of groups.
63-
* For more details, see the documentation in the share/field/field_request.hpp header.
61+
* to allocate fields. For more details, see the documentation in the share/field/field_request.hpp header.
6462
* 5) Set all the fields into the atm procs. Before this point, all the atm procs had were the
6563
* FieldIdentifiers for their input/output fields and FieldGroupInfo for their input/output
6664
* field groups. Now, we pass actual Field and FieldGroup objects to them, where both the
@@ -405,7 +403,7 @@ void AtmosphereDriver::reset_accumulated_fields ()
405403
}
406404

407405
auto accum_group = m_field_mgr->get_field_group("ACCUMULATED", grid_name);
408-
for (auto f_it : accum_group.m_fields) {
406+
for (auto f_it : accum_group.m_individual_fields) {
409407
auto& track = f_it.second->get_header().get_tracking();
410408
f_it.second->deep_copy(zero);
411409
track.set_accum_start_time(m_current_ts);
@@ -535,8 +533,54 @@ void AtmosphereDriver::create_fields()
535533
m_field_mgr = std::make_shared<field_mgr_type>(m_grids_manager);
536534
m_field_mgr->registration_begins();
537535

538-
// By now, the processes should have fully built the ids of their
539-
// required/computed fields and groups. Let them register them in the FM
536+
// Before registering fields, check that Field Requests for tracers are compatible
537+
{
538+
// Create map from tracer name to a vector which contains the field requests for that tracer.
539+
std::map<std::string, std::set<FieldRequest>> tracer_requests;
540+
auto gather_tracer_requests = [&] (FieldRequest req) {
541+
if (not ekat::contains(req.groups, "tracers")) return;
542+
543+
std::string fname = req.fid.name();
544+
if (tracer_requests.find(fname) == tracer_requests.end()) {
545+
tracer_requests[fname] = {req};
546+
} else {
547+
tracer_requests[fname].emplace(req);
548+
}
549+
};
550+
for (const auto& req : m_atm_process_group->get_required_field_requests()){
551+
gather_tracer_requests(req);
552+
}
553+
for (const auto& req : m_atm_process_group->get_computed_field_requests()) {
554+
gather_tracer_requests(req);
555+
}
556+
557+
// Go through the map entry for each tracer and check that every one
558+
// has the same request for turbulence advection.
559+
for (auto fr : tracer_requests) {
560+
const auto reqs = fr.second;
561+
562+
std::set<bool> turb_advect_types;
563+
for (auto req : reqs) {
564+
turb_advect_types.emplace(ekat::contains(req.groups, "turbulence_advected_tracers"));
565+
}
566+
567+
if (turb_advect_types.size()!=1) {
568+
std::ostringstream ss;
569+
ss << "Error! Incompatible tracer request. Turbulence advection requests not consistent among processes.\n"
570+
" - Tracer name: " + fr.first + "\n"
571+
" - Requests (process name, grid name, is tracers turbulence advected):\n";
572+
for (auto req : reqs) {
573+
const auto grid_name = req.fid.get_grid_name();
574+
const bool turb_advect = ekat::contains(req.groups, "turbulence_advected_tracers");
575+
ss << " - (" + req.calling_process + ", " + grid_name + ", " + (turb_advect ? "true" : "false") + ")\n";
576+
}
577+
EKAT_ERROR_MSG(ss.str());
578+
}
579+
}
580+
}
581+
582+
// Register required/computed fields. By now, the processes should have
583+
// fully built the ids of their required/computed fields and groups
540584
for (const auto& req : m_atm_process_group->get_required_field_requests()) {
541585
m_field_mgr->register_field(req);
542586
}
@@ -599,8 +643,8 @@ void AtmosphereDriver::create_fields()
599643
m_field_mgr->add_to_group(fid, "RESTART");
600644
}
601645
for (const auto& g : m_atm_process_group->get_groups_in()) {
602-
if (g.m_bundle) {
603-
m_field_mgr->add_to_group(g.m_bundle->get_header().get_identifier(), "RESTART");
646+
if (g.m_monolithic_field) {
647+
m_field_mgr->add_to_group(g.m_monolithic_field->get_header().get_identifier(), "RESTART");
604648
} else {
605649
for (const auto& fn : g.m_info->m_fields_names) {
606650
m_field_mgr->add_to_group(fn, g.grid_name(), "RESTART");
@@ -1128,19 +1172,19 @@ void AtmosphereDriver::set_initial_conditions ()
11281172
// ...then the input groups
11291173
m_atm_logger->debug(" [EAMxx] Processing input groups ...");
11301174
for (const auto& g : m_atm_process_group->get_groups_in()) {
1131-
if (g.m_bundle) {
1132-
process_ic_field(*g.m_bundle);
1175+
if (g.m_monolithic_field) {
1176+
process_ic_field(*g.m_monolithic_field);
11331177
}
1134-
for (auto it : g.m_fields) {
1178+
for (auto it : g.m_individual_fields) {
11351179
process_ic_field(*it.second);
11361180
}
11371181
}
11381182
m_atm_logger->debug(" [EAMxx] Processing input groups ... done!");
11391183

1140-
// Some fields might be the subfield of a group's bundled field. In that case,
1141-
// we only need to init one: either the bundled field, or all the individual subfields.
1184+
// Some fields might be the subfield of a group's monolithic field. In that case,
1185+
// we only need to init one: either the monolithic field, or all the individual subfields.
11421186
// So loop over the fields that appear to require loading from file, and remove
1143-
// them from the list if they are the subfield of a bundled field already inited
1187+
// them from the list if they are the subfield of a groups monolithic field already inited
11441188
// (perhaps via initialize_constant_field, or copied from another field).
11451189
for (auto& it1 : ic_fields_names) {
11461190
const auto& grid_name = it1.first;
@@ -1244,17 +1288,17 @@ void AtmosphereDriver::set_initial_conditions ()
12441288
}
12451289
m_atm_logger->debug(" [EAMxx] Processing fields to copy ... done!");
12461290

1247-
// It is possible to have a bundled group G1=(f1,f2,f3),
1291+
// It is possible to have a monolithically allocated group G1=(f1,f2,f3),
12481292
// where the IC are read from file for f1, f2, and f3. In that case,
1249-
// the time stamp for the bundled G1 has not be inited, but the data
1293+
// the time stamp for the monolithic field of G1 has not be inited, but the data
12501294
// is valid (all entries have been inited). Let's fix that.
12511295
m_atm_logger->debug(" [EAMxx] Processing subfields ...");
12521296
for (const auto& g : m_atm_process_group->get_groups_in()) {
1253-
if (g.m_bundle) {
1254-
auto& track = g.m_bundle->get_header().get_tracking();
1297+
if (g.m_monolithic_field) {
1298+
auto& track = g.m_monolithic_field->get_header().get_tracking();
12551299
if (not track.get_time_stamp().is_valid()) {
1256-
// The bundled field has not been inited. Check if all the subfields
1257-
// have been inited. If so, init the timestamp of the bundled field too.
1300+
// The groups monolithic field has not been inited. Check if all the subfields
1301+
// have been inited. If so, init the timestamp of the monlithic field too.
12581302
const auto& children = track.get_children();
12591303
bool all_inited = children.size()>0; // If no children, then something is off, so mark as not good
12601304
for (auto wp : children) {
@@ -1632,7 +1676,7 @@ void AtmosphereDriver::run (const int dt) {
16321676
}
16331677

16341678
auto rescale_group = m_field_mgr->get_field_group("DIVIDE_BY_DT", gname);
1635-
for (auto f_it : rescale_group.m_fields) {
1679+
for (auto f_it : rescale_group.m_individual_fields) {
16361680
f_it.second->scale(Real(1) / dt);
16371681
}
16381682
}

components/eamxx/src/control/tests/dummy_atm_proc.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ class DummyProcess : public scream::AtmosphereProcess {
9393
});
9494
} else if (m_name=="Group to Group") {
9595
const auto& g = get_group_out("The Group");
96-
const auto view_B = g.m_fields.at("B")->get_view<Real**>();
97-
const auto view_C = g.m_fields.at("C")->get_view<Real**>();
96+
const auto view_B = g.m_individual_fields.at("B")->get_view<Real**>();
97+
const auto view_C = g.m_individual_fields.at("C")->get_view<Real**>();
9898

9999
Kokkos::parallel_for(policy,KOKKOS_LAMBDA(const int idx) {
100100
const int icol = idx / nlevs;
@@ -105,8 +105,8 @@ class DummyProcess : public scream::AtmosphereProcess {
105105
});
106106
} else {
107107
const auto& g = get_group_in("The Group");
108-
const auto view_B = g.m_fields.at("B")->get_view<const Real**>();
109-
const auto view_C = g.m_fields.at("C")->get_view<const Real**>();
108+
const auto view_B = g.m_individual_fields.at("B")->get_view<const Real**>();
109+
const auto view_C = g.m_individual_fields.at("C")->get_view<const Real**>();
110110
const auto view_A = get_field_out("A").get_view<Real**>();
111111

112112
Kokkos::parallel_for(policy,KOKKOS_LAMBDA(const int idx) {
@@ -128,7 +128,7 @@ class DummyProcess : public scream::AtmosphereProcess {
128128

129129
std::string m_name;
130130

131-
DummyType m_dummy_type;
131+
DummyType m_dummy_type;
132132
};
133133

134134
} // namespace scream

components/eamxx/src/dynamics/homme/eamxx_homme_fv_phys.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ void HommeDynamics::fv_phys_dyn_to_fv_phys (const bool restart) {
111111
t.T_mid = Homme::ExecView<Real***>("T_mid_tmp", nelem, npg, npacks*N);
112112
t.horiz_winds = Homme::ExecView<Real****>("horiz_winds_tmp", nelem, npg, 2, npacks*N);
113113
// Really need just the first tracer.
114-
const auto qsize = get_group_out("tracers", pgn).m_bundle->get_view<Real***>().extent_int(1);
114+
const auto qsize = get_group_out("tracers", pgn).m_monolithic_field->get_view<Real***>().extent_int(1);
115115
t.tracers = Homme::ExecView<Real****>("tracers_tmp", nelem, npg, qsize, npacks*N);
116116
remap_dyn_to_fv_phys(&t);
117117
assert(ncols == nelem*npg);
@@ -138,7 +138,7 @@ void HommeDynamics::fv_phys_dyn_to_fv_phys (const bool restart) {
138138
auto f = get_field_out(n,pgn);
139139
f.get_header().get_tracking().update_time_stamp(timestamp());
140140
}
141-
auto Q = get_group_out("tracers",pgn).m_bundle;
141+
auto Q = get_group_out("tracers",pgn).m_monolithic_field;
142142
Q->get_header().get_tracking().update_time_stamp(timestamp());
143143
}
144144
update_pressure(m_phys_grid);
@@ -169,7 +169,7 @@ void HommeDynamics::remap_dyn_to_fv_phys (GllFvRemapTmp* t) const {
169169
const auto npg = m_phys_grid_pgN*m_phys_grid_pgN;
170170
const auto& gn = m_phys_grid->name();
171171
const auto nlev = get_field_out("T_mid", gn).get_view<Real**>().extent_int(1);
172-
const auto nq = get_group_out("tracers").m_bundle->get_view<Real***>().extent_int(1);
172+
const auto nq = get_group_out("tracers").m_monolithic_field->get_view<Real***>().extent_int(1);
173173
assert(get_field_out("T_mid", gn).get_view<Real**>().extent_int(0) == nelem*npg);
174174
assert(get_field_out("horiz_winds", gn).get_view<Real***>().extent_int(1) == 2);
175175

@@ -189,7 +189,7 @@ void HommeDynamics::remap_dyn_to_fv_phys (GllFvRemapTmp* t) const {
189189
t ? t->horiz_winds.data() : get_field_out("horiz_winds", gn).get_view<Real***>().data(),
190190
nelem, npg, 2, nlev);
191191
const auto q = Homme::GllFvRemap::Phys3T(
192-
t ? t->tracers.data() : get_group_out("tracers", gn).m_bundle->get_view<Real***>().data(),
192+
t ? t->tracers.data() : get_group_out("tracers", gn).m_monolithic_field->get_view<Real***>().data(),
193193
nelem, npg, nq, nlev);
194194
const auto dp = Homme::GllFvRemap::Phys2T(
195195
get_field_out("pseudo_density", gn).get_view<Real**>().data(),
@@ -209,7 +209,7 @@ void HommeDynamics::remap_fv_phys_to_dyn () const {
209209
const auto npg = m_phys_grid_pgN*m_phys_grid_pgN;
210210
const auto& gn = m_phys_grid->name();
211211
const auto nlev = m_helper_fields.at("FT_phys").get_view<const Real**>().extent_int(1);
212-
const auto nq = get_group_in("tracers", gn).m_bundle->get_view<const Real***>().extent_int(1);
212+
const auto nq = get_group_in("tracers", gn).m_monolithic_field->get_view<const Real***>().extent_int(1);
213213
assert(m_helper_fields.at("FT_phys").get_view<const Real**>().extent_int(0) == nelem*npg);
214214

215215
const auto uv_ndim = m_helper_fields.at("FM_phys").get_view<const Real***>().extent_int(1);
@@ -222,7 +222,7 @@ void HommeDynamics::remap_fv_phys_to_dyn () const {
222222
m_helper_fields.at("FM_phys").get_view<const Real***>().data(),
223223
nelem, npg, uv_ndim, nlev);
224224
const auto q = Homme::GllFvRemap::CPhys3T(
225-
get_group_in("tracers", gn).m_bundle->get_view<const Real***>().data(),
225+
get_group_in("tracers", gn).m_monolithic_field->get_view<const Real***>().data(),
226226
nelem, npg, nq, nlev);
227227

228228
gfr.run_fv_phys_to_dyn(time_idx, T, uv, q);

components/eamxx/src/dynamics/homme/eamxx_homme_process_interface.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ void HommeDynamics::set_grids (const std::shared_ptr<const GridsManager> grids_m
180180
add_field<Computed>("omega", pg_scalar3d_mid, Pa/s, pgn,N);
181181

182182
add_tracer<Updated >("qv", m_phys_grid, kg/kg, N);
183-
add_group<Updated>("tracers",pgn,N, true);
183+
add_group<Updated>("tracers",pgn,N, MonolithicAlloc::Required);
184184

185185
if (fv_phys_active()) {
186186
// [CGLL ICs in pg2] Read CGLL IC data even though our in/out format is
@@ -196,7 +196,7 @@ void HommeDynamics::set_grids (const std::shared_ptr<const GridsManager> grids_m
196196
add_field<Required>("T_mid", rg_scalar3d_mid,K, rgn,N);
197197
add_field<Required>("ps", rg_scalar2d ,Pa, rgn);
198198
add_field<Required>("phis", rg_scalar2d ,m2/s2, rgn);
199-
add_group<Required>("tracers",rgn,N, true);
199+
add_group<Required>("tracers",rgn,N, MonolithicAlloc::Required);
200200
fv_phys_rrtmgp_active_gases_init(grids_manager);
201201
// This is needed for the dp_ref init in initialize_homme_state.
202202
add_field<Computed>("pseudo_density",rg_scalar3d_mid,Pa, rgn,N);
@@ -397,7 +397,7 @@ void HommeDynamics::initialize_impl (const RunType run_type)
397397
// ftype!=FORCING_0:
398398
// 1) remap Q_pgn->FQ_dyn
399399
// Remap Q directly into FQ, tendency computed in pre_process step
400-
m_p2d_remapper->register_field(*get_group_out("Q",pgn).m_bundle,m_helper_fields.at("FQ_dyn"));
400+
m_p2d_remapper->register_field(*get_group_out("Q",pgn).m_monolithic_field,m_helper_fields.at("FQ_dyn"));
401401
m_p2d_remapper->register_field(m_helper_fields.at("FT_phys"),m_helper_fields.at("FT_dyn"));
402402

403403
// FM has 3 components on dyn grid, but only 2 on phys grid
@@ -412,7 +412,7 @@ void HommeDynamics::initialize_impl (const RunType run_type)
412412
m_d2p_remapper->register_field(get_internal_field("v_dyn"),get_field_out("horiz_winds"));
413413
m_d2p_remapper->register_field(get_internal_field("dp3d_dyn"), get_field_out("pseudo_density"));
414414
m_d2p_remapper->register_field(get_internal_field("ps_dyn"), get_field_out("ps"));
415-
m_d2p_remapper->register_field(m_helper_fields.at("Q_dyn"),*get_group_out("Q",pgn).m_bundle);
415+
m_d2p_remapper->register_field(m_helper_fields.at("Q_dyn"),*get_group_out("Q",pgn).m_monolithic_field);
416416
m_d2p_remapper->register_field(m_helper_fields.at("omega_dyn"), get_field_out("omega"));
417417

418418
m_p2d_remapper->registration_ends();
@@ -463,7 +463,7 @@ void HommeDynamics::initialize_impl (const RunType run_type)
463463
using Interval = FieldWithinIntervalCheck;
464464
using LowerBound = FieldLowerBoundCheck;
465465

466-
add_postcondition_check<LowerBound>(*get_group_out("Q",pgn).m_bundle,m_phys_grid,0,true);
466+
add_postcondition_check<LowerBound>(*get_group_out("Q",pgn).m_monolithic_field,m_phys_grid,0,true);
467467
add_postcondition_check<Interval>(get_field_out("T_mid",pgn),m_phys_grid,100.0, 500.0,false);
468468
add_postcondition_check<Interval>(get_field_out("horiz_winds",pgn),m_phys_grid,-400.0, 400.0,false);
469469
add_postcondition_check<Interval>(get_field_out("ps"),m_phys_grid,30000.0, 120000.0,false);
@@ -686,7 +686,7 @@ void HommeDynamics::homme_post_process (const double dt) {
686686
const auto dp_dry_view = get_field_out("pseudo_density_dry").get_view<Pack**>();
687687
const auto p_dry_int_view = get_field_out("p_dry_int").get_view<Pack**>();
688688
const auto p_dry_mid_view = get_field_out("p_dry_mid").get_view<Pack**>();
689-
const auto Q_view = get_group_out("Q",pgn).m_bundle->get_view<Pack***>();
689+
const auto Q_view = get_group_out("Q",pgn).m_monolithic_field->get_view<Pack***>();
690690

691691
const auto T_view = get_field_out("T_mid").get_view<Pack**>();
692692
const auto T_prev_view = m_helper_fields.at("FT_phys").get_view<Pack**>();
@@ -1003,7 +1003,7 @@ void HommeDynamics::restart_homme_state () {
10031003
auto qv_prev_ref = std::make_shared<Field>();
10041004
auto Q_dyn = m_helper_fields.at("Q_dyn");
10051005
if (params.ftype==Homme::ForcingAlg::FORCING_2) {
1006-
auto Q_old = *get_group_in("Q",pgn).m_bundle;
1006+
auto Q_old = *get_group_in("Q",pgn).m_monolithic_field;
10071007
m_ic_remapper->register_field(Q_old,Q_dyn);
10081008

10091009
// Grab qv_ref_old from Q_old
@@ -1106,7 +1106,7 @@ void HommeDynamics::initialize_homme_state () {
11061106
m_ic_remapper->register_field(get_field_in("ps",rgn),get_internal_field("ps_dyn"));
11071107
m_ic_remapper->register_field(get_field_in("phis",rgn),m_helper_fields.at("phis_dyn"));
11081108
m_ic_remapper->register_field(get_field_in("T_mid",rgn),get_internal_field("vtheta_dp_dyn"));
1109-
m_ic_remapper->register_field(*get_group_in("tracers",rgn).m_bundle,m_helper_fields.at("Q_dyn"));
1109+
m_ic_remapper->register_field(*get_group_in("tracers",rgn).m_monolithic_field,m_helper_fields.at("Q_dyn"));
11101110
m_ic_remapper->registration_ends();
11111111
m_ic_remapper->remap_fwd();
11121112

components/eamxx/src/physics/iop_forcing/eamxx_iop_forcing_process_interface.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ void IOPForcing::set_grids(const std::shared_ptr<const GridsManager> grids_manag
2929
add_field<Updated>("T_mid", scalar3d_mid, K, grid_name, pack_size);
3030

3131
add_tracer<Updated>("qv", m_grid, kg/kg, pack_size);
32-
add_group<Updated>("tracers", grid_name, pack_size, true);
32+
add_group<Updated>("tracers", grid_name, pack_size, MonolithicAlloc::Required);
3333

3434
// Sanity check that iop data manager is setup by driver
3535
EKAT_REQUIRE_MSG(m_iop_data_manager,
@@ -64,8 +64,8 @@ set_computed_group_impl (const FieldGroup& group)
6464
EKAT_REQUIRE_MSG(name=="tracers",
6565
"Error! IOPForcing was not expecting a field group called '" << name << "\n");
6666

67-
EKAT_REQUIRE_MSG(group.m_info->m_bundled,
68-
"Error! IOPForcing expects bundled fields for tracers.\n");
67+
EKAT_REQUIRE_MSG(group.m_info->m_monolithic_allocation,
68+
"Error! IOPForcing expects a monolithic allocation for tracers.\n");
6969

7070
m_num_tracers = group.m_info->size();
7171
}
@@ -343,7 +343,7 @@ void IOPForcing::run_impl (const double dt)
343343
const auto horiz_winds = get_field_out("horiz_winds").get_view<Pack***>();
344344
const auto T_mid = get_field_out("T_mid").get_view<Pack**>();
345345
const auto qv = get_field_out("qv").get_view<Pack**>();
346-
const auto Q = get_group_out("tracers").m_bundle->get_view<Pack***>();
346+
const auto Q = get_group_out("tracers").m_monolithic_field->get_view<Pack***>();
347347

348348
// Load data from IOP files, if necessary
349349
m_iop_data_manager->read_iop_file_data(timestamp());

components/eamxx/src/physics/mam/eamxx_mam_generic_process_interface.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,22 +140,24 @@ void MAMGenericInterface::add_tracers_interstitial_aerosol() {
140140
// ---------------------------------------------------------------------
141141
// These variables are "Updated" or inputs/outputs for the process
142142
// ---------------------------------------------------------------------
143-
// NOTE: Cloud borne aerosols are not updated in this process but are included
144-
// to create data structures.
143+
// NOTE:
144+
// - Cloud borne aerosols are not updated in this process but are included
145+
// to create data structures.
146+
// - For interstitial aerosols, we have dynamics advect, but not turbulence.
145147

146148
// interstitial and cloudborne aerosol tracers of interest: mass (q) and
147149
// number (n) mixing ratios
148150
for(int mode = 0; mode < mam_coupling::num_aero_modes(); ++mode) {
149151
// interstitial aerosol tracers of interest: number (n) mixing ratios
150152
const std::string int_nmr_field_name =
151153
mam_coupling::int_aero_nmr_field_name(mode);
152-
add_tracer<Updated>(int_nmr_field_name, grid_, n_unit);
154+
add_tracer<Updated>(int_nmr_field_name, grid_, n_unit, 1, TracerAdvection::DynamicsOnly);
153155
for(int a = 0; a < mam_coupling::num_aero_species(); ++a) {
154156
// (interstitial) aerosol tracers of interest: mass (q) mixing ratios
155157
const std::string int_mmr_field_name =
156158
mam_coupling::int_aero_mmr_field_name(mode, a);
157159
if(not int_mmr_field_name.empty()) {
158-
add_tracer<Updated>(int_mmr_field_name, grid_, q_unit);
160+
add_tracer<Updated>(int_mmr_field_name, grid_, q_unit, 1, TracerAdvection::DynamicsOnly);
159161
}
160162
} // end for loop num species
161163
} // end for loop for num modes

0 commit comments

Comments
 (0)