Fix random ray source region mesh export when using model.export_to_xml() (#3579)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: jtramm <1009059+jtramm@users.noreply.github.com>
Co-authored-by: Paul Romano <paul.k.romano@gmail.com>
This commit is contained in:
Copilot 2025-10-02 22:52:39 +00:00 committed by GitHub
parent 91a19cf220
commit 7806703c26
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
33 changed files with 72 additions and 39 deletions

View file

@ -1715,9 +1715,15 @@ class Settings:
domain_elem = ET.SubElement(mesh_elem, 'domain')
domain_elem.set('id', str(domain.id))
domain_elem.set('type', domain.__class__.__name__.lower())
if mesh_memo is not None and mesh.id not in mesh_memo:
# See if a <mesh> element already exists -- if not, add it
path = f"./mesh[@id='{mesh.id}']"
if root.find(path) is None:
root.append(mesh.to_xml_element())
mesh_memo.add(mesh.id)
if mesh_memo is not None:
mesh_memo.add(mesh.id)
elif isinstance(value, bool):
subelement = ET.SubElement(element, key)
subelement.text = str(value).lower()
else:
subelement = ET.SubElement(element, key)
subelement.text = str(value)
@ -2110,7 +2116,7 @@ class Settings:
if text is not None:
self.max_tracks = int(text)
def _random_ray_from_xml_element(self, root):
def _random_ray_from_xml_element(self, root, meshes=None):
elem = root.find('random_ray')
if elem is not None:
self.random_ray = {}
@ -2137,7 +2143,11 @@ class Settings:
elif child.tag == 'source_region_meshes':
self.random_ray['source_region_meshes'] = []
for mesh_elem in child.findall('mesh'):
mesh = MeshBase.from_xml_element(mesh_elem)
mesh_id = int(get_text(mesh_elem, 'id'))
if meshes and mesh_id in meshes:
mesh = meshes[mesh_id]
else:
mesh = MeshBase.from_xml_element(mesh_elem)
domains = []
for domain_elem in mesh_elem.findall('domain'):
domain_id = int(get_text(domain_elem, "id"))
@ -2339,7 +2349,7 @@ class Settings:
settings._max_history_splits_from_xml_element(elem)
settings._max_tracks_from_xml_element(elem)
settings._max_secondaries_from_xml_element(elem)
settings._random_ray_from_xml_element(elem)
settings._random_ray_from_xml_element(elem, meshes)
settings._use_decay_photons_from_xml_element(elem)
settings._source_rejection_fraction_from_xml_element(elem)

View file

@ -212,8 +212,8 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<adjoint>True</adjoint>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<adjoint>true</adjoint>
<volume_estimator>naive</volume_estimator>
</random_ray>
</settings>

View file

@ -85,8 +85,8 @@
<parameters>-1.26 -1.26 -1 1.26 1.26 1</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<adjoint>True</adjoint>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<adjoint>true</adjoint>
</random_ray>
</settings>
<tallies>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
</random_ray>
</settings>
<tallies>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
</random_ray>
</settings>
<tallies>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
</random_ray>
</settings>
<tallies>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<source_shape>linear</source_shape>
</random_ray>
</settings>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<source_shape>linear_xy</source_shape>
</random_ray>
</settings>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<source_region_meshes>
<mesh id="1">
<domain id="1" type="universe"/>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<source_region_meshes>
<mesh id="1">
<domain id="1" type="universe"/>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>False</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>false</volume_normalized_flux_tallies>
</random_ray>
</settings>
<tallies>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
</random_ray>
</settings>
<tallies>

View file

@ -115,7 +115,7 @@
<parameters>-1.26 -1.26 -1 1.26 1.26 1</parameters>
</space>
</source>
<volume_normalized_flux_tallies>False</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>false</volume_normalized_flux_tallies>
<source_shape>flat</source_shape>
</random_ray>
</settings>

View file

@ -115,7 +115,7 @@
<parameters>-1.26 -1.26 -1 1.26 1.26 1</parameters>
</space>
</source>
<volume_normalized_flux_tallies>False</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>false</volume_normalized_flux_tallies>
<source_shape>linear_xy</source_shape>
</random_ray>
</settings>

View file

@ -85,7 +85,7 @@
<parameters>-1.26 -1.26 -1 1.26 1.26 1</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<sample_method>halton</sample_method>
</random_ray>
</settings>

View file

@ -85,7 +85,7 @@
<parameters>-1.26 -1.26 -1 1.26 1.26 1</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
</random_ray>
</settings>
<tallies>

View file

@ -85,7 +85,7 @@
<parameters>-1.26 -1.26 -1 1.26 1.26 1</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<source_region_meshes>
<mesh id="2">
<domain id="7" type="universe"/>

View file

@ -85,7 +85,7 @@
<parameters>-1.26 -1.26 -1 1.26 1.26 1</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<source_shape>linear</source_shape>
</random_ray>
</settings>

View file

@ -85,7 +85,7 @@
<parameters>-1.26 -1.26 -1 1.26 1.26 1</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<source_shape>linear_xy</source_shape>
</random_ray>
</settings>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
</random_ray>
</settings>
<tallies>

View file

@ -211,7 +211,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<source_region_meshes>
<mesh id="1">
<domain id="6" type="universe"/>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<source_shape>flat</source_shape>
</random_ray>
</settings>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<source_shape>linear</source_shape>
</random_ray>
</settings>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<volume_estimator>hybrid</volume_estimator>
</random_ray>
</settings>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<volume_estimator>naive</volume_estimator>
</random_ray>
</settings>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<volume_estimator>simulation_averaged</volume_estimator>
</random_ray>
</settings>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<source_shape>linear</source_shape>
<volume_estimator>hybrid</volume_estimator>
</random_ray>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<source_shape>linear</source_shape>
<volume_estimator>naive</volume_estimator>
</random_ray>

View file

@ -212,7 +212,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<source_shape>linear</source_shape>
<volume_estimator>simulation_averaged</volume_estimator>
</random_ray>

View file

@ -227,7 +227,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<volume_estimator>naive</volume_estimator>
</random_ray>
</settings>

View file

@ -227,7 +227,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<source_region_meshes>
<mesh id="1">
<domain id="6" type="universe"/>

View file

@ -227,7 +227,7 @@
<parameters>0.0 0.0 0.0 30.0 30.0 30.0</parameters>
</space>
</source>
<volume_normalized_flux_tallies>True</volume_normalized_flux_tallies>
<volume_normalized_flux_tallies>true</volume_normalized_flux_tallies>
<source_region_meshes>
<mesh id="1">
<domain id="6" type="universe"/>

View file

@ -59,12 +59,23 @@ def test_export_to_xml(run_in_tmpdir):
s.electron_treatment = 'led'
s.write_initial_source = True
s.weight_window_checkpoints = {'surface': True, 'collision': False}
source_region_mesh = openmc.RegularMesh()
source_region_mesh.dimension = [2, 2, 2]
source_region_mesh.lower_left = [-2, -2, -2]
source_region_mesh.upper_right = [2, 2, 2]
root_universe = openmc.Universe()
s.random_ray = {
'distance_inactive': 10.0,
'distance_active': 100.0,
'ray_source': openmc.IndependentSource(
space=openmc.stats.Box((-1., -1., -1.), (1., 1., 1.))
)
),
'source_region_meshes': [(source_region_mesh, [root_universe])],
'volume_estimator': 'hybrid',
'source_shape': 'linear',
'volume_normalized_flux_tallies': True,
'adjoint': False,
'sample_method': 'halton'
}
s.max_particle_events = 100
s.max_secondaries = 1_000_000
@ -145,5 +156,17 @@ def test_export_to_xml(run_in_tmpdir):
assert s.random_ray['distance_active'] == 100.0
assert s.random_ray['ray_source'].space.lower_left == [-1., -1., -1.]
assert s.random_ray['ray_source'].space.upper_right == [1., 1., 1.]
assert 'source_region_meshes' in s.random_ray
assert len(s.random_ray['source_region_meshes']) == 1
mesh_and_domains = s.random_ray['source_region_meshes'][0]
recovered_mesh = mesh_and_domains[0]
assert recovered_mesh.dimension == (2, 2, 2)
assert recovered_mesh.lower_left == [-2., -2., -2.]
assert recovered_mesh.upper_right == [2., 2., 2.]
assert s.random_ray['volume_estimator'] == 'hybrid'
assert s.random_ray['source_shape'] == 'linear'
assert s.random_ray['volume_normalized_flux_tallies']
assert not s.random_ray['adjoint']
assert s.random_ray['sample_method'] == 'halton'
assert s.max_secondaries == 1_000_000
assert s.source_rejection_fraction == 0.01