mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-27 21:55:41 -04:00
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:
parent
91a19cf220
commit
7806703c26
33 changed files with 72 additions and 39 deletions
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue