OpenMC/tests/unit_tests/test_materials.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

130 lines
4.3 KiB
Python
Raw Permalink Normal View History

from pathlib import Path
import pytest
import openmc
from openmc.deplete import Chain
def test_materials_deplete():
pristine_material_1 = openmc.Material()
pristine_material_1.add_nuclide("Ni58", 1.)
pristine_material_1.set_density("g/cm3", 7.87)
pristine_material_1.depletable = True
pristine_material_1.temperature = 293.6
pristine_material_1.volume = 1.
pristine_material_2 = openmc.Material()
pristine_material_2.add_nuclide("Ni60", 1.)
pristine_material_2.set_density("g/cm3", 7.87)
pristine_material_2.depletable = True
pristine_material_2.temperature = 293.6
pristine_material_2.volume = 1.
pristine_materials = openmc.Materials([pristine_material_1, pristine_material_2])
mg_flux = [0.5e11] * 42
chain = Chain.from_xml(
Path(__file__).parents[1] / "chain_ni.xml"
)
depleted_material = pristine_materials.deplete(
multigroup_fluxes=[mg_flux, mg_flux],
energy_group_structures=["VITAMIN-J-42", "VITAMIN-J-42"],
timesteps=[100, 100],
source_rates=[1e19, 0.0],
timestep_units="d",
chain_file=chain,
)
assert list(depleted_material.keys()) == [pristine_material_1.id, pristine_material_2.id]
for mat_id, materials in depleted_material.items():
for i_step, material in enumerate(materials):
assert isinstance(material, openmc.Material)
if i_step > 0:
assert len(material.get_nuclides()) > 1
assert mat_id == material.id
mats = depleted_material[pristine_material_1.id]
Co58_mat_1_step_0 = mats[0].get_nuclide_atom_densities("Co58").get("Co58", 0.0)
Co58_mat_1_step_1 = mats[1].get_nuclide_atom_densities("Co58")["Co58"]
Co58_mat_1_step_2 = mats[2].get_nuclide_atom_densities("Co58")["Co58"]
assert Co58_mat_1_step_0 == 0.0
# Co58 is the main activation product of Ni58 in the first irradiation step.
# It then decays in the second cooling step (flux = 0)
assert Co58_mat_1_step_1 > 0.0 and Co58_mat_1_step_1 > Co58_mat_1_step_2
Ni59_mat_1_step_0 = mats[0].get_nuclide_atom_densities("Ni59").get("Ni59", 0.0)
Ni59_mat_1_step_1 = mats[1].get_nuclide_atom_densities("Ni59")["Ni59"]
Ni59_mat_1_step_2 = mats[2].get_nuclide_atom_densities("Ni59")["Ni59"]
assert Ni59_mat_1_step_0 == 0.0
# Ni59 is one of the main activation product of Ni60 in the first irradiation
# step. It then decays in the second cooling step (flux = 0)
assert Ni59_mat_1_step_1 > 0.0 and Ni59_mat_1_step_1 > Ni59_mat_1_step_2
def test_export_duplicate_materials_to_xml(run_in_tmpdir):
"""
Test exporting Materials to xml with a duplicate and checking that only
unique entities are exported.
"""
my_mat = openmc.Material(name="my_mat")
my_mat2 = openmc.Material(name="my_mat2")
materials = openmc.Materials([my_mat, my_mat2, my_mat])
materials.export_to_xml("materials.xml")
materials_in = openmc.Materials.from_xml("materials.xml")
assert len(materials_in) == 2
def test_materials_deplete_length_mismatch():
mats = openmc.Materials([openmc.Material()])
with pytest.raises(ValueError, match="multigroup_fluxes length"):
mats.deplete(
multigroup_fluxes=[],
energy_group_structures=["VITAMIN-J-42"],
timesteps=[1.0],
source_rates=1.0,
)
with pytest.raises(ValueError, match="energy_group_structures length"):
mats.deplete(
multigroup_fluxes=[[1.0]],
energy_group_structures=[],
timesteps=[1.0],
source_rates=1.0,
)
def test_materials_deplete_missing_volume(monkeypatch):
mat = openmc.Material()
mat.add_nuclide("Ni58", 1.0)
mat.set_density("g/cm3", 7.87)
mats = openmc.Materials([mat])
class DummySession:
def __enter__(self):
return self
def __exit__(self, exc_type, exc, tb):
return False
monkeypatch.setattr(openmc.lib, "TemporarySession", DummySession)
chain = Path(__file__).parents[1] / "chain_ni.xml"
with pytest.raises(ValueError, match="has no volume"):
mats.deplete(
multigroup_fluxes=[[1.0]],
energy_group_structures=["VITAMIN-J-42"],
timesteps=[1.0],
source_rates=1.0,
chain_file=chain,
)