From 0bd2f9263b132b7091bd0f85821bf3fb6a9d66e5 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sun, 6 Dec 2020 00:20:28 -0600 Subject: [PATCH] Always checking DAGMC models for additional material definitions. --- include/openmc/dagmc.h | 1 + src/dagmc.cpp | 44 +++++++++++++++++++ src/material.cpp | 4 ++ .../dagmc/uwuw/inputs_true.dat | 8 +++- tests/regression_tests/dagmc/uwuw/test.py | 6 ++- 5 files changed, 61 insertions(+), 2 deletions(-) diff --git a/include/openmc/dagmc.h b/include/openmc/dagmc.h index 91755ed146..f0c6d47186 100644 --- a/include/openmc/dagmc.h +++ b/include/openmc/dagmc.h @@ -27,6 +27,7 @@ void load_dagmc_geometry(); int32_t create_dagmc_universe(const std::string& filename); void read_geometry_dagmc(); void read_dagmc_universes(pugi::xml_node node); +void read_dagmc_uwuw_materials(); bool read_uwuw_materials(pugi::xml_document& doc); bool get_uwuw_materials_xml(std::string& s); diff --git a/src/dagmc.cpp b/src/dagmc.cpp index 97398374c0..c162096c23 100644 --- a/src/dagmc.cpp +++ b/src/dagmc.cpp @@ -128,6 +128,50 @@ bool read_uwuw_materials(pugi::xml_document& doc) { return found_uwuw_mats; } +void read_dagmc_uwuw_materials() { + std::string filename = settings::path_input + "geometry.xml"; + if (!file_exists(filename)) { + fatal_error(fmt::format("Geometry XML file '{}' does not exist!", filename)); + } + + pugi::xml_document doc; + auto result = doc.load_file(filename.c_str()); + if (!result) { + fatal_error("Error processing geometry.xml file."); + } + pugi::xml_node root = doc.document_element(); + // Loop over DAGMC elements + for (pugi::xml_node dagmc_node : root.children("dagmc")) { + if (!check_for_node(dagmc_node, "filename")) { + fatal_error("No filename specified on a DAGMC universe element"); + } + std::string dagmc_filename = get_node_value(dagmc_node, "filename"); + // Load any existing UWUW materials + UWUW uwuw(dagmc_filename.c_str()); + const auto& mat_lib = uwuw.material_library; + if (mat_lib.size() == 0) continue; + + std::stringstream ss; + ss << "\n"; + ss << "\n"; + for (auto mat : mat_lib) { ss << mat.second.openmc("atom"); } + ss << ""; + std::string mat_xml_string = ss.str(); + + // create a pugi XML document from this string + pugi::xml_document doc; + auto result = doc.load_string(mat_xml_string.c_str()); + if (!result) { + fatal_error("Error processing XML created using DAGMC UWUW materials."); + } + pugi::xml_node root = doc.document_element(); + for (pugi::xml_node material_node : root.children("material")) { + model::materials.push_back(std::make_unique(material_node)); + } + } +} + + bool write_uwuw_materials_xml() { std::string s; bool found_uwuw_mats = get_uwuw_materials_xml(s); diff --git a/src/material.cpp b/src/material.cpp index a1aa6ea5f8..9010e8b01c 100644 --- a/src/material.cpp +++ b/src/material.cpp @@ -1237,6 +1237,10 @@ void read_materials_xml() for (pugi::xml_node material_node : root.children("material")) { model::materials.push_back(make_unique(material_node)); } + + // Search for materials defined on DAGMC models + read_dagmc_uwuw_materials(); + model::materials.shrink_to_fit(); } diff --git a/tests/regression_tests/dagmc/uwuw/inputs_true.dat b/tests/regression_tests/dagmc/uwuw/inputs_true.dat index 87ceb944d8..901547fa29 100644 --- a/tests/regression_tests/dagmc/uwuw/inputs_true.dat +++ b/tests/regression_tests/dagmc/uwuw/inputs_true.dat @@ -1,4 +1,11 @@ + + + + + + + eigenvalue 100 @@ -9,7 +16,6 @@ -4 -4 -4 4 4 4 - true diff --git a/tests/regression_tests/dagmc/uwuw/test.py b/tests/regression_tests/dagmc/uwuw/test.py index b4391d8e77..5c9777d481 100644 --- a/tests/regression_tests/dagmc/uwuw/test.py +++ b/tests/regression_tests/dagmc/uwuw/test.py @@ -27,13 +27,17 @@ class UWUWTest(PyAPITestHarness): model.settings.export_to_xml() + # geometry + dag_univ = openmc.DAGMCUniverse("dagmc.h5m") + model.geometry = openmc.Geometry(root=dag_univ) + # tally tally = openmc.Tally() tally.scores = ['total'] tally.filters = [openmc.CellFilter(1)] model.tallies = [tally] - model.tallies.export_to_xml() + model.export_to_xml() def test_uwuw(): harness = UWUWTest('statepoint.5.h5')