@@ -50,6 +50,9 @@ namespace openmc {
5050
5151DAGUniverse::DAGUniverse (pugi::xml_node node)
5252{
53+ MaterialOverrides material_overrides;
54+ TemperatureOverrides temperature_overrides;
55+
5356 if (check_for_node (node, " id" )) {
5457 id_ = std::stoi (get_node_value (node, " id" ));
5558 } else {
@@ -99,8 +102,7 @@ DAGUniverse::DAGUniverse(pugi::xml_node node)
99102 fatal_error (fmt::format (
100103 " DAGMC cell {} override cannot specify a universe." , cell_id));
101104 }
102- if (check_for_node (cell_node, " temperature" ) ||
103- check_for_node (cell_node, " density" ) ||
105+ if (check_for_node (cell_node, " density" ) ||
104106 check_for_node (cell_node, " translation" ) ||
105107 check_for_node (cell_node, " rotation" ) ||
106108 check_for_node (cell_node, " volume" )) {
@@ -131,19 +133,36 @@ DAGUniverse::DAGUniverse(pugi::xml_node node)
131133 }
132134 }
133135
134- auto inserted = material_overrides_ .emplace (cell_id, override_mats);
136+ auto inserted = material_overrides .emplace (cell_id, override_mats);
135137 if (!inserted.second ) {
136138 fatal_error (fmt::format (
137139 " Duplicate DAGMC cell override specified for cell {}" , cell_id));
138140 }
141+
142+ if (check_for_node (cell_node, " temperature" )) {
143+ auto temperatures = get_node_array<double >(cell_node, " temperature" );
144+ if (temperatures.empty ()) {
145+ fatal_error (fmt::format (
146+ " DAGMC cell {} override has an empty temperature specification." ,
147+ cell_id));
148+ }
149+ for (auto T : temperatures) {
150+ if (T < 0.0 ) {
151+ fatal_error (fmt::format (
152+ " DAGMC cell {} was specified with a negative temperature" ,
153+ cell_id));
154+ }
155+ }
156+ temperature_overrides.emplace (cell_id, temperatures);
157+ }
139158 }
140159 } else if (check_for_node (node, " material_overrides" )) {
141160 fatal_error (
142161 " DAGMCUniverse <material_overrides> is no longer supported. Use nested "
143162 " <cell> elements under <dagmc_universe> instead." );
144163 }
145164
146- initialize ();
165+ initialize (material_overrides, temperature_overrides );
147166}
148167
149168DAGUniverse::DAGUniverse (
@@ -160,9 +179,11 @@ DAGUniverse::DAGUniverse(std::shared_ptr<moab::DagMC> dagmc_ptr,
160179 : dagmc_instance_(dagmc_ptr), filename_(filename),
161180 adjust_geometry_ids_(auto_geom_ids), adjust_material_ids_(auto_mat_ids)
162181{
182+ MaterialOverrides material_overrides;
183+ TemperatureOverrides temperature_overrides;
163184 set_id ();
164185 init_metadata ();
165- init_geometry ();
186+ init_geometry (material_overrides, temperature_overrides );
166187}
167188
168189void DAGUniverse::set_id ()
@@ -180,6 +201,14 @@ void DAGUniverse::set_id()
180201}
181202
182203void DAGUniverse::initialize ()
204+ {
205+ MaterialOverrides material_overrides;
206+ TemperatureOverrides temperature_overrides;
207+ initialize (material_overrides, temperature_overrides);
208+ }
209+
210+ void DAGUniverse::initialize (const MaterialOverrides& material_overrides,
211+ const TemperatureOverrides& temperature_overrides)
183212{
184213#ifdef OPENMC_UWUW_ENABLED
185214 // read uwuw materials from the .h5m file if present
@@ -190,7 +219,7 @@ void DAGUniverse::initialize()
190219
191220 init_metadata ();
192221
193- init_geometry ();
222+ init_geometry (material_overrides, temperature_overrides );
194223}
195224
196225void DAGUniverse::init_dagmc ()
@@ -226,7 +255,8 @@ void DAGUniverse::init_metadata()
226255 MB_CHK_ERR_CONT (rval);
227256}
228257
229- void DAGUniverse::init_geometry ()
258+ void DAGUniverse::init_geometry (const MaterialOverrides& material_overrides,
259+ const TemperatureOverrides& temperature_overrides)
230260{
231261 moab::ErrorCode rval;
232262
@@ -280,8 +310,8 @@ void DAGUniverse::init_geometry()
280310 if (mat_str == " graveyard" ) {
281311 graveyard = vol_handle;
282312 }
283- if (material_overrides_ .count (c->id_ )) {
284- override_assign_material (c);
313+ if (material_overrides .count (c->id_ )) {
314+ override_assign_material (c, material_overrides );
285315 } else if (mat_str == " void" || mat_str == " vacuum" ||
286316 mat_str == " graveyard" ) {
287317 c->material_ .push_back (MATERIAL_VOID);
@@ -291,6 +321,35 @@ void DAGUniverse::init_geometry()
291321 legacy_assign_material (mat_str, c);
292322 }
293323
324+ if (temperature_overrides.count (c->id_ )) {
325+ if (c->material_ .empty () || c->material_ [0 ] == MATERIAL_VOID) {
326+ fatal_error (fmt::format (" DAGMC cell {} was specified with a "
327+ " temperature but no non-void material." ,
328+ c->id_ ));
329+ }
330+
331+ c->sqrtkT_ .clear ();
332+ const auto & temp_overrides = temperature_overrides.at (c->id_ );
333+ c->sqrtkT_ .reserve (temp_overrides.size ());
334+ for (auto T : temp_overrides) {
335+ c->sqrtkT_ .push_back (std::sqrt (K_BOLTZMANN * T));
336+ }
337+
338+ if (settings::verbosity >= 10 ) {
339+ std::stringstream override_values;
340+ for (size_t i = 0 ; i < temp_overrides.size (); ++i) {
341+ if (i > 0 ) {
342+ override_values << " " ;
343+ }
344+ override_values << temp_overrides[i];
345+ }
346+ auto msg = fmt::format (" Overriding DAGMC cell {} property "
347+ " 'temperature [K]' with value(s): {}" ,
348+ c->id_ , override_values.str ());
349+ write_message (msg, 10 );
350+ }
351+ }
352+
294353 // check for temperature assignment
295354 std::string temp_value;
296355
@@ -300,18 +359,21 @@ void DAGUniverse::init_geometry()
300359 continue ;
301360 }
302361
303- // assign cell temperature
304- const auto & mat = model::materials[model::material_map.at (c->material_ [0 ])];
305- if (dagmc_instance_->has_prop (vol_handle, " temp" )) {
306- rval = dagmc_instance_->prop_value (vol_handle, " temp" , temp_value);
307- MB_CHK_ERR_CONT (rval);
308- double temp = std::stod (temp_value);
309- c->sqrtkT_ .push_back (std::sqrt (K_BOLTZMANN * temp));
310- } else if (mat->temperature () > 0.0 ) {
311- c->sqrtkT_ .push_back (std::sqrt (K_BOLTZMANN * mat->temperature ()));
312- } else {
313- c->sqrtkT_ .push_back (
314- std::sqrt (K_BOLTZMANN * settings::temperature_default));
362+ // assign cell temperature if not explicitly overridden
363+ if (c->sqrtkT_ .empty ()) {
364+ const auto & mat =
365+ model::materials[model::material_map.at (c->material_ [0 ])];
366+ if (dagmc_instance_->has_prop (vol_handle, " temp" )) {
367+ rval = dagmc_instance_->prop_value (vol_handle, " temp" , temp_value);
368+ MB_CHK_ERR_CONT (rval);
369+ double temp = std::stod (temp_value);
370+ c->sqrtkT_ .push_back (std::sqrt (K_BOLTZMANN * temp));
371+ } else if (mat->temperature () > 0.0 ) {
372+ c->sqrtkT_ .push_back (std::sqrt (K_BOLTZMANN * mat->temperature ()));
373+ } else {
374+ c->sqrtkT_ .push_back (
375+ std::sqrt (K_BOLTZMANN * settings::temperature_default));
376+ }
315377 }
316378
317379 model::cells.emplace_back (std::move (c));
@@ -678,15 +740,16 @@ void DAGUniverse::uwuw_assign_material(
678740#endif // OPENMC_UWUW_ENABLED
679741}
680742
681- void DAGUniverse::override_assign_material (std::unique_ptr<DAGCell>& c) const
743+ void DAGUniverse::override_assign_material (std::unique_ptr<DAGCell>& c,
744+ const MaterialOverrides& material_overrides) const
682745{
683746 // if Cell ID matches an override key, use it to override the material
684747 // assignment else if UWUW is used, get the material assignment from the DAGMC
685748 // metadata
686749 // Notify User that an override is being applied on a DAGMCCell
687750 write_message (fmt::format (" Applying override for DAGMCCell {}" , c->id_ ), 8 );
688751
689- const auto & mat_overrides = material_overrides_ .at (c->id_ );
752+ const auto & mat_overrides = material_overrides .at (c->id_ );
690753 if (settings::verbosity >= 10 ) {
691754 std::stringstream override_values;
692755 for (size_t i = 0 ; i < mat_overrides.size (); ++i) {
0 commit comments