Merge remote-tracking branch 'upstream/develop' into mg_th5

This commit is contained in:
Adam Nelson 2016-09-15 19:39:12 -04:00
commit 8d35923405
33 changed files with 1168 additions and 320 deletions

View file

@ -42,7 +42,7 @@ install: true
before_script:
- if [[ ! -e $HOME/nndc_hdf5/cross_sections.xml ]]; then
wget https://anl.box.com/shared/static/68b2yhu8e6mx1f6hnbzz9mxsgg42d9ls.xz -O - | tar -C $HOME -xvJ;
wget https://anl.box.com/shared/static/fouwc8lh9he2wc97kzq65u4rp8zt9sgq.xz -O - | tar -C $HOME -xvJ;
fi
- export OPENMC_CROSS_SECTIONS=$HOME/nndc_hdf5/cross_sections.xml

View file

@ -66,6 +66,8 @@ Other Methods
A good survey of other energy grid techniques, including unionized energy grids,
can be found in a paper by Leppanen_.
.. _windowed_multipole:
Windowed Multipole Representation
---------------------------------
@ -141,6 +143,40 @@ but not always the case. Future library versions may eliminate this issue.
The data format used by OpenMC to represent windowed multipole data is specified
in :ref:`io_data_wmp`.
.. _temperature_treatment:
Temperature Treatment
---------------------
At the beginning of a simulation, OpenMC collects a list of all temperatures
that are present in a model. It then uses this list to determine what cross
sections to load. The data that is loaded depends on what temperature method has
been selected. There are three methods available:
:Nearest: Cross sections are loaded only if they are within a specified
tolerance of the actual temperatures in the model.
:Interpolation: Cross sections are loaded at temperatures that bound the actual
temperatures in the model. During transport, cross sections for
each material are calculated using statistical linear-linear
interpolation between bounding temperature. Suppose cross
sections are available at temperatures :math:`T_1, T_2, ...,
T_n` and a material is assigned a temperature :math:`T` where
:math:`T_i < T < T_{i+1}`. Statistical interpolation is applied
as follows: a uniformly-distributed random number of the unit
interval, :math:`\xi`, is sampled. If :math:`\xi < (T -
T_i)/(T_{i+1} - T_i)`, then cross sections at temperature
:math:`T_{i+1}` are used. Otherwise, cross sections at
:math:`T_i` are used. This procedure is applied for pointwise
cross sections in the resolved resonance range, unresolved
resonance probability tables, and :math:`S(\alpha,\beta)`
thermal scattering tables.
:Multipole: Resolved resonance cross sections are calculated on-the-fly using
techniques/data described in :ref:`windowed_multipole`. Cross
section data is loaded for a single temperature and is used in the
unresolved resonance and fast energy ranges.
----------------
Multi-Group Data
----------------

View file

@ -265,6 +265,8 @@ Again, we need to check whether the denominator is zero. If so, this means that
the particle's direction of flight is parallel to the plane and it will
therefore never hit the plane.
.. _cylinder_distance:
Cylinder Parallel to an Axis
----------------------------
@ -366,7 +368,74 @@ will then be either both positive or both negative. If they are both positive,
the smaller (closer) one will be the solution with a negative sign on the square
root of the discriminant.
.. TODO: Need to add derivation for x-cone, y-cone, and z-cone.
Cone Parallel to an Axis
------------------------
The equation for a cone parallel to, for example, the x-axis is :math:`(y -
y_0)^2 + (z - z_0)^2 = R^2(x - x_0)^2`. Thus, we need to solve :math:`(y + dv -
y_0)^2 + (z + dw - z_0)^2 = R^2(x + du - x_0)^2`. Let us define :math:`\bar{x} =
x - x_0`, :math:`\bar{y} = y - y_0`, and :math:`\bar{z} = z - z_0`. We then have
.. math::
:label: dist-xcone-1
(\bar{y} + dv)^2 + (\bar{z} + dw)^2 = R^2(\bar{x} + du)^2
Expanding equation :eq:`dist-xcone-1` and rearranging terms, we obtain
.. math::
:label: dist-xcylinder-2
(v^2 + w^2 - R^2u^2) d^2 + 2 (\bar{y}v + \bar{z}w - R^2\bar{x}u) d +
(\bar{y}^2 + \bar{z}^2 - R^2\bar{x}^2) = 0
Defining the terms
.. math::
:label: dist-quadric-terms
a = v^2 + w^2 - R^2u^2
k = \bar{y}v + \bar{z}w - R^2\bar{x}u
c = \bar{y}^2 + \bar{z}^2 - R^2\bar{x}^2
we then have the simple quadratic equation :math:`ad^2 + 2kd + c = 0` which can
be solved as described in :ref:`cylinder_distance`.
General Quadric
---------------
The equation for a general quadric surface is :math:`Ax^2 + By^2 + Cz^2 + Dxy +
Eyz + Fxz + Gx + Hy + Jz + K = 0`. Thus, we need to solve the equation
.. math::
:label: dist-quadric-1
A(x+du)^2 + B(y+dv)^2 + C(z+dw)^2 + D(x+du)(y+dv) + E(y+dv)(z+dw) + \\
F(x+du)(z+dw) + G(x+du) + H(y+dv) + J(z+dw) + K = 0
Expanding equation :eq:`dist-quadric-1` and rearranging terms, we obtain
.. math::
:label: dist-quadric-2
d^2(uv + vw + uw) + 2d(Aux + Bvy + Cwx + (D(uv + vx) + E(vz + wy) + \\
F(wx + uz))/2) + (x(Ax + Dy) + y(By + Ez) + z(Cz + Fx)) = 0
Defining the terms
.. math::
:label: dist-quadric-terms
a = uv + vw + uw
k = Aux + Bvy + Cwx + (D(uv + vx) + E(vz + wy) + F(wx + uz))/2
c = x(Ax + Dy) + y(By + Ez) + z(Cz + Fx)
we then have the simple quadratic equation :math:`ad^2 + 2kd + c = 0` which can
be solved as described in :ref:`cylinder_distance`.
.. _find-cell:
@ -810,6 +879,18 @@ form of the solution:
w' = w + \frac{2 (\bar{x}u + \bar{y}v - R^2\bar{z}w)}{R^2 (1 + R^2) \bar{z}}
General Quadric
---------------
A general quadric surface has the form :math:`f(x,y,z) = Ax^2 + By^2 + Cz^2 +
Dxy + Eyz + Fxz + Gx + Hy + Jz + K = 0`. Thus, the gradient to the surface is
.. math::
:label: reflection-quadric-grad
\nabla f = \left ( \begin{array}{c} 2Ax + Dy + Fz + G \\ 2By + Dx + Ez + H
\\ 2Cz + Ey + Fx + J \end{array} \right ).
.. _constructive solid geometry: http://en.wikipedia.org/wiki/Constructive_solid_geometry
.. _surfaces: http://en.wikipedia.org/wiki/Surface

View file

