mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-26 05:05:30 -04:00
103 lines
3.5 KiB
Python
103 lines
3.5 KiB
Python
""" Transport-free depletion test suite """
|
|
|
|
from pathlib import Path
|
|
import shutil
|
|
|
|
import numpy as np
|
|
import pytest
|
|
import openmc
|
|
import openmc.deplete
|
|
from openmc.deplete import CoupledOperator, IndependentOperator, MicroXS
|
|
|
|
|
|
@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.add_nuclide("Xe135_m1", 1)
|
|
fuel.add_nuclide("Cs135_m1", 1)
|
|
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
|
|
|
|
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 = 5
|
|
settings.batches = 10
|
|
|
|
return openmc.Model(geometry, materials, settings)
|
|
|
|
@pytest.fixture(scope="module")
|
|
def micro_xs():
|
|
micro_xs_file = Path(__file__).parents[2] / 'micro_xs_simple.csv'
|
|
return MicroXS.from_csv(micro_xs_file)
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def chain_file():
|
|
return Path(__file__).parents[2] / 'chain_simple_decay.xml'
|
|
|
|
|
|
@pytest.mark.parametrize("operator_type", ["coupled", "independent"])
|
|
def test_decay_only(run_in_tmpdir, operator_type, model, micro_xs, chain_file):
|
|
"""Transport free system test suite.
|
|
|
|
"""
|
|
# Create operator
|
|
if operator_type == "coupled":
|
|
op = CoupledOperator(model, chain_file=chain_file)
|
|
else:
|
|
op = IndependentOperator(openmc.Materials([model.materials[0]]),
|
|
[1e15],
|
|
[micro_xs],
|
|
chain_file)
|
|
|
|
# Power and timesteps
|
|
dt = [917.4, 2262.6] # one Xe135_m1 half life and one Cs135_m1 half life
|
|
|
|
# Perform simulation using the predictor algorithm
|
|
openmc.deplete.PredictorIntegrator(op,
|
|
dt,
|
|
power=0.0,
|
|
timestep_units='s').integrate()
|
|
|
|
# Get path to test and reference results
|
|
path_test = op.output_dir / 'depletion_results.h5'
|
|
|
|
# Load the reference/test results
|
|
res_test = openmc.deplete.Results(path_test)
|
|
|
|
_, xe135m1_atoms = res_test.get_atoms('1', 'Xe135_m1')
|
|
_, xe135_atoms = res_test.get_atoms('1', 'Xe135')
|
|
_, cs135m1_atoms = res_test.get_atoms('1', 'Cs135_m1')
|
|
_, cs135_atoms = res_test.get_atoms('1', 'Cs135')
|
|
|
|
tol = 1.0e-14
|
|
assert xe135m1_atoms[0] == pytest.approx(xe135m1_atoms[1] * 2, rel=tol)
|
|
|
|
# WARNING: this is generally not true as Xe135_m1 has two
|
|
# decay modes, and Xe135 will also decay, but we've modified the depletion chain so
|
|
# that Xe135_m1 only decays to Xe135, and that Xe135 has has no decay modes
|
|
assert xe135_atoms[1] == pytest.approx(xe135m1_atoms[1], rel=tol)
|
|
assert cs135m1_atoms[0] == pytest.approx(cs135m1_atoms[2] * 2, rel=tol)
|
|
assert cs135_atoms[2] == pytest.approx(cs135m1_atoms[2], rel=tol)
|