From a533fcd7f39f9f20bd769a37723c20c009bde079 Mon Sep 17 00:00:00 2001 From: Eden <91745090+EdenRochmanSharabi@users.noreply.github.com> Date: Thu, 23 Jul 2026 16:31:42 +0200 Subject: [PATCH] Add description attribute to Model (#3956) Co-authored-by: Paul Romano --- openmc/model/model.py | 25 +++++++++++++++++++++++++ tests/unit_tests/test_model.py | 18 ++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/openmc/model/model.py b/openmc/model/model.py index c3bfa3b55..220b4d8aa 100644 --- a/openmc/model/model.py +++ b/openmc/model/model.py @@ -70,6 +70,8 @@ class Model: Tallies information plots : openmc.Plots, optional Plot information + description : str, optional + A description of the model Attributes ---------- @@ -83,6 +85,8 @@ class Model: Tallies information plots : openmc.Plots Plot information + description : str + A description of the model """ @@ -93,12 +97,14 @@ class Model: settings: openmc.Settings | None = None, tallies: openmc.Tallies | None = None, plots: openmc.Plots | None = None, + description: str = '', ): self.geometry = openmc.Geometry() if geometry is None else geometry self.materials = openmc.Materials() if materials is None else materials self.settings = openmc.Settings() if settings is None else settings self.tallies = openmc.Tallies() if tallies is None else tallies self.plots = openmc.Plots() if plots is None else plots + self.description = description @property def geometry(self) -> openmc.Geometry: @@ -166,6 +172,15 @@ class Model: for plot in plots: self._plots.append(plot) + @property + def description(self) -> str: + return self._description + + @description.setter + def description(self, description): + check_type('description', description, str) + self._description = description + @property def bounding_box(self) -> openmc.BoundingBox: return self.geometry.bounding_box @@ -375,6 +390,10 @@ class Model: model = cls() + desc_elem = root.find('description') + if desc_elem is not None and desc_elem.text: + model.description = desc_elem.text + meshes = {} model.settings = openmc.Settings.from_xml_element( root.find('settings'), meshes) @@ -711,6 +730,12 @@ class Model: # write the XML header fh.write("\n") fh.write("\n") + if self.description: + description_element = ET.Element('description') + description_element.text = self.description + fh.write(" ") + fh.write(ET.tostring(description_element, encoding="unicode")) + fh.write("\n") # Write the materials collection to the open XML file first. # This will write the XML header also materials._write_xml(fh, False, level=1, diff --git a/tests/unit_tests/test_model.py b/tests/unit_tests/test_model.py index 5e3ba7e31..7321640af 100644 --- a/tests/unit_tests/test_model.py +++ b/tests/unit_tests/test_model.py @@ -572,6 +572,24 @@ def test_model_xml(run_in_tmpdir): new_model.export_to_xml() +def test_model_description(run_in_tmpdir): + model = openmc.examples.pwr_pin_cell() + model.description = "PWR fuel & water " + model.export_to_model_xml() + + reloaded = openmc.Model.from_model_xml() + assert reloaded.description == "PWR fuel & water " + + # Verify that an empty description is not written to XML + model2 = openmc.examples.pwr_pin_cell() + model2.export_to_model_xml('model_no_desc.xml') + with open('model_no_desc.xml') as f: + assert '' not in f.read() + + reloaded2 = openmc.Model.from_model_xml('model_no_desc.xml') + assert reloaded2.description == '' + + def test_single_xml_exec(run_in_tmpdir): pincell_model = openmc.examples.pwr_pin_cell()