@ -53,6 +53,16 @@ Benchmarking
Coupling and Multi-physics
--------------------------
- Matthew Ellis, Benoit Forget, Kord Smith, and Derek Gaston, "Continuous
Temperature Representation in Coupled OpenMC/MOOSE Simulations," *Proc. PHYSOR
2016*, Sun Valley, Idaho, May 1-5, 2016.
- Antonios G. Mylonakis, Melpomeni Varvayanni, and Nicolas Catsaros,
"Investigating a Matrix-free, Newton-based, Neutron-Monte
Carlo/Thermal-Hydraulic Coupling Scheme", *Proc. Int. Conf. Nuclear Energy for
New Europe*, Portoroz, Slovenia, Sep .14-17
(2015). `<https://www.researchgate.net/publication/282001032>`_
- Matt Ellis, Benoit Forget, Kord Smith, and Derek Gaston, "Preliminary coupling
of the Monte Carlo code OpenMC and the Multiphysics Object-Oriented Simulation
Environment (MOOSE) for analyzing Doppler feedback in Monte Carlo
@ -80,8 +90,17 @@ Geometry
Miscellaneous
-------------
- Yunzhao Li, Qingming He, Liangzhi Cao, Hongchun Wu, and Tiejun Zu, "Resonance
Elastic Scattering and Interference Effects Treatments in Subgroup Method,"
*Nucl. Eng. Tech.*, **48**, 339-350
(2016). `<http://dx.doi.org/10.1016/j.net.2015.12.015>`_
- William Boyd, Sterling Harper, and Paul K. Romano, "Equipping OpenMC for the
big data era," Accepted, *PHYSOR 2016*, Sun Valley, Idaho, May 1-5, 2016.
big data era," *Proc. PHYSOR*, Sun Valley, Idaho, May 1-5, 2016.
- Michal Kostal, Vojtech Rypar, Jan Milcak, Vlastimil Juricek, Evzen Losa,
Benoit Forget, and Sterling Harper, *Ann. Nucl. Energy*, **87**, 601-611
(2016). `<http://dx.doi.org/10.1016/j.anucene.2015.10.010>`_
- Qicang Shen, William Boyd, Benoit Forget, and Kord Smith, "Tally precision
triggers for the OpenMC Monte Carlo code," *Trans. Am. Nucl. Soc.*, **112**,
@ -95,6 +114,11 @@ Miscellaneous
Multi-group Cross Section Generation
------------------------------------
- Zhaoyuan Liu, Kord Smith, and Benoit Forget, "A Cumulative Migration Method
for Computing Rigorous Transport Cross Sections and Diffusion Coefficients for
LWR Lattices with Monte Carlo," *Proc. PHYSOR*, Sun Valley, Idaho, May
1-5, 2016.
- Adam G. Nelson and William R. Martin, "Improved Monte Carlo tallying of
multi-group scattering moments using the NDPP code," *Trans. Am. Nucl. Soc.*,
**113**, 645-648 (2015)
@ -108,18 +132,43 @@ Multi-group Cross Section Generation
Computational Methods Applied to Nuclear Science and Engineering*, Sun Valley,
Idaho, May 5--9 (2013).
------------
Nuclear Data
------------
------------------
Doppler Broadening
------------------
- Colin Josey, Pablo Ducru, Benoit Forget, and Kord Smith, "Windowed multipole
for cross section Doppler broadening," *J. Comput. Phys.*, In Press
for cross section Doppler broadening," *J. Comput. Phys.*, **307**, 715-727
(2016). `<http://dx.doi.org/10.1016/jcp.2015.08.013>`_
- Jonathan A. Walsh, Benoit Forget, Kord S. Smith, and Forrest B. Brown,
"On-the-fly Doppler Broadening of Unresolved Resonance Region Cross Sections
via Probability Band Interpolation," *Proc. PHYSOR*, Sun Valley, Idaho, May
1-5, 2016.
- Colin Josey, Benoit Forget, and Kord Smith, "Windowed multipole sensitivity to
target accuracy of the optimization procedure," *J. Nucl. Sci. Technol.*,
**52**, 987-992 (2015). `<http://dx.doi.org/10.1080/00223131.2015.1035353>`_
- Paul K. Romano and Timothy H. Trumbull, "Comparison of algorithms for Doppler
broadening pointwise tabulated cross sections," *Ann. Nucl. Energy*, **75**,
358--364 (2015). `<http://dx.doi.org/10.1016/j.anucene.2014.08.046>`_
- Tuomas Viitanen, Jaakko Leppanen, and Benoit Forget, "Target motion sampling
temperature treatment technique with track-length esimators in OpenMC --
Preliminary results," *Proc. PHYSOR*, Kyoto, Japan, Sep. 28--Oct. 3 (2014).
- Benoit Forget, Sheng Xu, and Kord Smith, "Direct Doppler broadening in Monte
Carlo simulations using the multipole representation," *Ann. Nucl. Energy*,
**64**, 78--85 (2014). `<http://dx.doi.org/10.1016/j.anucene.2013.09.043>`_
------------
Nuclear Data
------------
- Paul K. Romano and Sterling M. Harper, "Nuclear data processing capabilities
in OpenMC", *Proc. Nuclear Data*, Sep. 11-16, 2016.
- Jonathan A. Walsh, Paul K. Romano, Benoit Forget, and Kord S. Smith,
"Optimizations of the energy grid search algorithm in continuous-energy Monte
Carlo particle transport codes", *Comput. Phys. Commun.*, **196**, 134-142
@ -139,29 +188,17 @@ Nuclear Data
performance analysis for varying cross section parameter regimes,"
*Proc. Joint Int. Conf. M&C+SNA+MC*, Nashville, Tennessee, Apr. 19--23 (2015).
- Paul K. Romano and Timothy H. Trumbull, "Comparison of algorithms for Doppler
broadening pointwise tabulated cross sections," *Ann. Nucl. Energy*, **75**,
358--364 (2015). `<http://dx.doi.org/10.1016/j.anucene.2014.08.046>`_
- Tuomas Viitanen, Jaakko Leppanen, and Benoit Forget, "Target motion sampling
temperature treatment technique with track-length esimators in OpenMC --
Preliminary results," *Proc. PHYSOR*, Kyoto, Japan, Sep. 28--Oct. 3 (2014).
- Jonathan A. Walsh, Benoit Forget, and Kord S. Smith, "Accelerated sampling
of the free gas resonance elastic scattering kernel," *Ann. Nucl. Energy*,
**69**, 116--124 (2014). `<http://dx.doi.org/10.1016/j.anucene.2014.01.017>`_
- Benoit Forget, Sheng Xu, and Kord Smith, "Direct Doppler broadening in Monte
Carlo simulations using the multipole representation," *Ann. Nucl. Energy*,
**64**, 78--85 (2014). `<http://dx.doi.org/10.1016/j.anucene.2013.09.043>`_
-----------
Parallelism
-----------
- Paul K. Romano, John R. Tramm, and Andrew R. Siegel, "Efficacy of hardware
threading for Monte Carlo particle transport calculations on multi- and
many-core systems," Accepted, *PHYSOR 2016*, Sun Valley, Idaho, May 1-5, 2016.
many-core systems," *PHYSOR 2016*, Sun Valley, Idaho, May 1-5, 2016.
- David Ozog, Allen D. Malony, and Andrew R. Siegel, "A performance analysis of
SIMD algorithms for Monte Carlo simulations of nuclear reactor cores,"
@ -228,3 +265,11 @@ Parallelism
- Paul K. Romano and Benoit Forget, "Parallel Fission Bank Algorithms in Monte
Carlo Criticality Calculations," *Nucl. Sci. Eng.*, **170**, 125--135
(2012). `<http://hdl.handle.net/1721.1/73569>`_
---------
Depletion
---------
- Kai Huang, Hongchun Wu, Yunzhao Li, and Liangzhi Cao, "Generalized depletion
chain simplification based of significance analysis," *Proc. PHYSOR*, Sun
Valley, Idaho, May 1-5, 2016.

File diff suppressed because one or more lines are too long

View file

@ -298,6 +298,7 @@ Multi-delayed-group Cross Sections
openmc.mgxs.ChiDelayed
openmc.mgxs.DelayedNuFissionXS
openmc.mgxs.Beta
openmc.mgxs.DecayRate
Multi-group Cross Section Libraries
-----------------------------------

View file

@ -755,13 +755,16 @@ a material default temperature.
``<temperature_method>`` Element
--------------------------------
The ``<temperature_method>`` element has an accepted value of "nearest" or
"interpolation". A value of "nearest" indicates that for each cell, the nearest
temperature at which cross sections are given is to be applied, within a given
tolerance (see :ref:`temperature_tolerance`). A value of "multipole" indicates
that the windowed multipole method should be used to evaluate
temperature-dependent cross sections in the resolved resonance range (a
:ref:`windowed multipole library <multipole_library>` must also be available).
The ``<temperature_method>`` element has an accepted value of "nearest",
"interpolation", or "multipole". A value of "nearest" indicates that for each
cell, the nearest temperature at which cross sections are given is to be
applied, within a given tolerance (see :ref:`temperature_tolerance`). A value of
"interpolation" indicates that cross sections are to be linear-linear
interpolated between temperatures at which nuclear data are present (see
:ref:`temperature_treatment`). A value of "multipole" indicates that the
windowed multipole method should be used to evaluate temperature-dependent cross
sections in the resolved resonance range (a :ref:`windowed multipole library
<multipole_library>` must also be available).
*Default*: "nearest"
@ -1917,6 +1920,11 @@ The ``<tally>`` element accepts the following sub-elements:
| |deposited locally. Units are MeV per source |
| |paticle. |
+----------------------+---------------------------------------------------+
|decay-rate |The delayed-nu-fission-weighted decay rate where |
| |the decay rate is in units of inverse seconds. |
| |This score type is not used in the |
| |multi-group :ref:`energy_mode`. |
+----------------------+---------------------------------------------------+
.. note::
The ``analog`` estimator is actually identical to the ``collision``

View file

@ -478,7 +478,7 @@ class IncidentNeutron(EqualityMixin):
if len(rxs) > 0:
data.summed_reactions[mt_sum] = rx = Reaction(mt_sum)
for T in data.temperatures:
rx.xs[T] = Sum([rx.xs[T] for rx in rxs])
rx.xs[T] = Sum([rx_i.xs[T] for rx_i in rxs])
# Read unresolved resonance probability tables
if 'urr' in group:

View file

@ -107,7 +107,9 @@ def _get_fission_products(ace):
for group in range(n_group):
delayed_neutron = Product('neutron')
delayed_neutron.emission_mode = 'delayed'
delayed_neutron.decay_rate = ace.xss[idx]
# Convert units of inverse shakes to inverse seconds
delayed_neutron.decay_rate = ace.xss[idx] * 1.e8
group_probability = Tabulated1D.from_ace(ace, idx + 1)
if np.all(group_probability.y == group_probability.y[0]):

View file

@ -64,7 +64,7 @@ class Geometry(object):
if cell.id in volume_calc.results:
cell.add_volume_information(volume_calc)
def export_to_xml(self):
def export_to_xml(self, path='geometry.xml'):
"""Create a geometry.xml file that can be used for a simulation.
"""
@ -82,8 +82,7 @@ class Geometry(object):
# Write the XML Tree to the geometry.xml file
tree = ET.ElementTree(geometry_file)
tree.write("geometry.xml", xml_declaration=True, encoding='utf-8',
method="xml")
tree.write(path, xml_declaration=True, encoding='utf-8', method="xml")
def find(self, point):
"""Find cells/universes/lattices which contain a given point

View file

@ -41,19 +41,16 @@ class Material(object):
name : str, optional
Name of the material. If not specified, the name will be the empty
string.
temperature : str, optional
The temperature identifier applied to this material. The units are
in Kelvin and the temperature rounded to the nearest integer.
For example, a tempreature of 293.6K would be provided as '294K'
temperature : float, optional
Temperature of the material in Kelvin. If not specified, the material
inherits the default temperature applied to the model.
Attributes
----------
id : int
Unique identifier for the material
temperature : str
The temperature identifier applied to this material. The units are
in Kelvin and the temperature rounded to the nearest integer.
For example, a tempreature of 293.6K would be provided as '294K'
temperature : float
Temperature of the material in Kelvin.
density : float
Density of the material (units defined separately)
density_units : str
@ -217,12 +214,9 @@ class Material(object):
@temperature.setter
def temperature(self, temperature):
if temperature is not None:
cv.check_type('Temperature for Material ID="{0}"'.format(self._id),
temperature, basestring)
self._temperature = temperature
else:
self._temperature = ''
cv.check_type('Temperature for Material ID="{0}"'.format(self._id),
temperature, (Real, type(None)))
self._temperature = temperature
def set_density(self, units, density=None):
"""Set the density of the material
@ -631,9 +625,9 @@ class Material(object):
element.set("name", str(self._name))
# Create temperature XML subelement
if len(self.temperature) > 0:
if self.temperature is not None:
subelement = ET.SubElement(element, "temperature")
subelement.text = self.temperature
subelement.text = str(self.temperature)
# Create density XML subelement
subelement = ET.SubElement(element, "density")
@ -817,7 +811,7 @@ class Materials(cv.CheckedList):
xml_element = material.get_material_xml()
self._materials_file.append(xml_element)
def export_to_xml(self):
def export_to_xml(self, path='materials.xml'):
"""Create a materials.xml file that can be used for a simulation.
"""
@ -833,5 +827,4 @@ class Materials(cv.CheckedList):
# Write the XML Tree to the materials.xml file
tree = ET.ElementTree(self._materials_file)
tree.write("materials.xml", xml_declaration=True,
encoding='utf-8', method="xml")
tree.write(path, xml_declaration=True, encoding='utf-8', method="xml")

View file

