From 836bc487cf13e69a9d2d9ef3f79d3828609df4e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Delaporte-Mathurin?= <40028739+RemDelaporteMathurin@users.noreply.github.com> Date: Tue, 29 Jul 2025 05:34:03 -0400 Subject: [PATCH] Fix: `materials`, `plots`, and `tallies` cannot be passed as lists (#3513) Co-authored-by: Paul Romano --- openmc/model/model.py | 18 ++++++++++++------ tests/unit_tests/test_model.py | 13 +++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/openmc/model/model.py b/openmc/model/model.py index b1eff5b7c..03fdcda1f 100644 --- a/openmc/model/model.py +++ b/openmc/model/model.py @@ -70,7 +70,7 @@ class Model: def __init__( self, geometry: openmc.Geometry | None = None, - materials: openmc.Materials = None, + materials: openmc.Materials | None = None, settings: openmc.Settings | None = None, tallies: openmc.Tallies | None = None, plots: openmc.Plots | None = None, @@ -82,7 +82,7 @@ class Model: self.plots = openmc.Plots() if plots is None else plots @property - def geometry(self) -> openmc.Geometry | None: + def geometry(self) -> openmc.Geometry: return self._geometry @geometry.setter @@ -91,7 +91,7 @@ class Model: self._geometry = geometry @property - def materials(self) -> openmc.Materials | None: + def materials(self) -> openmc.Materials: return self._materials @materials.setter @@ -100,12 +100,14 @@ class Model: if isinstance(materials, openmc.Materials): self._materials = materials else: + if not hasattr(self, '_materials'): + self._materials = openmc.Materials() del self._materials[:] for mat in materials: self._materials.append(mat) @property - def settings(self) -> openmc.Settings | None: + def settings(self) -> openmc.Settings: return self._settings @settings.setter @@ -114,7 +116,7 @@ class Model: self._settings = settings @property - def tallies(self) -> openmc.Tallies | None: + def tallies(self) -> openmc.Tallies: return self._tallies @tallies.setter @@ -123,12 +125,14 @@ class Model: if isinstance(tallies, openmc.Tallies): self._tallies = tallies else: + if not hasattr(self, '_tallies'): + self._tallies = openmc.Tallies() del self._tallies[:] for tally in tallies: self._tallies.append(tally) @property - def plots(self) -> openmc.Plots | None: + def plots(self) -> openmc.Plots: return self._plots @plots.setter @@ -137,6 +141,8 @@ class Model: if isinstance(plots, openmc.Plots): self._plots = plots else: + if not hasattr(self, '_plots'): + self._plots = openmc.Plots() del self._plots[:] for plot in plots: self._plots.append(plot) diff --git a/tests/unit_tests/test_model.py b/tests/unit_tests/test_model.py index 3797188ba..6e4dec00f 100644 --- a/tests/unit_tests/test_model.py +++ b/tests/unit_tests/test_model.py @@ -892,3 +892,16 @@ def test_id_map_aligned_model(): assert tr_cell == 20, f"Expected cell ID 20 at top-right corner, got {tr_cell}" assert tr_instance == 3, f"Expected cell instance 3 at top-right corner, got {tr_instance}" assert tr_material == 5, f"Expected material ID 5 at top-right corner, got {tr_material}" + +def test_setter_from_list(): + mat = openmc.Material() + model = openmc.Model(materials=[mat]) + assert isinstance(model.materials, openmc.Materials) + + tally = openmc.Tally() + model = openmc.Model(tallies=[tally]) + assert isinstance(model.tallies, openmc.Tallies) + + plot = openmc.Plot() + model = openmc.Model(plots=[plot]) + assert isinstance(model.plots, openmc.Plots)