mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-26 04:55:40 -04:00
Merge pull request #2333 from openmc-dev/optional_materials_when_loading_geometry_2
allowing xml file for materials
This commit is contained in:
commit
02abb63bcf
2 changed files with 36 additions and 11 deletions
|
|
@ -1,3 +1,5 @@
|
|||
import os
|
||||
import typing
|
||||
from collections import OrderedDict, defaultdict
|
||||
from collections.abc import Iterable
|
||||
from copy import deepcopy
|
||||
|
|
@ -7,7 +9,7 @@ import warnings
|
|||
|
||||
import openmc
|
||||
import openmc._xml as xml
|
||||
from .checkvalue import check_type, check_less_than, check_greater_than
|
||||
from .checkvalue import check_type, check_less_than, check_greater_than, PathLike
|
||||
|
||||
|
||||
class Geometry:
|
||||
|
|
@ -254,16 +256,20 @@ class Geometry:
|
|||
raise ValueError('Error determining root universe.')
|
||||
|
||||
@classmethod
|
||||
def from_xml(cls, path='geometry.xml', materials=None):
|
||||
def from_xml(
|
||||
cls,
|
||||
path: PathLike = 'geometry.xml',
|
||||
materials: typing.Optional[typing.Union[PathLike, 'openmc.Materials']] = 'materials.xml'
|
||||
):
|
||||
"""Generate geometry from XML file
|
||||
|
||||
Parameters
|
||||
----------
|
||||
path : str, optional
|
||||
path : PathLike, optional
|
||||
Path to geometry XML file
|
||||
materials : openmc.Materials or None
|
||||
Materials used to assign to cells. If None, an attempt is made to
|
||||
generate it from the materials.xml file.
|
||||
materials : openmc.Materials or PathLike
|
||||
Materials used to assign to cells. If PathLike, an attempt is made
|
||||
to generate materials from the provided xml file.
|
||||
|
||||
Returns
|
||||
-------
|
||||
|
|
@ -271,10 +277,13 @@ class Geometry:
|
|||
Geometry object
|
||||
|
||||
"""
|
||||
# Create dictionary to easily look up materials
|
||||
if materials is None:
|
||||
filename = Path(path).parent / 'materials.xml'
|
||||
materials = openmc.Materials.from_xml(str(filename))
|
||||
|
||||
# Using str and os.Pathlike here to avoid error when using just the imported PathLike
|
||||
# TypeError: Subscripted generics cannot be used with class and instance checks
|
||||
check_type('materials', materials, (str, os.PathLike, openmc.Materials))
|
||||
|
||||
if isinstance(materials, (str, os.PathLike)):
|
||||
materials = openmc.Materials.from_xml(materials)
|
||||
|
||||
tree = ET.parse(path)
|
||||
root = tree.getroot()
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
import xml.etree.ElementTree as ET
|
||||
from pathlib import Path
|
||||
|
||||
import numpy as np
|
||||
import openmc
|
||||
|
|
@ -274,7 +275,22 @@ def test_from_xml(run_in_tmpdir, mixed_lattice_model):
|
|||
# Export model
|
||||
mixed_lattice_model.export_to_xml()
|
||||
|
||||
# Import geometry
|
||||
mats_from_xml = openmc.Materials.from_xml('materials.xml')
|
||||
# checking string a Path are both acceptable
|
||||
for path in ['geometry.xml', Path('geometry.xml')]:
|
||||
for materials in [mats_from_xml, 'materials.xml']:
|
||||
# Import geometry from file
|
||||
geom = openmc.Geometry.from_xml(path=path, materials=materials)
|
||||
assert isinstance(geom, openmc.Geometry)
|
||||
ll, ur = geom.bounding_box
|
||||
assert ll == pytest.approx((-6.0, -6.0, -np.inf))
|
||||
assert ur == pytest.approx((6.0, 6.0, np.inf))
|
||||
|
||||
with pytest.raises(TypeError) as excinfo:
|
||||
geom = openmc.Geometry.from_xml(path='geometry.xml', materials=None)
|
||||
assert 'Unable to set "materials" to "None"' in str(excinfo.value)
|
||||
|
||||
# checking that the default args also work
|
||||
geom = openmc.Geometry.from_xml()
|
||||
assert isinstance(geom, openmc.Geometry)
|
||||
ll, ur = geom.bounding_box
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue