mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-23 19:45:34 -04:00
103 lines
3.3 KiB
Python
103 lines
3.3 KiB
Python
import hashlib
|
|
|
|
import numpy as np
|
|
import openmc
|
|
import pytest
|
|
|
|
from tests.testing_harness import PyAPITestHarness
|
|
|
|
|
|
@pytest.fixture
|
|
def model():
|
|
model = openmc.model.Model()
|
|
|
|
fuel = openmc.Material()
|
|
fuel.set_density('g/cm3', 10.0)
|
|
fuel.add_nuclide('U234', 1.0)
|
|
fuel.add_nuclide('U235', 4.0)
|
|
fuel.add_nuclide('U238', 95.0)
|
|
water = openmc.Material(name='light water')
|
|
water.add_nuclide('H1', 2.0)
|
|
water.add_nuclide('O16', 1.0)
|
|
water.set_density('g/cm3', 1.0)
|
|
water.add_s_alpha_beta('c_H_in_H2O')
|
|
model.materials.extend([fuel, water])
|
|
|
|
cyl1 = openmc.ZCylinder(r=5.0)
|
|
cyl2 = openmc.ZCylinder(r=10.0, boundary_type='vacuum')
|
|
cell1 = openmc.Cell(fill=fuel, region=-cyl1)
|
|
cell2 = openmc.Cell(fill=water, region=+cyl1 & -cyl2)
|
|
model.geometry = openmc.Geometry([cell1, cell2])
|
|
|
|
model.settings.batches = 5
|
|
model.settings.inactive = 0
|
|
model.settings.particles = 1000
|
|
|
|
mesh = openmc.RegularMesh()
|
|
mesh.dimension = (2, 2)
|
|
mesh.lower_left = (-10.0, -10.0)
|
|
mesh.upper_right = (10.0, 10.0)
|
|
energy_filter = openmc.EnergyFilter((0.0, 10.0, 20.0e6))
|
|
material_filter = openmc.MaterialFilter((fuel, water))
|
|
mesh_filter = openmc.MeshFilter(mesh)
|
|
|
|
tally = openmc.Tally(name='tally 1')
|
|
tally.filters = [material_filter, energy_filter]
|
|
tally.scores = ['nu-fission', 'total']
|
|
tally.nuclides = ['U234', 'U235']
|
|
model.tallies.append(tally)
|
|
tally = openmc.Tally(name='tally 2')
|
|
tally.filters = [energy_filter, mesh_filter]
|
|
tally.scores = ['total', 'fission']
|
|
tally.nuclides = ['U238', 'U235']
|
|
model.tallies.append(tally)
|
|
|
|
return model
|
|
|
|
|
|
class TallyArithmeticTestHarness(PyAPITestHarness):
|
|
def _get_results(self, hash_output=False):
|
|
"""Digest info in the statepoint and return as a string."""
|
|
|
|
# Read the statepoint file.
|
|
sp = openmc.StatePoint(self._sp_name)
|
|
|
|
# Load the tallies
|
|
tally_1 = sp.get_tally(name='tally 1')
|
|
tally_2 = sp.get_tally(name='tally 2')
|
|
|
|
# Perform all the tally arithmetic operations and output results
|
|
output = []
|
|
with np.printoptions(precision=5, threshold=np.inf):
|
|
mean = (tally_1 * tally_2).mean
|
|
output.append(str(mean[np.nonzero(mean)]))
|
|
|
|
mean = tally_1.hybrid_product(
|
|
tally_2, '*', 'entrywise', 'tensor', 'tensor').mean
|
|
output.append(str(mean[np.nonzero(mean)]))
|
|
|
|
mean = tally_1.hybrid_product(
|
|
tally_2, '*', 'entrywise', 'entrywise', 'tensor').mean
|
|
output.append(str(mean[np.nonzero(mean)]))
|
|
|
|
mean = tally_1.hybrid_product(
|
|
tally_2, '*', 'entrywise', 'tensor', 'entrywise').mean
|
|
output.append(str(mean[np.nonzero(mean)]))
|
|
|
|
mean = tally_1.hybrid_product(
|
|
tally_2, '*', 'entrywise', 'entrywise', 'entrywise').mean
|
|
output.append(str(mean[np.nonzero(mean)]))
|
|
|
|
# Hash the results if necessary
|
|
outstr = ''.join(output)
|
|
if hash_output:
|
|
sha512 = hashlib.sha512()
|
|
sha512.update(outstr.encode('utf-8'))
|
|
outstr = sha512.hexdigest()
|
|
|
|
return outstr
|
|
|
|
|
|
def test_tally_arithmetic(model):
|
|
harness = TallyArithmeticTestHarness('statepoint.5.h5', model)
|
|
harness.main()
|