OpenMC/tests/unit_tests/test_deplete_coupled_operator.py
Jonathan Shimwell f81962c960
Allowing chain_file to be chain object to save reloading time (#3436)
Co-authored-by: Paul Romano <paul.k.romano@gmail.com>
2025-06-12 21:02:35 +00:00

122 lines
3.6 KiB
Python

"""Basic unit tests for openmc.deplete.CoupledOperator instantiation
"""
from pathlib import Path
import pytest
from openmc.deplete import CoupledOperator, Chain
import openmc
import numpy as np
CHAIN_PATH = Path(__file__).parents[1] / "chain_simple.xml"
@pytest.fixture(scope="module")
def model():
fuel = openmc.Material(name="uo2")
fuel.add_element("U", 1, percent_type="ao", enrichment=4.25)
fuel.add_element("O", 2)
fuel.set_density("g/cc", 10.4)
clad = openmc.Material(name="clad")
clad.add_element("Zr", 1)
clad.set_density("g/cc", 6)
water = openmc.Material(name="water")
water.add_element("O", 1)
water.add_element("H", 2)
water.set_density("g/cc", 1.0)
water.add_s_alpha_beta("c_H_in_H2O")
radii = [0.42, 0.45]
fuel.volume = np.pi * radii[0] ** 2
clad.volume = np.pi * (radii[1]**2 - radii[0]**2)
water.volume = 1.24**2 - (np.pi * radii[1]**2)
materials = openmc.Materials([fuel, clad, water])
pin_surfaces = [openmc.ZCylinder(r=r) for r in radii]
pin_univ = openmc.model.pin(pin_surfaces, materials)
bound_box = openmc.model.RectangularPrism(
1.24, 1.24, boundary_type="reflective")
root_cell = openmc.Cell(fill=pin_univ, region=-bound_box)
geometry = openmc.Geometry([root_cell])
settings = openmc.Settings()
settings.particles = 1000
settings.inactive = 10
settings.batches = 50
return openmc.Model(geometry, materials, settings)
@pytest.fixture()
def model_with_volumes():
mat1 = openmc.Material()
mat1.add_element("Ag", 1, percent_type="ao")
mat1.set_density("g/cm3", 10.49)
mat1.depletable = True
mat1.volume = 102
mat2 = openmc.Material()
mat2.add_element("Ag", 1, percent_type="ao")
mat2.set_density("g/cm3", 10.49)
sph1 = openmc.Sphere(r=1.0)
sph2 = openmc.Sphere(r=2.0, x0=3)
sph3 = openmc.Sphere(r=5.0, boundary_type="vacuum")
cell1 = openmc.Cell(region=-sph1, fill=mat1)
cell1.volume = 4.19
cell2 = openmc.Cell(region=-sph2, fill=mat1)
cell2.volume = 33.51
cell3 = openmc.Cell(region=-sph3 & +sph1 & +sph2, fill=mat2)
cell3.volume = 485.9
geometry = openmc.Geometry([cell1, cell2, cell3])
return openmc.Model(geometry)
def test_operator_init(model):
"""The test uses a temporary dummy chain. This file will be removed
at the end of the test, and only contains a depletion_chain node."""
CoupledOperator(model, CHAIN_PATH)
def test_diff_volume_method_match_cell(model_with_volumes):
"""Tests the volumes assigned to the materials match the cell volumes"""
operator = openmc.deplete.CoupledOperator(
model=model_with_volumes,
diff_burnable_mats=True,
diff_volume_method='match cell',
chain_file=CHAIN_PATH
)
all_cells = list(operator.model.geometry.get_all_cells().values())
assert all_cells[0].fill.volume == 4.19
assert all_cells[1].fill.volume == 33.51
# mat2 is not depletable
assert all_cells[2].fill.volume is None
def test_diff_volume_method_divide_equally(model_with_volumes):
"""Tests the volumes assigned to the materials are divided equally"""
chain = Chain.from_xml(CHAIN_PATH)
operator = openmc.deplete.CoupledOperator(
model=model_with_volumes,
diff_burnable_mats=True,
diff_volume_method='divide equally',
chain_file=chain
)
all_cells = list(operator.model.geometry.get_all_cells().values())
assert all_cells[0].fill.volume == 51
assert all_cells[1].fill.volume == 51
# mat2 is not depletable
assert all_cells[2].fill.volume is None