@ -20,7 +20,8 @@ if sys.version_info[0] >= 3:
# Supported cross section types
MDGXS_TYPES = ['delayed-nu-fission',
'chi-delayed',
'beta']
'beta',
'decay-rate']
# Maximum number of delayed groups, from src/constants.F90
MAX_DELAYED_GROUPS = 8
@ -213,7 +214,7 @@ class MDGXS(MGXS):
Parameters
----------
mdgxs_type : {'delayed-nu-fission', 'chi-delayed', 'beta'}
mdgxs_type : {'delayed-nu-fission', 'chi-delayed', 'beta', 'decay-rate'}
The type of multi-delayed-group cross section object to return
domain : openmc.Material or openmc.Cell or openmc.Universe or
openmc.Mesh
@ -249,6 +250,8 @@ class MDGXS(MGXS):
delayed_groups)
elif mdgxs_type == 'beta':
mdgxs = Beta(domain, domain_type, energy_groups, delayed_groups)
elif mdgxs_type == 'decay-rate':
mdgxs = DecayRate(domain, domain_type, energy_groups, delayed_groups)
mdgxs.by_nuclide = by_nuclide
mdgxs.name = name
@ -1574,3 +1577,155 @@ class Beta(MDGXS):
super(Beta, self)._compute_xs()
return self._xs_tally
class DecayRate(MDGXS):
r"""The decay rate for delayed neutron precursors.
This class can be used for both OpenMC input generation and tally data
post-processing to compute spatially-homogenized and energy-integrated
multi-group and multi-delayed group cross sections for multi-group
neutronics calculations. At a minimum, one needs to set the
:attr:`DecayRate.energy_groups` and :attr:`DecayRate.domain` properties.
Tallies for the flux and appropriate reaction rates over the specified
domain are generated automatically via the :attr:`DecayRate.tallies`
property, which can then be appended to a :class:`openmc.Tallies` instance.
For post-processing, the :meth:`MGXS.load_from_statepoint` will pull in the
necessary data to compute multi-group cross sections from a
:class:`openmc.StatePoint` instance. The derived multi-group cross section
can then be obtained from the :attr:`DecayRate.xs_tally` property.
For a spatial domain :math:`V`, energy group :math:`[E_g,E_{g-1}]`, and
delayed group :math:`d`, the decay rate is calculated as:
.. math::
\langle \lambda_d \nu^d \sigma_f \phi \rangle &= \int_{r \in V} dr
\int_{4\pi} d\Omega' \int_0^\infty dE' \int_0^\infty dE \; \lambda_d \nu^d
\sigma_f (r, E') \psi(r, E', \Omega') \\
\langle \nu^d \sigma_f \phi \rangle &= \int_{r \in V} dr \int_{4\pi}
d\Omega' \int_0^\infty dE' \int_0^\infty dE \; \chi(E) \nu^d
\sigma_f (r, E') \psi(r, E', \Omega') \\
\lambda_d &= \frac{\langle \lambda_d \nu^d \sigma_f \phi \rangle}
{\langle \nu^d \sigma_f \phi \rangle}
Parameters
----------
domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh
The domain for spatial homogenization
domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'}
The domain type for spatial homogenization
groups : openmc.mgxs.EnergyGroups
The energy group structure for energy condensation
by_nuclide : bool
If true, computes cross sections for each nuclide in domain
name : str, optional
Name of the multi-group cross section. Used as a label to identify
tallies in OpenMC 'tallies.xml' file.
delayed_groups : list of int
Delayed groups to filter out the xs
Attributes
----------
name : str, optional
Name of the multi-group cross section
rxn_type : str
Reaction type (e.g., 'total', 'nu-fission', etc.)
by_nuclide : bool
If true, computes cross sections for each nuclide in domain
domain : Material or Cell or Universe or Mesh
Domain for spatial homogenization
domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'}
Domain type for spatial homogenization
energy_groups : openmc.mgxs.EnergyGroups
Energy group structure for energy condensation
delayed_groups : list of int
Delayed groups to filter out the xs
tally_trigger : openmc.Trigger
An (optional) tally precision trigger given to each tally used to
compute the cross section
scores : list of str
The scores in each tally used to compute the multi-group cross section
filters : list of openmc.Filter
The filters in each tally used to compute the multi-group cross section
tally_keys : list of str
The keys into the tallies dictionary for each tally used to compute
the multi-group cross section
estimator : {'tracklength', 'analog'}
The tally estimator used to compute the multi-group cross section
tallies : collections.OrderedDict
OpenMC tallies needed to compute the multi-group cross section. The keys
are strings listed in the :attr:`DecayRate.tally_keys` property and
values are instances of :class:`openmc.Tally`.
rxn_rate_tally : openmc.Tally
Derived tally for the reaction rate tally used in the numerator to
compute the multi-group cross section. This attribute is None
unless the multi-group cross section has been computed.
xs_tally : openmc.Tally
Derived tally for the multi-group cross section. This attribute
is None unless the multi-group cross section has been computed.
num_subdomains : int
The number of subdomains is unity for 'material', 'cell' and 'universe'
domain types. When the This is equal to the number of cell instances
for 'distribcell' domain types (it is equal to unity prior to loading
tally data from a statepoint file).
num_nuclides : int
The number of nuclides for which the multi-group cross section is
being tracked. This is unity if the by_nuclide attribute is False.
nuclides : Iterable of str or 'sum'
The optional user-specified nuclides for which to compute cross
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
are not specified by the user, all nuclides in the spatial domain
are included. This attribute is 'sum' if by_nuclide is false.
sparse : bool
Whether or not the MGXS' tallies use SciPy's LIL sparse matrix format
for compressed data storage
loaded_sp : bool
Whether or not a statepoint file has been loaded with tally data
derived : bool
Whether or not the MGXS is merged from one or more other MGXS
hdf5_key : str
The key used to index multi-group cross sections in an HDF5 data store
"""
def __init__(self, domain=None, domain_type=None, energy_groups=None,
delayed_groups=None, by_nuclide=False, name=''):
super(DecayRate, self).__init__(domain, domain_type, energy_groups,
delayed_groups, by_nuclide, name)
self._rxn_type = 'decay-rate'
self._estimator = 'analog'
@property
def scores(self):
return ['delayed-nu-fission', 'decay-rate']
@property
def tally_keys(self):
return ['delayed-nu-fission', 'decay-rate']
@property
def filters(self):
# Create the non-domain specific Filters for the Tallies
group_edges = self.energy_groups.group_edges
energy_filter = openmc.Filter('energy', group_edges)
if self.delayed_groups != None:
delayed_filter = openmc.Filter('delayedgroup', self.delayed_groups)
return [[delayed_filter, energy_filter], [delayed_filter, energy_filter]]
else:
return [[energy_filter], [energy_filter]]
@property
def xs_tally(self):
if self._xs_tally is None:
delayed_nu_fission = self.tallies['delayed-nu-fission']
# Compute the decay rate
self._xs_tally = self.rxn_rate_tally / delayed_nu_fission
super(DecayRate, self)._compute_xs()
return self._xs_tally

View file

@ -616,7 +616,7 @@ class Plots(cv.CheckedList):
self._plots_file.append(xml_element)
def export_to_xml(self):
def export_to_xml(self, path='plots.xml'):
"""Create a plots.xml file that can be used by OpenMC.
"""
@ -631,5 +631,4 @@ class Plots(cv.CheckedList):
# Write the XML Tree to the plots.xml file
tree = ET.ElementTree(self._plots_file)
tree.write("plots.xml", xml_declaration=True,
encoding='utf-8', method="xml")
tree.write(path, xml_declaration=True, encoding='utf-8', method="xml")

View file

@ -1153,7 +1153,7 @@ class Settings(object):
for r in self.resonance_scattering:
elem.append(r.to_xml_element())
def export_to_xml(self):
def export_to_xml(self, path='settings.xml'):
"""Create a settings.xml file that can be used for a simulation.
"""
@ -1198,8 +1198,7 @@ class Settings(object):
# Write the XML Tree to the settings.xml file
tree = ET.ElementTree(self._settings_file)
tree.write("settings.xml", xml_declaration=True,
encoding='utf-8', method="xml")
tree.write(path, xml_declaration=True, encoding='utf-8', method="xml")
class ResonanceScattering(object):

View file

@ -296,7 +296,7 @@ module constants
EVENT_ABSORB = 2
! Tally score type
integer, parameter :: N_SCORE_TYPES = 23
integer, parameter :: N_SCORE_TYPES = 24
integer, parameter :: &
SCORE_FLUX = -1, & ! flux
SCORE_TOTAL = -2, & ! total reaction rate
@ -320,7 +320,8 @@ module constants
SCORE_PROMPT_NU_FISSION = -20, & ! prompt neutron production rate
SCORE_INVERSE_VELOCITY = -21, & ! flux-weighted inverse velocity
SCORE_FISS_Q_PROMPT = -22, & ! prompt fission Q-value
SCORE_FISS_Q_RECOV = -23 ! recoverable fission Q-value
SCORE_FISS_Q_RECOV = -23, & ! recoverable fission Q-value
SCORE_DECAY_RATE = -24 ! delayed neutron precursor decay rate
! Maximum scattering order supported
integer, parameter :: MAX_ANG_ORDER = 10

View file

