mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-27 05:35:49 -04:00
126 lines
3.9 KiB
Python
126 lines
3.9 KiB
Python
"""Basic unit tests for openmc.deplete.IndependentOperator instantiation
|
|
|
|
Modifies and resets environment variable OPENMC_CROSS_SECTIONS
|
|
to a custom file with new depletion_chain node
|
|
"""
|
|
|
|
from os import remove
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
from openmc.deplete import MicroXS
|
|
import numpy as np
|
|
|
|
ONE_GROUP_XS = Path(__file__).parents[1] / "micro_xs_simple.csv"
|
|
|
|
|
|
def test_from_array():
|
|
nuclides = [
|
|
'U234',
|
|
'U235',
|
|
'U238',
|
|
'U236',
|
|
'O16',
|
|
'O17',
|
|
'I135',
|
|
'Xe135',
|
|
'Xe136',
|
|
'Cs135',
|
|
'Gd157',
|
|
'Gd156']
|
|
reactions = ['fission', '(n,gamma)']
|
|
# These values are placeholders and are not at all
|
|
# physically meaningful.
|
|
data = np.array([[0.1, 0.],
|
|
[0.1, 0.],
|
|
[0.9, 0.],
|
|
[0.4, 0.],
|
|
[0., 0.],
|
|
[0., 0.],
|
|
[0., 0.1],
|
|
[0., 0.9],
|
|
[0., 0.],
|
|
[0., 0.],
|
|
[0., 0.1],
|
|
[0., 0.1]])
|
|
data.shape = (12, 2, 1)
|
|
|
|
MicroXS(data, nuclides, reactions)
|
|
with pytest.raises(ValueError, match='Data array must be 3D'):
|
|
MicroXS(data[:, 0], nuclides, reactions)
|
|
|
|
|
|
def test_csv():
|
|
ref_xs = MicroXS.from_csv(ONE_GROUP_XS)
|
|
ref_xs.to_csv('temp_xs.csv')
|
|
temp_xs = MicroXS.from_csv('temp_xs.csv')
|
|
assert np.all(ref_xs.data == temp_xs.data)
|
|
remove('temp_xs.csv')
|
|
|
|
|
|
def test_from_multigroup_flux():
|
|
energies = [0., 6.25e-1, 5.53e3, 8.21e5, 2.e7]
|
|
flux = [1.1e-7, 1.2e-6, 1.3e-5, 1.4e-4]
|
|
chain_file = Path(__file__).parents[1] / 'chain_simple.xml'
|
|
kwargs = {'multigroup_flux': flux, 'chain_file': chain_file}
|
|
|
|
# test with energy group structure from string
|
|
microxs = MicroXS.from_multigroup_flux(energies='CASMO-4', **kwargs)
|
|
assert isinstance(microxs, MicroXS)
|
|
|
|
# test with energy group structure as floats
|
|
microxs = MicroXS.from_multigroup_flux(energies=energies, **kwargs)
|
|
assert isinstance(microxs, MicroXS)
|
|
|
|
# test with nuclides provided
|
|
microxs = MicroXS.from_multigroup_flux(
|
|
energies=energies, nuclides=['Gd157', 'H1'], **kwargs
|
|
)
|
|
assert isinstance(microxs, MicroXS)
|
|
assert microxs.nuclides == ['Gd157', 'H1']
|
|
|
|
# test with reactions provided
|
|
microxs = MicroXS.from_multigroup_flux(
|
|
energies=energies, reactions=['fission', '(n,2n)'], **kwargs
|
|
)
|
|
assert isinstance(microxs, MicroXS)
|
|
assert microxs.reactions == ['fission', '(n,2n)']
|
|
|
|
|
|
def test_multigroup_flux_same():
|
|
chain_file = Path(__file__).parents[1] / 'chain_simple.xml'
|
|
|
|
# Generate micro XS based on 4-group flux
|
|
energies = [0., 6.25e-1, 5.53e3, 8.21e5, 2.e7]
|
|
flux_per_ev = [0.3, 0.3, 1.0, 1.0]
|
|
flux = flux_per_ev * np.diff(energies)
|
|
flux_sum = flux.sum()
|
|
microxs_4g = MicroXS.from_multigroup_flux(
|
|
energies=energies, multigroup_flux=flux, chain_file=chain_file)
|
|
|
|
# from_multigroup_flux should not modify the flux
|
|
assert flux.sum() == flux_sum
|
|
|
|
# Generate micro XS based on 2-group flux, where the boundaries line up with
|
|
# the 4 group flux and have the same flux per eV across the full energy
|
|
# range
|
|
energies = [0., 5.53e3, 2.0e7]
|
|
flux_per_ev = [0.3, 1.0]
|
|
flux = flux_per_ev * np.diff(energies)
|
|
microxs_2g = MicroXS.from_multigroup_flux(
|
|
energies=energies, multigroup_flux=flux, chain_file=chain_file)
|
|
|
|
assert microxs_4g.data == pytest.approx(microxs_2g.data)
|
|
|
|
|
|
def test_microxs_zero_flux():
|
|
chain_file = Path(__file__).parents[1] / 'chain_simple.xml'
|
|
|
|
# Generate micro XS based on zero flux
|
|
energies = [0., 6.25e-1, 5.53e3, 8.21e5, 2.e7]
|
|
flux = [0.0, 0.0, 0.0, 0.0]
|
|
microxs = MicroXS.from_multigroup_flux(
|
|
energies=energies, multigroup_flux=flux, chain_file=chain_file)
|
|
|
|
# All microscopic cross sections should be zero
|
|
assert np.all(microxs.data == 0.0)
|