@ -162,15 +162,33 @@ contains
! temperature. Note that there is no tolerance here, so this
! temperature could be very far off!
kT = sqrtkT**2
i_temp = minloc(abs(nuclides(i_nuclide) % kTs - kT), dim=1)
end if
else
! If not using multipole data, do a linear search on temperature
kT = sqrtkT**2
do i_temp = 1, size(nuclides(i_nuclide) % kTs)
if (abs(nuclides(i_nuclide) % kTs(i_temp) - kT) < &
K_BOLTZMANN*temperature_tolerance) exit
end do
select case (temperature_method)
case (TEMPERATURE_NEAREST)
! If using nearest temperature, do linear search on temperature
do i_temp = 1, size(nuc % kTs)
if (abs(nuc % kTs(i_temp) - kT) < K_BOLTZMANN * &
temperature_tolerance) exit
end do
case (TEMPERATURE_INTERPOLATION)
! Find temperatures that bound the actual temperature
do i_temp = 1, size(nuc % kTs) - 1
if (nuc % kTs(i_temp) <= kT .and. kT < nuc % kTs(i_temp + 1)) exit
end do
! Randomly sample between temperature i and i+1
f = (kT - nuc % kTs(i_temp)) / &
(nuc % kTs(i_temp + 1) - nuc % kTs(i_temp))
if (f > prn()) i_temp = i_temp + 1
case (TEMPERATURE_MULTIPOLE)
i_temp = minloc(abs(nuclides(i_nuclide) % kTs - kT), dim=1)
end select
end if
! Evaluate multipole or interpolate
@ -317,10 +335,25 @@ contains
! Determine temperature for S(a,b) table
kT = sqrtkT**2
do i_temp = 1, size(sab_tables(i_sab) % kTs)
if (abs(sab_tables(i_sab) % kTs(i_temp) - kT) < &
K_BOLTZMANN*temperature_tolerance) exit
end do
if (temperature_method == TEMPERATURE_NEAREST) then
! If using nearest temperature, do linear search on temperature
do i_temp = 1, size(sab_tables(i_sab) % kTs)
if (abs(sab_tables(i_sab) % kTs(i_temp) - kT) < &
K_BOLTZMANN*temperature_tolerance) exit
end do
else
! Find temperatures that bound the actual temperature
do i_temp = 1, size(sab_tables(i_sab) % kTs) - 1
if (sab_tables(i_sab) % kTs(i_temp) <= kT .and. &
kT < sab_tables(i_sab) % kTs(i_temp + 1)) exit
end do
! Randomly sample between temperature i and i+1
f = (kT - sab_tables(i_sab) % kTs(i_temp)) / &
(sab_tables(i_sab) % kTs(i_temp + 1) - sab_tables(i_sab) % kTs(i_temp))
if (f > prn()) i_temp = i_temp + 1
end if
! Get pointer to S(a,b) table
associate (sab => sab_tables(i_sab) % data(i_temp))

View file

@ -40,6 +40,8 @@ contains
string = "fission"
case (SCORE_NU_FISSION)
string = "nu-fission"
case (SCORE_DECAY_RATE)
string = "decay-rate"
case (SCORE_DELAYED_NU_FISSION)
string = "delayed-nu-fission"
case (SCORE_PROMPT_NU_FISSION)

View file

@ -3261,22 +3261,6 @@ contains
! Check if total material was specified
if (trim(sarray(j)) == 'total') then
! Check if a delayedgroup filter is present for this tally
do l = 1, size(t % filters)
select type(filt => t % filters(l) % obj)
type is (DelayedGroupFilter)
call warning("A delayedgroup filter was used on a total &
&nuclide tally. Cross section libraries are not &
&guaranteed to have the same delayed group structure &
&across all isotopes. In particular, ENDF/B-VII.1 does &
&not have a consistent delayed group structure across &
&all isotopes while the JEFF 3.1.1 library has the same &
&delayed group structure across all isotopes. Use with &
&caution!")
end select
end do
t % nuclide_bins(j) = -1
cycle
end if
@ -3321,20 +3305,6 @@ contains
allocate(t % nuclide_bins(1))
t % nuclide_bins(1) = -1
t % n_nuclide_bins = 1
! Check if a delayedgroup filter is present for this tally
do l = 1, size(t % filters)
select type(filt => t % filters(l) % obj)
type is (DelayedGroupFilter)
call warning("A delayedgroup filter was used on a total nuclide &
&tally. Cross section libraries are not guaranteed to have the&
& same delayed group structure across all isotopes. In &
&particular, ENDF/B-VII.1 does not have a consistent delayed &
&group structure across all isotopes while the JEFF 3.1.1 &
&library has the same delayed group structure across all &
&isotopes. Use with caution!")
end select
end do
end if
! =======================================================================
@ -3448,8 +3418,9 @@ contains
end if
! Check if delayed group filter is used with any score besides
! delayed-nu-fission
if (score_name /= 'delayed-nu-fission' .and. &
! delayed-nu-fission or decay-rate
if ((score_name /= 'delayed-nu-fission' .and. &
score_name /= 'decay-rate') .and. &
t % find_filter(FILTER_DELAYEDGROUP) > 0) then
call fatal_error("Cannot tally " // trim(score_name) // " with a &
&delayedgroup filter.")
@ -3603,6 +3574,9 @@ contains
! Set tally estimator to analog
t % estimator = ESTIMATOR_ANALOG
end if
case ('decay-rate')
t % score_bins(j) = SCORE_DECAY_RATE
t % estimator = ESTIMATOR_ANALOG
case ('delayed-nu-fission')
t % score_bins(j) = SCORE_DELAYED_NU_FISSION
if (t % find_filter(FILTER_ENERGYOUT) > 0) then
@ -4975,7 +4949,7 @@ contains
call names % push_back('Ga0')
call densities % push_back(density)
else
call names % push_back('Ha69')
call names % push_back('Ga69')
call densities % push_back(density * 0.60108_8)
call names % push_back('Ga71')
call densities % push_back(density * 0.39892_8)
@ -5867,7 +5841,7 @@ contains
file_id = file_open(libraries(i_library) % path, 'r')
group_id = open_group(file_id, name)
call sab_tables(i_sab) % from_hdf5(group_id, sab_temps(i_sab), &
temperature_tolerance)
temperature_method, temperature_tolerance)
call close_group(group_id)
call file_close(file_id)
@ -6020,6 +5994,7 @@ contains
integer :: i, j
integer :: i_library
integer :: method
integer(HID_T) :: file_id
integer(HID_T) :: group_id
real(8) :: xs_cdf_sum
@ -6047,8 +6022,9 @@ contains
! Read nuclide data from HDF5
file_id = file_open(libraries(i_library) % path, 'r')
group_id = open_group(file_id, name)
method = TEMPERATURE_NEAREST
call resonant_nuc % from_hdf5(group_id, temperature, &
TEMPERATURE_NEAREST, 1000.0_8)
method, 1000.0_8)
call close_group(group_id)
call file_close(file_id)

View file

@ -189,7 +189,7 @@ module nuclide_header
class(Nuclide), intent(inout) :: this
integer(HID_T), intent(in) :: group_id
type(VectorReal), intent(in) :: temperature ! list of desired temperatures
integer, intent(in) :: method
integer, intent(inout) :: method
real(8), intent(in) :: tolerance
integer :: i
@ -236,11 +236,22 @@ module nuclide_header
call read_dataset(temps_available(i), kT_group, trim(dset_names(i)))
temps_available(i) = temps_available(i) / K_BOLTZMANN
end do
call sort(temps_available)
! If only one temperature is available, revert to nearest temperature
if (size(temps_available) == 1 .and. &
method == TEMPERATURE_INTERPOLATION) then
call warning("Cross sections for " // trim(this % name) // " are only &
&available at one temperature. Reverting to nearest temperature &
&method.")
method = TEMPERATURE_NEAREST
end if
! Determine actual temperatures to read
select case (method)
case (TEMPERATURE_NEAREST)
! Determine actual temperatures to read
TEMP_LOOP: do i = 1, temperature % size()
! Find nearest temperatures
do i = 1, temperature % size()
temp_desired = temperature % data(i)
i_closest = minloc(abs(temps_available - temp_desired), dim=1)
temp_actual = temps_available(i_closest)
@ -260,11 +271,31 @@ module nuclide_header
&for " // trim(this % name) // " at or near " // &
trim(to_str(nint(temp_desired))) // " K.")
end if
end do TEMP_LOOP
end do
case (TEMPERATURE_INTERPOLATION)
! TODO: Get bounding temperatures
call fatal_error("Temperature interpolation not yet implemented")
! If temperature interpolation or multipole is selected, get a list of
! bounding temperatures for each actual temperature present in the model
TEMP_LOOP: do i = 1, temperature % size()
temp_desired = temperature % data(i)
do j = 1, size(temps_available) - 1
if (temps_available(j) <= temp_desired .and. &
temp_desired < temps_available(j + 1)) then
if (find(temps_to_read, nint(temps_available(j))) == -1) then
call temps_to_read % push_back(nint(temps_available(j)))
end if
if (find(temps_to_read, nint(temps_available(j + 1))) == -1) then
call temps_to_read % push_back(nint(temps_available(j + 1)))
end if
cycle TEMP_LOOP
end if
end do
call fatal_error("Nuclear data library does not contain cross sections &
&for " // trim(this % name) // " at temperatures that bound " // &
trim(to_str(nint(temp_desired))) // " K.")
end do TEMP_LOOP
case (TEMPERATURE_MULTIPOLE)
! Add first available temperature

View file

@ -735,6 +735,7 @@ contains
score_names(abs(SCORE_NU_SCATTER_N)) = "Scattering Prod. Rate Moment"
score_names(abs(SCORE_NU_SCATTER_PN)) = "Scattering Prod. Rate Moment"
score_names(abs(SCORE_NU_SCATTER_YN)) = "Scattering Prod. Rate Moment"
score_names(abs(SCORE_DECAY_RATE)) = "Decay Rate"
score_names(abs(SCORE_DELAYED_NU_FISSION)) = "Delayed-Nu-Fission Rate"
score_names(abs(SCORE_PROMPT_NU_FISSION)) = "Prompt-Nu-Fission Rate"
score_names(abs(SCORE_INVERSE_VELOCITY)) = "Flux-Weighted Inverse Velocity"

View file

@ -80,10 +80,11 @@ module sab_header
contains
subroutine salphabeta_from_hdf5(this, group_id, temperature, tolerance)
subroutine salphabeta_from_hdf5(this, group_id, temperature, method, tolerance)
class(SAlphaBeta), intent(inout) :: this
integer(HID_T), intent(in) :: group_id
type(VectorReal), intent(in) :: temperature ! list of temperatures
integer, intent(in) :: method
real(8), intent(in) :: tolerance
integer :: i, j
@ -140,25 +141,55 @@ contains
call read_dataset(temps_available(i), kT_group, trim(dset_names(i)))
temps_available(i) = temps_available(i) / K_BOLTZMANN
end do
call sort(temps_available)
! Determine actual temperatures to read
TEMP_LOOP: do i = 1, temperature % size()
temp_desired = temperature % data(i)
i_closest = minloc(abs(temps_available - temp_desired), dim=1)
temp_actual = temps_available(i_closest)
if (abs(temp_actual - temp_desired) < tolerance) then
if (find(temps_to_read, nint(temp_actual)) == -1) then
call temps_to_read % push_back(nint(temp_actual))
select case (method)
case (TEMPERATURE_NEAREST)
! Determine actual temperatures to read
do i = 1, temperature % size()
temp_desired = temperature % data(i)
i_closest = minloc(abs(temps_available - temp_desired), dim=1)
temp_actual = temps_available(i_closest)
if (abs(temp_actual - temp_desired) < tolerance) then
if (find(temps_to_read, nint(temp_actual)) == -1) then
call temps_to_read % push_back(nint(temp_actual))
end if
else
call fatal_error("Nuclear data library does not contain cross sections &
&for " // trim(this % name) // " at or near " // &
trim(to_str(nint(temp_desired))) // " K.")
end if
else
call fatal_error("Nuclear data library does not contain cross sections &
&for " // trim(this % name) // " at or near " // &
trim(to_str(nint(temp_desired))) // " K.")
end if
end do TEMP_LOOP
end do
! TODO: If using interpolation, add a block to add bounding temperatures for
! each
case (TEMPERATURE_INTERPOLATION)
! If temperature interpolation or multipole is selected, get a list of
! bounding temperatures for each actual temperature present in the model
TEMP_LOOP: do i = 1, temperature % size()
temp_desired = temperature % data(i)
do j = 1, size(temps_available) - 1
if (temps_available(j) <= temp_desired .and. &
temp_desired < temps_available(j + 1)) then
if (find(temps_to_read, nint(temps_available(j))) == -1) then
call temps_to_read % push_back(nint(temps_available(j)))
end if
if (find(temps_to_read, nint(temps_available(j + 1))) == -1) then
call temps_to_read % push_back(nint(temps_available(j + 1)))
end if
cycle TEMP_LOOP
end if
end do
call fatal_error("Nuclear data library does not contain cross sections &
&for " // trim(this % name) // " at temperatures that bound " // &
trim(to_str(nint(temp_desired))) // " K.")
end do TEMP_LOOP
case (TEMPERATURE_MULTIPOLE)
! Add first available temperature
call temps_to_read % push_back(nint(temps_available(1)))
end select
! Sort temperatures to read
call sort(temps_to_read)
@ -297,6 +328,12 @@ contains
end do
end associate
end do
! Clear data on correlated angle-energy object
deallocate(correlated_dist % breakpoints)
deallocate(correlated_dist % interpolation)
deallocate(correlated_dist % energy)
deallocate(correlated_dist % distribution)
end if
call close_group(inelastic_group)

View file

@ -94,6 +94,8 @@ contains
integer :: score_bin ! scoring bin, e.g. SCORE_FLUX
integer :: score_index ! scoring bin index
integer :: d ! delayed neutron index
integer :: g ! delayed neutron index
integer :: k ! loop index for bank sites
integer :: d_bin ! delayed group bin index
integer :: dg_filter ! index of delayed group filter
real(8) :: yield ! delayed neutron yield
@ -671,6 +673,141 @@ contains
end if
case (SCORE_DECAY_RATE)
! Set the delayedgroup filter index
dg_filter = t % find_filter(FILTER_DELAYEDGROUP)
if (survival_biasing) then
! No fission events occur if survival biasing is on -- need to
! calculate fraction of absorptions that would have resulted in
! delayed-nu-fission
if (micro_xs(p % event_nuclide) % absorption > ZERO .and. &
nuclides(p % event_nuclide) % fissionable) then
! Check if the delayed group filter is present
if (dg_filter > 0) then
select type(filt => t % filters(dg_filter) % obj)
type is (DelayedGroupFilter)
! Loop over all delayed group bins and tally to them
! individually
do d_bin = 1, filt % n_bins
! Get the delayed group for this bin
d = filt % groups(d_bin)
! Compute the yield for this delayed group
yield = nuclides(p % event_nuclide) &
% nu(E, EMISSION_DELAYED, d)
associate (rxn => nuclides(p % event_nuclide) % &
reactions(nuclides(p % event_nuclide) % index_fission(1)))
! Compute the score
score = p % absorb_wgt * yield * &
micro_xs(p % event_nuclide) % fission &
/ micro_xs(p % event_nuclide) % absorption &
* rxn % products(1 + d) % decay_rate
end associate
! Tally to bin
call score_fission_delayed_dg(t, d_bin, score, score_index)
end do
cycle SCORE_LOOP
end select
else
! If the delayed group filter is not present, compute the score
! by accumulating the absorbed weight times the decay rate times
! the fraction of the delayed-nu-fission xs to the absorption xs
! for all delayed groups.
score = ZERO
associate (rxn => nuclides(p % event_nuclide) % &
reactions(nuclides(p % event_nuclide) % index_fission(1)))
! We need to be careful not to overshoot the number of delayed
! groups since this could cause the range of the rxn % products
! array to be exceeded. Hence, we use the size of this array
! and not the MAX_DELAYED_GROUPS constant for this loop.
do d = 1, size(rxn % products) - 2
score = score + rxn % products(1 + d) % decay_rate * &
p % absorb_wgt * micro_xs(p % event_nuclide) % fission *&
nuclides(p % event_nuclide) % nu(E, EMISSION_DELAYED, d)&
/ micro_xs(p % event_nuclide) % absorption
end do
end associate
end if
end if
else
! Skip any non-fission events
if (.not. p % fission) cycle SCORE_LOOP
! If there is no outgoing energy filter, than we only need to
! score to one bin. For the score to be 'analog', we need to
! score the number of particles that were banked in the fission
! bank. Since this was weighted by 1/keff, we multiply by keff
! to get the proper score. Loop over the neutrons produced from
! fission and check which ones are delayed. If a delayed neutron is
! encountered, add its contribution to the fission bank to the
! score.
score = ZERO
! loop over number of particles banked
do k = 1, p % n_bank
! get the delayed group
g = fission_bank(n_bank - p % n_bank + k) % delayed_group
! Case for tallying delayed emissions
if (g /= 0) then
! Accumulate the decay rate times delayed nu fission score
associate (rxn => nuclides(p % event_nuclide) % &
reactions(nuclides(p % event_nuclide) % index_fission(1)))
! determine score based on bank site weight and keff.
score = score + keff * fission_bank(n_bank - p % n_bank + k) &
% wgt * rxn % products(1 + g) % decay_rate
end associate
! if the delayed group filter is present, tally to corresponding
! delayed group bin if it exists
if (dg_filter > 0) then
! declare the delayed group filter type
select type(filt => t % filters(dg_filter) % obj)
type is (DelayedGroupFilter)
! loop over delayed group bins until the corresponding bin is
! found
do d_bin = 1, filt % n_bins
d = filt % groups(d_bin)
! check whether the delayed group of the particle is equal to
! the delayed group of this bin
if (d == g) then
call score_fission_delayed_dg(t, d_bin, score, score_index)
end if
end do
end select
! Reset the score to zero
score = ZERO
end if
end if
end do
! If the delayed group filter is present, cycle because the
! score_fission_delayed_dg(...) has already tallied the score
if (dg_filter > 0) then
cycle SCORE_LOOP
end if
end if
case (SCORE_KAPPA_FISSION)
! Determine kappa-fission cross section on the fly. The ENDF standard
! (ENDF-102) states that MT 18 stores the fission energy as the Q_value

View file

@ -1 +1 @@
2b2a2f5778b03f87d20fa6da96cc19db0489f69d4d5f0cac02dd407fd8e53a082081bfef35c4310cb2e0651254766d499e89279e711fd6fd93f913c964855839
723ce48152faa9ec1576c26a825dfa45cdd858e721bd698d72d559ac3b9e5c37e5048305bd9af9c3137a781798ab2eee20e5df46455bfd9d6819a08fd2bff47d

View file

@ -61,6 +61,13 @@
3 10000 4 1 total 0.002752 0.000240
4 10000 5 1 total 0.001231 0.000105
5 10000 6 1 total 0.000512 0.000044
material delayedgroup group in nuclide mean std. dev.
0 10000 1 1 total 0.000000 0.000000
1 10000 2 1 total 0.032739 0.028454
2 10000 3 1 total 0.120780 0.170809
3 10000 4 1 total 0.302780 0.109110
4 10000 5 1 total 0.000000 0.000000
5 10000 6 1 total 0.000000 0.000000
material group in nuclide mean std. dev.
0 10001 1 total 0.311594 0.013793
material group in nuclide mean std. dev.
@ -123,6 +130,13 @@
2 10001 3 1 total 0.0 0.0
3 10001 4 1 total 0.0 0.0
4 10001 5 1 total 0.0 0.0
5 10001 6 1 total 0.0 0.0
material delayedgroup group in nuclide mean std. dev.
0 10001 1 1 total 0.0 0.0
1 10001 2 1 total 0.0 0.0
2 10001 3 1 total 0.0 0.0
3 10001 4 1 total 0.0 0.0
4 10001 5 1 total 0.0 0.0
5 10001 6 1 total 0.0 0.0
material group in nuclide mean std. dev.
0 10002 1 total 0.904999 0.043964
@ -186,4 +200,11 @@
2 10002 3 1 total 0.0 0.0
3 10002 4 1 total 0.0 0.0
4 10002 5 1 total 0.0 0.0
5 10002 6 1 total 0.0 0.0
material delayedgroup group in nuclide mean std. dev.
0 10002 1 1 total 0.0 0.0
1 10002 2 1 total 0.0 0.0
2 10002 3 1 total 0.0 0.0
3 10002 4 1 total 0.0 0.0
4 10002 5 1 total 0.0 0.0
5 10002 6 1 total 0.0 0.0

View file

@ -1 +1 @@
ad427594bd8a68ad35382bc34b5932e7c78480b6e327caf63782d563fd6e6e5fb4e7b0dfd9094394a5db092f789c473dbb08cb6b3d0c0296edcfc247dbe95d6f
7d95d5cf3f4d1f3277d1a1bbc638b47888d7eb1e6afeedea73140ae5caeebead7c5f1a2945f2a18b49ce75adbd9df17773390530fee129d981a3af50141fe116

View file

@ -61,3 +61,10 @@
3 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 4 1 total 0.002727 0.000135
4 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 5 1 total 0.001210 0.000058
5 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 6 1 total 0.000504 0.000024
avg(distribcell) delayedgroup group in nuclide mean std. dev.
0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total 0.000000 0.000000
1 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 2 1 total 0.032739 0.046300
2 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 3 1 total 0.120780 0.170809
3 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 4 1 total 0.000000 0.000000
4 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 5 1 total 0.000000 0.000000
5 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 6 1 total 2.853000 4.034751

View file

@ -1 +1 @@
2b2a2f5778b03f87d20fa6da96cc19db0489f69d4d5f0cac02dd407fd8e53a082081bfef35c4310cb2e0651254766d499e89279e711fd6fd93f913c964855839
723ce48152faa9ec1576c26a825dfa45cdd858e721bd698d72d559ac3b9e5c37e5048305bd9af9c3137a781798ab2eee20e5df46455bfd9d6819a08fd2bff47d

View file

@ -111,6 +111,19 @@ domain=10000 type=beta
[ 3.21434855e-04 1.09939816e-03]
[ 1.82980497e-04 4.50738567e-04]
[ 7.48899920e-05 1.88812772e-04]]
domain=10000 type=decay-rate
[[ 0. 0. ]
[ 0. 0.032739]
[ 0. 0.12078 ]
[ 0. 0.30278 ]
[ 0. 0. ]
[ 0. 0. ]]
[[ 0. 0. ]
[ 0. 0.02845437]
[ 0. 0.17080871]
[ 0. 0.10910951]
[ 0. 0. ]
[ 0. 0. ]]
domain=10001 type=total
[ 0.31373767 0.3008214 ]
[ 0.0155819 0.02805245]
@ -212,6 +225,19 @@ domain=10001 type=chi-delayed
[ 0. 0.]
[ 0. 0.]]
domain=10001 type=beta
[[ 0. 0.]
[ 0. 0.]
[ 0. 0.]
[ 0. 0.]
[ 0. 0.]
[ 0. 0.]]
[[ 0. 0.]
[ 0. 0.]
[ 0. 0.]
[ 0. 0.]
[ 0. 0.]
[ 0. 0.]]
domain=10001 type=decay-rate
[[ 0. 0.]
[ 0. 0.]
[ 0. 0.]
@ -337,3 +363,16 @@ domain=10002 type=beta
[ 0. 0.]
[ 0. 0.]
[ 0. 0.]]
domain=10002 type=decay-rate
[[ 0. 0.]
[ 0. 0.]
[ 0. 0.]
[ 0. 0.]
[ 0. 0.]
[ 0. 0.]]
[[ 0. 0.]
[ 0. 0.]
[ 0. 0.]
[ 0. 0.]
[ 0. 0.]
[ 0. 0.]]

View file

@ -1 +1 @@
68c7695d7ae0367c59155eab05d3fe859cae895170f2cd32d4463af340a9a2035be16221b1eda8e2a1132bfe1b8163ca8d964fb1b23274c232fb10fd88274aea
88b1a1b52bcae466bab63038d03e9b2fb9f2a28aac3d73573ca00d5f0c116aa9e1c97341215b80266e8317a0549f11d9adcb8726c82fcc1741a5a730e10c8186

View file

@ -208,3 +208,29 @@
21 2 2 1 4 1 total 0.002143 0.001028
22 2 2 1 5 1 total 0.001026 0.000492
23 2 2 1 6 1 total 0.000408 0.000196
mesh 1 delayedgroup group in nuclide mean std. dev.
x y z
0 1 1 1 1 1 total 0.00000 0.000000
1 1 1 1 2 1 total 0.00000 0.000000
2 1 1 1 3 1 total 0.00000 0.000000
3 1 1 1 4 1 total 0.30278 0.428196
4 1 1 1 5 1 total 0.00000 0.000000
5 1 1 1 6 1 total 0.00000 0.000000
6 1 2 1 1 1 total 0.00000 0.000000
7 1 2 1 2 1 total 0.00000 0.000000
8 1 2 1 3 1 total 0.00000 0.000000
9 1 2 1 4 1 total 0.00000 0.000000
10 1 2 1 5 1 total 0.00000 0.000000
11 1 2 1 6 1 total 0.00000 0.000000
12 2 1 1 1 1 total 0.00000 0.000000
13 2 1 1 2 1 total 0.00000 0.000000
14 2 1 1 3 1 total 0.00000 0.000000
15 2 1 1 4 1 total 0.00000 0.000000
16 2 1 1 5 1 total 0.00000 0.000000
17 2 1 1 6 1 total 0.00000 0.000000
18 2 2 1 1 1 total 0.00000 0.000000
19 2 2 1 2 1 total 0.00000 0.000000
20 2 2 1 3 1 total 0.00000 0.000000
21 2 2 1 4 1 total 0.00000 0.000000
22 2 2 1 5 1 total 0.00000 0.000000
23 2 2 1 6 1 total 0.00000 0.000000

View file

@ -1 +1 @@
2b2a2f5778b03f87d20fa6da96cc19db0489f69d4d5f0cac02dd407fd8e53a082081bfef35c4310cb2e0651254766d499e89279e711fd6fd93f913c964855839
723ce48152faa9ec1576c26a825dfa45cdd858e721bd698d72d559ac3b9e5c37e5048305bd9af9c3137a781798ab2eee20e5df46455bfd9d6819a08fd2bff47d

View file

@ -123,6 +123,19 @@
6 10000 4 2 total 0.011426 0.001099
8 10000 5 2 total 0.004684 0.000451
10 10000 6 2 total 0.001962 0.000189
material delayedgroup group in nuclide mean std. dev.
1 10000 1 1 total 0.000000 0.000000
3 10000 2 1 total 0.000000 0.000000
5 10000 3 1 total 0.000000 0.000000
7 10000 4 1 total 0.000000 0.000000
9 10000 5 1 total 0.000000 0.000000
11 10000 6 1 total 0.000000 0.000000
0 10000 1 2 total 0.000000 0.000000
2 10000 2 2 total 0.032739 0.028454
4 10000 3 2 total 0.120780 0.170809
6 10000 4 2 total 0.302780 0.109110
8 10000 5 2 total 0.000000 0.000000
10 10000 6 2 total 0.000000 0.000000
material group in nuclide mean std. dev.
1 10001 1 total 0.313738 0.015582
0 10001 2 total 0.300821 0.028052
@ -247,6 +260,19 @@
4 10001 3 2 total 0.0 0.0
6 10001 4 2 total 0.0 0.0
8 10001 5 2 total 0.0 0.0
10 10001 6 2 total 0.0 0.0
material delayedgroup group in nuclide mean std. dev.
1 10001 1 1 total 0.0 0.0
3 10001 2 1 total 0.0 0.0
5 10001 3 1 total 0.0 0.0
7 10001 4 1 total 0.0 0.0
9 10001 5 1 total 0.0 0.0
11 10001 6 1 total 0.0 0.0
0 10001 1 2 total 0.0 0.0
2 10001 2 2 total 0.0 0.0
4 10001 3 2 total 0.0 0.0
6 10001 4 2 total 0.0 0.0
8 10001 5 2 total 0.0 0.0
10 10001 6 2 total 0.0 0.0
material group in nuclide mean std. dev.
1 10002 1 total 0.664572 0.031215
@ -372,4 +398,17 @@
4 10002 3 2 total 0.0 0.0
6 10002 4 2 total 0.0 0.0
8 10002 5 2 total 0.0 0.0
10 10002 6 2 total 0.0 0.0
material delayedgroup group in nuclide mean std. dev.
1 10002 1 1 total 0.0 0.0
3 10002 2 1 total 0.0 0.0
5 10002 3 1 total 0.0 0.0
7 10002 4 1 total 0.0 0.0
9 10002 5 1 total 0.0 0.0
11 10002 6 1 total 0.0 0.0
0 10002 1 2 total 0.0 0.0
2 10002 2 2 total 0.0 0.0
4 10002 3 2 total 0.0 0.0
6 10002 4 2 total 0.0 0.0
8 10002 5 2 total 0.0 0.0
10 10002 6 2 total 0.0 0.0

View file

@ -13,7 +13,7 @@ import openmc
class SourceTestHarness(PyAPITestHarness):
def _build_inputs(self):
mat1 = openmc.Material(material_id=1, temperature='294')
mat1 = openmc.Material(material_id=1, temperature=294)
mat1.set_density('g/cm3', 4.5)
mat1.add_nuclide(openmc.Nuclide('U235'), 1.0)
materials = openmc.Materials([mat1])