diff --git a/.gitignore b/.gitignore
index 1998a6c5b..ef67316fb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -64,3 +64,10 @@ data/nndc
# IPython notebook checkpoints
.ipynb_checkpoints
+
+# Multi-group cross section IPython Notebook
+docs/source/pythonapi/examples/*.xml
+docs/source/pythonapi/examples/*.png
+docs/source/pythonapi/examples/*.xls
+docs/source/pythonapi/examples/mgxs
+docs/source/pythonapi/examples/tracks
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index 7af617f85..efdc457a1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -27,7 +27,7 @@ before_install:
- conda config --set always_yes yes --set changeps1 no
- conda update -q conda
- conda info -a
- - conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION numpy scipy h5py
+ - conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION numpy scipy h5py pandas
- source activate test-environment
# Install GCC, MPICH, HDF5, PHDF5
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 4a18f14de..05559aab0 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -27,6 +27,7 @@ sys.path.insert(0, os.path.abspath('../..'))
extensions = ['sphinx.ext.autodoc',
'sphinx.ext.napoleon',
'sphinx.ext.pngmath',
+ 'sphinx.ext.autosummary',
'sphinxcontrib.tikz',
'sphinx_numfig',
'notebook_sphinxext']
diff --git a/docs/source/pythonapi/energy_groups.rst b/docs/source/pythonapi/energy_groups.rst
new file mode 100644
index 000000000..28ca6f3fe
--- /dev/null
+++ b/docs/source/pythonapi/energy_groups.rst
@@ -0,0 +1,8 @@
+.. _pythonapi_energy_groups:
+
+=============
+Energy Groups
+=============
+
+.. automodule:: openmc.mgxs.groups
+ :members:
diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb
new file mode 100644
index 000000000..4b0d2022b
--- /dev/null
+++ b/docs/source/pythonapi/examples/multi-group-cross-sections.ipynb
@@ -0,0 +1,2461 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This notebook demonstrates how to use the **``openmc.mgxs``** module to generate multi-group cross sections with OpenMC.\n",
+ "\n",
+ "**Note:** that this Notebook was created using [OpenMOC](https://mit-crpg.github.io/OpenMOC/) to verify the multi-group cross-sections generated by OpenMC. In order to run this Notebook, you must have [OpenMOC](https://mit-crpg.github.io/OpenMOC/) installed on your system, along with OpenCG to convert the OpenMC geometries into OpenMOC geometries."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/usr/lib/pymodules/python2.7/matplotlib/__init__.py:1173: UserWarning: This call to matplotlib.use() has no effect\n",
+ "because the backend has already been chosen;\n",
+ "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n",
+ "or matplotlib.backends is imported for the first time.\n",
+ "\n",
+ " warnings.warn(_use_error_msg)\n"
+ ]
+ }
+ ],
+ "source": [
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "import openmc\n",
+ "import openmc.mgxs as mgxs\n",
+ "import openmoc\n",
+ "from openmoc.compatible import get_openmoc_geometry\n",
+ "\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Infinite Homogeneous Medium"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We first construct a simple homogeneous infinite medium problem to illustrate use of the `openmc.mgxs` module to generate multi-group cross sections."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Generate Inputs"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Instantiate some Nuclides\n",
+ "h1 = openmc.Nuclide('H-1')\n",
+ "o16 = openmc.Nuclide('O-16')\n",
+ "u235 = openmc.Nuclide('U-235')\n",
+ "u238 = openmc.Nuclide('U-238')\n",
+ "zr90 = openmc.Nuclide('Zr-90')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "With the nuclides we defined, we will now create a material for the homogeneous medium."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Instantiate a Material and register the Nuclides\n",
+ "inf_medium = openmc.Material(name='moderator')\n",
+ "inf_medium.set_density('g/cc', 5.)\n",
+ "inf_medium.add_nuclide(h1, 0.028999667)\n",
+ "inf_medium.add_nuclide(o16, 0.01450188)\n",
+ "inf_medium.add_nuclide(u235, 0.000114142)\n",
+ "inf_medium.add_nuclide(u238, 0.006886019)\n",
+ "inf_medium.add_nuclide(zr90, 0.002116053)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "With our material, we can now create a materials file object that can be exported to an actual XML file."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Instantiate a MaterialsFile, register all Materials, and export to XML\n",
+ "materials_file = openmc.MaterialsFile()\n",
+ "materials_file.default_xs = '71c'\n",
+ "materials_file.add_material(inf_medium)\n",
+ "materials_file.export_to_xml()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now let's move on to the geometry. This problem will be a simple square cell with reflective boundary conditions to simulate an infinite homogeneous medium. The first step is to create the outer bounding surfaces of the problem."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Instantiate boundary Planes\n",
+ "min_x = openmc.XPlane(boundary_type='reflective', x0=-0.63)\n",
+ "max_x = openmc.XPlane(boundary_type='reflective', x0=0.63)\n",
+ "min_y = openmc.YPlane(boundary_type='reflective', y0=-0.63)\n",
+ "max_y = openmc.YPlane(boundary_type='reflective', y0=0.63)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "With the surfaces defined, we can now create a cell that is defined by intersections of half-spaces created by the surfaces."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Instantiate a Cell\n",
+ "cell = openmc.Cell(cell_id=1, name='cell')\n",
+ "\n",
+ "# Register bounding Surfaces with the Cell\n",
+ "cell.region = +min_x & -max_x & +min_y & -max_y\n",
+ "\n",
+ "# Fill the Cell with the Material\n",
+ "cell.fill = inf_medium"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "OpenMC requires that there is a \"root\" universe. Let us create a root universe and add our square cell to it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Instantiate Universe\n",
+ "root_universe = openmc.Universe(universe_id=0, name='root universe')\n",
+ "root_universe.add_cell(cell)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Create Geometry and set root Universe\n",
+ "openmc_geometry = openmc.Geometry()\n",
+ "openmc_geometry.root_universe = root_universe\n",
+ "\n",
+ "# Instantiate a GeometryFile\n",
+ "geometry_file = openmc.GeometryFile()\n",
+ "geometry_file.geometry = openmc_geometry\n",
+ "\n",
+ "# Export to \"geometry.xml\"\n",
+ "geometry_file.export_to_xml()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 2500 particles."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# OpenMC simulation parameters\n",
+ "batches = 50\n",
+ "inactive = 10\n",
+ "particles = 2500\n",
+ "\n",
+ "# Instantiate a SettingsFile\n",
+ "settings_file = openmc.SettingsFile()\n",
+ "settings_file.batches = batches\n",
+ "settings_file.inactive = inactive\n",
+ "settings_file.particles = particles\n",
+ "settings_file.output = {'tallies': True, 'summary': True}\n",
+ "bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n",
+ "settings_file.set_source_space('box', bounds)\n",
+ "\n",
+ "# Export to \"settings.xml\"\n",
+ "settings_file.export_to_xml()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we are finally ready to make use of the `openmc.mgxs` module to generate multi-group cross sections! First, let's define a \"fine\" 8-group and \"coarse\" 2-group structures using the built-in `EnergyGroups` class."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Instantiate a \"fine\" 8-group EneryGroups object\n",
+ "fine_groups = mgxs.EnergyGroups()\n",
+ "fine_groups.group_edges = np.array([0., 0.058e-6, 0.14e-6, 0.28e-6,\n",
+ " 0.625e-6, 4.e-6, 5.53e-3, 821.e-3, 20.])\n",
+ "\n",
+ "# Instantiate a \"coarse\" 2-group EneryGroups object\n",
+ "coarse_groups = mgxs.EnergyGroups()\n",
+ "coarse_groups.group_edges = np.array([0., 0.625e-6, 20.])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can now use the fine and coarse `EnergyGroups` objects, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of the generic and abstract `MGXS` class:\n",
+ "\n",
+ "* `TotalXS`\n",
+ "* `TransportXS`\n",
+ "* `AbsorptionXS`\n",
+ "* `CaptureXS`\n",
+ "* `FissionXS`\n",
+ "* `NuFissionXS`\n",
+ "* `ScatterXS`\n",
+ "* `NuScatterXS`\n",
+ "* `ScatterMatrixXS`\n",
+ "* `NuScatterMatrixXS`\n",
+ "* `Chi`\n",
+ "\n",
+ "These classes provide us with an interface to generate the tally inputs as well as perform post-processing of OpenMC's tally data to compute the respective multi-group cross sections. In this case, let's create the multi-group cross sections needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we will define total, nu-fission, nu-scatter and chi cross sections for our infinite medium cell as the domain and our fine 8-group structure as our energy groups."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Instantiate cross sections needed for an OpenMOC simulation\n",
+ "transport = mgxs.TransportXS(domain=cell, domain_type='cell', groups=fine_groups)\n",
+ "nufission = mgxs.NuFissionXS(domain=cell, domain_type='cell', groups=fine_groups)\n",
+ "nuscatter = mgxs.NuScatterMatrixXS(domain=cell, domain_type='cell', groups=fine_groups)\n",
+ "chi = mgxs.Chi(domain=cell, domain_type='cell', groups=fine_groups)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Each multi-group cross section object stores its tallies in a Python dictionary called `tallies`. We can inspect the tallies in the dictionary for our `NuFission` object as follows. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "OrderedDict([('flux', Tally\n",
+ "\tID =\t10000\n",
+ "\tName =\t\n",
+ "\tFilters =\t\n",
+ " \t\tcell\t[1]\n",
+ " \t\tenergy\t[ 0.00000000e+00 5.80000000e-08 1.40000000e-07 2.80000000e-07\n",
+ " 6.25000000e-07 4.00000000e-06 5.53000000e-03 8.21000000e-01\n",
+ " 2.00000000e+01]\n",
+ "\tNuclides =\ttotal \n",
+ "\tScores =\t['flux']\n",
+ "\tEstimator =\ttracklength\n",
+ "), ('nu-fission', Tally\n",
+ "\tID =\t10001\n",
+ "\tName =\t\n",
+ "\tFilters =\t\n",
+ " \t\tcell\t[1]\n",
+ " \t\tenergy\t[ 0.00000000e+00 5.80000000e-08 1.40000000e-07 2.80000000e-07\n",
+ " 6.25000000e-07 4.00000000e-06 5.53000000e-03 8.21000000e-01\n",
+ " 2.00000000e+01]\n",
+ "\tNuclides =\ttotal \n",
+ "\tScores =\t['nu-fission']\n",
+ "\tEstimator =\ttracklength\n",
+ ")])"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "nufission.tallies"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The `NuFission` object includes tracklength tallies for the 'nu-fission' and 'flux' scores in the 8-group structure in cell 1. Now that each multi-group cross section object contains the tallies that it needs, we must add these tallies to a `TalliesFile` object to generate the \"tallies.xml\" input file for OpenMC."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Instantiate an empty TalliesFile\n",
+ "tallies_file = openmc.TalliesFile()\n",
+ "\n",
+ "# Add transport tallies to the tallies file\n",
+ "for tally in transport.tallies.values():\n",
+ " tallies_file.add_tally(tally, merge=True)\n",
+ "\n",
+ "# Add nu-fission tallies to the tallies file\n",
+ "for tally in nufission.tallies.values():\n",
+ " tallies_file.add_tally(tally, merge=True)\n",
+ "\n",
+ "# Add nu-scatter tallies to the tallies file\n",
+ "for tally in nuscatter.tallies.values():\n",
+ " tallies_file.add_tally(tally, merge=True)\n",
+ "\n",
+ "# Add chi tallies to the tallies file \n",
+ "for tally in chi.tallies.values():\n",
+ " tallies_file.add_tally(tally, merge=True)\n",
+ " \n",
+ "# Export to \"tallies.xml\"\n",
+ "tallies_file.export_to_xml()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we a have a complete set of inputs, so we can go ahead and run our simulation."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ " .d88888b. 888b d888 .d8888b.\n",
+ " d88P\" \"Y88b 8888b d8888 d88P Y88b\n",
+ " 888 888 88888b.d88888 888 888\n",
+ " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n",
+ " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n",
+ " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n",
+ " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n",
+ " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n",
+ "__________________888______________________________________________________\n",
+ " 888\n",
+ " 888\n",
+ "\n",
+ " Copyright: 2011-2015 Massachusetts Institute of Technology\n",
+ " License: http://mit-crpg.github.io/openmc/license.html\n",
+ " Version: 0.7.0\n",
+ " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n",
+ " Date/Time: 2015-10-28 12:11:50\n",
+ " MPI Processes: 1\n",
+ "\n",
+ " ===========================================================================\n",
+ " ========================> INITIALIZATION <=========================\n",
+ " ===========================================================================\n",
+ "\n",
+ " Reading settings XML file...\n",
+ " Reading cross sections XML file...\n",
+ " Reading geometry XML file...\n",
+ " Reading materials XML file...\n",
+ " Reading tallies XML file...\n",
+ " Building neighboring cells lists for each surface...\n",
+ " Loading ACE cross section table: 1001.71c\n",
+ " Loading ACE cross section table: 8016.71c\n",
+ " Loading ACE cross section table: 92235.71c\n",
+ " Loading ACE cross section table: 92238.71c\n",
+ " Loading ACE cross section table: 40090.71c\n",
+ " Maximum neutron transport energy: 20.0000 MeV for 1001.71c\n",
+ " Initializing source particles...\n",
+ "\n",
+ " ===========================================================================\n",
+ " ====================> K EIGENVALUE SIMULATION <====================\n",
+ " ===========================================================================\n",
+ "\n",
+ " Bat./Gen. k Average k \n",
+ " ========= ======== ==================== \n",
+ " 1/1 1.19804 \n",
+ " 2/1 1.12945 \n",
+ " 3/1 1.15573 \n",
+ " 4/1 1.13929 \n",
+ " 5/1 1.16300 \n",
+ " 6/1 1.22117 \n",
+ " 7/1 1.19012 \n",
+ " 8/1 1.11299 \n",
+ " 9/1 1.16066 \n",
+ " 10/1 1.12566 \n",
+ " 11/1 1.20854 \n",
+ " 12/1 1.14691 1.17773 +/- 0.03082\n",
+ " 13/1 1.17204 1.17583 +/- 0.01789\n",
+ " 14/1 1.14148 1.16724 +/- 0.01529\n",
+ " 15/1 1.17272 1.16834 +/- 0.01189\n",
+ " 16/1 1.18575 1.17124 +/- 0.01014\n",
+ " 17/1 1.20498 1.17606 +/- 0.00983\n",
+ " 18/1 1.14754 1.17249 +/- 0.00923\n",
+ " 19/1 1.18141 1.17348 +/- 0.00820\n",
+ " 20/1 1.15074 1.17121 +/- 0.00768\n",
+ " 21/1 1.15914 1.17011 +/- 0.00703\n",
+ " 22/1 1.14586 1.16809 +/- 0.00673\n",
+ " 23/1 1.18999 1.16978 +/- 0.00642\n",
+ " 24/1 1.15101 1.16844 +/- 0.00609\n",
+ " 25/1 1.13791 1.16640 +/- 0.00602\n",
+ " 26/1 1.19791 1.16837 +/- 0.00597\n",
+ " 27/1 1.19818 1.17012 +/- 0.00587\n",
+ " 28/1 1.14160 1.16854 +/- 0.00576\n",
+ " 29/1 1.11487 1.16571 +/- 0.00614\n",
+ " 30/1 1.17538 1.16620 +/- 0.00584\n",
+ " 31/1 1.20210 1.16791 +/- 0.00581\n",
+ " 32/1 1.20078 1.16940 +/- 0.00574\n",
+ " 33/1 1.14624 1.16839 +/- 0.00558\n",
+ " 34/1 1.14618 1.16747 +/- 0.00542\n",
+ " 35/1 1.16866 1.16752 +/- 0.00520\n",
+ " 36/1 1.18565 1.16821 +/- 0.00504\n",
+ " 37/1 1.16824 1.16821 +/- 0.00485\n",
+ " 38/1 1.18299 1.16874 +/- 0.00471\n",
+ " 39/1 1.21418 1.17031 +/- 0.00480\n",
+ " 40/1 1.11167 1.16835 +/- 0.00504\n",
+ " 41/1 1.11545 1.16665 +/- 0.00516\n",
+ " 42/1 1.11114 1.16491 +/- 0.00529\n",
+ " 43/1 1.14227 1.16423 +/- 0.00517\n",
+ " 44/1 1.14104 1.16355 +/- 0.00506\n",
+ " 45/1 1.16756 1.16366 +/- 0.00492\n",
+ " 46/1 1.13065 1.16274 +/- 0.00487\n",
+ " 47/1 1.11251 1.16139 +/- 0.00492\n",
+ " 48/1 1.14731 1.16101 +/- 0.00481\n",
+ " 49/1 1.16691 1.16117 +/- 0.00469\n",
+ " 50/1 1.19679 1.16206 +/- 0.00465\n",
+ " Creating state point statepoint.50.h5...\n",
+ "\n",
+ " ===========================================================================\n",
+ " ======================> SIMULATION FINISHED <======================\n",
+ " ===========================================================================\n",
+ "\n",
+ "\n",
+ " =======================> TIMING STATISTICS <=======================\n",
+ "\n",
+ " Total time for initialization = 1.7630E+00 seconds\n",
+ " Reading cross sections = 4.0800E-01 seconds\n",
+ " Total time in simulation = 4.1757E+01 seconds\n",
+ " Time in transport only = 4.1713E+01 seconds\n",
+ " Time in inactive batches = 6.5950E+00 seconds\n",
+ " Time in active batches = 3.5162E+01 seconds\n",
+ " Time synchronizing fission bank = 1.0000E-02 seconds\n",
+ " Sampling source sites = 6.0000E-03 seconds\n",
+ " SEND/RECV source sites = 2.0000E-03 seconds\n",
+ " Time accumulating tallies = 1.0000E-03 seconds\n",
+ " Total time for finalization = 5.0000E-03 seconds\n",
+ " Total time elapsed = 4.3566E+01 seconds\n",
+ " Calculation Rate (inactive) = 3790.75 neutrons/second\n",
+ " Calculation Rate (active) = 2843.98 neutrons/second\n",
+ "\n",
+ " ============================> RESULTS <============================\n",
+ "\n",
+ " k-effective (Collision) = 1.16131 +/- 0.00453\n",
+ " k-effective (Track-length) = 1.16206 +/- 0.00465\n",
+ " k-effective (Absorption) = 1.16096 +/- 0.00364\n",
+ " Combined k-effective = 1.16120 +/- 0.00325\n",
+ " Leakage Fraction = 0.00000 +/- 0.00000\n",
+ "\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Run OpenMC!\n",
+ "executor = openmc.Executor()\n",
+ "executor.run_simulation()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Tally Data Processing"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Our simulation ran successfully and created a statepoint file with all the tally data in it. We begin our analysis here loading the statepoint file and 'reading' the results. By default, data from the statepoint file is only read into memory when it is requested. This helps keep the memory use to a minimum even when a statepoint file may be huge."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Load the last statepoint file\n",
+ "sp = openmc.StatePoint('statepoint.50.h5')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry which is necessary for the `openmc.mgxs` module to properly process the tally data. We first create a summary object and link it with the statepoint."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Load the summary file and link it with the statepoint\n",
+ "su = openmc.Summary('summary.h5')\n",
+ "sp.link_with_summary(su)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The statepoint is now ready to be analyzed by our multi-group cross sections. We simply have to load the tallies from the statepoint into each object as follows and our `MGXS` objects will compute the cross sections for us under-the-hood."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.py:1514: RuntimeWarning: invalid value encountered in true_divide\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Load the tallies from the statepoint into each MGXS object\n",
+ "transport.load_from_statepoint(sp)\n",
+ "nufission.load_from_statepoint(sp)\n",
+ "nuscatter.load_from_statepoint(sp)\n",
+ "chi.load_from_statepoint(sp)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Voila! Our multi-group cross sections are now ready to rock 'n roll!"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Cross Section Data Visualization"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's first inspect our fission production cross section by printing it to the screen."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Multi-Group XS\n",
+ "\tReaction Type =\tnu-fission\n",
+ "\tDomain Type =\tcell\n",
+ "\tDomain ID =\t1\n",
+ "\tCross Sections [cm^-1]:\n",
+ " Group 1 [0.821 - 20.0 MeV]:\t1.11e-02 +/- 7.69e-01%\n",
+ " Group 2 [0.00553 - 0.821 MeV]:\t6.59e-04 +/- 2.97e-01%\n",
+ " Group 3 [4e-06 - 0.00553 MeV]:\t8.95e-03 +/- 5.12e-01%\n",
+ " Group 4 [6.25e-07 - 4e-06 MeV]:\t1.45e-02 +/- 7.10e-01%\n",
+ " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t4.71e-02 +/- 1.02e+00%\n",
+ " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t7.29e-02 +/- 8.86e-01%\n",
+ " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t1.11e-01 +/- 6.67e-01%\n",
+ " Group 8 [0.0 - 5.8e-08 MeV]:\t2.38e-01 +/- 7.71e-01%\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "nufission.print_xs()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Since the `openmc.mgxs` module uses tally arithmetic under-the-hood, the cross section is stored as a \"derived\" tally. This means that it can be queried and manipulated using all of the same method supported for the `Tally` class in the OpenMC Python API. For example, we can construct a Pandas DataFrame of the multi-group cross section data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/mgxs/mgxs.py:1264: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " cell | \n",
+ " group in | \n",
+ " group out | \n",
+ " nuclide | \n",
+ " mean | \n",
+ " std. dev. | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 63 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " total | \n",
+ " 0.076913 | \n",
+ " 0.001013 | \n",
+ "
\n",
+ " \n",
+ " | 62 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 2 | \n",
+ " total | \n",
+ " 0.087715 | \n",
+ " 0.000343 | \n",
+ "
\n",
+ " \n",
+ " | 61 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 3 | \n",
+ " total | \n",
+ " 0.000417 | \n",
+ " 0.000023 | \n",
+ "
\n",
+ " \n",
+ " | 60 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 4 | \n",
+ " total | \n",
+ " 0.000000 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 59 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 5 | \n",
+ " total | \n",
+ " 0.000000 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 58 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 6 | \n",
+ " total | \n",
+ " 0.000000 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 57 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 7 | \n",
+ " total | \n",
+ " 0.000000 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 56 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 8 | \n",
+ " total | \n",
+ " 0.000000 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 55 | \n",
+ " 1 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " total | \n",
+ " 0.000000 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 54 | \n",
+ " 1 | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " total | \n",
+ " 0.266499 | \n",
+ " 0.001265 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " cell group in group out nuclide mean std. dev.\n",
+ "63 1 1 1 total 0.076913 0.001013\n",
+ "62 1 1 2 total 0.087715 0.000343\n",
+ "61 1 1 3 total 0.000417 0.000023\n",
+ "60 1 1 4 total 0.000000 0.000000\n",
+ "59 1 1 5 total 0.000000 0.000000\n",
+ "58 1 1 6 total 0.000000 0.000000\n",
+ "57 1 1 7 total 0.000000 0.000000\n",
+ "56 1 1 8 total 0.000000 0.000000\n",
+ "55 1 2 1 total 0.000000 0.000000\n",
+ "54 1 2 2 total 0.266499 0.001265"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df = nuscatter.get_pandas_dataframe()\n",
+ "df.head(10)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Each multi-group cross section object can be easily exported to a variety of file formats, including CSV, Excel, and LaTeX for storage or data processing."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "transport.export_xs_data(filename='transport-xs', format='excel')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The following code snippet shows how to export all of four cross sections to the same HDF5 binary data store."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "transport.build_hdf5_store(filename='mgxs', append=True)\n",
+ "nufission.build_hdf5_store(filename='mgxs', append=True)\n",
+ "nuscatter.build_hdf5_store(filename='mgxs', append=True)\n",
+ "chi.build_hdf5_store(filename='mgxs', append=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Verification with OpenMOC"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Of course it is always a good idea to verify that one's cross sections are accurate. We can easily do so here with the deterministic transport code OpenMOC. First, we will use OpenCG to reconstruct our OpenMC geometry from the summary file into a equivalent OpenMOC geometry."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Create an OpenCG Geometry from the OpenMC Geometry stored in the summary\n",
+ "su.make_opencg_geometry()\n",
+ "\n",
+ "# Create an OpenMOC Geometry from the OpenCG Geometry\n",
+ "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now, we can inject the multi-group cross sections into the equivalent infinite homogeneous medium OpenMOC geometry."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Get all OpenMOC cells in the gometry\n",
+ "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n",
+ "\n",
+ "# Inject multi-group cross sections into OpenMOC Materials\n",
+ "for cell_id, cell in openmoc_cells.items():\n",
+ " \n",
+ " # Get a reference to the Material filling this Cell\n",
+ " openmoc_material = cell.getFillMaterial()\n",
+ " \n",
+ " # Set the number of energy groups for the Material\n",
+ " openmoc_material.setNumEnergyGroups(fine_groups.num_groups)\n",
+ " \n",
+ " # Inject NumPy arrays of cross section data into the Material\n",
+ " openmoc_material.setSigmaT(transport.get_xs().flatten())\n",
+ " openmoc_material.setNuSigmaF(nufission.get_xs().flatten())\n",
+ " openmoc_material.setSigmaS(nuscatter.get_xs().flatten())\n",
+ " openmoc_material.setChi(chi.get_xs().flatten())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We are now ready to run OpenMOC to verify our cross-sections from OpenMC."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[ NORMAL ] Ray tracing for track segmentation...\n",
+ "[ NORMAL ] Dumping tracks to file...\n",
+ "[ NORMAL ] Computing the eigenvalue...\n",
+ "[ NORMAL ] Iteration 0:\tk_eff = 0.685182\tres = 9.665E-317\n",
+ "[ NORMAL ] Iteration 1:\tk_eff = 0.785638\tres = 3.148E-01\n",
+ "[ NORMAL ] Iteration 2:\tk_eff = 0.750178\tres = 1.466E-01\n",
+ "[ NORMAL ] Iteration 3:\tk_eff = 0.728835\tres = 4.513E-02\n",
+ "[ NORMAL ] Iteration 4:\tk_eff = 0.695616\tres = 2.845E-02\n",
+ "[ NORMAL ] Iteration 5:\tk_eff = 0.663332\tres = 4.558E-02\n",
+ "[ NORMAL ] Iteration 6:\tk_eff = 0.632306\tres = 4.641E-02\n",
+ "[ NORMAL ] Iteration 7:\tk_eff = 0.604144\tres = 4.677E-02\n",
+ "[ NORMAL ] Iteration 8:\tk_eff = 0.579394\tres = 4.454E-02\n",
+ "[ NORMAL ] Iteration 9:\tk_eff = 0.558403\tres = 4.097E-02\n",
+ "[ NORMAL ] Iteration 10:\tk_eff = 0.541346\tres = 3.623E-02\n",
+ "[ NORMAL ] Iteration 11:\tk_eff = 0.528269\tres = 3.055E-02\n",
+ "[ NORMAL ] Iteration 12:\tk_eff = 0.519137\tres = 2.416E-02\n",
+ "[ NORMAL ] Iteration 13:\tk_eff = 0.513827\tres = 1.729E-02\n",
+ "[ NORMAL ] Iteration 14:\tk_eff = 0.512169\tres = 1.023E-02\n",
+ "[ NORMAL ] Iteration 15:\tk_eff = 0.513941\tres = 3.227E-03\n",
+ "[ NORMAL ] Iteration 16:\tk_eff = 0.518887\tres = 3.460E-03\n",
+ "[ NORMAL ] Iteration 17:\tk_eff = 0.526728\tres = 9.623E-03\n",
+ "[ NORMAL ] Iteration 18:\tk_eff = 0.537170\tres = 1.511E-02\n",
+ "[ NORMAL ] Iteration 19:\tk_eff = 0.549909\tres = 1.982E-02\n",
+ "[ NORMAL ] Iteration 20:\tk_eff = 0.564646\tres = 2.372E-02\n",
+ "[ NORMAL ] Iteration 21:\tk_eff = 0.581084\tres = 2.680E-02\n",
+ "[ NORMAL ] Iteration 22:\tk_eff = 0.598939\tres = 2.911E-02\n",
+ "[ NORMAL ] Iteration 23:\tk_eff = 0.617940\tres = 3.073E-02\n",
+ "[ NORMAL ] Iteration 24:\tk_eff = 0.637834\tres = 3.172E-02\n",
+ "[ NORMAL ] Iteration 25:\tk_eff = 0.658386\tres = 3.219E-02\n",
+ "[ NORMAL ] Iteration 26:\tk_eff = 0.679382\tres = 3.222E-02\n",
+ "[ NORMAL ] Iteration 27:\tk_eff = 0.700626\tres = 3.189E-02\n",
+ "[ NORMAL ] Iteration 28:\tk_eff = 0.721946\tres = 3.127E-02\n",
+ "[ NORMAL ] Iteration 29:\tk_eff = 0.743187\tres = 3.043E-02\n",
+ "[ NORMAL ] Iteration 30:\tk_eff = 0.764215\tres = 2.942E-02\n",
+ "[ NORMAL ] Iteration 31:\tk_eff = 0.784913\tres = 2.829E-02\n",
+ "[ NORMAL ] Iteration 32:\tk_eff = 0.805184\tres = 2.708E-02\n",
+ "[ NORMAL ] Iteration 33:\tk_eff = 0.824944\tres = 2.583E-02\n",
+ "[ NORMAL ] Iteration 34:\tk_eff = 0.844126\tres = 2.454E-02\n",
+ "[ NORMAL ] Iteration 35:\tk_eff = 0.862675\tres = 2.325E-02\n",
+ "[ NORMAL ] Iteration 36:\tk_eff = 0.880550\tres = 2.197E-02\n",
+ "[ NORMAL ] Iteration 37:\tk_eff = 0.897720\tres = 2.072E-02\n",
+ "[ NORMAL ] Iteration 38:\tk_eff = 0.914163\tres = 1.950E-02\n",
+ "[ NORMAL ] Iteration 39:\tk_eff = 0.929867\tres = 1.832E-02\n",
+ "[ NORMAL ] Iteration 40:\tk_eff = 0.944826\tres = 1.718E-02\n",
+ "[ NORMAL ] Iteration 41:\tk_eff = 0.959043\tres = 1.609E-02\n",
+ "[ NORMAL ] Iteration 42:\tk_eff = 0.972524\tres = 1.505E-02\n",
+ "[ NORMAL ] Iteration 43:\tk_eff = 0.985280\tres = 1.406E-02\n",
+ "[ NORMAL ] Iteration 44:\tk_eff = 0.997328\tres = 1.312E-02\n",
+ "[ NORMAL ] Iteration 45:\tk_eff = 1.008685\tres = 1.223E-02\n",
+ "[ NORMAL ] Iteration 46:\tk_eff = 1.019373\tres = 1.139E-02\n",
+ "[ NORMAL ] Iteration 47:\tk_eff = 1.029415\tres = 1.060E-02\n",
+ "[ NORMAL ] Iteration 48:\tk_eff = 1.038836\tres = 9.851E-03\n",
+ "[ NORMAL ] Iteration 49:\tk_eff = 1.047661\tres = 9.152E-03\n",
+ "[ NORMAL ] Iteration 50:\tk_eff = 1.055917\tres = 8.495E-03\n",
+ "[ NORMAL ] Iteration 51:\tk_eff = 1.063631\tres = 7.881E-03\n",
+ "[ NORMAL ] Iteration 52:\tk_eff = 1.070830\tres = 7.306E-03\n",
+ "[ NORMAL ] Iteration 53:\tk_eff = 1.077540\tres = 6.768E-03\n",
+ "[ NORMAL ] Iteration 54:\tk_eff = 1.083788\tres = 6.266E-03\n",
+ "[ NORMAL ] Iteration 55:\tk_eff = 1.089599\tres = 5.798E-03\n",
+ "[ NORMAL ] Iteration 56:\tk_eff = 1.094999\tres = 5.362E-03\n",
+ "[ NORMAL ] Iteration 57:\tk_eff = 1.100012\tres = 4.956E-03\n",
+ "[ NORMAL ] Iteration 58:\tk_eff = 1.104662\tres = 4.578E-03\n",
+ "[ NORMAL ] Iteration 59:\tk_eff = 1.108971\tres = 4.227E-03\n",
+ "[ NORMAL ] Iteration 60:\tk_eff = 1.112961\tres = 3.901E-03\n",
+ "[ NORMAL ] Iteration 61:\tk_eff = 1.116653\tres = 3.598E-03\n",
+ "[ NORMAL ] Iteration 62:\tk_eff = 1.120066\tres = 3.317E-03\n",
+ "[ NORMAL ] Iteration 63:\tk_eff = 1.123220\tres = 3.057E-03\n",
+ "[ NORMAL ] Iteration 64:\tk_eff = 1.126132\tres = 2.816E-03\n",
+ "[ NORMAL ] Iteration 65:\tk_eff = 1.128819\tres = 2.593E-03\n",
+ "[ NORMAL ] Iteration 66:\tk_eff = 1.131297\tres = 2.386E-03\n",
+ "[ NORMAL ] Iteration 67:\tk_eff = 1.133581\tres = 2.195E-03\n",
+ "[ NORMAL ] Iteration 68:\tk_eff = 1.135684\tres = 2.019E-03\n",
+ "[ NORMAL ] Iteration 69:\tk_eff = 1.137621\tres = 1.856E-03\n",
+ "[ NORMAL ] Iteration 70:\tk_eff = 1.139403\tres = 1.705E-03\n",
+ "[ NORMAL ] Iteration 71:\tk_eff = 1.141042\tres = 1.566E-03\n",
+ "[ NORMAL ] Iteration 72:\tk_eff = 1.142549\tres = 1.438E-03\n",
+ "[ NORMAL ] Iteration 73:\tk_eff = 1.143933\tres = 1.320E-03\n",
+ "[ NORMAL ] Iteration 74:\tk_eff = 1.145204\tres = 1.212E-03\n",
+ "[ NORMAL ] Iteration 75:\tk_eff = 1.146372\tres = 1.111E-03\n",
+ "[ NORMAL ] Iteration 76:\tk_eff = 1.147443\tres = 1.019E-03\n",
+ "[ NORMAL ] Iteration 77:\tk_eff = 1.148426\tres = 9.345E-04\n",
+ "[ NORMAL ] Iteration 78:\tk_eff = 1.149327\tres = 8.564E-04\n",
+ "[ NORMAL ] Iteration 79:\tk_eff = 1.150153\tres = 7.847E-04\n",
+ "[ NORMAL ] Iteration 80:\tk_eff = 1.150910\tres = 7.188E-04\n",
+ "[ NORMAL ] Iteration 81:\tk_eff = 1.151604\tres = 6.582E-04\n",
+ "[ NORMAL ] Iteration 82:\tk_eff = 1.152239\tres = 6.026E-04\n",
+ "[ NORMAL ] Iteration 83:\tk_eff = 1.152820\tres = 5.516E-04\n",
+ "[ NORMAL ] Iteration 84:\tk_eff = 1.153353\tres = 5.047E-04\n",
+ "[ NORMAL ] Iteration 85:\tk_eff = 1.153840\tres = 4.617E-04\n",
+ "[ NORMAL ] Iteration 86:\tk_eff = 1.154285\tres = 4.223E-04\n",
+ "[ NORMAL ] Iteration 87:\tk_eff = 1.154693\tres = 3.862E-04\n",
+ "[ NORMAL ] Iteration 88:\tk_eff = 1.155065\tres = 3.530E-04\n",
+ "[ NORMAL ] Iteration 89:\tk_eff = 1.155406\tres = 3.227E-04\n",
+ "[ NORMAL ] Iteration 90:\tk_eff = 1.155717\tres = 2.949E-04\n",
+ "[ NORMAL ] Iteration 91:\tk_eff = 1.156002\tres = 2.694E-04\n",
+ "[ NORMAL ] Iteration 92:\tk_eff = 1.156262\tres = 2.461E-04\n",
+ "[ NORMAL ] Iteration 93:\tk_eff = 1.156499\tres = 2.248E-04\n",
+ "[ NORMAL ] Iteration 94:\tk_eff = 1.156716\tres = 2.053E-04\n",
+ "[ NORMAL ] Iteration 95:\tk_eff = 1.156914\tres = 1.874E-04\n",
+ "[ NORMAL ] Iteration 96:\tk_eff = 1.157094\tres = 1.711E-04\n",
+ "[ NORMAL ] Iteration 97:\tk_eff = 1.157259\tres = 1.561E-04\n",
+ "[ NORMAL ] Iteration 98:\tk_eff = 1.157409\tres = 1.425E-04\n",
+ "[ NORMAL ] Iteration 99:\tk_eff = 1.157547\tres = 1.300E-04\n",
+ "[ NORMAL ] Iteration 100:\tk_eff = 1.157672\tres = 1.186E-04\n",
+ "[ NORMAL ] Iteration 101:\tk_eff = 1.157786\tres = 1.082E-04\n",
+ "[ NORMAL ] Iteration 102:\tk_eff = 1.157890\tres = 9.868E-05\n",
+ "[ NORMAL ] Iteration 103:\tk_eff = 1.157985\tres = 8.998E-05\n",
+ "[ NORMAL ] Iteration 104:\tk_eff = 1.158072\tres = 8.205E-05\n",
+ "[ NORMAL ] Iteration 105:\tk_eff = 1.158151\tres = 7.480E-05\n",
+ "[ NORMAL ] Iteration 106:\tk_eff = 1.158223\tres = 6.819E-05\n",
+ "[ NORMAL ] Iteration 107:\tk_eff = 1.158289\tres = 6.216E-05\n",
+ "[ NORMAL ] Iteration 108:\tk_eff = 1.158348\tres = 5.665E-05\n",
+ "[ NORMAL ] Iteration 109:\tk_eff = 1.158403\tres = 5.162E-05\n",
+ "[ NORMAL ] Iteration 110:\tk_eff = 1.158453\tres = 4.704E-05\n",
+ "[ NORMAL ] Iteration 111:\tk_eff = 1.158498\tres = 4.286E-05\n",
+ "[ NORMAL ] Iteration 112:\tk_eff = 1.158539\tres = 3.904E-05\n",
+ "[ NORMAL ] Iteration 113:\tk_eff = 1.158577\tres = 3.557E-05\n",
+ "[ NORMAL ] Iteration 114:\tk_eff = 1.158611\tres = 3.240E-05\n",
+ "[ NORMAL ] Iteration 115:\tk_eff = 1.158642\tres = 2.951E-05\n",
+ "[ NORMAL ] Iteration 116:\tk_eff = 1.158670\tres = 2.687E-05\n",
+ "[ NORMAL ] Iteration 117:\tk_eff = 1.158696\tres = 2.447E-05\n",
+ "[ NORMAL ] Iteration 118:\tk_eff = 1.158720\tres = 2.228E-05\n",
+ "[ NORMAL ] Iteration 119:\tk_eff = 1.158741\tres = 2.029E-05\n",
+ "[ NORMAL ] Iteration 120:\tk_eff = 1.158760\tres = 1.847E-05\n",
+ "[ NORMAL ] Iteration 121:\tk_eff = 1.158778\tres = 1.682E-05\n",
+ "[ NORMAL ] Iteration 122:\tk_eff = 1.158794\tres = 1.531E-05\n",
+ "[ NORMAL ] Iteration 123:\tk_eff = 1.158809\tres = 1.393E-05\n",
+ "[ NORMAL ] Iteration 124:\tk_eff = 1.158822\tres = 1.268E-05\n",
+ "[ NORMAL ] Iteration 125:\tk_eff = 1.158835\tres = 1.154E-05\n",
+ "[ NORMAL ] Iteration 126:\tk_eff = 1.158846\tres = 1.051E-05\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Generate tracks for OpenMOC\n",
+ "openmoc_geometry.initializeFlatSourceRegions()\n",
+ "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n",
+ "track_generator.generateTracks()\n",
+ "\n",
+ "# Run OpenMOC\n",
+ "solver = openmoc.CPUSolver(track_generator)\n",
+ "solver.computeEigenvalue()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We report the eigenvalues computed by OpenMC and OpenMOC here together to summarize our results."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "openmc keff = 1.161200\n",
+ "openmoc keff = 1.158846\n",
+ "bias [pcm]: -235.5\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Print report of keff and bias with OpenMC\n",
+ "openmoc_keff = solver.getKeff()\n",
+ "openmc_keff = sp.k_combined[0]\n",
+ "bias = (openmoc_keff - openmc_keff) * 1e5\n",
+ "\n",
+ "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n",
+ "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n",
+ "print('bias [pcm]: {0:1.1f}'.format(bias))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Although there is a non-trivial bias, one can easily run the preceding code with more particle histories to show that both codes converge to the same eigenvalue with <10 pcm bias. It should be noted that this discrepancy is due to use of tracklength tallies for `NuFission`, while one must use more slowly converging analog tallies for `TransportXS`, `NuScatterMatrixXS` and `Chi` (which require an 'energyout' filter)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Fuel Pin Cell"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this section we show how to compute multi-group cross sections for a fuel pin cell. In addition, we will illustrate how to use some of the more advanced features in `openmc.mgxs` such as nuclide-by-nuclide microscopic cross section tallies and downstream energy group condensation."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Generate Inputs"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "this time we separate our nuclides into three distinct materials for water, clad and fuel."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# 1.6 enriched fuel\n",
+ "fuel = openmc.Material(name='1.6% Fuel')\n",
+ "fuel.set_density('g/cm3', 10.31341)\n",
+ "fuel.add_nuclide(u235, 3.7503e-4)\n",
+ "fuel.add_nuclide(u238, 2.2625e-2)\n",
+ "fuel.add_nuclide(o16, 4.6007e-2)\n",
+ "\n",
+ "# borated water\n",
+ "water = openmc.Material(name='Borated Water')\n",
+ "water.set_density('g/cm3', 0.740582)\n",
+ "water.add_nuclide(h1, 4.9457e-2)\n",
+ "water.add_nuclide(o16, 2.4732e-2)\n",
+ "\n",
+ "# zircaloy\n",
+ "zircaloy = openmc.Material(name='Zircaloy')\n",
+ "zircaloy.set_density('g/cm3', 6.55)\n",
+ "zircaloy.add_nuclide(zr90, 7.2758e-3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "With our materials, we can now create a materials file object that can be exported to an actual XML file."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Instantiate a MaterialsFile, add Materials\n",
+ "materials_file = openmc.MaterialsFile()\n",
+ "materials_file.add_material(fuel)\n",
+ "materials_file.add_material(water)\n",
+ "materials_file.add_material(zircaloy)\n",
+ "materials_file.default_xs = '71c'\n",
+ "\n",
+ "# Export to \"materials.xml\"\n",
+ "materials_file.export_to_xml()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now let's move on to the geometry. Our problem will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces -- in this case two cylinders and six reflective planes."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Create cylinders for the fuel and clad\n",
+ "fuel_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.39218)\n",
+ "clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720)\n",
+ "\n",
+ "# Create boundary planes to surround the geometry\n",
+ "# Use both reflective and vacuum boundaries to make life interesting\n",
+ "min_x = openmc.XPlane(x0=-0.63, boundary_type='reflective')\n",
+ "max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective')\n",
+ "min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective')\n",
+ "max_y = openmc.YPlane(y0=+0.63, boundary_type='reflective')\n",
+ "min_z = openmc.ZPlane(z0=-0.63, boundary_type='reflective')\n",
+ "max_z = openmc.ZPlane(z0=+0.63, boundary_type='reflective')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "With the surfaces defined, we can now create cells that are defined by intersections of half-spaces created by the surfaces."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Create a Universe to encapsulate a fuel pin\n",
+ "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n",
+ "\n",
+ "# Create fuel Cell\n",
+ "fuel_cell = openmc.Cell(name='1.6% Fuel')\n",
+ "fuel_cell.fill = fuel\n",
+ "fuel_cell.region = -fuel_outer_radius\n",
+ "pin_cell_universe.add_cell(fuel_cell)\n",
+ "\n",
+ "# Create a clad Cell\n",
+ "clad_cell = openmc.Cell(name='1.6% Clad')\n",
+ "clad_cell.fill = zircaloy\n",
+ "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n",
+ "pin_cell_universe.add_cell(clad_cell)\n",
+ "\n",
+ "# Create a moderator Cell\n",
+ "moderator_cell = openmc.Cell(name='1.6% Moderator')\n",
+ "moderator_cell.fill = water\n",
+ "moderator_cell.region = +clad_outer_radius\n",
+ "pin_cell_universe.add_cell(moderator_cell)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "OpenMC requires that there is a \"root\" universe. Let us create a root cell that is filled by the pin cell universe and then assign it to the root universe."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Create root Cell\n",
+ "root_cell = openmc.Cell(name='root cell')\n",
+ "root_cell.region = +min_x & -max_x & +min_y & -max_y\n",
+ "root_cell.fill = pin_cell_universe\n",
+ "\n",
+ "# Create root Universe\n",
+ "root_universe = openmc.Universe(universe_id=0, name='root universe')\n",
+ "root_universe.add_cell(root_cell)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We now must create a geometry that is assigned a root universe, put the geometry into a geometry file, and export it to XML."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Create Geometry and set root Universe\n",
+ "openmc_geometry = openmc.Geometry()\n",
+ "openmc_geometry.root_universe = root_universe\n",
+ "\n",
+ "# Instantiate a GeometryFile\n",
+ "geometry_file = openmc.GeometryFile()\n",
+ "geometry_file.geometry = openmc_geometry\n",
+ "\n",
+ "# Export to \"geometry.xml\"\n",
+ "geometry_file.export_to_xml()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We will reuse our settings from the previous simulation. Now, we let's create transport, nu-fission, nu-scatter and chi multi-group cross sections for each cell."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Extract all Cells filled by Materials\n",
+ "openmc_cells = openmc_geometry.get_all_material_cells()\n",
+ "\n",
+ "# Create dictionary to store multi-group cross sections for all cells\n",
+ "xs_library = {}\n",
+ "\n",
+ "# Instantiate 8-group cross sections for each cell\n",
+ "for cell in openmc_cells:\n",
+ " xs_library[cell.id] = {}\n",
+ " xs_library[cell.id]['transport'] = mgxs.TransportXS(groups=fine_groups)\n",
+ " xs_library[cell.id]['nu-fission'] = mgxs.NuFissionXS(groups=fine_groups)\n",
+ " xs_library[cell.id]['nu-scatter'] = mgxs.NuScatterMatrixXS(groups=fine_groups)\n",
+ " xs_library[cell.id]['chi'] = mgxs.Chi(groups=fine_groups)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Create a tally trigger set to +/- 0.01 for each tally\n",
+ "# used to compute the multi-group cross sections\n",
+ "tally_trigger = openmc.Trigger('std_dev', 1E-2)\n",
+ "\n",
+ "# Add the tally trigger to each of the multi-group cross section tallies\n",
+ "for cell in openmc_cells:\n",
+ " for mgxs_type in xs_library[cell.id]:\n",
+ " xs_library[cell.id][mgxs_type].tally_trigger = tally_trigger\n",
+ " \n",
+ "# Set the trigger to active in the \"settings.xml\" file\n",
+ "settings_file.trigger_active = True\n",
+ "settings_file.particles *= 4\n",
+ "settings_file.trigger_max_batches = settings_file.batches * 4\n",
+ "settings_file.export_to_xml()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this case, we did not give our cross sections a spatial domain in their constructors. Instead, we will loop over all cells to set each cross sections domain. In addition, we will set each cross section to tally cross sections on a per-nuclide basis through the use of the `by_nuclide` instance attribute. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Instantiate an empty TalliesFile\n",
+ "tallies_file = openmc.TalliesFile()\n",
+ "\n",
+ "# Iterate over all cells and cross section types\n",
+ "for cell in openmc_cells:\n",
+ " for rxn_type in xs_library[cell.id]:\n",
+ "\n",
+ " # Set the cross sections domain type to the cell\n",
+ " xs_library[cell.id][rxn_type].domain = cell\n",
+ " xs_library[cell.id][rxn_type].domain_type = 'cell'\n",
+ " \n",
+ " # Tally cross sections by nuclide (e.g., micro cross sections)\n",
+ " xs_library[cell.id][rxn_type].by_nuclide = True\n",
+ " \n",
+ " # Add OpenMC tallies to the tallies file for XML generation\n",
+ " for tally in xs_library[cell.id][rxn_type].tallies.values():\n",
+ " tallies_file.add_tally(tally, merge=True)\n",
+ "\n",
+ "# Export to \"tallies.xml\"\n",
+ "tallies_file.export_to_xml()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we a have a complete set of inputs, so we can go ahead and run our simulation."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ " .d88888b. 888b d888 .d8888b.\n",
+ " d88P\" \"Y88b 8888b d8888 d88P Y88b\n",
+ " 888 888 88888b.d88888 888 888\n",
+ " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n",
+ " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n",
+ " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n",
+ " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n",
+ " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n",
+ "__________________888______________________________________________________\n",
+ " 888\n",
+ " 888\n",
+ "\n",
+ " Copyright: 2011-2015 Massachusetts Institute of Technology\n",
+ " License: http://mit-crpg.github.io/openmc/license.html\n",
+ " Version: 0.7.0\n",
+ " Git SHA1: 21738db07debeabde824c9b955bd3bf0c9a16366\n",
+ " Date/Time: 2015-10-28 12:12:36\n",
+ " MPI Processes: 1\n",
+ "\n",
+ " ===========================================================================\n",
+ " ========================> INITIALIZATION <=========================\n",
+ " ===========================================================================\n",
+ "\n",
+ " Reading settings XML file...\n",
+ " Reading cross sections XML file...\n",
+ " Reading geometry XML file...\n",
+ " Reading materials XML file...\n",
+ " Reading tallies XML file...\n",
+ " Building neighboring cells lists for each surface...\n",
+ " Loading ACE cross section table: 92235.71c\n",
+ " Loading ACE cross section table: 92238.71c\n",
+ " Loading ACE cross section table: 8016.71c\n",
+ " Loading ACE cross section table: 1001.71c\n",
+ " Loading ACE cross section table: 40090.71c\n",
+ " Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n",
+ " Initializing source particles...\n",
+ "\n",
+ " ===========================================================================\n",
+ " ====================> K EIGENVALUE SIMULATION <====================\n",
+ " ===========================================================================\n",
+ "\n",
+ " Bat./Gen. k Average k \n",
+ " ========= ======== ==================== \n",
+ " 1/1 1.23985 \n",
+ " 2/1 1.24082 \n",
+ " 3/1 1.22031 \n",
+ " 4/1 1.21649 \n",
+ " 5/1 1.23229 \n",
+ " 6/1 1.21957 \n",
+ " 7/1 1.22515 \n",
+ " 8/1 1.21309 \n",
+ " 9/1 1.23939 \n",
+ " 10/1 1.23865 \n",
+ " 11/1 1.22776 \n",
+ " 12/1 1.21661 1.22219 +/- 0.00558\n",
+ " 13/1 1.22202 1.22213 +/- 0.00322\n",
+ " 14/1 1.23251 1.22473 +/- 0.00345\n",
+ " 15/1 1.23965 1.22771 +/- 0.00401\n",
+ " 16/1 1.21441 1.22549 +/- 0.00395\n",
+ " 17/1 1.23348 1.22663 +/- 0.00353\n",
+ " 18/1 1.21121 1.22471 +/- 0.00361\n",
+ " 19/1 1.20506 1.22252 +/- 0.00386\n",
+ " 20/1 1.22275 1.22255 +/- 0.00346\n",
+ " 21/1 1.21700 1.22204 +/- 0.00317\n",
+ " 22/1 1.20841 1.22091 +/- 0.00311\n",
+ " 23/1 1.21302 1.22030 +/- 0.00292\n",
+ " 24/1 1.22504 1.22064 +/- 0.00272\n",
+ " 25/1 1.22325 1.22081 +/- 0.00254\n",
+ " 26/1 1.22988 1.22138 +/- 0.00244\n",
+ " 27/1 1.21374 1.22093 +/- 0.00234\n",
+ " 28/1 1.21434 1.22056 +/- 0.00224\n",
+ " 29/1 1.24678 1.22194 +/- 0.00253\n",
+ " 30/1 1.22600 1.22215 +/- 0.00240\n",
+ " 31/1 1.22783 1.22242 +/- 0.00230\n",
+ " 32/1 1.23107 1.22281 +/- 0.00223\n",
+ " 33/1 1.23041 1.22314 +/- 0.00216\n",
+ " 34/1 1.21147 1.22266 +/- 0.00212\n",
+ " 35/1 1.23184 1.22302 +/- 0.00207\n",
+ " 36/1 1.22513 1.22310 +/- 0.00199\n",
+ " 37/1 1.22969 1.22335 +/- 0.00193\n",
+ " 38/1 1.21288 1.22297 +/- 0.00190\n",
+ " 39/1 1.23967 1.22355 +/- 0.00192\n",
+ " 40/1 1.21419 1.22324 +/- 0.00188\n",
+ " 41/1 1.23212 1.22352 +/- 0.00184\n",
+ " 42/1 1.20703 1.22301 +/- 0.00185\n",
+ " 43/1 1.24153 1.22357 +/- 0.00188\n",
+ " 44/1 1.23561 1.22392 +/- 0.00186\n",
+ " 45/1 1.20369 1.22335 +/- 0.00190\n",
+ " 46/1 1.24517 1.22395 +/- 0.00194\n",
+ " 47/1 1.22985 1.22411 +/- 0.00189\n",
+ " 48/1 1.23570 1.22442 +/- 0.00187\n",
+ " 49/1 1.22288 1.22438 +/- 0.00182\n",
+ " 50/1 1.20470 1.22389 +/- 0.00184\n",
+ " Triggers unsatisfied, max unc./thresh. is 1.18932 for flux in tally 10080\n",
+ " The estimated number of batches is 67\n",
+ " Creating state point statepoint.050.h5...\n",
+ " 51/1 1.24158 1.22432 +/- 0.00185\n",
+ " 52/1 1.24407 1.22479 +/- 0.00186\n",
+ " 53/1 1.23412 1.22500 +/- 0.00183\n",
+ " 54/1 1.25172 1.22561 +/- 0.00189\n",
+ " 55/1 1.22653 1.22563 +/- 0.00185\n",
+ " 56/1 1.24741 1.22610 +/- 0.00187\n",
+ " 57/1 1.24342 1.22647 +/- 0.00186\n",
+ " 58/1 1.20365 1.22600 +/- 0.00189\n",
+ " 59/1 1.23576 1.22620 +/- 0.00186\n",
+ " 60/1 1.21398 1.22595 +/- 0.00184\n",
+ " 61/1 1.22186 1.22587 +/- 0.00180\n",
+ " 62/1 1.23502 1.22605 +/- 0.00178\n",
+ " 63/1 1.23328 1.22618 +/- 0.00175\n",
+ " 64/1 1.23990 1.22644 +/- 0.00173\n",
+ " 65/1 1.23283 1.22655 +/- 0.00171\n",
+ " 66/1 1.21605 1.22637 +/- 0.00169\n",
+ " 67/1 1.22322 1.22631 +/- 0.00166\n",
+ " Triggers satisfied for batch 67\n",
+ " Creating state point statepoint.067.h5...\n",
+ "\n",
+ " ===========================================================================\n",
+ " ======================> SIMULATION FINISHED <======================\n",
+ " ===========================================================================\n",
+ "\n",
+ "\n",
+ " =======================> TIMING STATISTICS <=======================\n",
+ "\n",
+ " Total time for initialization = 1.2980E+00 seconds\n",
+ " Reading cross sections = 3.1700E-01 seconds\n",
+ " Total time in simulation = 6.3378E+02 seconds\n",
+ " Time in transport only = 6.3364E+02 seconds\n",
+ " Time in inactive batches = 4.2049E+01 seconds\n",
+ " Time in active batches = 5.9173E+02 seconds\n",
+ " Time synchronizing fission bank = 5.4000E-02 seconds\n",
+ " Sampling source sites = 3.9000E-02 seconds\n",
+ " SEND/RECV source sites = 1.5000E-02 seconds\n",
+ " Time accumulating tallies = 4.0000E-03 seconds\n",
+ " Total time for finalization = 2.5000E-02 seconds\n",
+ " Total time elapsed = 6.3523E+02 seconds\n",
+ " Calculation Rate (inactive) = 2378.18 neutrons/second\n",
+ " Calculation Rate (active) = 675.978 neutrons/second\n",
+ "\n",
+ " ============================> RESULTS <============================\n",
+ "\n",
+ " k-effective (Collision) = 1.22548 +/- 0.00143\n",
+ " k-effective (Track-length) = 1.22631 +/- 0.00166\n",
+ " k-effective (Absorption) = 1.22204 +/- 0.00138\n",
+ " Combined k-effective = 1.22386 +/- 0.00114\n",
+ " Leakage Fraction = 0.00000 +/- 0.00000\n",
+ "\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 35,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Delete old HDF5 files\n",
+ "!rm *.h5\n",
+ "\n",
+ "# Run OpenMC with the output throttled!\n",
+ "executor = openmc.Executor()\n",
+ "executor.run_simulation(output=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Tally Data Processing"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Our simulation ran successfully and created a statepoint file with all the tally data in it. As before, we begin our analysis here loading the statepoint file."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Load the last statepoint and summary files\n",
+ "sp = openmc.StatePoint('statepoint.067.h5')\n",
+ "su = openmc.Summary('summary.h5')\n",
+ "sp.link_with_summary(su)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The statepoint is now ready to be analyzed by our multi-group cross sections. Next, we load the tallies from the statepoint into each object and to compute the cross sections using tally arithmetic."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Iterate over all cells and cross section types\n",
+ "for cell in openmc_cells:\n",
+ " for rxn_type in xs_library[cell.id]:\n",
+ " xs_library[cell.id][rxn_type].load_from_statepoint(sp)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "That's it! Our multi-group cross sections are now ready for the big spotlight. This time we have cross sections in three distinct spatial zones - fuel, clad and moderator - on a per-nuclide basis."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Cross Section Data Visualization"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's first inspect one of our cross sections by printing it to the screen as a microscopic cross section in units of barns."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Multi-Group XS\n",
+ "\tReaction Type =\tnu-fission\n",
+ "\tDomain Type =\tcell\n",
+ "\tDomain ID =\t10000\n",
+ "\tNuclide =\tU-235\n",
+ "\tCross Sections [barns]:\n",
+ " Group 1 [0.821 - 20.0 MeV]:\t3.31e+00 +/- 2.13e-01%\n",
+ " Group 2 [0.00553 - 0.821 MeV]:\t3.96e+00 +/- 1.54e-01%\n",
+ " Group 3 [4e-06 - 0.00553 MeV]:\t5.51e+01 +/- 2.36e-01%\n",
+ " Group 4 [6.25e-07 - 4e-06 MeV]:\t8.83e+01 +/- 3.76e-01%\n",
+ " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t2.89e+02 +/- 4.10e-01%\n",
+ " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t4.49e+02 +/- 4.94e-01%\n",
+ " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t6.87e+02 +/- 3.44e-01%\n",
+ " Group 8 [0.0 - 5.8e-08 MeV]:\t1.44e+03 +/- 2.37e-01%\n",
+ "\n",
+ "\tNuclide =\tU-238\n",
+ "\tCross Sections [barns]:\n",
+ " Group 1 [0.821 - 20.0 MeV]:\t1.06e+00 +/- 2.47e-01%\n",
+ " Group 2 [0.00553 - 0.821 MeV]:\t1.21e-03 +/- 3.07e-01%\n",
+ " Group 3 [4e-06 - 0.00553 MeV]:\t5.72e-04 +/- 3.47e+00%\n",
+ " Group 4 [6.25e-07 - 4e-06 MeV]:\t6.54e-06 +/- 3.29e-01%\n",
+ " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.07e-05 +/- 4.20e-01%\n",
+ " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.55e-05 +/- 4.94e-01%\n",
+ " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.30e-05 +/- 3.44e-01%\n",
+ " Group 8 [0.0 - 5.8e-08 MeV]:\t4.24e-05 +/- 2.37e-01%\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "nufission = xs_library[fuel_cell.id]['nu-fission']\n",
+ "nufission.print_xs(xs_type='micro', nuclides=['U-235', 'U-238'])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Our multi-group cross sections are capable of summing across all nuclides to provide us with macroscopic cross sections as well."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Multi-Group XS\n",
+ "\tReaction Type =\tnu-fission\n",
+ "\tDomain Type =\tcell\n",
+ "\tDomain ID =\t10000\n",
+ "\tCross Sections [cm^-1]:\n",
+ " Group 1 [0.821 - 20.0 MeV]:\t2.53e-02 +/- 2.35e-01%\n",
+ " Group 2 [0.00553 - 0.821 MeV]:\t1.51e-03 +/- 1.51e-01%\n",
+ " Group 3 [4e-06 - 0.00553 MeV]:\t2.07e-02 +/- 2.36e-01%\n",
+ " Group 4 [6.25e-07 - 4e-06 MeV]:\t3.31e-02 +/- 3.76e-01%\n",
+ " Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.09e-01 +/- 4.10e-01%\n",
+ " Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.69e-01 +/- 4.94e-01%\n",
+ " Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.58e-01 +/- 3.44e-01%\n",
+ " Group 8 [0.0 - 5.8e-08 MeV]:\t5.40e-01 +/- 2.37e-01%\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "nufission = xs_library[fuel_cell.id]['nu-fission']\n",
+ "nufission.print_xs(xs_type='macro', nuclides='sum')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Although a printed report is nice, it is not scalable or flexible. Let's extract the cross section data for the moderator as a Pandas DataFrame."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " cell | \n",
+ " group in | \n",
+ " group out | \n",
+ " nuclide | \n",
+ " mean | \n",
+ " std. dev. | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 126 | \n",
+ " 10002 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " H-1 | \n",
+ " 0.233896 | \n",
+ " 0.004410 | \n",
+ "
\n",
+ " \n",
+ " | 127 | \n",
+ " 10002 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " O-16 | \n",
+ " 1.564488 | \n",
+ " 0.007478 | \n",
+ "
\n",
+ " \n",
+ " | 124 | \n",
+ " 10002 | \n",
+ " 1 | \n",
+ " 2 | \n",
+ " H-1 | \n",
+ " 1.589975 | \n",
+ " 0.003196 | \n",
+ "
\n",
+ " \n",
+ " | 125 | \n",
+ " 10002 | \n",
+ " 1 | \n",
+ " 2 | \n",
+ " O-16 | \n",
+ " 0.283697 | \n",
+ " 0.001986 | \n",
+ "
\n",
+ " \n",
+ " | 122 | \n",
+ " 10002 | \n",
+ " 1 | \n",
+ " 3 | \n",
+ " H-1 | \n",
+ " 0.010846 | \n",
+ " 0.000225 | \n",
+ "
\n",
+ " \n",
+ " | 123 | \n",
+ " 10002 | \n",
+ " 1 | \n",
+ " 3 | \n",
+ " O-16 | \n",
+ " 0.000000 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 120 | \n",
+ " 10002 | \n",
+ " 1 | \n",
+ " 4 | \n",
+ " H-1 | \n",
+ " 0.000000 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 121 | \n",
+ " 10002 | \n",
+ " 1 | \n",
+ " 4 | \n",
+ " O-16 | \n",
+ " 0.000000 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 118 | \n",
+ " 10002 | \n",
+ " 1 | \n",
+ " 5 | \n",
+ " H-1 | \n",
+ " 0.000000 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ " | 119 | \n",
+ " 10002 | \n",
+ " 1 | \n",
+ " 5 | \n",
+ " O-16 | \n",
+ " 0.000000 | \n",
+ " 0.000000 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " cell group in group out nuclide mean std. dev.\n",
+ "126 10002 1 1 H-1 0.233896 0.004410\n",
+ "127 10002 1 1 O-16 1.564488 0.007478\n",
+ "124 10002 1 2 H-1 1.589975 0.003196\n",
+ "125 10002 1 2 O-16 0.283697 0.001986\n",
+ "122 10002 1 3 H-1 0.010846 0.000225\n",
+ "123 10002 1 3 O-16 0.000000 0.000000\n",
+ "120 10002 1 4 H-1 0.000000 0.000000\n",
+ "121 10002 1 4 O-16 0.000000 0.000000\n",
+ "118 10002 1 5 H-1 0.000000 0.000000\n",
+ "119 10002 1 5 O-16 0.000000 0.000000"
+ ]
+ },
+ "execution_count": 40,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "nuscatter = xs_library[moderator_cell.id]['nu-scatter']\n",
+ "df = nuscatter.get_pandas_dataframe(xs_type='micro')\n",
+ "df.head(10)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can easily use the Pandas DataFrame to extract the H-1 and O-16 scattering matrices separately."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Slice DataFrame in two for each nuclide's mean values\n",
+ "h1 = df[df['nuclide'] == 'H-1']['mean']\n",
+ "o16 = df[df['nuclide'] == 'O-16']['mean']\n",
+ "\n",
+ "# Cast DataFrames as NumPy arrays\n",
+ "h1 = h1.as_matrix()\n",
+ "o16 = o16.as_matrix()\n",
+ "\n",
+ "# Reshape arrays to 2D matrix for plotting\n",
+ "h1.shape = (fine_groups.num_groups, fine_groups.num_groups)\n",
+ "o16.shape = (fine_groups.num_groups, fine_groups.num_groups)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Matplotlib's `imshow` routine can be used to plot the matrices to illustrate their sparsity structures."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\nAAAAAElFTkSuQmCC\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Create plot of the H-1 scattering matrix\n",
+ "fig = plt.subplot(121)\n",
+ "fig.imshow(h1, interpolation='nearest')\n",
+ "plt.title('H-1 Scattering Matrix')\n",
+ "\n",
+ "# Create plot of the O-16 scattering matrix\n",
+ "fig2 = plt.subplot(122)\n",
+ "fig2.imshow(o16, interpolation='nearest')\n",
+ "plt.title('O-16 Scattering Matrix')\n",
+ "\n",
+ "# Show the plot on screen\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next, we illustate how one can easily take multi-group cross sections and condense them down to a coarser energy group structure using. The `get_condensed_xs(...)` class method takes in as a parameter an `EnergyGroups` object with a coarse(r) group structure and returns a new multi-group cross section condensed to the coarse groups. We illustrate this process below using the 2-group structure created earlier."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Extract the 16-group transport cross section for the fuel\n",
+ "fine_xs = xs_library[fuel_cell.id]['transport']\n",
+ "\n",
+ "# Condense to the 2-group structure\n",
+ "condense_xs = fine_xs.get_condensed_xs(coarse_groups)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Group condensation is as simple as that! We now have a new coarse 2-group cross section in addition to our original 16-group cross section. Let's inspect the 2-group cross section by printing it to the screen and extracting a Pandas DataFrame as we have already learned how to do."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Multi-Group XS\n",
+ "\tReaction Type =\ttransport\n",
+ "\tDomain Type =\tcell\n",
+ "\tDomain ID =\t10000\n",
+ "\tNuclide =\tU-235\n",
+ "\tCross Sections [cm^-1]:\n",
+ " Group 1 [6.25e-07 - 20.0 MeV]:\t7.81e-03 +/- 4.72e-01%\n",
+ " Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 2.09e-01%\n",
+ "\n",
+ "\tNuclide =\tU-238\n",
+ "\tCross Sections [cm^-1]:\n",
+ " Group 1 [6.25e-07 - 20.0 MeV]:\t2.17e-01 +/- 1.58e-01%\n",
+ " Group 2 [0.0 - 6.25e-07 MeV]:\t2.54e-01 +/- 2.46e-01%\n",
+ "\n",
+ "\tNuclide =\tO-16\n",
+ "\tCross Sections [cm^-1]:\n",
+ " Group 1 [6.25e-07 - 20.0 MeV]:\t1.45e-01 +/- 1.73e-01%\n",
+ " Group 2 [0.0 - 6.25e-07 MeV]:\t1.75e-01 +/- 2.64e-01%\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "condense_xs.print_xs()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " cell | \n",
+ " group in | \n",
+ " nuclide | \n",
+ " mean | \n",
+ " std. dev. | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 3 | \n",
+ " 10000 | \n",
+ " 1 | \n",
+ " U-235 | \n",
+ " 20.832704 | \n",
+ " 0.098310 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 10000 | \n",
+ " 1 | \n",
+ " U-238 | \n",
+ " 9.574435 | \n",
+ " 0.015117 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 10000 | \n",
+ " 1 | \n",
+ " O-16 | \n",
+ " 3.161919 | \n",
+ " 0.005466 | \n",
+ "
\n",
+ " \n",
+ " | 0 | \n",
+ " 10000 | \n",
+ " 2 | \n",
+ " U-235 | \n",
+ " 484.133513 | \n",
+ " 1.011870 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 10000 | \n",
+ " 2 | \n",
+ " U-238 | \n",
+ " 11.215152 | \n",
+ " 0.027565 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 10000 | \n",
+ " 2 | \n",
+ " O-16 | \n",
+ " 3.798833 | \n",
+ " 0.010031 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " cell group in nuclide mean std. dev.\n",
+ "3 10000 1 U-235 20.832704 0.098310\n",
+ "4 10000 1 U-238 9.574435 0.015117\n",
+ "5 10000 1 O-16 3.161919 0.005466\n",
+ "0 10000 2 U-235 484.133513 1.011870\n",
+ "1 10000 2 U-238 11.215152 0.027565\n",
+ "2 10000 2 O-16 3.798833 0.010031"
+ ]
+ },
+ "execution_count": 45,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df = condense_xs.get_pandas_dataframe(xs_type='micro')\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Verification with OpenMOC"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Finally, let's verify our cross sections using OpenMOC. First, we use OpenCG construct an equivalent OpenMOC geometry just as we did before."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Create an OpenCG Geometry from the OpenMC Geometry stored in the summary\n",
+ "su.make_opencg_geometry()\n",
+ "\n",
+ "# Create an OpenMOC Geometry from the OpenCG Geometry\n",
+ "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Likewise, we can inject the multi-group cross sections into the equivalent fuel pin cell OpenMOC geometry."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Get all OpenMOC cells in the gometry\n",
+ "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n",
+ "\n",
+ "# Inject multi-group cross sections into OpenMOC Materials\n",
+ "# NOTE: This code will work for 1, 10, or 1,000s of cells\n",
+ "# as is the case for a complicated geometry like BEAVRS\n",
+ "for cell_id, cell in openmoc_cells.items():\n",
+ " \n",
+ " # Ignore the root cell\n",
+ " if cell.getName() == 'root cell':\n",
+ " continue\n",
+ " \n",
+ " # Get a reference to the Material filling this Cell\n",
+ " openmoc_material = cell.getFillMaterial()\n",
+ " \n",
+ " # Set the number of energy groups for the Material\n",
+ " openmoc_material.setNumEnergyGroups(fine_groups.num_groups)\n",
+ " \n",
+ " # Extract the appropriate cross section objects for this cell\n",
+ " transport = xs_library[cell_id]['transport']\n",
+ " nufission = xs_library[cell_id]['nu-fission']\n",
+ " nuscatter = xs_library[cell_id]['nu-scatter']\n",
+ " chi = xs_library[cell_id]['chi']\n",
+ " \n",
+ " # Inject NumPy arrays of cross section data into the Material\n",
+ " # NOTE: In each case we must sum across nuclides to get the\n",
+ " # macroscopic cross sections needed by OpenMOC\n",
+ " openmoc_material.setSigmaT(transport.get_xs(nuclides='sum').flatten())\n",
+ " openmoc_material.setNuSigmaF(nufission.get_xs(nuclides='sum').flatten())\n",
+ " openmoc_material.setSigmaS(nuscatter.get_xs(nuclides='sum').flatten())\n",
+ " openmoc_material.setChi(chi.get_xs(nuclides='sum').flatten())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We are now ready to run OpenMOC to verify our cross-sections from OpenMC."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Throttle OpenMOC output to screen\n",
+ "openmoc.log.set_log_level('WARNING')\n",
+ "\n",
+ "# Generate tracks for OpenMOC\n",
+ "openmoc_geometry.initializeFlatSourceRegions()\n",
+ "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n",
+ "track_generator.generateTracks()\n",
+ "\n",
+ "# Run OpenMOC\n",
+ "solver = openmoc.CPUSolver(track_generator)\n",
+ "solver.computeEigenvalue()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We report the eigenvalues computed by OpenMC and OpenMOC here together to summarize our results."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "openmc keff = 1.223863\n",
+ "openmoc keff = 1.220753\n",
+ "bias [pcm]: -311.0\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Print report of keff and bias with OpenMC\n",
+ "openmoc_keff = solver.getKeff()\n",
+ "openmc_keff = sp.k_combined[0]\n",
+ "bias = (openmoc_keff - openmc_keff) * 1e5\n",
+ "\n",
+ "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n",
+ "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n",
+ "print('bias [pcm]: {0:1.1f}'.format(bias))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "As a sanity check, let's run a simulation with the coarse 2-group cross sections to ensure that they produce a reasonable result."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "su.make_opencg_geometry()\n",
+ "openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)\n",
+ "openmoc_cells = openmoc_geometry.getRootUniverse().getAllCells()\n",
+ "\n",
+ "# Inject multi-group cross sections into OpenMOC Materials\n",
+ "for cell_id, cell in openmoc_cells.items():\n",
+ " \n",
+ " # Ignore the root cell\n",
+ " if cell.getName() == 'root cell':\n",
+ " continue\n",
+ " \n",
+ " openmoc_material = cell.getFillMaterial()\n",
+ " openmoc_material.setNumEnergyGroups(coarse_groups.num_groups)\n",
+ " \n",
+ " # Extract the appropriate cross section objects for this cell\n",
+ " transport = xs_library[cell_id]['transport']\n",
+ " nufission = xs_library[cell_id]['nu-fission']\n",
+ " nuscatter = xs_library[cell_id]['nu-scatter']\n",
+ " chi = xs_library[cell_id]['chi']\n",
+ " \n",
+ " # Perform group condensation\n",
+ " transport = transport.get_condensed_xs(coarse_groups)\n",
+ " nufission = nufission.get_condensed_xs(coarse_groups)\n",
+ " nuscatter = nuscatter.get_condensed_xs(coarse_groups)\n",
+ " chi = chi.get_condensed_xs(coarse_groups)\n",
+ " \n",
+ " # Inject NumPy arrays of cross section data into the Material\n",
+ " openmoc_material.setSigmaT(transport.get_xs(nuclides='sum').flatten())\n",
+ " openmoc_material.setNuSigmaF(nufission.get_xs(nuclides='sum').flatten())\n",
+ " openmoc_material.setSigmaS(nuscatter.get_xs(nuclides='sum').flatten())\n",
+ " openmoc_material.setChi(chi.get_xs(nuclides='sum').flatten())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [],
+ "source": [
+ "# Generate tracks for OpenMOC\n",
+ "openmoc_geometry.initializeFlatSourceRegions()\n",
+ "track_generator = openmoc.TrackGenerator(openmoc_geometry, 128, 0.1)\n",
+ "track_generator.generateTracks()\n",
+ "\n",
+ "# Run OpenMOC\n",
+ "solver = openmoc.CPUSolver(track_generator)\n",
+ "solver.computeEigenvalue()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "metadata": {
+ "collapsed": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "openmc keff = 1.223863\n",
+ "openmoc keff = 1.223860\n",
+ "bias [pcm]: -0.3\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Print report of keff and bias with OpenMC\n",
+ "openmoc_keff = solver.getKeff()\n",
+ "openmc_keff = sp.k_combined[0]\n",
+ "bias = (openmoc_keff - openmc_keff) * 1e5\n",
+ "\n",
+ "print('openmc keff = {0:1.6f}'.format(openmc_keff))\n",
+ "print('openmoc keff = {0:1.6f}'.format(openmoc_keff))\n",
+ "print('bias [pcm]: {0:1.1f}'.format(bias))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "There is a non-trivial bias in both the 2-group and 8-group cases. In the case of the pin cell, one can show that these biases do not converge to <100 pcm with more particle histories. In the case of heterogeneous geometries, additional measures must be taken to address the following three sources of bias:\n",
+ "\n",
+ "* Appropriate transport-corrected cross sections\n",
+ "* Spatial discretization of OpenMOC's mesh\n",
+ "* Constant-in-angle multi-group cross sections"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 2",
+ "language": "python",
+ "name": "python2"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 2
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython2",
+ "version": "2.7.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
diff --git a/docs/source/pythonapi/examples/multi-group-cross-sections.rst b/docs/source/pythonapi/examples/multi-group-cross-sections.rst
new file mode 100644
index 000000000..b2da0e1bc
--- /dev/null
+++ b/docs/source/pythonapi/examples/multi-group-cross-sections.rst
@@ -0,0 +1,11 @@
+====================================
+Multi-Group Cross Section Generation
+====================================
+
+.. only:: html
+
+ .. notebook:: multi-group-cross-sections.ipynb
+
+.. only:: latex
+
+ IPython notebooks must be viewed in the online HTML documentation.
diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb
index 15b778662..294c35ba0 100644
--- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb
+++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb
@@ -352,7 +352,18 @@
"metadata": {
"collapsed": false
},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"# Run openmc in plotting mode\n",
"executor = openmc.Executor()\n",
@@ -368,7 +379,7 @@
"outputs": [
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98KAwIzOzFd628AAAPZSURBVGje7Zs7buMwEIZ9iey5\n0gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwgwIcgg8Cc4fCTSK5W4OeF\nkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7E08mlia+rn7VcKXP8sRs\nzFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WBzfiz20hXORmP9fi/bM9E\neUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4lXju8K3DKv9NThOZ3q2K\nmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3OafPX40NGgST2r+uvQkXXp6\ncKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcublfKGt6apotG/NVx3SInW\ntLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJbf8qlPynYmpKCh7OB1fzN\nalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utrJTy8/06TXh0r/5JOa2Jm\nYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU4YuBTPa/8P67l/6r44ds\n+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m/65n+S8p/itN15v0UkW3\n/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB6R3Cqn55U4rv4kfH3zaS\ngQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6bjT6rym9I/v/03/b+LHS\n4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv6h9B/Bfxr9j1Hz2eN/hO\n8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wXfP8Mvf9G37/D/ovuP8Se\nP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7+O+E8zdP/8XOf8Hnz9Dz\nb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589jz5/Y8ej9h4D+W7qQmf57\nefqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m4fwXuH+M3n+OO3++AX9c\nlR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTAzVDA5OjUxOjEzKzA3OjAwBMrIlQAA\nACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wM1QwOTo1MToxMyswNzowMHWXcCkAAAAASUVORK5C\nYII=\n",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAPZSURB\nVGje7Zs7buMwEIZ9iey50gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwg\nwIcgg8Cc4fCTSK5W4OeFkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7\nE08mlia+rn7VcKXP8sRszFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WB\nzfiz20hXORmP9fi/bM9EeUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4\nlXju8K3DKv9NThOZ3q2KmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3Oaf\nPX40NGgST2r+uvQkXXp6cKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcub\nlfKGt6apotG/NVx3SInWtLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJb\nf8qlPynYmpKCh7OB1fzNalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utr\nJTy8/06TXh0r/5JOa2JmYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU\n4YuBTPa/8P67l/6r44ds+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m\n/65n+S8p/itN15v0UkW3/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB\n6R3Cqn55U4rv4kfH3zaSgQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6\nbjT6rym9I/v/03/b+LHS4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv\n6h9B/Bfxr9j1Hz2eN/hO8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wX\nfP8Mvf9G37/D/ovuP8SeP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7\n+O+E8zdP/8XOf8Hnz9Dzb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589j\nz5/Y8ej9h4D+W7qQmf57efqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m\n4fwXuH+M3n+OO3++AX9clR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTEyVDIzOjQ5\nOjA0LTA0OjAw6Y3dGwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0xMlQyMzo0OTowNC0wNDow\nMJjQZacAAAAASUVORK5CYII=\n",
"text/plain": [
""
]
@@ -557,9 +568,9 @@
" Copyright: 2011-2015 Massachusetts Institute of Technology\n",
" License: http://mit-crpg.github.io/openmc/license.html\n",
" Version: 0.7.0\n",
- " Git SHA1: 71dfde8d12942170a9a8d91796ab40a6e9becaaf\n",
- " Date/Time: 2015-10-03 09:52:00\n",
- " OpenMP Threads: 4\n",
+ " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n",
+ " Date/Time: 2015-10-12 23:49:04\n",
+ " MPI Processes: 1\n",
"\n",
" ===========================================================================\n",
" ========================> INITIALIZATION <=========================\n",
@@ -571,11 +582,11 @@
" Reading materials XML file...\n",
" Reading tallies XML file...\n",
" Building neighboring cells lists for each surface...\n",
+ " Loading ACE cross section table: 92235.71c\n",
" Loading ACE cross section table: 92238.71c\n",
" Loading ACE cross section table: 8016.71c\n",
- " Loading ACE cross section table: 92235.71c\n",
- " Loading ACE cross section table: 5010.71c\n",
" Loading ACE cross section table: 1001.71c\n",
+ " Loading ACE cross section table: 5010.71c\n",
" Loading ACE cross section table: 40090.71c\n",
" Initializing source particles...\n",
"\n",
@@ -585,39 +596,35 @@
"\n",
" Bat./Gen. k Average k \n",
" ========= ======== ==================== \n",
- " 1/1 0.59998 \n",
- " 2/1 0.65473 \n",
- " 3/1 0.67452 \n",
- " 4/1 0.66458 \n",
- " 5/1 0.70093 \n",
- " 6/1 0.70726 \n",
- " 7/1 0.65977 0.68351 +/- 0.02375\n",
- " 8/1 0.68457 0.68387 +/- 0.01372\n",
- " 9/1 0.70024 0.68796 +/- 0.01053\n",
- " 10/1 0.64895 0.68016 +/- 0.01128\n",
- " 11/1 0.68744 0.68137 +/- 0.00929\n",
- " 12/1 0.68037 0.68123 +/- 0.00786\n",
- " 13/1 0.64865 0.67715 +/- 0.00793\n",
- " 14/1 0.71415 0.68127 +/- 0.00811\n",
- " 15/1 0.65717 0.67886 +/- 0.00764\n",
- " 16/1 0.71598 0.68223 +/- 0.00769\n",
- " 17/1 0.67285 0.68145 +/- 0.00707\n",
- " 18/1 0.69329 0.68236 +/- 0.00656\n",
- " 19/1 0.65696 0.68055 +/- 0.00634\n",
- " 20/1 0.65500 0.67884 +/- 0.00615\n",
- " Triggers unsatisfied, max unc./thresh. is 1.21110 for absorption in tally 10002\n",
- " The estimated number of batches is 28\n",
+ " 1/1 0.54958 \n",
+ " 2/1 0.67628 \n",
+ " 3/1 0.70618 \n",
+ " 4/1 0.66601 \n",
+ " 5/1 0.70876 \n",
+ " 6/1 0.69708 \n",
+ " 7/1 0.68623 0.69166 +/- 0.00543\n",
+ " 8/1 0.69159 0.69163 +/- 0.00313\n",
+ " 9/1 0.69908 0.69349 +/- 0.00289\n",
+ " 10/1 0.63865 0.68253 +/- 0.01120\n",
+ " 11/1 0.65439 0.67784 +/- 0.01027\n",
+ " 12/1 0.68518 0.67889 +/- 0.00875\n",
+ " 13/1 0.69507 0.68091 +/- 0.00784\n",
+ " 14/1 0.70129 0.68317 +/- 0.00728\n",
+ " 15/1 0.71336 0.68619 +/- 0.00717\n",
+ " 16/1 0.68725 0.68629 +/- 0.00649\n",
+ " 17/1 0.72579 0.68958 +/- 0.00678\n",
+ " 18/1 0.67149 0.68819 +/- 0.00639\n",
+ " 19/1 0.67771 0.68744 +/- 0.00596\n",
+ " 20/1 0.68035 0.68697 +/- 0.00557\n",
+ " Triggers unsatisfied, max unc./thresh. is 1.09851 for absorption in tally 10002\n",
+ " The estimated number of batches is 24\n",
" Creating state point statepoint.020.h5...\n",
- " 21/1 0.67090 0.67835 +/- 0.00577\n",
- " 22/1 0.69025 0.67905 +/- 0.00546\n",
- " 23/1 0.66113 0.67805 +/- 0.00525\n",
- " 24/1 0.67934 0.67812 +/- 0.00496\n",
- " 25/1 0.67203 0.67781 +/- 0.00472\n",
- " 26/1 0.66928 0.67741 +/- 0.00451\n",
- " 27/1 0.70271 0.67856 +/- 0.00445\n",
- " 28/1 0.70233 0.67959 +/- 0.00437\n",
- " Triggers satisfied for batch 28\n",
- " Creating state point statepoint.028.h5...\n",
+ " 21/1 0.68105 0.68660 +/- 0.00522\n",
+ " 22/1 0.67168 0.68572 +/- 0.00498\n",
+ " 23/1 0.67520 0.68514 +/- 0.00473\n",
+ " 24/1 0.67940 0.68483 +/- 0.00449\n",
+ " Triggers satisfied for batch 24\n",
+ " Creating state point statepoint.024.h5...\n",
"\n",
" ===========================================================================\n",
" ======================> SIMULATION FINISHED <======================\n",
@@ -626,28 +633,28 @@
"\n",
" =======================> TIMING STATISTICS <=======================\n",
"\n",
- " Total time for initialization = 3.9200E-01 seconds\n",
- " Reading cross sections = 1.3900E-01 seconds\n",
- " Total time in simulation = 3.8950E+00 seconds\n",
- " Time in transport only = 3.7970E+00 seconds\n",
- " Time in inactive batches = 5.0500E-01 seconds\n",
- " Time in active batches = 3.3900E+00 seconds\n",
- " Time synchronizing fission bank = 3.0000E-03 seconds\n",
- " Sampling source sites = 3.0000E-03 seconds\n",
+ " Total time for initialization = 4.0100E-01 seconds\n",
+ " Reading cross sections = 8.9000E-02 seconds\n",
+ " Total time in simulation = 9.1400E+00 seconds\n",
+ " Time in transport only = 9.1280E+00 seconds\n",
+ " Time in inactive batches = 1.3230E+00 seconds\n",
+ " Time in active batches = 7.8170E+00 seconds\n",
+ " Time synchronizing fission bank = 1.0000E-03 seconds\n",
+ " Sampling source sites = 1.0000E-03 seconds\n",
" SEND/RECV source sites = 0.0000E+00 seconds\n",
- " Time accumulating tallies = 0.0000E+00 seconds\n",
+ " Time accumulating tallies = 3.0000E-03 seconds\n",
" Total time for finalization = 0.0000E+00 seconds\n",
- " Total time elapsed = 4.2970E+00 seconds\n",
- " Calculation Rate (inactive) = 24752.5 neutrons/second\n",
- " Calculation Rate (active) = 11061.9 neutrons/second\n",
+ " Total time elapsed = 9.5500E+00 seconds\n",
+ " Calculation Rate (inactive) = 9448.22 neutrons/second\n",
+ " Calculation Rate (active) = 4797.24 neutrons/second\n",
"\n",
" ============================> RESULTS <============================\n",
"\n",
- " k-effective (Collision) = 0.68196 +/- 0.00427\n",
- " k-effective (Track-length) = 0.67959 +/- 0.00437\n",
- " k-effective (Absorption) = 0.67957 +/- 0.00402\n",
- " Combined k-effective = 0.67943 +/- 0.00295\n",
- " Leakage Fraction = 0.34370 +/- 0.00201\n",
+ " k-effective (Collision) = 0.68264 +/- 0.00405\n",
+ " k-effective (Track-length) = 0.68483 +/- 0.00449\n",
+ " k-effective (Absorption) = 0.68225 +/- 0.00336\n",
+ " Combined k-effective = 0.68275 +/- 0.00346\n",
+ " Leakage Fraction = 0.34345 +/- 0.00167\n",
"\n"
]
},
@@ -764,13 +771,13 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "[[[ 0.15044911]]\n",
+ "[[[ 0.18257268]]\n",
"\n",
- " [[ 0.09149973]]\n",
+ " [[ 0.07111957]]\n",
"\n",
- " [[ 0.27611475]]\n",
+ " [[ 0.40880276]]\n",
"\n",
- " [[ 0.12476673]]]\n"
+ " [[ 0.16407535]]]\n"
]
}
],
@@ -814,16 +821,6 @@
" | \n",
" | \n",
" \n",
- " \n",
- " | bin | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
" \n",
" \n",
" \n",
@@ -831,229 +828,228 @@
" | 1 | \n",
" 1 | \n",
" 1 | \n",
- " 0.0e+00 - 6.3e-07 | \n",
+ " (0.0e+00 - 6.3e-07) | \n",
" fission | \n",
- " 0.000236 | \n",
- " 0.000035 | \n",
+ " 0.000202 | \n",
+ " 0.000037 | \n",
"
\n",
" \n",
" | 1 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
- " 0.0e+00 - 6.3e-07 | \n",
+ " (0.0e+00 - 6.3e-07) | \n",
" nu-fission | \n",
- " 0.000574 | \n",
- " 0.000086 | \n",
+ " 0.000492 | \n",
+ " 0.000090 | \n",
"
\n",
" \n",
" | 2 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
- " 6.3e-07 - 2.0e+01 | \n",
+ " (6.3e-07 - 2.0e+01) | \n",
" fission | \n",
- " 0.000072 | \n",
- " 0.000006 | \n",
+ " 0.000076 | \n",
+ " 0.000004 | \n",
"
\n",
" \n",
" | 3 | \n",
" 1 | \n",
" 1 | \n",
" 1 | \n",
- " 6.3e-07 - 2.0e+01 | \n",
+ " (6.3e-07 - 2.0e+01) | \n",
" nu-fission | \n",
- " 0.000190 | \n",
- " 0.000014 | \n",
+ " 0.000204 | \n",
+ " 0.000010 | \n",
"
\n",
" \n",
" | 4 | \n",
" 1 | \n",
" 2 | \n",
" 1 | \n",
- " 0.0e+00 - 6.3e-07 | \n",
+ " (0.0e+00 - 6.3e-07) | \n",
" fission | \n",
- " 0.000451 | \n",
- " 0.000058 | \n",
+ " 0.000375 | \n",
+ " 0.000039 | \n",
"
\n",
" \n",
" | 5 | \n",
" 1 | \n",
" 2 | \n",
" 1 | \n",
- " 0.0e+00 - 6.3e-07 | \n",
+ " (0.0e+00 - 6.3e-07) | \n",
" nu-fission | \n",
- " 0.001100 | \n",
- " 0.000141 | \n",
+ " 0.000914 | \n",
+ " 0.000094 | \n",
"
\n",
" \n",
" | 6 | \n",
" 1 | \n",
" 2 | \n",
" 1 | \n",
- " 6.3e-07 - 2.0e+01 | \n",
+ " (6.3e-07 - 2.0e+01) | \n",
" fission | \n",
- " 0.000095 | \n",
- " 0.000006 | \n",
+ " 0.000107 | \n",
+ " 0.000013 | \n",
"
\n",
" \n",
" | 7 | \n",
" 1 | \n",
" 2 | \n",
" 1 | \n",
- " 6.3e-07 - 2.0e+01 | \n",
+ " (6.3e-07 - 2.0e+01) | \n",
" nu-fission | \n",
- " 0.000250 | \n",
- " 0.000016 | \n",
+ " 0.000278 | \n",
+ " 0.000032 | \n",
"
\n",
" \n",
" | 8 | \n",
" 1 | \n",
" 3 | \n",
" 1 | \n",
- " 0.0e+00 - 6.3e-07 | \n",
+ " (0.0e+00 - 6.3e-07) | \n",
" fission | \n",
- " 0.000575 | \n",
- " 0.000080 | \n",
+ " 0.000564 | \n",
+ " 0.000056 | \n",
"
\n",
" \n",
" | 9 | \n",
" 1 | \n",
" 3 | \n",
" 1 | \n",
- " 0.0e+00 - 6.3e-07 | \n",
+ " (0.0e+00 - 6.3e-07) | \n",
" nu-fission | \n",
- " 0.001401 | \n",
- " 0.000194 | \n",
+ " 0.001374 | \n",
+ " 0.000137 | \n",
"
\n",
" \n",
" | 10 | \n",
" 1 | \n",
" 3 | \n",
" 1 | \n",
- " 6.3e-07 - 2.0e+01 | \n",
+ " (6.3e-07 - 2.0e+01) | \n",
" fission | \n",
- " 0.000134 | \n",
- " 0.000011 | \n",
+ " 0.000149 | \n",
+ " 0.000007 | \n",
"
\n",
" \n",
" | 11 | \n",
" 1 | \n",
" 3 | \n",
" 1 | \n",
- " 6.3e-07 - 2.0e+01 | \n",
+ " (6.3e-07 - 2.0e+01) | \n",
" nu-fission | \n",
- " 0.000353 | \n",
- " 0.000028 | \n",
+ " 0.000388 | \n",
+ " 0.000018 | \n",
"
\n",
" \n",
" | 12 | \n",
" 1 | \n",
" 4 | \n",
" 1 | \n",
- " 0.0e+00 - 6.3e-07 | \n",
+ " (0.0e+00 - 6.3e-07) | \n",
" fission | \n",
- " 0.000655 | \n",
- " 0.000071 | \n",
+ " 0.000669 | \n",
+ " 0.000044 | \n",
"
\n",
" \n",
" | 13 | \n",
" 1 | \n",
" 4 | \n",
" 1 | \n",
- " 0.0e+00 - 6.3e-07 | \n",
+ " (0.0e+00 - 6.3e-07) | \n",
" nu-fission | \n",
- " 0.001596 | \n",
- " 0.000174 | \n",
+ " 0.001631 | \n",
+ " 0.000108 | \n",
"
\n",
" \n",
" | 14 | \n",
" 1 | \n",
" 4 | \n",
" 1 | \n",
- " 6.3e-07 - 2.0e+01 | \n",
+ " (6.3e-07 - 2.0e+01) | \n",
" fission | \n",
- " 0.000149 | \n",
- " 0.000009 | \n",
+ " 0.000165 | \n",
+ " 0.000011 | \n",
"
\n",
" \n",
" | 15 | \n",
" 1 | \n",
" 4 | \n",
" 1 | \n",
- " 6.3e-07 - 2.0e+01 | \n",
+ " (6.3e-07 - 2.0e+01) | \n",
" nu-fission | \n",
- " 0.000391 | \n",
- " 0.000023 | \n",
+ " 0.000433 | \n",
+ " 0.000029 | \n",
"
\n",
" \n",
" | 16 | \n",
" 1 | \n",
" 5 | \n",
" 1 | \n",
- " 0.0e+00 - 6.3e-07 | \n",
+ " (0.0e+00 - 6.3e-07) | \n",
" fission | \n",
- " 0.000781 | \n",
- " 0.000078 | \n",
+ " 0.000932 | \n",
+ " 0.000069 | \n",
"
\n",
" \n",
" | 17 | \n",
" 1 | \n",
" 5 | \n",
" 1 | \n",
- " 0.0e+00 - 6.3e-07 | \n",
+ " (0.0e+00 - 6.3e-07) | \n",
" nu-fission | \n",
- " 0.001903 | \n",
- " 0.000191 | \n",
+ " 0.002270 | \n",
+ " 0.000168 | \n",
"
\n",
" \n",
" | 18 | \n",
" 1 | \n",
" 5 | \n",
" 1 | \n",
- " 6.3e-07 - 2.0e+01 | \n",
+ " (6.3e-07 - 2.0e+01) | \n",
" fission | \n",
- " 0.000185 | \n",
- " 0.000009 | \n",
+ " 0.000183 | \n",
+ " 0.000011 | \n",
"
\n",
" \n",
" | 19 | \n",
" 1 | \n",
" 5 | \n",
" 1 | \n",
- " 6.3e-07 - 2.0e+01 | \n",
+ " (6.3e-07 - 2.0e+01) | \n",
" nu-fission | \n",
- " 0.000484 | \n",
- " 0.000024 | \n",
+ " 0.000477 | \n",
+ " 0.000028 | \n",
"
\n",
" \n",
"\n",
""
],
"text/plain": [
- " mesh 1 energy [MeV] score mean std. dev.\n",
- " x y z \n",
- "bin \n",
- "0 1 1 1 0.0e+00 - 6.3e-07 fission 0.000236 0.000035\n",
- "1 1 1 1 0.0e+00 - 6.3e-07 nu-fission 0.000574 0.000086\n",
- "2 1 1 1 6.3e-07 - 2.0e+01 fission 0.000072 0.000006\n",
- "3 1 1 1 6.3e-07 - 2.0e+01 nu-fission 0.000190 0.000014\n",
- "4 1 2 1 0.0e+00 - 6.3e-07 fission 0.000451 0.000058\n",
- "5 1 2 1 0.0e+00 - 6.3e-07 nu-fission 0.001100 0.000141\n",
- "6 1 2 1 6.3e-07 - 2.0e+01 fission 0.000095 0.000006\n",
- "7 1 2 1 6.3e-07 - 2.0e+01 nu-fission 0.000250 0.000016\n",
- "8 1 3 1 0.0e+00 - 6.3e-07 fission 0.000575 0.000080\n",
- "9 1 3 1 0.0e+00 - 6.3e-07 nu-fission 0.001401 0.000194\n",
- "10 1 3 1 6.3e-07 - 2.0e+01 fission 0.000134 0.000011\n",
- "11 1 3 1 6.3e-07 - 2.0e+01 nu-fission 0.000353 0.000028\n",
- "12 1 4 1 0.0e+00 - 6.3e-07 fission 0.000655 0.000071\n",
- "13 1 4 1 0.0e+00 - 6.3e-07 nu-fission 0.001596 0.000174\n",
- "14 1 4 1 6.3e-07 - 2.0e+01 fission 0.000149 0.000009\n",
- "15 1 4 1 6.3e-07 - 2.0e+01 nu-fission 0.000391 0.000023\n",
- "16 1 5 1 0.0e+00 - 6.3e-07 fission 0.000781 0.000078\n",
- "17 1 5 1 0.0e+00 - 6.3e-07 nu-fission 0.001903 0.000191\n",
- "18 1 5 1 6.3e-07 - 2.0e+01 fission 0.000185 0.000009\n",
- "19 1 5 1 6.3e-07 - 2.0e+01 nu-fission 0.000484 0.000024"
+ " mesh 1 energy [MeV] score mean std. dev.\n",
+ " x y z \n",
+ "0 1 1 1 (0.0e+00 - 6.3e-07) fission 0.000202 0.000037\n",
+ "1 1 1 1 (0.0e+00 - 6.3e-07) nu-fission 0.000492 0.000090\n",
+ "2 1 1 1 (6.3e-07 - 2.0e+01) fission 0.000076 0.000004\n",
+ "3 1 1 1 (6.3e-07 - 2.0e+01) nu-fission 0.000204 0.000010\n",
+ "4 1 2 1 (0.0e+00 - 6.3e-07) fission 0.000375 0.000039\n",
+ "5 1 2 1 (0.0e+00 - 6.3e-07) nu-fission 0.000914 0.000094\n",
+ "6 1 2 1 (6.3e-07 - 2.0e+01) fission 0.000107 0.000013\n",
+ "7 1 2 1 (6.3e-07 - 2.0e+01) nu-fission 0.000278 0.000032\n",
+ "8 1 3 1 (0.0e+00 - 6.3e-07) fission 0.000564 0.000056\n",
+ "9 1 3 1 (0.0e+00 - 6.3e-07) nu-fission 0.001374 0.000137\n",
+ "10 1 3 1 (6.3e-07 - 2.0e+01) fission 0.000149 0.000007\n",
+ "11 1 3 1 (6.3e-07 - 2.0e+01) nu-fission 0.000388 0.000018\n",
+ "12 1 4 1 (0.0e+00 - 6.3e-07) fission 0.000669 0.000044\n",
+ "13 1 4 1 (0.0e+00 - 6.3e-07) nu-fission 0.001631 0.000108\n",
+ "14 1 4 1 (6.3e-07 - 2.0e+01) fission 0.000165 0.000011\n",
+ "15 1 4 1 (6.3e-07 - 2.0e+01) nu-fission 0.000433 0.000029\n",
+ "16 1 5 1 (0.0e+00 - 6.3e-07) fission 0.000932 0.000069\n",
+ "17 1 5 1 (0.0e+00 - 6.3e-07) nu-fission 0.002270 0.000168\n",
+ "18 1 5 1 (6.3e-07 - 2.0e+01) fission 0.000183 0.000011\n",
+ "19 1 5 1 (6.3e-07 - 2.0e+01) nu-fission 0.000477 0.000028"
]
},
"execution_count": 25,
@@ -1078,9 +1074,9 @@
"outputs": [
{
"data": {
- "image/png": "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\n",
+ "image/png": "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\nkiRJEsA/A3sng0v+IomuAAAAAElFTkSuQmCC\n",
"text/plain": [
- ""
+ ""
]
},
"metadata": {},
@@ -1103,7 +1099,7 @@
{
"data": {
"text/plain": [
- ""
+ ""
]
},
"execution_count": 27,
@@ -1112,9 +1108,9 @@
},
{
"data": {
- "image/png": "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\nEvx/rHWCrxSlro8AAAAASUVORK5CYII=\n",
+ "image/png": "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\n/wfC21DgNNvIcQAAAABJRU5ErkJggg==\n",
"text/plain": [
- ""
+ ""
]
},
"metadata": {},
@@ -1124,7 +1120,7 @@
"source": [
"# Extract thermal nu-fission rates from pandas\n",
"fiss = df[df['score'] == 'nu-fission']\n",
- "fiss = fiss[fiss['energy [MeV]'] == '0.0e+00 - 6.3e-07']\n",
+ "fiss = fiss[fiss['energy [MeV]'] == '(0.0e+00 - 6.3e-07)']\n",
"\n",
"# Extract mean and reshape as 2D NumPy arrays\n",
"mean = fiss['mean'].reshape((17,17))\n",
@@ -1195,14 +1191,6 @@
" mean | \n",
" std. dev. | \n",
" \n",
- " \n",
- " | bin | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
" \n",
" \n",
" \n",
@@ -1210,170 +1198,169 @@
" | 10000 | \n",
" U-235 | \n",
" scatter-Y0,0 | \n",
- " 0.036453 | \n",
- " 0.001219 | \n",
+ " 0.037095 | \n",
+ " 0.001150 | \n",
"
\n",
" \n",
" | 1 | \n",
" 10000 | \n",
" U-235 | \n",
" scatter-Y1,-1 | \n",
- " 0.000302 | \n",
- " 0.000314 | \n",
+ " 0.000266 | \n",
+ " 0.000323 | \n",
"
\n",
" \n",
" | 2 | \n",
" 10000 | \n",
" U-235 | \n",
" scatter-Y1,0 | \n",
- " -0.000006 | \n",
- " 0.000347 | \n",
+ " -0.000417 | \n",
+ " 0.000274 | \n",
"
\n",
" \n",
" | 3 | \n",
" 10000 | \n",
" U-235 | \n",
" scatter-Y1,1 | \n",
- " 0.000244 | \n",
- " 0.000286 | \n",
+ " -0.000228 | \n",
+ " 0.000237 | \n",
"
\n",
" \n",
" | 4 | \n",
" 10000 | \n",
" U-235 | \n",
" scatter-Y2,-2 | \n",
- " 0.000184 | \n",
- " 0.000211 | \n",
+ " 0.000026 | \n",
+ " 0.000199 | \n",
"
\n",
" \n",
" | 5 | \n",
" 10000 | \n",
" U-235 | \n",
" scatter-Y2,-1 | \n",
- " 0.000067 | \n",
- " 0.000173 | \n",
+ " -0.000115 | \n",
+ " 0.000185 | \n",
"
\n",
" \n",
" | 6 | \n",
" 10000 | \n",
" U-235 | \n",
" scatter-Y2,0 | \n",
- " 0.000353 | \n",
- " 0.000210 | \n",
+ " 0.000151 | \n",
+ " 0.000159 | \n",
"
\n",
" \n",
" | 7 | \n",
" 10000 | \n",
" U-235 | \n",
" scatter-Y2,1 | \n",
- " -0.000266 | \n",
- " 0.000263 | \n",
+ " -0.000122 | \n",
+ " 0.000280 | \n",
"
\n",
" \n",
" | 8 | \n",
" 10000 | \n",
" U-235 | \n",
" scatter-Y2,2 | \n",
- " -0.000246 | \n",
- " 0.000153 | \n",
+ " 0.000008 | \n",
+ " 0.000181 | \n",
"
\n",
" \n",
" | 9 | \n",
" 10000 | \n",
" U-238 | \n",
" scatter-Y0,0 | \n",
- " 2.315893 | \n",
- " 0.008243 | \n",
+ " 2.328632 | \n",
+ " 0.013107 | \n",
"
\n",
" \n",
" | 10 | \n",
" 10000 | \n",
" U-238 | \n",
" scatter-Y1,-1 | \n",
- " -0.022028 | \n",
- " 0.002316 | \n",
+ " 0.024530 | \n",
+ " 0.002272 | \n",
"
\n",
" \n",
" | 11 | \n",
" 10000 | \n",
" U-238 | \n",
" scatter-Y1,0 | \n",
- " -0.003426 | \n",
- " 0.002651 | \n",
+ " -0.000059 | \n",
+ " 0.002804 | \n",
"
\n",
" \n",
" | 12 | \n",
" 10000 | \n",
" U-238 | \n",
" scatter-Y1,1 | \n",
- " 0.026620 | \n",
- " 0.002084 | \n",
+ " -0.027990 | \n",
+ " 0.002536 | \n",
"
\n",
" \n",
" | 13 | \n",
" 10000 | \n",
" U-238 | \n",
" scatter-Y2,-2 | \n",
- " -0.001295 | \n",
- " 0.001627 | \n",
+ " -0.004861 | \n",
+ " 0.001575 | \n",
"
\n",
" \n",
" | 14 | \n",
" 10000 | \n",
" U-238 | \n",
" scatter-Y2,-1 | \n",
- " 0.000759 | \n",
- " 0.001426 | \n",
+ " 0.000557 | \n",
+ " 0.002018 | \n",
"
\n",
" \n",
" | 15 | \n",
" 10000 | \n",
" U-238 | \n",
" scatter-Y2,0 | \n",
- " 0.005513 | \n",
- " 0.001983 | \n",
+ " 0.006236 | \n",
+ " 0.001627 | \n",
"
\n",
" \n",
" | 16 | \n",
" 10000 | \n",
" U-238 | \n",
" scatter-Y2,1 | \n",
- " 0.000431 | \n",
- " 0.001862 | \n",
+ " -0.000648 | \n",
+ " 0.001551 | \n",
"
\n",
" \n",
" | 17 | \n",
" 10000 | \n",
" U-238 | \n",
" scatter-Y2,2 | \n",
- " -0.001962 | \n",
- " 0.001222 | \n",
+ " -0.001031 | \n",
+ " 0.001310 | \n",
"
\n",
" \n",
"\n",
""
],
"text/plain": [
- " cell nuclide score mean std. dev.\n",
- "bin \n",
- "0 10000 U-235 scatter-Y0,0 0.036453 0.001219\n",
- "1 10000 U-235 scatter-Y1,-1 0.000302 0.000314\n",
- "2 10000 U-235 scatter-Y1,0 -0.000006 0.000347\n",
- "3 10000 U-235 scatter-Y1,1 0.000244 0.000286\n",
- "4 10000 U-235 scatter-Y2,-2 0.000184 0.000211\n",
- "5 10000 U-235 scatter-Y2,-1 0.000067 0.000173\n",
- "6 10000 U-235 scatter-Y2,0 0.000353 0.000210\n",
- "7 10000 U-235 scatter-Y2,1 -0.000266 0.000263\n",
- "8 10000 U-235 scatter-Y2,2 -0.000246 0.000153\n",
- "9 10000 U-238 scatter-Y0,0 2.315893 0.008243\n",
- "10 10000 U-238 scatter-Y1,-1 -0.022028 0.002316\n",
- "11 10000 U-238 scatter-Y1,0 -0.003426 0.002651\n",
- "12 10000 U-238 scatter-Y1,1 0.026620 0.002084\n",
- "13 10000 U-238 scatter-Y2,-2 -0.001295 0.001627\n",
- "14 10000 U-238 scatter-Y2,-1 0.000759 0.001426\n",
- "15 10000 U-238 scatter-Y2,0 0.005513 0.001983\n",
- "16 10000 U-238 scatter-Y2,1 0.000431 0.001862\n",
- "17 10000 U-238 scatter-Y2,2 -0.001962 0.001222"
+ " cell nuclide score mean std. dev.\n",
+ "0 10000 U-235 scatter-Y0,0 0.037095 0.001150\n",
+ "1 10000 U-235 scatter-Y1,-1 0.000266 0.000323\n",
+ "2 10000 U-235 scatter-Y1,0 -0.000417 0.000274\n",
+ "3 10000 U-235 scatter-Y1,1 -0.000228 0.000237\n",
+ "4 10000 U-235 scatter-Y2,-2 0.000026 0.000199\n",
+ "5 10000 U-235 scatter-Y2,-1 -0.000115 0.000185\n",
+ "6 10000 U-235 scatter-Y2,0 0.000151 0.000159\n",
+ "7 10000 U-235 scatter-Y2,1 -0.000122 0.000280\n",
+ "8 10000 U-235 scatter-Y2,2 0.000008 0.000181\n",
+ "9 10000 U-238 scatter-Y0,0 2.328632 0.013107\n",
+ "10 10000 U-238 scatter-Y1,-1 0.024530 0.002272\n",
+ "11 10000 U-238 scatter-Y1,0 -0.000059 0.002804\n",
+ "12 10000 U-238 scatter-Y1,1 -0.027990 0.002536\n",
+ "13 10000 U-238 scatter-Y2,-2 -0.004861 0.001575\n",
+ "14 10000 U-238 scatter-Y2,-1 0.000557 0.002018\n",
+ "15 10000 U-238 scatter-Y2,0 0.006236 0.001627\n",
+ "16 10000 U-238 scatter-Y2,1 -0.000648 0.001551\n",
+ "17 10000 U-238 scatter-Y2,2 -0.001031 0.001310"
]
},
"execution_count": 29,
@@ -1407,8 +1394,8 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "[[[ 0.00122163 0.00824348]\n",
- " [ 0.00015287 0.00121882]]]\n"
+ "[[[ 0.00131009 0.01310707]\n",
+ " [ 0.00018089 0.00114976]]]\n"
]
}
],
@@ -1476,25 +1463,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "[[[ 0.0400168 ]]\n",
- "\n",
- " [[ 0.05233031]]\n",
- "\n",
- " [[ 0.03819276]]\n",
- "\n",
- " [[ 0.02900783]]\n",
- "\n",
- " [[ 0.03176394]]\n",
- "\n",
- " [[ 0.03046477]]\n",
- "\n",
- " [[ 0.03864163]]\n",
- "\n",
- " [[ 0.02455132]]\n",
- "\n",
- " [[ 0.02282716]]\n",
- "\n",
- " [[ 0.02162945]]]\n"
+ "[[[ 0.04537029]]]\n"
]
}
],
@@ -1502,7 +1471,7 @@
"# Get the relative error for the scattering reaction rates in\n",
"# the first 30 distribcell instances \n",
"data = tally.get_values(scores=['scatter'], filters=['distribcell'],\n",
- " filter_bins=[range(10)], value='rel_err')\n",
+ " filter_bins=[(i,) for i in range(10)], value='rel_err')\n",
"print(data)"
]
},
@@ -1533,126 +1502,119 @@
" mean | \n",
" std. dev. | \n",
" \n",
- " \n",
- " | bin | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
" \n",
" \n",
" \n",
" | 558 | \n",
" 279 | \n",
" absorption | \n",
- " 0.000085 | \n",
- " 0.000008 | \n",
+ " 0.000093 | \n",
+ " 0.000013 | \n",
"
\n",
" \n",
" | 559 | \n",
" 279 | \n",
" scatter | \n",
- " 0.013429 | \n",
- " 0.000449 | \n",
+ " 0.013504 | \n",
+ " 0.000805 | \n",
"
\n",
" \n",
" | 560 | \n",
" 280 | \n",
" absorption | \n",
- " 0.000095 | \n",
- " 0.000014 | \n",
+ " 0.000084 | \n",
+ " 0.000010 | \n",
"
\n",
" \n",
" | 561 | \n",
" 280 | \n",
" scatter | \n",
- " 0.014770 | \n",
- " 0.000783 | \n",
+ " 0.014215 | \n",
+ " 0.000612 | \n",
"
\n",
" \n",
" | 562 | \n",
" 281 | \n",
" absorption | \n",
- " 0.000107 | \n",
- " 0.000013 | \n",
+ " 0.000091 | \n",
+ " 0.000008 | \n",
"
\n",
" \n",
" | 563 | \n",
" 281 | \n",
" scatter | \n",
- " 0.015044 | \n",
- " 0.000605 | \n",
+ " 0.014545 | \n",
+ " 0.000590 | \n",
"
\n",
" \n",
" | 564 | \n",
" 282 | \n",
" absorption | \n",
- " 0.000110 | \n",
- " 0.000010 | \n",
+ " 0.000112 | \n",
+ " 0.000012 | \n",
"
\n",
" \n",
" | 565 | \n",
" 282 | \n",
" scatter | \n",
- " 0.016090 | \n",
- " 0.000795 | \n",
+ " 0.016321 | \n",
+ " 0.000729 | \n",
"
\n",
" \n",
" | 566 | \n",
" 283 | \n",
" absorption | \n",
- " 0.000121 | \n",
- " 0.000012 | \n",
+ " 0.000092 | \n",
+ " 0.000007 | \n",
"
\n",
" \n",
" | 567 | \n",
" 283 | \n",
" scatter | \n",
- " 0.017010 | \n",
- " 0.000793 | \n",
+ " 0.016163 | \n",
+ " 0.000661 | \n",
"
\n",
" \n",
" | 568 | \n",
" 284 | \n",
" absorption | \n",
- " 0.000110 | \n",
- " 0.000007 | \n",
+ " 0.000104 | \n",
+ " 0.000011 | \n",
"
\n",
" \n",
" | 569 | \n",
" 284 | \n",
" scatter | \n",
- " 0.017010 | \n",
- " 0.000430 | \n",
+ " 0.017384 | \n",
+ " 0.000599 | \n",
"
\n",
" \n",
" | 570 | \n",
" 285 | \n",
" absorption | \n",
- " 0.000112 | \n",
- " 0.000007 | \n",
+ " 0.000111 | \n",
+ " 0.000011 | \n",
"
\n",
" \n",
" | 571 | \n",
" 285 | \n",
" scatter | \n",
- " 0.017499 | \n",
- " 0.000615 | \n",
+ " 0.018015 | \n",
+ " 0.000774 | \n",
"
\n",
" \n",
" | 572 | \n",
" 286 | \n",
" absorption | \n",
- " 0.000127 | \n",
- " 0.000016 | \n",
+ " 0.000125 | \n",
+ " 0.000012 | \n",
"
\n",
" \n",
" | 573 | \n",
" 286 | \n",
" scatter | \n",
- " 0.017716 | \n",
- " 0.000690 | \n",
+ " 0.018294 | \n",
+ " 0.000828 | \n",
"
\n",
" \n",
" | 574 | \n",
@@ -1665,22 +1627,22 @@
" 575 | \n",
" 287 | \n",
" scatter | \n",
- " 0.018041 | \n",
- " 0.000702 | \n",
+ " 0.017483 | \n",
+ " 0.000757 | \n",
"
\n",
" \n",
" | 576 | \n",
" 288 | \n",
" absorption | \n",
- " 0.000125 | \n",
- " 0.000013 | \n",
+ " 0.000113 | \n",
+ " 0.000014 | \n",
"
\n",
" \n",
" | 577 | \n",
" 288 | \n",
" scatter | \n",
- " 0.018212 | \n",
- " 0.000715 | \n",
+ " 0.018248 | \n",
+ " 0.000782 | \n",
"
\n",
" \n",
"\n",
@@ -1688,27 +1650,26 @@
],
"text/plain": [
" distribcell score mean std. dev.\n",
- "bin \n",
- "558 279 absorption 0.000085 0.000008\n",
- "559 279 scatter 0.013429 0.000449\n",
- "560 280 absorption 0.000095 0.000014\n",
- "561 280 scatter 0.014770 0.000783\n",
- "562 281 absorption 0.000107 0.000013\n",
- "563 281 scatter 0.015044 0.000605\n",
- "564 282 absorption 0.000110 0.000010\n",
- "565 282 scatter 0.016090 0.000795\n",
- "566 283 absorption 0.000121 0.000012\n",
- "567 283 scatter 0.017010 0.000793\n",
- "568 284 absorption 0.000110 0.000007\n",
- "569 284 scatter 0.017010 0.000430\n",
- "570 285 absorption 0.000112 0.000007\n",
- "571 285 scatter 0.017499 0.000615\n",
- "572 286 absorption 0.000127 0.000016\n",
- "573 286 scatter 0.017716 0.000690\n",
+ "558 279 absorption 0.000093 0.000013\n",
+ "559 279 scatter 0.013504 0.000805\n",
+ "560 280 absorption 0.000084 0.000010\n",
+ "561 280 scatter 0.014215 0.000612\n",
+ "562 281 absorption 0.000091 0.000008\n",
+ "563 281 scatter 0.014545 0.000590\n",
+ "564 282 absorption 0.000112 0.000012\n",
+ "565 282 scatter 0.016321 0.000729\n",
+ "566 283 absorption 0.000092 0.000007\n",
+ "567 283 scatter 0.016163 0.000661\n",
+ "568 284 absorption 0.000104 0.000011\n",
+ "569 284 scatter 0.017384 0.000599\n",
+ "570 285 absorption 0.000111 0.000011\n",
+ "571 285 scatter 0.018015 0.000774\n",
+ "572 286 absorption 0.000125 0.000012\n",
+ "573 286 scatter 0.018294 0.000828\n",
"574 287 absorption 0.000119 0.000013\n",
- "575 287 scatter 0.018041 0.000702\n",
- "576 288 absorption 0.000125 0.000013\n",
- "577 288 scatter 0.018212 0.000715"
+ "575 287 scatter 0.017483 0.000757\n",
+ "576 288 absorption 0.000113 0.000014\n",
+ "577 288 scatter 0.018248 0.000782"
]
},
"execution_count": 33,
@@ -1781,21 +1742,6 @@
" | \n",
" | \n",
" \n",
- " \n",
- " | bin | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
" \n",
" \n",
" \n",
@@ -1810,8 +1756,8 @@
" | 10000 | \n",
" 0 | \n",
" absorption | \n",
- " 0.000136 | \n",
- " 0.000017 | \n",
+ " 0.000123 | \n",
+ " 0.000012 | \n",
"
\n",
" \n",
" | 1 | \n",
@@ -1825,8 +1771,8 @@
" 10000 | \n",
" 0 | \n",
" scatter | \n",
- " 0.018504 | \n",
- " 0.000740 | \n",
+ " 0.017805 | \n",
+ " 0.000808 | \n",
"
\n",
" \n",
" | 2 | \n",
@@ -1840,8 +1786,8 @@
" 10000 | \n",
" 1 | \n",
" absorption | \n",
- " 0.000231 | \n",
- " 0.000031 | \n",
+ " 0.000217 | \n",
+ " 0.000020 | \n",
"
\n",
" \n",
" | 3 | \n",
@@ -1855,8 +1801,8 @@
" 10000 | \n",
" 1 | \n",
" scatter | \n",
- " 0.029149 | \n",
- " 0.001525 | \n",
+ " 0.028867 | \n",
+ " 0.001263 | \n",
"
\n",
" \n",
" | 4 | \n",
@@ -1870,8 +1816,8 @@
" 10000 | \n",
" 2 | \n",
" absorption | \n",
- " 0.000306 | \n",
- " 0.000032 | \n",
+ " 0.000318 | \n",
+ " 0.000020 | \n",
"
\n",
" \n",
" | 5 | \n",
@@ -1885,8 +1831,8 @@
" 10000 | \n",
" 2 | \n",
" scatter | \n",
- " 0.039770 | \n",
- " 0.001519 | \n",
+ " 0.040493 | \n",
+ " 0.001269 | \n",
"
\n",
" \n",
" | 6 | \n",
@@ -1900,8 +1846,8 @@
" 10000 | \n",
" 3 | \n",
" absorption | \n",
- " 0.000339 | \n",
- " 0.000028 | \n",
+ " 0.000386 | \n",
+ " 0.000018 | \n",
"
\n",
" \n",
" | 7 | \n",
@@ -1915,8 +1861,8 @@
" 10000 | \n",
" 3 | \n",
" scatter | \n",
- " 0.046708 | \n",
- " 0.001355 | \n",
+ " 0.048576 | \n",
+ " 0.001337 | \n",
"
\n",
" \n",
" | 8 | \n",
@@ -1930,8 +1876,8 @@
" 10000 | \n",
" 4 | \n",
" absorption | \n",
- " 0.000433 | \n",
- " 0.000031 | \n",
+ " 0.000501 | \n",
+ " 0.000026 | \n",
"
\n",
" \n",
" | 9 | \n",
@@ -1945,8 +1891,8 @@
" 10000 | \n",
" 4 | \n",
" scatter | \n",
- " 0.056359 | \n",
- " 0.001790 | \n",
+ " 0.057063 | \n",
+ " 0.001715 | \n",
"
\n",
" \n",
" | 10 | \n",
@@ -1960,8 +1906,8 @@
" 10000 | \n",
" 5 | \n",
" absorption | \n",
- " 0.000538 | \n",
- " 0.000028 | \n",
+ " 0.000484 | \n",
+ " 0.000026 | \n",
"
\n",
" \n",
" | 11 | \n",
@@ -1975,8 +1921,8 @@
" 10000 | \n",
" 5 | \n",
" scatter | \n",
- " 0.064943 | \n",
- " 0.001978 | \n",
+ " 0.060822 | \n",
+ " 0.001581 | \n",
"
\n",
" \n",
" | 12 | \n",
@@ -1990,8 +1936,8 @@
" 10000 | \n",
" 6 | \n",
" absorption | \n",
- " 0.000588 | \n",
- " 0.000028 | \n",
+ " 0.000532 | \n",
+ " 0.000039 | \n",
"
\n",
" \n",
" | 13 | \n",
@@ -2005,8 +1951,8 @@
" 10000 | \n",
" 6 | \n",
" scatter | \n",
- " 0.070231 | \n",
- " 0.002714 | \n",
+ " 0.069101 | \n",
+ " 0.002249 | \n",
"
\n",
" \n",
" | 14 | \n",
@@ -2020,8 +1966,8 @@
" 10000 | \n",
" 7 | \n",
" absorption | \n",
- " 0.000670 | \n",
- " 0.000041 | \n",
+ " 0.000577 | \n",
+ " 0.000039 | \n",
"
\n",
" \n",
" | 15 | \n",
@@ -2035,8 +1981,8 @@
" 10000 | \n",
" 7 | \n",
" scatter | \n",
- " 0.075852 | \n",
- " 0.001862 | \n",
+ " 0.076722 | \n",
+ " 0.002335 | \n",
"
\n",
" \n",
" | 16 | \n",
@@ -2050,7 +1996,7 @@
" 10000 | \n",
" 8 | \n",
" absorption | \n",
- " 0.000745 | \n",
+ " 0.000649 | \n",
" 0.000039 | \n",
"
\n",
" \n",
@@ -2065,8 +2011,8 @@
" | 10000 | \n",
" 8 | \n",
" scatter | \n",
- " 0.086234 | \n",
- " 0.001968 | \n",
+ " 0.081564 | \n",
+ " 0.001610 | \n",
"
\n",
" \n",
" | 18 | \n",
@@ -2080,8 +2026,8 @@
" 10000 | \n",
" 9 | \n",
" absorption | \n",
- " 0.000731 | \n",
- " 0.000039 | \n",
+ " 0.000680 | \n",
+ " 0.000032 | \n",
"
\n",
" \n",
" | 19 | \n",
@@ -2095,63 +2041,61 @@
" 10000 | \n",
" 9 | \n",
" scatter | \n",
- " 0.090448 | \n",
- " 0.001956 | \n",
+ " 0.087715 | \n",
+ " 0.001959 | \n",
"
\n",
" \n",
"\n",
""
],
"text/plain": [
- " level 1 level 2 level 3 distribcell score \\\n",
- " cell univ lat cell univ \n",
- " id id id x y z id id \n",
- "bin \n",
- "0 10003 0 10001 0 0 0 10002 10000 0 absorption \n",
- "1 10003 0 10001 0 0 0 10002 10000 0 scatter \n",
- "2 10003 0 10001 1 0 0 10002 10000 1 absorption \n",
- "3 10003 0 10001 1 0 0 10002 10000 1 scatter \n",
- "4 10003 0 10001 2 0 0 10002 10000 2 absorption \n",
- "5 10003 0 10001 2 0 0 10002 10000 2 scatter \n",
- "6 10003 0 10001 3 0 0 10002 10000 3 absorption \n",
- "7 10003 0 10001 3 0 0 10002 10000 3 scatter \n",
- "8 10003 0 10001 4 0 0 10002 10000 4 absorption \n",
- "9 10003 0 10001 4 0 0 10002 10000 4 scatter \n",
- "10 10003 0 10001 5 0 0 10002 10000 5 absorption \n",
- "11 10003 0 10001 5 0 0 10002 10000 5 scatter \n",
- "12 10003 0 10001 6 0 0 10002 10000 6 absorption \n",
- "13 10003 0 10001 6 0 0 10002 10000 6 scatter \n",
- "14 10003 0 10001 7 0 0 10002 10000 7 absorption \n",
- "15 10003 0 10001 7 0 0 10002 10000 7 scatter \n",
- "16 10003 0 10001 8 0 0 10002 10000 8 absorption \n",
- "17 10003 0 10001 8 0 0 10002 10000 8 scatter \n",
- "18 10003 0 10001 9 0 0 10002 10000 9 absorption \n",
- "19 10003 0 10001 9 0 0 10002 10000 9 scatter \n",
+ " level 1 level 2 level 3 distribcell score \\\n",
+ " cell univ lat cell univ \n",
+ " id id id x y z id id \n",
+ "0 10003 0 10001 0 0 0 10002 10000 0 absorption \n",
+ "1 10003 0 10001 0 0 0 10002 10000 0 scatter \n",
+ "2 10003 0 10001 1 0 0 10002 10000 1 absorption \n",
+ "3 10003 0 10001 1 0 0 10002 10000 1 scatter \n",
+ "4 10003 0 10001 2 0 0 10002 10000 2 absorption \n",
+ "5 10003 0 10001 2 0 0 10002 10000 2 scatter \n",
+ "6 10003 0 10001 3 0 0 10002 10000 3 absorption \n",
+ "7 10003 0 10001 3 0 0 10002 10000 3 scatter \n",
+ "8 10003 0 10001 4 0 0 10002 10000 4 absorption \n",
+ "9 10003 0 10001 4 0 0 10002 10000 4 scatter \n",
+ "10 10003 0 10001 5 0 0 10002 10000 5 absorption \n",
+ "11 10003 0 10001 5 0 0 10002 10000 5 scatter \n",
+ "12 10003 0 10001 6 0 0 10002 10000 6 absorption \n",
+ "13 10003 0 10001 6 0 0 10002 10000 6 scatter \n",
+ "14 10003 0 10001 7 0 0 10002 10000 7 absorption \n",
+ "15 10003 0 10001 7 0 0 10002 10000 7 scatter \n",
+ "16 10003 0 10001 8 0 0 10002 10000 8 absorption \n",
+ "17 10003 0 10001 8 0 0 10002 10000 8 scatter \n",
+ "18 10003 0 10001 9 0 0 10002 10000 9 absorption \n",
+ "19 10003 0 10001 9 0 0 10002 10000 9 scatter \n",
"\n",
- " mean std. dev. \n",
- " \n",
- " \n",
- "bin \n",
- "0 0.000136 0.000017 \n",
- "1 0.018504 0.000740 \n",
- "2 0.000231 0.000031 \n",
- "3 0.029149 0.001525 \n",
- "4 0.000306 0.000032 \n",
- "5 0.039770 0.001519 \n",
- "6 0.000339 0.000028 \n",
- "7 0.046708 0.001355 \n",
- "8 0.000433 0.000031 \n",
- "9 0.056359 0.001790 \n",
- "10 0.000538 0.000028 \n",
- "11 0.064943 0.001978 \n",
- "12 0.000588 0.000028 \n",
- "13 0.070231 0.002714 \n",
- "14 0.000670 0.000041 \n",
- "15 0.075852 0.001862 \n",
- "16 0.000745 0.000039 \n",
- "17 0.086234 0.001968 \n",
- "18 0.000731 0.000039 \n",
- "19 0.090448 0.001956 "
+ " mean std. dev. \n",
+ " \n",
+ " \n",
+ "0 0.000123 0.000012 \n",
+ "1 0.017805 0.000808 \n",
+ "2 0.000217 0.000020 \n",
+ "3 0.028867 0.001263 \n",
+ "4 0.000318 0.000020 \n",
+ "5 0.040493 0.001269 \n",
+ "6 0.000386 0.000018 \n",
+ "7 0.048576 0.001337 \n",
+ "8 0.000501 0.000026 \n",
+ "9 0.057063 0.001715 \n",
+ "10 0.000484 0.000026 \n",
+ "11 0.060822 0.001581 \n",
+ "12 0.000532 0.000039 \n",
+ "13 0.069101 0.002249 \n",
+ "14 0.000577 0.000039 \n",
+ "15 0.076722 0.002335 \n",
+ "16 0.000649 0.000039 \n",
+ "17 0.081564 0.001610 \n",
+ "18 0.000680 0.000032 \n",
+ "19 0.087715 0.001959 "
]
},
"execution_count": 34,
@@ -2204,38 +2148,38 @@
" \n",
" \n",
" | mean | \n",
- " 0.000416 | \n",
- " 0.000025 | \n",
+ " 0.000418 | \n",
+ " 0.000022 | \n",
"
\n",
" \n",
" | std | \n",
- " 0.000238 | \n",
- " 0.000011 | \n",
+ " 0.000239 | \n",
+ " 0.000009 | \n",
"
\n",
" \n",
" | min | \n",
- " 0.000023 | \n",
+ " 0.000018 | \n",
" 0.000004 | \n",
"
\n",
" \n",
" | 25% | \n",
- " 0.000206 | \n",
- " 0.000017 | \n",
+ " 0.000202 | \n",
+ " 0.000015 | \n",
"
\n",
" \n",
" | 50% | \n",
- " 0.000391 | \n",
- " 0.000024 | \n",
+ " 0.000402 | \n",
+ " 0.000021 | \n",
"
\n",
" \n",
" | 75% | \n",
- " 0.000626 | \n",
- " 0.000031 | \n",
+ " 0.000615 | \n",
+ " 0.000027 | \n",
"
\n",
" \n",
" | max | \n",
- " 0.000928 | \n",
- " 0.000061 | \n",
+ " 0.000892 | \n",
+ " 0.000044 | \n",
"
\n",
" \n",
"\n",
@@ -2246,13 +2190,13 @@
" \n",
" \n",
"count 289.000000 289.000000\n",
- "mean 0.000416 0.000025\n",
- "std 0.000238 0.000011\n",
- "min 0.000023 0.000004\n",
- "25% 0.000206 0.000017\n",
- "50% 0.000391 0.000024\n",
- "75% 0.000626 0.000031\n",
- "max 0.000928 0.000061"
+ "mean 0.000418 0.000022\n",
+ "std 0.000239 0.000009\n",
+ "min 0.000018 0.000004\n",
+ "25% 0.000202 0.000015\n",
+ "50% 0.000402 0.000021\n",
+ "75% 0.000615 0.000027\n",
+ "max 0.000892 0.000044"
]
},
"execution_count": 35,
@@ -2287,7 +2231,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Mann-Whitney Test p-value: 0.474494586047\n"
+ "Mann-Whitney Test p-value: 0.414863173548\n"
]
}
],
@@ -2325,7 +2269,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Mann-Whitney Test p-value: 1.364780046e-41\n"
+ "Mann-Whitney Test p-value: 3.28554363741e-42\n"
]
}
],
@@ -2371,7 +2315,7 @@
{
"data": {
"text/plain": [
- ""
+ ""
]
},
"execution_count": 38,
@@ -2380,9 +2324,9 @@
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAEZCAYAAABvpam5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztvX2cFOWZ7/29hnFcFBQR4xsEDWKcCWiGGMWQSHLiMIgu\nHpn1GFkjGI+aZ5cYdTDAQ+IxKyxrTlBDPKv4EiEJrEkk7o4LzmDy5IzLJDEREdQZjZhofCUCMfGF\nZMS5nj+qeqa6uqq7qrurX2au7+fTn+mqvu+7rqruuX/3fV33i6gqhmEYhhGHmnIbYBiGYVQfJh6G\nYRhGbEw8DMMwjNiYeBiGYRixMfEwDMMwYmPiYRiGYcTGxMMwCkRElojIXeW2wzBKiYmHUZGIyCdF\n5Oci8qaI7BGRLSJyaoFlzheR//KdWyMiNxZSrqquUNXLCykjDBHpE5G3ReQtEXlFRFaJSG3EvDeI\nyPeSsMswTDyMikNEDgH+E/gWcBhwLPB14K/ltCsIERlWgsucrKojgTOBOcAVJbimYWTFxMOoRE4E\nVFV/oA5/UdWHVfXJVAIRuVxEukXkzyLytIg0uucXi8hOz/n/7p6vB24HznBb8X8UkcuBucBX3HP/\n4aY9RkQ2iMgfROS3IvIlz3VvEJH7ReR7IvInYL63hS8ix7m9hUtE5EUReUNE/l9P/uEislZE9rr2\nf0VEXoryUFT1eaALaPCU9y0R+b2I/ElEHhORT7rnZwJLgAvde9vmnj9URO4RkVdF5GURuVFEatzP\nThCRTre394aI3Bf3izOGDiYeRiXyLPC+61KaKSKHeT8UkQuA/wV8XlUPAWYDe9yPdwKfdM9/Hfi+\niBypqj3AF4FfqOpIVT1MVe8C1gE3uefOcyvSB4FtwDHAZ4GrRWSGx4TZwI9U9VA3f9AaP9NwRPCz\nwPUi8mH3/P8CPggcDzQBF4fkT7tl975PAj4F/Mrz2a+AU3B6aOuBH4lInaq2A/8M3OfeW6Obfg3Q\nC0wAGoEZwP90P7sRaFfVUTi9vVU57DKGMCYeRsWhqm8Bn8SpVO8C/iAi/yEiH3CT/E+cCn+rm/55\nVf29+/5+VX3dff9D4DngdDefhFzSe/7jwBhVXaaq+1X1d8DdwOc8aX6uqm3uNf4SUu7XVfWvqroD\n2I5TwQNcAPyzqv5JVV/Bcc2F2ZXicRF5G+gG7lfV76Y+UNV1qvpHVe1T1ZuBA4GUUIm3bBE5Ejgb\nuEZV96nqG8CtnnvrBY4TkWNVtVdVf57DLmMIY+JhVCSq+oyqXqqq44BJOL2AW92PxwLPB+Vz3UXb\nXLfUH928h8e49HjgmFR+t4wlwAc8aV6OUM7rnvfvAiPc98cAXjdVlLIaVXUEcCFwiYiMT30gIgtd\n99ebrq2HAmNCyhkPHAC85rm3O4Aj3M+/giM2vxKRp0Tk0gi2GUOUSKM2DKOcqOqzIrKWgUDxS8AJ\n/nRupXon8N9w3FPq+vpTre8g95D/3O+B36nqiWHmBOSJszT1a8A44Bn3eFzUjKr6IxE5D7gBuFRE\nPgVcB/w3VX0aQET2En6/L+EMOjhcVfsCyt+F+4xFZBrwExHpVNXfRrXRGDpYz8OoOETkwyJyrYgc\n6x6PAy4CfuEmuRtYKCJTxOEEEfkgcDBOhbkbqHFbzpM8Re8CxorIAb5zH/Ic/wp4yw1kDxeRYSIy\nSQaGCQe5mHK5nbz8EFgiIqPc+1tAPPH5F+AiERkLjAT2A7tFpE5ErgcO8aR9HccNJQCq+hqwGbhZ\nREaKSI2ITBCRM8GJJbnlArzp2pUhMoYBJh5GZfIWTpziUdfX/wtgB9AKTlwDWI4TIP4z8GPgMFXt\nBla66V/HEY4tnnJ/CjwNvC4if3DP3QM0uG6cH7st8nOBjwK/Bd7A6c2kKuWwnof6jsP4JxxX1e9w\nKvIf4cQawkgrS1WfAv4/4Fqg3X39BngB2IfTc0rxI/fvHhF5zH1/CVCHEz/Z66Y5yv3sVOCXIvIW\n8B/AVar6QhbbjCGMJLkZlDtc8FZgGHC3qt4UkGYVThDvXWC+qqaGFH4ZJzAqwF2q+q3EDDWMMiEi\n/w/wP1T1M+W2xTDikFjPQ5zJU7cBM3HGpV8kzlh7b5pZwAmqOhHH13q7e34SjnB8HGeUyrkiMiEp\nWw2jVIjIUSIyzXUZfRinB/FAue0yjLgk6bY6Ddipqi+o6nvAfcB5vjSzgbUAqvooMEpEjgLqgUfd\nyWHvA504M2sNo9qpwxnh9GccN9q/A/9aVosMIw+SHG11LJlDEk+PkOYY4ElgmYiMBv4CnEP6xCjD\nqErc+SiTy22HYRRKkuIRNZiSMVJFVZ8RkZtwAorv4Mz2tVEfhmEYFUKS4vEK6WPYx5E5IcqfZqx7\nDlX9DvAdABH5Z9JHkeCeTy7abxiGMYhR1ThDzDNIMubxGDBRnIXi6nBmx7b50rThDB1ERKYCb7oT\nlUgtReGO3z8fZ1hmBqpata85c+aU3Qazv/x2DEX7q9n2wWB/MUis56Gq+0VkAdCBM1T3HlXtEZEr\n3c9Xq+omEZklIjtx3FPe5RDuF5HDgfeAf1DVPydlq2EYhhGPRJcnUdWHgId851b7jheE5D0zQdMM\nwzCMArAZ5mWkvr4+d6IKxuwvL9VsfzXbDtVvfzEw8SgjDQ0NuRNVMGZ/ealm+6vZdqh++4uBiYdh\nGIYRGxMPwzAMIzYmHoZhGEZsTDwMwzCM2Jh4GIZhGLEx8TAMwzBiY+JhGIZhxMbEwzAMw4iNiYdh\nGIYRGxMPwzAMIzYmHoZhGEZsTDwMwzCM2Jh4GIZhGLEx8TAMwzBik6h4iMhMEXlGRJ4TkUUhaVa5\nn28XkUbP+SUi8rSIPCki60XkwCRtNQzDMKKTmHiIyDDgNmAm0ABcJCL1vjSzgBNUdSJwBXC7e/44\n4HJgiqpOxtnG9nNJ2WoYhmHEI8mex2nATlV9QVXfA+4DzvOlmQ2sBVDVR4FRInIk8GecvcsPEpFa\n4CDglQRtNQzDMGKQpHgcC7zkOX7ZPZczjaruBVYCvwdeBd5U1Z8kaKthGIYRg9oEy9aI6STjhMgE\n4GrgOOBPwI9E5O9VdZ0/bUtLS//7+vr6qtoesqurq9wmFITZX16q2f5qth2qz/7u7m56enqKWmaS\n4vEKMM5zPA6nZ5EtzVj33KeBn6vqHgAR+THwCSBDPDZs2FA8i8vA3Llzy21CQZj95aWa7a9m26G6\n7RfJaLPHJkm31WPARBE5TkTqgAuBNl+aNuASABGZiuOe2gU8C0wVkeHi3OVZQHeCthqGYRgxSKzn\noar7RWQB0IEzWuoeVe0RkSvdz1er6iYRmSUiO4F3gEvdz54Qke/iCFAf8DhwZ1K2GoZhGPFI0m2F\nqj4EPOQ7t9p3vCAk7zeAbyRnnWEYhpEvNsPcMAzDiI2Jh2EYhhEbEw/DMAwjNiYehmEYRmxMPAzD\nMIzYmHgYhmEYsTHxMAzDMGJj4mEYhmHExsTDMAzDiI2Jh2EYhhEbE48qoqOjgxkzWpgxo4WOjo5y\nm2MYxhAm0bWtjOLR0dHB+efPY9++mwDYsmUeDzywlubm5jJbZhjGUMTEo0pYufJOVzjmAbBvn3PO\nxMMwjHJgbivDMAwjNtbzqBJaW69gy5Z57NvnHA8fvojW1rXlNcowjCGLiUeV0NzczAMPrGXlSmdP\nrNZWi3cYhlE+EhUPEZkJ3Iqzk+DdqnpTQJpVwNnAu8B8Vd0mIh8G7vMk+xDwNVVdlaS9lU5zc7MJ\nhmEYFUFi4iEiw4DbcPYffwX4tYi0qWqPJ80s4ARVnSgipwO3A1NV9Vmg0U1T4+Z/IClbDcMwjHgk\nGTA/Ddipqi+o6ns4PYnzfGlmA2sBVPVRYJSIHOlLcxbwvKq+lKCthmEYRgySFI9jAW+F/7J7Llea\nsb40nwPWF906wzAMI2+SjHloxHQSlk9E6oC/BRaFZW5pael/X19fT0NDQwwTy0tXV1fktDt27GDj\nxkcAOOecMzn55JOTMisyceyvRMz+8lHNtkP12d/d3U1PT0/uhDFIUjxeAcZ5jsfh9CyypRnrnktx\nNrBVVd8Iu8iGDRsKNLO8zJ07N2eajo4OVq1a0z+7/PnnF1XM7PIo9lcyZn/5qGbbobrtF/G32eOT\npHg8BkwUkeOAV4ELgYt8adqABcB9IjIVeFNVd3k+vwj4twRtrFg6Ojr6h+Xu3r3LZpcbhlFRJCYe\nqrpfRBYAHThDde9R1R4RudL9fLWqbhKRWSKyE3gHuDSVX0QOxgmWX56UjZWKfx2rmpprgCfLa5Rh\nGIaHROd5qOpDwEO+c6t9xwtC8r4DjEnOusrFv45VXx/U1LTS1zcZsNnlhmGUH5thXiWccsokxoxp\nA2x2uWEY5cfEowIJWsdqxQoTDMMwKgcTjwrE1rEyDKPSMfGoUGwdK8MwKhnbz8MwDMOIjYmHYRiG\nERsTD8MwDCM2Jh6GYRhGbEw8DMMwjNiYeBiGYRixMfEYBHR0dDBjRgszZrTQ0dFRbnMMwxgC2DyP\nKsO72m5r6xUAaYsobtkyr2KWazcMY/Bi4lFF+Ffb3bJlHieddIIt124YRskx8agi/Kvt7tsHL754\nY3mNMgxjSGIxjypn/PixDB++CFgLrHWXa78iLY3FRAzDKDbW86giwlbbBUIXUQxydVlMxDCMQklU\nPERkJnArzk6Cd6vqTQFpVuHsVf4uMF9Vt7nnRwF3Ax8BFPiCqv4ySXsrnWyr7YaJQZCry2IihmEU\nSmLiISLDgNtwtpJ9Bfi1iLSpao8nzSzgBFWdKCKnA7cDU92PvwVsUtW/E5Fa4OCkbK0mbLVdwzAq\ngSRjHqcBO1X1BVV9D7gPOM+XZjaOsx5VfRQYJSJHisihwKdU9TvuZ/tV9U8J2jpoaW29ImdMJAyL\nlRiGEUaSbqtjgZc8xy8Dp0dIMxZ4H3hDRO4FTgG2Al9W1XeTM3dwku/GUhYrMQwjG0mKh0ZMJwH5\naoEpwAJV/bWI3AosBq73Z25pael/X19fT0NDQ37WloGurq6SXWv+fOc57dmzh/Xr1+dMv2LFbRmx\nkoULv86ePXv605TS/iQw+8tHNdsO1Wd/d3c3PT09uRPGIEnxeAUY5zkeh9OzyJZmrHtOgJdV9dfu\n+ftxxCODDRs2FMXYcjF37txymxDImjUbeOqp9HNHH310hr2Van9UzP7yUc22Q3XbL+Jvs8cnyZjH\nY8BEETlOROqAC4E2X5o24BIAEZkKvKmqu1T1deAlETnRTXcW8HSCtho+ComVGIYx+ElMPFR1P7AA\n6AC6gR+oao+IXCkiV7ppNgG/FZGdwGrgHzxFfAlYJyLbgZOBf07K1mqmWEFtfzmpWElTUxtNTW0W\n7zAMI41E53mo6kPAQ75zq33HC0Lybgc+npx11U+xgtrZykmVtXz5cubO/UcArr32UpYuXVrEOzEM\no9qwGeZVTLEmAOYqZ/ny5Xz1q98AVgHw1a9eBcDxxx9flPswDKP6sLWtjJzcfPO9OMIxz32tcs8Z\nhjFUMfGoYuIEtYNiI6lzu3fvoq7uukjlGIZhgLmtqpqoEwCDYhpLl36J5cu/3X+uru5qGhvvZcyY\nwzPKufbaS/tdVQ5Xce21X0nuxgzDqHhMPKqcKGtdBcU0br75xrRzvb0wZkwbmzdnzptJBcdvvtnZ\nO+Taa7/C0qVLI002NAxjcGLiMYhJbVm7det2oLDg9tKlS22ElWEY/Zh4DFLSXVWzgZTbaTI1Ndfw\nt387mx/+cFHa3iCtrWvLZK1hGNWGiccgxe+qcrgWOJG+vi/wwx9+n6VLv0RnpzPpP+qCiYZhGGDi\nMcQ4EfgFAPv2TaazMzjGYRiGkQsbqjtI8Q/jram5BpiWkc727DAMIx+s5zFI8Q/jnT691R2aOxlw\nYhzTp38pcAhvZ+fjgCNAlerKSg0GgMq20zAGKyYeg5SgyvXUU09NmxMSNIT3+utb6etbCZR+A6io\ngmAbVRlG+THxGIQsX76c669fSV/fLQB0dn6Oj3zkFHcC4EClnKqovfT1TaTQtbKyESYQcQShWGt6\nGYaRPyYeg4yOjg6uv/4WVzjmAR309taybdulQHql3Np6BVu2zOsfrityNaqXJWpbmECYIBhGdWHi\nMchYufJOt/eQ4k7gmwRVyt64yO7de3jyyffYv38t4MRF6uquo7X1e0W1bUAglrNv3wGce+4l3HDD\nVbmypuEXPZujYhilJ1HxEJGZwK3AMOBuVb0pIM0q4GzgXWC+qm5zz78A/Bl4H3hPVU9L0tbBxTRg\nkfv+1awpUyIyY0YL+/f/H+AoHMF5lY985MSEWv7LAWeJ9/37nSXe5807n+HDo01ajLqml2EYyZHX\nUF0RuStCmmHAbcBMoAG4SETqfWlmASeo6kTgCuB2z8cKfFpVG004MgkbYusM0f0+cDFwByJPU1vb\nSvQVc5uBDcA0du58qahDeAeGD9+Bf4n3Bx/cEmvnwubmZjZv3sDmzRtMOAyjDGTtebgCcJWq3uL7\naHVQeh+nATtV9QW3rPuA84AeT5rZOLUaqvqoiIwSkSNVdVfKhAjXGXLk2vlvoFV+DK2tNwDkbKW3\ntl5BZ+fn6e0FeBK4i7feWsXDDxdvNFPKtnPPvYT9+4M/NyEwjOogq3io6vsiMhe4xXf+sQhlHwu8\n5Dl+GTg9QppjgV04PY+fiMj7wGpVzdnbGSrkCi4HVcK5KuXm5mY+8pET2bbtX4C9OJ3Fo4Dmogav\nm5ubueGGq2yJd8OocqLEPLaIyG3AD4B3UidV9fEc+TSiDWG9i0+q6qsicgTwsIg8o6r/FbFMI292\n4wTYwRGn4geiw5Z4t4l/hlE9RBGPRhwh+Cff+c/kyPcKMM5zPA6nZ5EtzVj3HKr6qvv3DRF5AMcN\nliEeLS0t/e/r6+tpaGjIYVbl0NXVlVe+KVMm0tm50HUxQV3dQqZMuazg/TX++Mc/4x2Z5XADdXU7\nA8vv6upix44dbNz4CADnnHMmJ598cqRrHX/88Xz72wM/qcWLF3PLLffQ2+sIV2fnxVxzzWWRy8uH\nfJ9/pVDN9lez7VB99nd3d9PT05M7YRxUNfSFM0rq2mxpsuStBZ4HjgPqgCeAel+aWcAm9/1U4Jfu\n+4OAke77g4EuYEbANbSaWbduXd5529vbtalpjjY1zdH29vai5G9qmqOwRkHd1xodPXpCaPmLFi3S\n4cOPdPOs0eHDj8zLlrBrNzXNyausqBTy/CuBara/mm1XrX773bozdr3ufUWJeVwE3JyHKO0XkQVA\nhytC96hqj4hc6X6+WlU3icgsEdmJ4xK71M1+FPBjEUmJ0DpV3RzXhsFMIcHlsIB70PyJ9evDA+Ub\nNz4Se2KfuaYMY3CQT8xDcFQrV8wDVX0IeMh3brXveEFAvt8CH41gm5EHYQH3zZs3JDp/ItsoMZv4\nZxjVRZIxD6MKidqj6ejo4O2336amppW+vieByTkr/GyjxGzin2FUFznFQ1U/XQI7jBISpZWfzb3k\n70HU1FzDKac0sGLFQIWfj3vK5nkYRvWQUzxE5Cic9SSOVdWZItIAnKGq9yRunZEIuVr5uVa49fcg\n+vpgzJi2/s/9q/pmi6mYa8owqpMobqs1wL3AUvf4OeCHgIlHFZOtlV/ICreZq/qWLqZiGEbpiCIe\nY1T1ByKyGEBV3xORgMUljKFCth5E5qq+6ZhryjAGB1EWRnxbRA5PHYjIVOBPyZlkxCGJPcj9+5/7\nF1NMub0mTVrdv4ghwIwZLWzduh1nhZn0/dOzL8ZoGEa1EaXn0Qo8CHxIRH4OHAH8XaJWGZGIux1r\n1CB2lJFPzc3N7Nmzh7lz5/rsmA1cBTQBd1BT8xz/9E+t1tswjEFGlNFWW0VkOvBhnDkez6pqb+KW\nGTmJE5uIKzRx3Et+OwBGjvwaBxxQx/jxkzj11FPj3ZhhGBVPpP08VPU9VX1KVZ804ahO0it4R0SC\n9jAvFu+88y57936Nbdsu5fzz50VyqSXhgjMMIxlsG9oqplKGvvrtqKm5hr6+LxB32ZI4PSPDMMqL\niUcVE2dWdpJCk7JjyZIbefHF13nvvRG89Va8MgoZHmwYRukx8ahyosYmCln+I2qg/Zlndvb3HJyg\nOURZtsQwjOojL/EQkW2q2lhsY4xkyWeORVR3UlDQfPToG/nYx34XSagqxQVnGEY08hIPE46hQyHu\npI997BQ2b96Qdi6sF2MLIxpGdWFuqyFGUvtphPUcvNebPn0Ky5d/O7QXM9hnn9teJsZgIlQ8RORt\nwvchV1U9JBmTjKTIZ0RTVHdSUM8BSLveT38afxTWYMFGkxmDjVDxUNURhRYuIjOBW3F2ErxbVW8K\nSLMKOBt4F5ivqts8nw0DHgNeVtW/LdSeoU4+Lqg47iR/z2HGjJaM1XfhjmLcSigdHR0sWbKCF198\nmfHjj2LFiq9VRAVto8mMwUYkt5WIfAo4QVXvFZEjgBGq+rsceYYBtwFnAa8AvxaRNlXt8aSZ5ZY7\nUUROB27H2cs8xZeBbmBknJsy4pHLnVJMd1JNzXP09Tm9krhB8TA7U+d3797Fk08+w/79KwHYu3ch\ns2d/jra2+6ySNowiE2U/jxuAU4ETcZZmrwPWAZ/IkfU0YKeqvuCWcx9wHtDjSTMbZ/U8VPVRERkl\nIkeq6i4RGQvMwtlL5NoY92SEEOSCmj79SzndKfn66oOut3TpNXR2trmfxxsuHGQneF1jdwAr8Y74\n6u39KnPn/iPr1/+fsgqIjSYzBhtReh7n42xFuxVAVV8RkSgurWOBlzzHLwOnR0hzLLALuAW4DrDY\nSpEIckHlcqd0dHQwe/bn6O09CYDOzugt+TCX19KlA2miClOYnc771Pm2gJxj2bv3i5x/fnljDDaa\nzBhsRBGPv6pqn4gAICIHRyw7LNjuR/zHInIu8AdV3SYin45YjhEBvwsq1/pWc+d+nt7ePuCLAPT2\nLmTJkhsjV3ze66XWrgJHKB577DF346iJwLQiBJGvAC72HC8Ergba2Lfv+Fh2J8FgH01mDC2iiMeP\nRGQ1MEpErgC+ANwdId8rwDjP8TicnkW2NGPdcy3AbDcm8jfAISLyXVW9xH+RlpaW/vf19fU0NDRE\nMK0y6OrqKrcJTJkykc7OhfS6y12KXM2oUU2sX7+eO+64g7173wNW4XUF/eY3X2X9+vWx7N+xYwe3\n3HIPvb3fBOBnP/sfvP++oPotN8Ui9u27mIULv86ePXty2llXt5ApUy4DSDtfW9vL6NHL2L37Tfr6\npgPfBhxX1xNPXM3ixYs5+eSTgdzPf8eOHWzc+AgA55xzZn++SiGp308p7rsSfvuFUG32d3d309PT\nkzthHFQ19IXTK/ggMAP4pvtqypbHk7cWeB44DidO8gRQ70szC9jkvp8K/DKgnOnAgyHX0Gpm3bp1\n5TZBVVWXLVumNTWHK0xVaNXhw4/U9vZ2ra39gHtujYK6rzXa2DhdVePZ39Q0x1dOZrkwVZua5oSW\n0d7erk1Nc7SpaY62t7f3n2tsnKYjRhytI0d+UBsbp2t7e7u2t7e795Rpe6qMRYsWZb3W8OFHuvnX\n9D+TSiKJ30+p7rtSfvv5Uu32u3Vnzno82ytKz2OTqk4CNscUpf0isgDowBmqe4+q9ojIle7nq1V1\nk4jMEpGdwDvApWHFxbm2EY/Ozsfp6xsINO/bN9njzpqGsytgiqtYseKHidhRU/Mcra03hH7ud/sM\nBNEvBp4FVrBtG/3xjVNOmcS2bellbN/+lHuvTo/lM5/5TKAraagOrR2q923EJ6t4qKqKyFYROU1V\nfxW3cFV9CHjId26173hBjjI6gc641zYK5+///mzWrr0LuBxnJNMznHXWaRkVSZSgt3+0UV3dM8B1\n/e6mmppr+PznZ7Ny5Z2sXHlnpFFdAxVdG06nOL3CW7FiiSsuA9fwTlLs7bWK0TDyJUrPYypwsYi8\niNM7AEdXKssBbORNtmGkmzd38tpraxg2rIaLLz6PNWvWpOWNOnM6c7TRfcBAwH769NasS5fkg/+a\nu3c3sG3b5MC0fgEcqkNrh+p9G3mQy6+FE7PIeBXqLyvGC4t5FA1/PCGK73vdunUBsYw1WeMWYeRT\nzoCNrQpjcvrp/fdUVzcm670GxVgKJSxuk891kvr9JHHffirpt58P1W4/pYh5qDvJzxjc5FpapBJ9\n396exe7dHwbuZcyYw0PnUPh7IlOmXEZzc3PovW7evKGo9xvUS1u69EtF73EVig0pNqJgq+oaBVEs\nN0e+5QRVdP75JP5lTFLng4YEp9i6dTsdHR1FrUSDgtE333xjxYu0YQRh4mEEks9qurt37wFO6K+g\n41SAcWZg+5d537DhIV588XXGjx9LS0tTYEseyGj1X3XVfObOnZtxr7CQvXvnlX1Wei527NjBmjXO\nfinTp0+hs/NxoPDl3m3peCMShfq9yvnCYh6JsmzZMh09eoKOHj1Bly1blvG51/5C5wcExVyC/O7+\n68BBCqP7j0VGuTGQ9NhJUExl0qQz0sodPXqCO/+kvaD4TbZ79D+jZcuW5fXc2tvbta5ujOc5HOLe\nd2FzM2yeRzSq3X6KEPMouwAUZLyJR2JEDZinKCRwnhnIPkLr6kYFXjvqZEPvcUoAncp1jvtqTROP\nzLLbFU7S2toP9E88LAbFCpgHPW/nvgoTvWINgMhFJf/2o1Dt9hdDPMxtNUSI64oI8s8vWbIiEReG\n/1rO3I87yDcO4F32Ha5i797LgReAu3CWWnHO19enlzfgvnrSTVvH/v3fZNs2mD3781x//ZcLdg0F\nxWgsQG1UJYWqTzlfWM8jEvm4IoJbtqPTWuHFclsFX2tqYOs3l9uqru4IXbZsmTY1zfH0NtRtlYe7\nrbz3MeC+8qZv1ZqawxJ350TF3Fblpdrtx9xWJh5RyKycW3X06AlZ3STO2lCHZa2c/PbnOz/AqQiP\n6L9Wbe3hoW4r/3WWLVumjY3TdPToCRnupfT7LlQ8Mt1jSbhz4rBo0aK051CsuRlxvsdC5qiUYj5J\nUph4mHiUlfKIR7tGmVCnqtrYOM2tNL0t+IGKs1j2O+Ixyr3WVK2rG1WUyjC9Fd3qCuDAfS9atChD\niBw7TlJyrUksAAAcJElEQVQ4OO05iYyuOPEo5u8nn4q8kF7KokWLKn7hyWyYeJh4lJXyuK2it6AH\n8gXnKZb9YUHaYrRM/eLgLc9fgYmM8LjAWhVG6LBhR2hj4/S8R0UlSTHFO597KyS4PmnSGRl5vSse\nl/vZ5sLEw8SjrJTyB5iqRB2XTPR/+NSS50H+/mLZ39g4PcOmCRM+GqtCy0doMiuwTJEcPXpCQddI\nkqTFO6l8qsHiMbCEfmWIczZMPEw8yko5foD5tjKDKs4g+/MZiuq4x7zB3zE6YsTRoS3Txsbp2tg4\nLdY6XEF25BaPVh058oORxaLYPaVcZZRbPIrptnIaJ5mu0UrFxMPEo6yU6wdYrBZ0UMA8n0lwTuWV\nPgcjqIfkbZk6YuNsXBXUc/FXPEG2XXDBBb6RW3+jcJgrIi3qj5Hk6vkU6taKW0ac30+277wQ23NN\nJM1mu9cmpwFRWTGlbJh4mHiUlWr/AfrtD2rBRnGTRRGdoJZpagRVlGuEzTAf2EXxJPUO+XVEJHpl\nVozJdXHLiNPzyyUOpQ6YR2l4mNsqOYohHolOEhSRmcCtODsJ3q2qNwWkWQWcDbwLzFfVbSLyNzgb\nQB2Is4Xtf6jqkiRtNUqPd+Li0qVforOzDRhY1+rUU0+NtBfH+PFHsW/forwWZxzYRbENWMzAXu13\nZKTdunU7M2a05D1BMOk1o8JW7b355ntzLr6Yz0TFYu46GGdtszjYOl0JUqj6hL1wBGMnzv4fB5B7\nD/PT8exhDhzk/q0Ffgl8MuAaRVXjUlPtrZdC3FZxW5qZw25HK0zSurpR/eVlazkHXS81T8Lbiwmb\nFJhrEl6u+4na+i/EbRXUcxFJueGK7xIauF67+/ymamPjtEh5S/HbT7I3U+3/u1Sy2wo4A2j3HC8G\nFvvS3AFc6Dl+BjjSl+Yg4NdAQ8A1ivpAS021/wALCZjn4+ZJjfxyFj8cmFEex83itSPldw/bUCpz\npnr2SjKbgEW930IC5mGrAsAyhUxRL0Zw35kXMyb291GK337Q8yjWcOBq/9+tdPH4O+Auz/HFwLd9\naR4EPuE5/gnwMR3ouTwBvAV8I+QaxX2iJabaf4CF2F+O4aF+UvanKuzGxmn9lYtX+BzxOElhYBa8\nyKj+EV9RKuKweFBY+igiEtTzS+8tpURxjit8U/sD28VqkUcdrBBlpF6xCXrmxRoO7F+ap5KGcEeh\nGOKRZMxDI6aToHyq+j7wURE5FOgQkU+r6v/1Z25pael/X19fT0NDQ37WloGurq7Eyt6xYwcbNz4C\nwDnnnMnJJxd/y/lC7J8yZSKdnQvdRRChrm4hU6Zcxvr167Pme+211wLP5coXhNf++fNb0j7bs2cP\nixcv5pZb7qG395vAN4H/Tcq/rwrbtt0BzObhh68CLgcm09l5Mddcc1nG8/bfb2rPkNmzM9Pv2LHD\nc11Cywx6/uPGHcWLL94BHAOsBV4HuoDXqavbyeWXX8Z9923MiFUsXPj10M2xsv2W3nuvNyO99/sI\nu5e33nor8FrFxP/MRa6mr+8yot53NlLPPsp3VYr/xVx0d3fT09NT3EILVZ+wFzCVdLfVEmCRL80d\nwOc8xxluK/f814CFAeeLJ8VlIMk9qIvRsszVoirU/myzv7PlKdbIoVz2p/v0D89oxXqXQI+yHPpA\nLyb7niFRe1dBPY/Gxulu67q1343knRMTp/xUmYXEcsKu5V2XK8nWelLDgVPPPtezrNRRZFS426oW\neB4nYF5H7oD5VNyAOTAGGOW+Hw48Anw24BpFf6ilJCnxKIZrJ8qPPunlMcJEoFhzFqKLR2oeindO\nyJg0AYi6l0aU7yYf8fDfd03NYdrYOC3y4IHc7rbweE/cWE9j47S0FYG9MZgg12GxKGZFHlU8iulm\nLSYVLR6OfZwNPIsz6mqJe+5K4EpPmtvcz7cDU9xzk4HHXcHZAVwXUn7RH2opqWTxiFJGmP1xK/2w\nCibp9ZZyPf+ByiY1WilVgU5SGOERkujLoUepwJYtW6beCYpwSMYEvPZ2Z4Z86lnG/c5TvRRnNeJg\nkVH1TuBMF6ZC5oIExUkGekvRFu3MFqfKZU+2fP7faNhvNtVzamycnnUF6Cg9k3LESypePJJ+mXgE\nU4wWVr7ika0XEWZTWDA5V4s3qt1hI2yyPf+BSma6TpjQEDBst0VhqtbUHK7z5s2LVQHkctcNVNgD\nM+5zuULiumSi/kacIHymyy5OY8RfQQaPCpuqQcvmh41ICxshF/X5R/mNhu1o6YwySx9hNmFCQ9q2\nAF6Rqq09PC3tQC8ru/AkiYmHiUcohbZo8nVbhYlONjEKb53Gb/FGrQDC7A+zx9k3xGmpT5gwOSOO\nkMoX55k7s9szF5zM9ayC4iaNjdNjNRji9FSijKjKRlBrPn0jq0Pd7zrzOo2N0zPKGrj//GIYcX6j\nQZuSZaZLnxOU/ptrVWfDMme7gdraQ9N+j373Z6lcWiYeJh6Jkk/APB/xCLrWQIs3vAUexe5sLfKw\n5x/We8k3cBz0HLO16KO2jB1hbU/LF1W8osQyotxbru/AiW8ckZH3ggsucO/fu47YSepfIDPlUgsq\ny1lCJvf8myjfb6onkJ94ZE7CHMiXW5CKsfd8XEw8TDzKSrHcVmFMmDA5sDKJQzbRiiMeudbPCrvO\nwNpZUxVa+0c/Be9WmN7DCHZnZVZEcSZKpnBa/9En+MVZADH9uw6+x8wVjVu1tvYD6m8spIt2UCU9\nIu0eamsPj907TfUs/c8jbEdLf88pqBEQXTxaFcZqahM0c1uZeERiMIqHavyAeRhBLcGRI8fFcsVl\nE604bqtcMYWwoH/wpL2p/WISxy0XLB5jIwlq0LOP6o6KK/zpdgaLavBmUJmDJNKfe9D95xeP8T+P\ngWeR3osJ+81ecMEF/WJ61lln5XBbHdL/XmS0u2RMq++zeKslFIqJh4lHYkSp6JO2P9wHHS+4GHYv\nUQLmXjdatuHEQcHPcDdIasb3mH4xqak5PFKLPkiMclWWYbYH2eePMajGH72Xnj5422P/fh51daPc\nfVrS92oJLislwIcpjM9LPDKfa3QRyozZpA+gWLZsWcagCH9DoqbmMB05clzBtueLiYeJRyJEbWkm\nbX+mj7+4wcW49ucSlJRLKlUBBrm6nLWmUvfg7FsSpyfld4NFEdFwH3/mJlxBvZi44pH5XEb1P5PU\nyDfv/vFhcZGgspw9Vw71VdzRWu9ho9yc5+Cfx3NoqJgHN2qyxy3ycYUmiYmHiUciRK0sSrUyalOT\nd3HC4v2jRbU/rOeSO7Ce7pYQGaU1NQdqym2Vr487Zc+kSWdEyp99EEPuAQlxhvUGVc7BQjsmaywn\nbDDFhAkfzUg7fPjRacNkw55Ztu/FH3iHk0IHPQT3KCeod/BClO8g37lMxcDEw8QjEZIUj3yHEOcT\ncM913Sj2Z7tutNbkQO/CCcoOtLDzDXSn7mPRokWR8xQ6iCHX95arrGy/qTg9m7BnHq/3lVn5i3g3\nAsscxebvSdXWetOnXGljQhsEudyecf8fCsXEw8QjEZJyWyUhAIVcN4r92Sq2uIH1uO6f8PtwfP4i\noyPFSVKumSgzqnOdDys/V88w272HzXfJ/gzSK+54QfxMd9HIkeNC1x3LtL1VDzxwjDs6bJL659vk\nelalFoogTDxMPBIjmwsiRVz7C6088yXsuoWKh2q0OEhq9vHIkR/MKCsVHPY+2+xusugjtPIV6zhu\nqqgxqTC3lV8Qo8zYb2+PtsBksK2p5zdaU0vKeOeTBN13tgEA5ZrkVygmHiYeiZOtIhkK4pFPBewd\ngVVbe7CnsvEPzRyVESgOc20NVJhjs7bwo9x3vs8rSrpso+GCXG5BZYTtuZEr7pDr3vw9HBilcFKa\nqylIuNN/A6kh1gNxorB7rqSehh8TDxOPxMlWkZTabZUvhbitUvn9vYsolYLz7PwT2wZiIEEV4PDh\nx2ScmzBhsm9mdbTWbjnEI+rosWyr0gbN6g6KOzjPJPpQ53zjJaoDv4ERI45Wf89jxIijA91+5QqG\nR8HEw8QjcYopHqrla43lGzAPKidqpRAsHtljII47Jf3csGFHBKTL3drNd8fAfN1WcSpI7y6O3jKc\nnkFmzyroWfkXrCzmel5h5Dc3ZmAXx0oREBMPE4/EKabbqtLIx/44FVB7e/YlQNrbgyb9jc1o2Q4b\nljmBrbb2A2lDddvbMzeCSrnB8h1kECdgHrf8oG1cg1YwzrZYZNg8iWyDAArtDcTvlbWrf//4ShAQ\nEw8Tj5IQ9s9YLfaHkY/9UVueKZxKfVroPARndJZ31nmrioxQ71yQCRMaMgSlsXFaaOvdP9Q0CqXo\nEQbFPFKkT35s0Zqaw9OeV/DItuDvItcCloWIadRl1AfsDe95lhMTDxOPslIt9hdT/KLOyo5jW9Ai\nff4Yi1NhpU8uzB43mBNYUQU9C38gOTUjvJhCEjTayruvBRzsE7/MCYu5RrZFWYOsOLYfoePH10fq\nlZVzFnk2qkI8gJnu3uTP+fcw96RZ5X6+HWh0z40DfgY8DTwFXBWQr8iPtLRUS+UbRjXYX2y328Bw\n2XjLxOeyMVdrOFvMJizoHNTqDhKq9HWdgteiymV/tt5VsI2tPpedf1vfqZGeq/+5pLuLoi/Tno2g\n5ztp0hmR8lZq4LzixQMY5m4xexxwQIR9zE/37GN+FPBR9/0Idztbf96iP9RSUg2VbzYKsb9UgfMk\nAv6VUhlkCzoHbS0bHjfwulbijaDKFdcJv3bQ8upzPO+jb3Wby57a2sMDN++KSiHikbKp0obsVoN4\nnAG0e44XA4t9ae4ALvQcPwMcGVDWvwOf9Z0r5vMsOUNVPEpZARdbPFSTqQzyKTMo6Jwtf7h4eCce\nBlXqkzRsRnuuEWVe+7zf+cByIN7rpMpx4jz5Er6acWtGLCUKQb9Xf8ymEgUiG9UgHn8H3OU5vhj4\nti/Ng8AnPMc/AT7mS3Mc8CIwwne+qA+01AxV8SjGkMmoVMNosXzFtBjzbAaG86aWPBmZtue2M3R4\nIEAskr52U1TxSF0/VcFecMEFviB/aifBzAUj41bMwW686Ro06infUWV+4a6U3mhUiiEetSSLRkwn\nYflEZARwP/BlVX3bn7GlpaX/fX19PQ0NDXmYWR66urrKbUJB5Gv/a6+9Fnhu/fr1hZoUyFVXzWfj\nxtUAnHPOfPbs2cP69etj2b9jxw42bnzELeNMTj755KLZt2LFbezbdxMwD4B9+2Dhwq+zZ8+erNf3\n2x/FRv+zOP744zn33DPZtOkHAMyaNZMPfehDbNy4mu7u5+jr+wCOw8CxTTXdtilTJvKzn/2E/fsX\n9l+jtvZapky5PPD7nD/f+X/t6upKs+Www07h8cd/B7zNrFlN/d/Rjh07uOWWe+jt/SYAnZ0Xc801\nl2V9/lOmTKSzcyG9vakzC4EPA+nP+ItfvI5XX30tctkp2/fs2ZP27KN8f+Wmu7ubnp6e4hZaqPpk\newFTSXdbLcEXNMdxW33Oc9zvtsKJk3QAV4eUX0wxLjmV0vLNl2pwW2UjzgzzJO3N1RMLu34+rd8o\nI5ZS+ZyRS5nupSCXVK6AuZ+otufbS80cWpvZOxpw2cUf/OC1v5Q96WJBFbitaoHncdxOdeQOmE9l\nIGAuwHeBW7KUX+RHWlqGqnioVoaPOKr9SVcOuSr+sOtnVmDZK8I4cyVS6Z21uQbcVsXaKjVq5VuM\nZ58SN//kw7D5M3Htr5TGUByKIR41xe3HpKOq+4EFbu+hG/iBqvaIyJUicqWbZhPwWxHZCawG/sHN\nPg0nRvIZEdnmvmYmaa9ROpqbm9m8eQObN2+gubm53OaUlebmZh54YC1NTW00NbXxwANrYz+T3bt3\nAXcBr7qvu9xzA6xceafHvTKPfftu4sUXX84oa/v2p+jo6KC5uZn//M8NNDZ+hNGjb6Sx8V7a2r6X\n07aOjg5mzGhhxowWOjo6Yt1Hiq1btzNjRgvTp09h+PBFwFpgLcOHL6K19YpYZTU3N/P441vYtOnf\n0p7xIYccAXyT1PNw3tfGvodifH9VSaHqU84X1vMoK0PF/nK3LKO4rSZMmJzRip4wYXJaOUGteH+L\nPOq+6HFt9ZOt5e4EzwtfYiUXYb2aKPdQ7b99Kt1tlfTLxKO8DCX7y+1myzZJUFUDZzKPHj0ho4yg\nSjFziZT83XJR3Uz+Z5+6vyS2Gw4j7HlEuYdq/+0XQzySHm1lGIOC5ubmsroicl1//Pix7N2bec5f\nxgMPrGXlyjsBaG0dcK+cf/489u37IvC66xpaW1T7c5G6vxkzWnj44cklu2bQ80gdG9kx8TCMQcCK\nFUuYPfvz/cNT6+quY8WK72WkCxKhbKISl+nTp/DTn15DX59zHFeIWluvYMuWeezbl1/+uAQ9j1Lb\nUK2YeBjGIKC5uZm2tu95BCB7YLujo8OT9oqi9Kw6OjpYvvzb9PV9AbiDmprnWLr0mljlFlPI8qUS\nbKgGTDwMY5AQVQA6OjpcN9VNAGzZMq8oI4TSR3NBX99aOjvbWLo0XjnldhFWig2VjomHYQwx/JX8\nvn3OOassjTiYeBiGURQsVjC0MPEwjCFGUpW8xQqGFiYehjHESLKSt1jB0MHEwzCGINVSyQeNCjMq\nAxMPwzAqkqRGhRnFwcTDMIyKxEaFVTaJrqprGIZhDE6s52EYRkViQ38rGxMPwzAqEhv6W9mYeBiG\nUbFUy6iwoUjiMQ8RmSkiz4jIcyKyKCTNKvfz7SLS6Dn/HRHZJSJPJm2nYRiGEZ1ExUNEhgG3ATOB\nBuAiEan3pZkFnKCqE4ErgNs9H9/r5jUMwzAqiKR7HqcBO1X1BVV9D7gPOM+XZjbOBsWo6qPAKBE5\nyj3+L+CPCdtoGIZhxCRp8TgWeMlz/LJ7Lm4awzAMo4JIOmCuEdNJnvloaWnpf19fX09DQ0PUrGWn\nq6ur3CYUhNlfXqrZ/mq2HarP/u7ubnp6eopaZtLi8QowznM8DqdnkS3NWPdcJDZs2JC3cZXA3Llz\ny21CQZj95aWa7a9m26G67Rfxt9fjk7Tb6jFgoogcJyJ1wIVAmy9NG3AJgIhMBd5U1V0J22UYhmEU\nQKLioar7gQVAB9AN/EBVe0TkShG50k2zCfitiOwEVgP/kMovIv8G/Bw4UUReEpFLk7TXMAzDiEbi\nkwRV9SHgId+51b7jBSF5L0rQNMMwDCNPbGFEwzAMIzYmHoZhGEZsTDwMwzCM2Jh4GIZhGLEx8TAM\nwzBiY+JhGIZhxMbEwzAMw4iNiYdhGIYRGxMPwzAMIzYmHoZhGEZsTDwMwzCM2Jh4GIZhGLEx8TAM\nwzBiY+JhGIZhxMbEwzAMw4hNouIhIjNF5BkReU5EFoWkWeV+vl1EGuPkNQzDMMpDYuIhIsOA24CZ\nQANwkYjU+9LMAk5Q1YnAFcDtUfMOBrq7u8ttQkGY/eWlmu2vZtuh+u0vBkn2PE4DdqrqC6r6HnAf\ncJ4vzWxgLYCqPgqMEpGjIuatenp6esptQkGY/eWlmu2vZtuh+u0vBkmKx7HAS57jl91zUdIcEyGv\nYRiGUSaSFA+NmE4StMEwDMNIgNoEy34FGOc5HofTg8iWZqyb5oAIeQEQqW7tMfvLi9lfPqrZdqh+\n+wslSfF4DJgoIscBrwIXAhf50rQBC4D7RGQq8Kaq7hKRPRHyoqpD+9szDMMoE4mJh6ruF5EFQAcw\nDLhHVXtE5Er389WquklEZonITuAd4NJseZOy1TAMw4iHqEYNTRiGYRiGQ8XPMBeR0SLysIj8RkQ2\ni8iokHSBkwpF5H+LSI87CfHHInJoieyu6gmS+dovIuNE5Gci8rSIPCUiV5XW8sKevfvZMBHZJiIP\nlsbiDNsK+e2MEpH73d98t+sOLikF2r/E/e08KSLrReTA0lneb0NW+0XkJBH5hYj8RURa4+QtBfna\nH/t/V1Ur+gV8A/iK+34R8C8BaYYBO4HjcILtTwD17mdNQI37/l+C8idgc6g9njSzgE3u+9OBX0bN\nW+H2HwV81H0/Ani2lPYXYrvn82uBdUBbKZ97MezHmTf1Bfd9LXBotdjv5vktcKB7/ANgXgXafwRw\nKrAMaI2Tt8Ltj/W/W/E9DzwTCd2//z0gTeikQlV9WFX73HSP4ozoSppqnyCZr/1HqurrqvqEe/5t\noAdn3k6pyNt2ABEZi1O53U15hpHnbb/bq/6Uqn7H/Wy/qv6phLZDYc//z8B7wEEiUgschDMis5Tk\ntF9V31DVx1xbY+UtAXnbH/d/txrE40hV3eW+3wUcGZAmyoREgC8Am4prXiDVPkEyX/vThNkdLdeI\nI9qlopBnD3ALcB3QR3ko5NkfD7whIveKyOMicpeIHJSotZnk/fxVdS+wEvg9zijLN1X1JwnaGkTU\nuqTYeYtFUWyI8r9bEeLhxjSeDHjN9qZTpz8VFOHPGfUXkaVAr6quL5LZ2aj2CZL52t+fT0RGAPcD\nX3ZbMaUiX9tFRM4F/qCq2wI+LxWFPPtaYArwr6o6BWcE4+Ii2haFvH/7IjIBuBrH5XIMMEJE/r54\npkWikBFElTD6qGAbov7vJjnPIzKq2hT2mYjsEpGjVPV1ETka+ENAsqwTEkVkPo4r4rPFsTgnJZkg\nmSD52v8KgIgcAGwAvq+q/56gnUEUYnsLMFucBTv/BjhERL6rqpckaK+fQuwX4GVV/bV7/n5KLx6F\n2P9p4OequgdARH4MfAIn/lQqotifRN5iUZANsf53SxnMyTMA9A1gkft+McEB81rgeZwWSx3pAfOZ\nwNPAmBLaHGqPJ403aDiVgaBhzrwVbr8A3wVuKdPvJW/bfWmmAw9Wm/3AI8CJ7vsbgJuqxX7go8BT\nwHD3d7QW+MdKs9+T9gbSA85V8b+bxf5Y/7sl/cfI82GMBn4C/AbYDIxyzx8DbPSkOxtndMBOYInn\n/HPAi8A29/WvJbI7wx7gSuBKT5rb3M+3A1Ny3UuJn3te9gOfxIkXPOF55jOrwXZfGdMpw2irIvx2\nTgF+7Z7/MSUebVUE+7+C09h7Ekc8Dqg0+3FGJb0E/An4I06MZkRY3mqxP+7/rk0SNAzDMGJTEQFz\nwzAMo7ow8TAMwzBiY+JhGIZhxMbEwzAMw4iNiYdhGIYRGxMPwzAMIzYmHoZhGEZsTDwMwzCM2Jh4\nGEYOROQ4d3Ode0XkWRFZJyIzRKRLnE3KPi4iB4vId0TkUXdF29mevI+IyFb3dYZ7/tMi8n9F5Efu\nxk3fL+9dGkY8bIa5YeTAXZ76OZy1l7pxl/9Q1ctckbjUPd+tquvE2e3yUZwlrRXoU9W/ishEYL2q\nflxEPg38O9AAvAZ0AdepaldJb84w8qQiVtU1jCrgd6r6NICIPI2z3ho4C/kdh7My7GwRWeiePxBn\nRdPXgdtE5BTgfWCip8xfqeqrbplPuOWYeBhVgYmHYUTjr573fUCv530tsB+Yo6rPeTOJyA3Aa6r6\neREZBvwlpMz3sf9Ho4qwmIdhFIcO4KrUgYg0um8Pwel9AFyCs8e0YVQ9Jh6GEQ1/cFB9728EDhCR\nHSLyFPB197N/Bea5bqkPA2+HlBF0bBgViwXMDcMwjNhYz8MwDMOIjYmHYRiGERsTD8MwDCM2Jh6G\nYRhGbEw8DMMwjNiYeBiGYRixMfEwDMMwYmPiYRiGYcTm/wc+m36HSPvANgAAAABJRU5ErkJggg==\n",
+ "image/png": "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\niUSS+/w/t3PPI3Lev3cAAAAASUVORK5CYII=\n",
"text/plain": [
- ""
+ ""
]
},
"metadata": {},
@@ -2409,7 +2353,7 @@
{
"data": {
"text/plain": [
- ""
+ ""
]
},
"execution_count": 39,
@@ -2418,9 +2362,9 @@
},
{
"data": {
- "image/png": "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\n",
+ "image/png": "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\n",
"text/plain": [
- ""
+ ""
]
},
"metadata": {},
@@ -2453,7 +2397,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
- "version": "2.7.9"
+ "version": "2.7.6"
}
},
"nbformat": 4,
diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb
index 1d4e57828..ecf027fda 100644
--- a/docs/source/pythonapi/examples/post-processing.ipynb
+++ b/docs/source/pythonapi/examples/post-processing.ipynb
@@ -320,7 +320,18 @@
"metadata": {
"collapsed": false
},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"# Run openmc in plotting mode\n",
"executor = openmc.Executor()\n",
@@ -336,7 +347,7 @@
"outputs": [
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98KAwIrNs33D4sAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMTAtMDNUMDk6NDE6\nNDYrMDc6MDDfnDaWAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAzVDA5OjQxOjQ2KzA3OjAw\nrsGOKgAAAABJRU5ErkJggg==\n",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMTJUMjM6NTE6MDAtMDQ6MDDPm2Y8AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTEy\nVDIzOjUxOjAwLTA0OjAwvsbegAAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
@@ -370,8 +381,7 @@
"outputs": [],
"source": [
"# Instantiate an empty TalliesFile\n",
- "tallies_file = openmc.TalliesFile()\n",
- "tallies_file.tallies = []"
+ "tallies_file = openmc.TalliesFile()"
]
},
{
@@ -403,7 +413,7 @@
},
{
"cell_type": "code",
- "execution_count": 16,
+ "execution_count": null,
"metadata": {
"collapsed": true
},
@@ -422,7 +432,7 @@
},
{
"cell_type": "code",
- "execution_count": 17,
+ "execution_count": null,
"metadata": {
"collapsed": false,
"scrolled": true
@@ -448,9 +458,9 @@
" Copyright: 2011-2015 Massachusetts Institute of Technology\n",
" License: http://mit-crpg.github.io/openmc/license.html\n",
" Version: 0.7.0\n",
- " Git SHA1: 71dfde8d12942170a9a8d91796ab40a6e9becaaf\n",
- " Date/Time: 2015-10-03 09:43:54\n",
- " OpenMP Threads: 4\n",
+ " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n",
+ " Date/Time: 2015-10-12 23:51:01\n",
+ " MPI Processes: 1\n",
"\n",
" ===========================================================================\n",
" ========================> INITIALIZATION <=========================\n",
@@ -462,11 +472,11 @@
" Reading materials XML file...\n",
" Reading tallies XML file...\n",
" Building neighboring cells lists for each surface...\n",
+ " Loading ACE cross section table: 92235.71c\n",
" Loading ACE cross section table: 92238.71c\n",
" Loading ACE cross section table: 8016.71c\n",
- " Loading ACE cross section table: 92235.71c\n",
- " Loading ACE cross section table: 5010.71c\n",
" Loading ACE cross section table: 1001.71c\n",
+ " Loading ACE cross section table: 5010.71c\n",
" Loading ACE cross section table: 40090.71c\n",
" Initializing source particles...\n",
"\n",
@@ -476,149 +486,29 @@
"\n",
" Bat./Gen. k Average k \n",
" ========= ======== ==================== \n",
- " 1/1 1.01593 \n",
- " 2/1 1.05332 \n",
- " 3/1 1.03858 \n",
- " 4/1 1.03420 \n",
- " 5/1 1.03004 \n",
- " 6/1 1.03899 \n",
- " 7/1 1.04639 \n",
- " 8/1 1.03921 \n",
- " 9/1 1.00410 \n",
- " 10/1 1.06702 \n",
- " 11/1 1.03401 \n",
- " 12/1 1.05518 1.04460 +/- 0.01059\n",
- " 13/1 1.03358 1.04092 +/- 0.00713\n",
- " 14/1 1.00991 1.03317 +/- 0.00925\n",
- " 15/1 1.04884 1.03631 +/- 0.00782\n",
- " 16/1 1.03449 1.03600 +/- 0.00639\n",
- " 17/1 1.04612 1.03745 +/- 0.00559\n",
- " 18/1 1.07511 1.04216 +/- 0.00675\n",
- " 19/1 1.01774 1.03944 +/- 0.00655\n",
- " 20/1 1.04054 1.03955 +/- 0.00586\n",
- " 21/1 1.01202 1.03705 +/- 0.00586\n",
- " 22/1 1.04460 1.03768 +/- 0.00538\n",
- " 23/1 1.04415 1.03818 +/- 0.00498\n",
- " 24/1 1.04222 1.03846 +/- 0.00462\n",
- " 25/1 1.04045 1.03860 +/- 0.00430\n",
- " 26/1 1.04133 1.03877 +/- 0.00403\n",
- " 27/1 1.03166 1.03835 +/- 0.00381\n",
- " 28/1 1.00701 1.03661 +/- 0.00399\n",
- " 29/1 1.04111 1.03685 +/- 0.00378\n",
- " 30/1 1.05130 1.03757 +/- 0.00366\n",
- " 31/1 1.02685 1.03706 +/- 0.00352\n",
- " 32/1 1.03458 1.03695 +/- 0.00335\n",
- " 33/1 1.05243 1.03762 +/- 0.00328\n",
- " 34/1 1.05717 1.03843 +/- 0.00324\n",
- " 35/1 1.07396 1.03985 +/- 0.00342\n",
- " 36/1 1.01690 1.03897 +/- 0.00340\n",
- " 37/1 1.03340 1.03877 +/- 0.00328\n",
- " 38/1 1.04153 1.03886 +/- 0.00316\n",
- " 39/1 1.01971 1.03820 +/- 0.00312\n",
- " 40/1 1.01491 1.03743 +/- 0.00311\n",
- " 41/1 1.02779 1.03712 +/- 0.00303\n",
- " 42/1 1.03047 1.03691 +/- 0.00294\n",
- " 43/1 1.02305 1.03649 +/- 0.00288\n",
- " 44/1 1.07854 1.03773 +/- 0.00305\n",
- " 45/1 1.04412 1.03791 +/- 0.00297\n",
- " 46/1 1.05139 1.03828 +/- 0.00291\n",
- " 47/1 1.05357 1.03870 +/- 0.00286\n",
- " 48/1 1.06435 1.03937 +/- 0.00287\n",
- " 49/1 1.02632 1.03904 +/- 0.00281\n",
- " 50/1 1.05201 1.03936 +/- 0.00276\n",
- " 51/1 1.04582 1.03952 +/- 0.00270\n",
- " 52/1 1.02056 1.03907 +/- 0.00267\n",
- " 53/1 1.06448 1.03966 +/- 0.00267\n",
- " 54/1 1.03609 1.03958 +/- 0.00261\n",
- " 55/1 1.02701 1.03930 +/- 0.00257\n",
- " 56/1 1.04865 1.03950 +/- 0.00252\n",
- " 57/1 1.06310 1.04000 +/- 0.00252\n",
- " 58/1 1.02975 1.03979 +/- 0.00247\n",
- " 59/1 1.03922 1.03978 +/- 0.00242\n",
- " 60/1 1.07259 1.04043 +/- 0.00246\n",
- " 61/1 1.04555 1.04053 +/- 0.00242\n",
- " 62/1 1.01950 1.04013 +/- 0.00240\n",
- " 63/1 1.04618 1.04024 +/- 0.00236\n",
- " 64/1 1.02489 1.03996 +/- 0.00233\n",
- " 65/1 1.06850 1.04048 +/- 0.00235\n",
- " 66/1 1.03623 1.04040 +/- 0.00231\n",
- " 67/1 0.99892 1.03967 +/- 0.00238\n",
- " 68/1 1.05557 1.03995 +/- 0.00236\n",
- " 69/1 1.01211 1.03948 +/- 0.00236\n",
- " 70/1 1.04679 1.03960 +/- 0.00233\n",
- " 71/1 1.03461 1.03952 +/- 0.00229\n",
- " 72/1 1.01993 1.03920 +/- 0.00227\n",
- " 73/1 1.04742 1.03933 +/- 0.00224\n",
- " 74/1 1.05269 1.03954 +/- 0.00222\n",
- " 75/1 1.05696 1.03981 +/- 0.00220\n",
- " 76/1 1.05904 1.04010 +/- 0.00218\n",
- " 77/1 1.05930 1.04039 +/- 0.00217\n",
- " 78/1 1.03375 1.04029 +/- 0.00214\n",
- " 79/1 1.07044 1.04073 +/- 0.00215\n",
- " 80/1 1.04144 1.04074 +/- 0.00212\n",
- " 81/1 1.06296 1.04105 +/- 0.00212\n",
- " 82/1 1.04630 1.04112 +/- 0.00209\n",
- " 83/1 1.03772 1.04108 +/- 0.00206\n",
- " 84/1 1.03774 1.04103 +/- 0.00203\n",
- " 85/1 1.03984 1.04101 +/- 0.00200\n",
- " 86/1 1.03040 1.04087 +/- 0.00198\n",
- " 87/1 1.03484 1.04080 +/- 0.00196\n",
- " 88/1 1.03820 1.04076 +/- 0.00193\n",
- " 89/1 1.04654 1.04084 +/- 0.00191\n",
- " 90/1 1.03377 1.04075 +/- 0.00189\n",
- " 91/1 1.03370 1.04066 +/- 0.00187\n",
- " 92/1 1.04172 1.04067 +/- 0.00184\n",
- " 93/1 1.04945 1.04078 +/- 0.00182\n",
- " 94/1 1.03360 1.04069 +/- 0.00181\n",
- " 95/1 1.06547 1.04099 +/- 0.00181\n",
- " 96/1 1.04340 1.04101 +/- 0.00179\n",
- " 97/1 1.07502 1.04140 +/- 0.00181\n",
- " 98/1 1.05391 1.04155 +/- 0.00179\n",
- " 99/1 1.05622 1.04171 +/- 0.00178\n",
- " 100/1 1.01519 1.04142 +/- 0.00179\n",
- " Creating state point statepoint.100.h5...\n",
- "\n",
- " ===========================================================================\n",
- " ======================> SIMULATION FINISHED <======================\n",
- " ===========================================================================\n",
- "\n",
- "\n",
- " =======================> TIMING STATISTICS <=======================\n",
- "\n",
- " Total time for initialization = 4.3100E-01 seconds\n",
- " Reading cross sections = 1.3800E-01 seconds\n",
- " Total time in simulation = 1.1654E+02 seconds\n",
- " Time in transport only = 1.1510E+02 seconds\n",
- " Time in inactive batches = 3.7070E+00 seconds\n",
- " Time in active batches = 1.1283E+02 seconds\n",
- " Time synchronizing fission bank = 1.0000E-02 seconds\n",
- " Sampling source sites = 6.0000E-03 seconds\n",
- " SEND/RECV source sites = 4.0000E-03 seconds\n",
- " Time accumulating tallies = 6.0000E-03 seconds\n",
- " Total time for finalization = 2.7600E-01 seconds\n",
- " Total time elapsed = 1.1727E+02 seconds\n",
- " Calculation Rate (inactive) = 13488.0 neutrons/second\n",
- " Calculation Rate (active) = 3988.19 neutrons/second\n",
- "\n",
- " ============================> RESULTS <============================\n",
- "\n",
- " k-effective (Collision) = 1.04100 +/- 0.00169\n",
- " k-effective (Track-length) = 1.04142 +/- 0.00179\n",
- " k-effective (Absorption) = 1.04380 +/- 0.00147\n",
- " Combined k-effective = 1.04287 +/- 0.00130\n",
- " Leakage Fraction = 0.00000 +/- 0.00000\n",
- "\n"
+ " 1/1 1.04894 \n",
+ " 2/1 1.01711 \n",
+ " 3/1 1.05357 \n",
+ " 4/1 1.03052 \n",
+ " 5/1 1.06523 \n",
+ " 6/1 1.06806 \n",
+ " 7/1 1.05161 \n",
+ " 8/1 1.04199 \n",
+ " 9/1 1.05010 \n",
+ " 10/1 1.04617 \n",
+ " 11/1 1.04894 \n",
+ " 12/1 1.06806 1.05850 +/- 0.00956\n",
+ " 13/1 1.05002 1.05567 +/- 0.00620\n",
+ " 14/1 1.03471 1.05043 +/- 0.00683\n",
+ " 15/1 1.01803 1.04395 +/- 0.00837\n",
+ " 16/1 1.05588 1.04594 +/- 0.00712\n",
+ " 17/1 1.07503 1.05010 +/- 0.00731\n",
+ " 18/1 1.02786 1.04732 +/- 0.00691\n",
+ " 19/1 1.00071 1.04214 +/- 0.00800\n",
+ " 20/1 1.05587 1.04351 +/- 0.00729\n",
+ " 21/1 1.03886 1.04309 +/- 0.00660\n",
+ " 22/1 1.04335 1.04311 +/- 0.00603\n"
]
- },
- {
- "data": {
- "text/plain": [
- "0"
- ]
- },
- "execution_count": 17,
- "metadata": {},
- "output_type": "execute_result"
}
],
"source": [
@@ -642,7 +532,7 @@
},
{
"cell_type": "code",
- "execution_count": 18,
+ "execution_count": null,
"metadata": {
"collapsed": false,
"scrolled": true
@@ -662,27 +552,11 @@
},
{
"cell_type": "code",
- "execution_count": 19,
+ "execution_count": null,
"metadata": {
"collapsed": false
},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Tally\n",
- "\tID =\t10000\n",
- "\tName =\t\n",
- "\tFilters =\t\n",
- " \t\tmesh\t[10000]\n",
- "\tNuclides =\ttotal \n",
- "\tScores =\t[u'flux', u'fission']\n",
- "\tEstimator =\ttracklength\n",
- "\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"tally = sp.get_tally(scores=['flux'])\n",
"print(tally)"
@@ -697,33 +571,11 @@
},
{
"cell_type": "code",
- "execution_count": 20,
+ "execution_count": null,
"metadata": {
"collapsed": false
},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[[ 0.41271426, 0. ]],\n",
- "\n",
- " [[ 0.40846766, 0. ]],\n",
- "\n",
- " [[ 0.4112029 , 0. ]],\n",
- "\n",
- " ..., \n",
- " [[ 0.41437289, 0. ]],\n",
- "\n",
- " [[ 0.41376468, 0. ]],\n",
- "\n",
- " [[ 0.41312074, 0. ]]])"
- ]
- },
- "execution_count": 20,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"tally.sum"
]
@@ -737,52 +589,11 @@
},
{
"cell_type": "code",
- "execution_count": 21,
+ "execution_count": null,
"metadata": {
"collapsed": false
},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "(10000, 1, 2)\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "(array([[[ 0.00458571, 0. ]],\n",
- " \n",
- " [[ 0.00453853, 0. ]],\n",
- " \n",
- " [[ 0.00456892, 0. ]],\n",
- " \n",
- " ..., \n",
- " [[ 0.00460414, 0. ]],\n",
- " \n",
- " [[ 0.00459739, 0. ]],\n",
- " \n",
- " [[ 0.00459023, 0. ]]]),\n",
- " array([[[ 2.02702426e-05, 0.00000000e+00]],\n",
- " \n",
- " [[ 1.77108625e-05, 0.00000000e+00]],\n",
- " \n",
- " [[ 1.79568064e-05, 0.00000000e+00]],\n",
- " \n",
- " ..., \n",
- " [[ 1.83114148e-05, 0.00000000e+00]],\n",
- " \n",
- " [[ 1.69970626e-05, 0.00000000e+00]],\n",
- " \n",
- " [[ 1.92143217e-05, 0.00000000e+00]]]))"
- ]
- },
- "execution_count": 21,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"print(tally.mean.shape)\n",
"(tally.mean, tally.std_dev)"
@@ -797,27 +608,11 @@
},
{
"cell_type": "code",
- "execution_count": 22,
+ "execution_count": null,
"metadata": {
"collapsed": false
},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Tally\n",
- "\tID =\t10000\n",
- "\tName =\t\n",
- "\tFilters =\t\n",
- " \t\tmesh\t[10000]\n",
- "\tNuclides =\ttotal \n",
- "\tScores =\t[u'flux']\n",
- "\tEstimator =\ttracklength\n",
- "\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"flux = tally.get_slice(scores=['flux'])\n",
"fission = tally.get_slice(scores=['fission'])\n",
@@ -833,7 +628,7 @@
},
{
"cell_type": "code",
- "execution_count": 23,
+ "execution_count": null,
"metadata": {
"collapsed": false
},
@@ -847,32 +642,11 @@
},
{
"cell_type": "code",
- "execution_count": 24,
+ "execution_count": null,
"metadata": {
"collapsed": false
},
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 24,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
"source": [
"fig = plt.subplot(121)\n",
"fig.imshow(flux.mean)\n",
@@ -889,22 +663,11 @@
},
{
"cell_type": "code",
- "execution_count": 25,
+ "execution_count": null,
"metadata": {
"collapsed": false
},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
"source": [
"# Determine relative error\n",
"relative_error = np.zeros_like(flux.std_dev)\n",
@@ -931,29 +694,11 @@
},
{
"cell_type": "code",
- "execution_count": 26,
+ "execution_count": null,
"metadata": {
"collapsed": false
},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([ (1.0, [0.08159183470384083, 0.37187405724079425, -0.4569273259677805], [-0.5991379733562734, 0.6213299732428319, -0.5049581697849825], 1.4308796774550836),\n",
- " (1.0, [0.08159183470384083, 0.37187405724079425, -0.4569273259677805], [0.6943502674814661, -0.18996972225593808, 0.694110373553384], 1.8499326750790277),\n",
- " (1.0, [-0.2283457014858208, -0.3149356437736135, -0.6287339985223156], [0.22841158666373973, -0.9428738529578353, 0.24252225565130936], 2.8993105331976654),\n",
- " ...,\n",
- " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [0.871391386295745, 0.3866181159860615, 0.30199914615933615], 2.2329770939373517),\n",
- " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [-0.4649777417907873, 0.38973845929247963, 0.7949211489119309], 1.6836109244016622),\n",
- " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [-0.4649777417907873, 0.38973845929247963, 0.7949211489119309], 1.6836109244016622)], \n",
- " dtype=[('wgt', '"
- ]
- },
- "execution_count": 28,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAEUCAYAAAA8+dFZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGeRJREFUeJzt3X20ZFV55/Hvz8YXUBL6Jo4O0IojELtdOgENsGJmxBdc\npFVQOhFoEpUZBY0dXyaZMK6oMOOsTHSiImHJ4BIVDQ0qEAdHEF9BaR0UQVT6grAcMrysIcRu3yAq\nL8/8UXWhKG7VrXO7zq26t7+ftWp1nX32OfXUprof9tn77JOqQpKkUT1i0gFIkpYXE4ckqREThySp\nEROHJKkRE4ckqREThySpkVYTR5LDk1yf5MYkJ82z/2lJvpHkF0n+rMmxkqTJSFv3cSRZBdwAvBC4\nDfgWcGxVzfbUeTzwZOBlwPaqes+ox0qSJqPNHsdBwE1VdXNV3QOcBxzZW6Gq7qyqq4B7mh4rSZqM\nNhPHXsAtPdu3dsvaPlaS1KI2E8eOXANzHRRJmlK7tHju24A1Pdtr6PQcxnZsEhOMJC1CVWWxx7bZ\n47gK2C/JPkkeBRwNXDSgbv8XGPnYqmr9dfLJJ7d+3EJ1B+1vUt5f1r991FFHTW1bNjl2lHq25/ja\nc9j+UdptlLKlaMsdac+l+Lu+I+3Zv72jWutxVNW9STYBlwKrgLOqajbJid39ZyZ5Ip0ZU78G3J/k\nTcC6qvr5fMe2FetCDj300NaPW6juoP1NyvvLFvu9dsSOfOaox45Sz/YcX3sO2z9KuzUpa9s0/10f\ntG8Sv83WpuMuhSS1nOOfNhs2bOCCCy6YdBgrhu05PrbleCWhpvRSlZaZtWvXTjqEFcX2HB/bcrqY\nOPSAdevWTTqEFcX2HB/bcrqYOCRJjZg4JEmNmDgkSY2YOCRJjZg4JEmNmDgkSY2YOCRJjZg4JEmN\nmDgkSY2YOCRJjZg4JK14MzOQzP+amZl0dMtPmw9ykqSpsH07DFpIO4teI3bnZY9DktSIiUOS1IiJ\nQ5LUiIlDktSIiUPSsuHsqOngrCpJy4azo6aDPQ5JUiMmDklSIyYOSVIjJg5JUiMmDklSIyYOSZqH\nU38HczquJM3Dqb+D2eOQJDVi4pAkNWLikCQ1YuKQJDVi4pAkNWLikCQ1YuKQJDVi4pAkNWLikCQ1\n0mriSHJ4kuuT3JjkpAF1TuvuvzbJAT3lb01yXZLvJdmc5NFtxipJGk1riSPJKuB04HBgHXBskrV9\n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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
"source": [
"# Create log-spaced energy bins from 1 keV to 100 MeV\n",
"energy_bins = np.logspace(-3,1)\n",
@@ -1055,32 +760,11 @@
},
{
"cell_type": "code",
- "execution_count": 29,
+ "execution_count": null,
"metadata": {
"collapsed": false
},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(-0.5, 0.5)"
- ]
- },
- "execution_count": 29,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
"source": [
"plt.quiver(sp.source['xyz'][:,0], sp.source['xyz'][:,1],\n",
" sp.source['uvw'][:,0], sp.source['uvw'][:,1],\n",
@@ -1107,7 +791,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
- "version": "2.7.9"
+ "version": "2.7.6"
}
},
"nbformat": 4,
diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb
index 7b850a2eb..0c9869767 100644
--- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb
+++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb
@@ -336,7 +336,18 @@
"metadata": {
"collapsed": false
},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"# Run openmc in plotting mode\n",
"executor = openmc.Executor()\n",
@@ -352,7 +363,7 @@
"outputs": [
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB98KAwI1HbUKyRQAAAPZSURBVGje7Zs7buMwEIZ9iey5\n0gyNjQpXKTYudIScgkdQYTfut1idwkdQkQNsYQO2Qj0sPiVK+mlQDmwgwIcgg8Cc4fCTSK5W4OeF\nkM8rHv+2I/rgxPZEPZgR7XtQxKdXYuUXJSUnBQ/9WCgo4vOSJ+WFUvF7E08mlia+rn7VcKXP8sRs\nzFX8b2MdX2y6v1Tw6MZUw4H4ojfIjD8mvn/qRL5p4+vvlMqvp2EhR8WBzfiz20hXORmP9fi/bM9E\neUFvV5H/0yRkeSbiGRfFJErxD9ENdz7Mbhig/h89fvtFdMiI/ePUIXV4lXju8K3DKv9NThOZ3q2K\nmUy6grxFES8rjeyic+FFQav+ncg3fXjH+Ts+/iibztFqOiZuZP/Z3OafPX40NGgST2r+uvQkXXp6\ncKvmr+r0e1Eef5um3+JHP3IFF1D/seNZJgaDmvY0Gav1s+2f1fqpIcublfKGt6apotG/NVx3SInW\ntLX+7Vg/Pv1YqOsnun6JSVdOXT/X7vk75f938QP+8OmSBs0fXtymMhJbf8qlPynYmpKCh7OB1fzN\nalOj1sl0ZAruHLiA+RM73pDe/VjMVP89+aTXwjyc/x5n+u991895/utrJTy8/06TXh0r/5JOa2Jm\nYmqi4r/vUm/H4wLmT+z4anhr05X+q6KUXhtzr/9qSff5L5uMT//V/NdU4YuBTPa/8P67l/6r44ds\n+hYuoP5jx9ciy6XTWlibBrmx8V/TdMfjkP+6pOsu/lvM9N90sf7r+f6m/65n+S8p/itN15v0UkW3\n/+48+PRfJX6S9Joo4g+G/1qYG9KroqP/WypcuvyXPf13wH89/hHef7MB6R3Cqn55U4rv4kfH3zaS\ngQuYP7HjVf89tXrbO+hfLdr+Ozv/SP1dgtQ/Ov8C+i/3+q/Zf2D/HWi6bjT6rym9I/v/03/b+LHS\n4cTg/utTsV7/net/Afzz4f0XGX84/2j9xZ4/sePR/of2X7D/o+vPo/sv6h9B/Bfxr9j1Hz2eN/hO\n8/wfff4A848+f/1A/530/I0+/8PvH9D3H9HnT+R49P0b+v4PfP/4E/wXfP8Mvf9G37/D/ovuP8Se\nP7Hj0f0vdP8tqP9O339cyv7p3P1fdP8Z3v9G999j13/seMax8x/o+ZN7+O+E8zdP/8XOf8Hnz9Dz\nb7HnT+x49PxlCp7/BM+fOv13wvnXBfivt2lMvD8TyH/Hnb+Gz3+j589jz5/Y8ej9h4D+W7qQmf57\nefqv239n3T+C7z+h969i13/seMax+3/o/cMcu/8Y2H9n3p+J6r98pv8m4fwXuH+M3n+OO3++AX9c\nlR+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEwLTAzVDA5OjUxOjU5KzA3OjAwJPCZIQAA\nACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wM1QwOTo1MTo1OSswNzowMFWtIZ0AAAAASUVORK5C\nYII=\n",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMTJUMjM6NTI6MDgtMDQ6MDAXQ5NYAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTEy\nVDIzOjUyOjA4LTA0OjAwZh4r5AAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
@@ -381,13 +392,12 @@
"cell_type": "code",
"execution_count": 15,
"metadata": {
- "collapsed": true
+ "collapsed": false
},
"outputs": [],
"source": [
"# Instantiate an empty TalliesFile\n",
- "tallies_file = openmc.TalliesFile()\n",
- "tallies_file.tallies = []"
+ "tallies_file = openmc.TalliesFile()"
]
},
{
@@ -563,9 +573,9 @@
" Copyright: 2011-2015 Massachusetts Institute of Technology\n",
" License: http://mit-crpg.github.io/openmc/license.html\n",
" Version: 0.7.0\n",
- " Git SHA1: 71dfde8d12942170a9a8d91796ab40a6e9becaaf\n",
- " Date/Time: 2015-10-03 09:53:29\n",
- " OpenMP Threads: 4\n",
+ " Git SHA1: 170155e8d7935b57fad57bfad6aff1034a80206e\n",
+ " Date/Time: 2015-10-12 23:52:08\n",
+ " MPI Processes: 1\n",
"\n",
" ===========================================================================\n",
" ========================> INITIALIZATION <=========================\n",
@@ -577,11 +587,11 @@
" Reading materials XML file...\n",
" Reading tallies XML file...\n",
" Building neighboring cells lists for each surface...\n",
+ " Loading ACE cross section table: 92235.71c\n",
" Loading ACE cross section table: 92238.71c\n",
" Loading ACE cross section table: 8016.71c\n",
- " Loading ACE cross section table: 92235.71c\n",
- " Loading ACE cross section table: 5010.71c\n",
" Loading ACE cross section table: 1001.71c\n",
+ " Loading ACE cross section table: 5010.71c\n",
" Loading ACE cross section table: 40090.71c\n",
" Initializing source particles...\n",
"\n",
@@ -591,26 +601,26 @@
"\n",
" Bat./Gen. k Average k \n",
" ========= ======== ==================== \n",
- " 1/1 1.00279 \n",
- " 2/1 1.03320 \n",
- " 3/1 1.04467 \n",
- " 4/1 1.09693 \n",
- " 5/1 1.05008 \n",
- " 6/1 1.08426 \n",
- " 7/1 1.05363 1.06894 +/- 0.01531\n",
- " 8/1 0.97961 1.03917 +/- 0.03106\n",
- " 9/1 1.06444 1.04549 +/- 0.02285\n",
- " 10/1 1.08345 1.05308 +/- 0.01926\n",
- " 11/1 1.06871 1.05568 +/- 0.01594\n",
- " 12/1 1.03183 1.05228 +/- 0.01390\n",
- " 13/1 1.04486 1.05135 +/- 0.01207\n",
- " 14/1 1.06468 1.05283 +/- 0.01075\n",
- " 15/1 1.04185 1.05173 +/- 0.00968\n",
- " 16/1 1.01268 1.04818 +/- 0.00944\n",
- " 17/1 1.04129 1.04761 +/- 0.00864\n",
- " 18/1 1.01127 1.04481 +/- 0.00843\n",
- " 19/1 1.03738 1.04428 +/- 0.00782\n",
- " 20/1 1.04410 1.04427 +/- 0.00728\n",
+ " 1/1 1.05992 \n",
+ " 2/1 1.05251 \n",
+ " 3/1 1.05204 \n",
+ " 4/1 1.02100 \n",
+ " 5/1 1.07784 \n",
+ " 6/1 1.04814 \n",
+ " 7/1 1.02335 1.03574 +/- 0.01239\n",
+ " 8/1 1.02415 1.03188 +/- 0.00813\n",
+ " 9/1 1.10331 1.04974 +/- 0.01876\n",
+ " 10/1 1.05452 1.05069 +/- 0.01456\n",
+ " 11/1 1.07867 1.05536 +/- 0.01277\n",
+ " 12/1 1.04203 1.05345 +/- 0.01096\n",
+ " 13/1 1.04482 1.05237 +/- 0.00955\n",
+ " 14/1 1.04117 1.05113 +/- 0.00852\n",
+ " 15/1 1.07581 1.05360 +/- 0.00801\n",
+ " 16/1 1.04235 1.05257 +/- 0.00731\n",
+ " 17/1 1.02710 1.05045 +/- 0.00701\n",
+ " 18/1 1.01970 1.04809 +/- 0.00687\n",
+ " 19/1 1.01022 1.04538 +/- 0.00691\n",
+ " 20/1 1.01449 1.04332 +/- 0.00675\n",
" Creating state point statepoint.20.h5...\n",
"\n",
" ===========================================================================\n",
@@ -620,27 +630,27 @@
"\n",
" =======================> TIMING STATISTICS <=======================\n",
"\n",
- " Total time for initialization = 3.7200E-01 seconds\n",
- " Reading cross sections = 1.2400E-01 seconds\n",
- " Total time in simulation = 4.7110E+00 seconds\n",
- " Time in transport only = 4.6510E+00 seconds\n",
- " Time in inactive batches = 6.1900E-01 seconds\n",
- " Time in active batches = 4.0920E+00 seconds\n",
- " Time synchronizing fission bank = 2.0000E-03 seconds\n",
- " Sampling source sites = 2.0000E-03 seconds\n",
+ " Total time for initialization = 4.1300E-01 seconds\n",
+ " Reading cross sections = 9.6000E-02 seconds\n",
+ " Total time in simulation = 1.6248E+01 seconds\n",
+ " Time in transport only = 1.6236E+01 seconds\n",
+ " Time in inactive batches = 2.3150E+00 seconds\n",
+ " Time in active batches = 1.3933E+01 seconds\n",
+ " Time synchronizing fission bank = 0.0000E+00 seconds\n",
+ " Sampling source sites = 0.0000E+00 seconds\n",
" SEND/RECV source sites = 0.0000E+00 seconds\n",
" Time accumulating tallies = 0.0000E+00 seconds\n",
" Total time for finalization = 2.0000E-03 seconds\n",
- " Total time elapsed = 5.0950E+00 seconds\n",
- " Calculation Rate (inactive) = 20193.9 neutrons/second\n",
- " Calculation Rate (active) = 9164.22 neutrons/second\n",
+ " Total time elapsed = 1.6672E+01 seconds\n",
+ " Calculation Rate (inactive) = 5399.57 neutrons/second\n",
+ " Calculation Rate (active) = 2691.45 neutrons/second\n",
"\n",
" ============================> RESULTS <============================\n",
"\n",
- " k-effective (Collision) = 1.04044 +/- 0.00527\n",
- " k-effective (Track-length) = 1.04427 +/- 0.00728\n",
- " k-effective (Absorption) = 1.04794 +/- 0.00535\n",
- " Combined k-effective = 1.04628 +/- 0.00467\n",
+ " k-effective (Collision) = 1.03935 +/- 0.00682\n",
+ " k-effective (Track-length) = 1.04332 +/- 0.00675\n",
+ " k-effective (Absorption) = 1.03845 +/- 0.00598\n",
+ " Combined k-effective = 1.04024 +/- 0.00523\n",
" Leakage Fraction = 0.00000 +/- 0.00000\n",
"\n"
]
@@ -741,30 +751,22 @@
" mean | \n",
" std. dev. | \n",
" \n",
- " \n",
- " | bin | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" total | \n",
" (nu-fission / absorption) | \n",
- " 1.046353 | \n",
- " 0.00935 | \n",
+ " 1.040166 | \n",
+ " 0.009069 | \n",
"
\n",
" \n",
"\n",
""
],
"text/plain": [
- " nuclide score mean std. dev.\n",
- "bin \n",
- "0 total (nu-fission / absorption) 1.046353 0.00935"
+ " nuclide score mean std. dev.\n",
+ "0 total (nu-fission / absorption) 1.040166 0.009069"
]
},
"execution_count": 26,
@@ -804,35 +806,29 @@
" \n",
" \n",
" | \n",
+ " energy [MeV] | \n",
" nuclide | \n",
" score | \n",
" mean | \n",
" std. dev. | \n",
"
\n",
- " \n",
- " | bin | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
+ " (0.0e+00 - 6.2e-01) | \n",
" total | \n",
" absorption | \n",
- " 0.95873 | \n",
- " 0.00774 | \n",
+ " 0.95938 | \n",
+ " 0.008187 | \n",
"
\n",
" \n",
"\n",
""
],
"text/plain": [
- " nuclide score mean std. dev.\n",
- "bin \n",
- "0 total absorption 0.95873 0.00774"
+ " energy [MeV] nuclide score mean std. dev.\n",
+ "0 (0.0e+00 - 6.2e-01) total absorption 0.95938 0.008187"
]
},
"execution_count": 27,
@@ -875,30 +871,22 @@
" mean | \n",
" std. dev. | \n",
" \n",
- " \n",
- " | bin | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" total | \n",
" nu-fission | \n",
- " 1.091622 | \n",
- " 0.011163 | \n",
+ " 1.090899 | \n",
+ " 0.010602 | \n",
"
\n",
" \n",
"\n",
""
],
"text/plain": [
- " nuclide score mean std. dev.\n",
- "bin \n",
- "0 total nu-fission 1.091622 0.011163"
+ " nuclide score mean std. dev.\n",
+ "0 total nu-fission 1.090899 0.010602"
]
},
"execution_count": 28,
@@ -944,25 +932,16 @@
" mean | \n",
" std. dev. | \n",
" \n",
- " \n",
- " | bin | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
- " 0.0e+00 - 6.2e-01 | \n",
+ " (0.0e+00 - 6.2e-01) | \n",
" 10000 | \n",
" total | \n",
" absorption | \n",
- " 0.802012 | \n",
- " 0.006609 | \n",
+ " 0.803413 | \n",
+ " 0.007031 | \n",
"
\n",
" \n",
"\n",
@@ -970,8 +949,7 @@
],
"text/plain": [
" energy [MeV] cell nuclide score mean std. dev.\n",
- "bin \n",
- "0 0.0e+00 - 6.2e-01 10000 total absorption 0.802012 0.006609"
+ "0 (0.0e+00 - 6.2e-01) 10000 total absorption 0.803413 0.007031"
]
},
"execution_count": 29,
@@ -1009,44 +987,28 @@
" \n",
" | \n",
" energy [MeV] | \n",
- " cell | \n",
" nuclide | \n",
" score | \n",
" mean | \n",
" std. dev. | \n",
"
\n",
- " \n",
- " | bin | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
- " 0.0e+00 - 6.2e-01 | \n",
- " 10000 | \n",
+ " (0.0e+00 - 6.2e-01) | \n",
" total | \n",
" (nu-fission / absorption) | \n",
- " 1.246604 | \n",
- " 0.011825 | \n",
+ " 1.237053 | \n",
+ " 0.011765 | \n",
"
\n",
" \n",
"\n",
""
],
"text/plain": [
- " energy [MeV] cell nuclide score mean \\\n",
- "bin \n",
- "0 0.0e+00 - 6.2e-01 10000 total (nu-fission / absorption) 1.246604 \n",
- "\n",
- " std. dev. \n",
- "bin \n",
- "0 0.011825 "
+ " energy [MeV] nuclide score mean std. dev.\n",
+ "0 (0.0e+00 - 6.2e-01) total (nu-fission / absorption) 1.237053 0.011765"
]
},
"execution_count": 30,
@@ -1082,39 +1044,32 @@
" \n",
" \n",
" | \n",
+ " energy [MeV] | \n",
" nuclide | \n",
" score | \n",
" mean | \n",
" std. dev. | \n",
"
\n",
- " \n",
- " | bin | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
+ " (0.0e+00 - 6.2e-01) | \n",
" total | \n",
" (((absorption * nu-fission) * absorption) * (n... | \n",
- " 1.046353 | \n",
- " 0.01894 | \n",
+ " 1.040166 | \n",
+ " 0.019018 | \n",
"
\n",
" \n",
"\n",
""
],
"text/plain": [
- " nuclide score mean \\\n",
- "bin \n",
- "0 total (((absorption * nu-fission) * absorption) * (n... 1.046353 \n",
+ " energy [MeV] nuclide \\\n",
+ "0 (0.0e+00 - 6.2e-01) total \n",
"\n",
- " std. dev. \n",
- "bin \n",
- "0 0.01894 "
+ " score mean std. dev. \n",
+ "0 (((absorption * nu-fission) * absorption) * (n... 1.040166 0.019018 "
]
},
"execution_count": 31,
@@ -1174,115 +1129,104 @@
" mean | \n",
" std. dev. | \n",
" \n",
- " \n",
- " | bin | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 10000 | \n",
- " 0.0e+00 - 6.3e-07 | \n",
+ " (0.0e+00 - 6.3e-07) | \n",
" (U-238 / total) | \n",
" (nu-fission / flux) | \n",
- " 0.000001 | \n",
- " 6.859257e-09 | \n",
+ " 6.657029e-07 | \n",
+ " 7.377419e-09 | \n",
"
\n",
" \n",
" | 1 | \n",
" 10000 | \n",
- " 0.0e+00 - 6.3e-07 | \n",
+ " (0.0e+00 - 6.3e-07) | \n",
" (U-238 / total) | \n",
" (scatter / flux) | \n",
- " 0.209986 | \n",
- " 1.966887e-03 | \n",
+ " 2.099891e-01 | \n",
+ " 2.303838e-03 | \n",
"
\n",
" \n",
" | 2 | \n",
" 10000 | \n",
- " 0.0e+00 - 6.3e-07 | \n",
+ " (0.0e+00 - 6.3e-07) | \n",
" (U-235 / total) | \n",
" (nu-fission / flux) | \n",
- " 0.355667 | \n",
- " 3.717881e-03 | \n",
+ " 3.564204e-01 | \n",
+ " 3.951669e-03 | \n",
"
\n",
" \n",
" | 3 | \n",
" 10000 | \n",
- " 0.0e+00 - 6.3e-07 | \n",
+ " (0.0e+00 - 6.3e-07) | \n",
" (U-235 / total) | \n",
" (scatter / flux) | \n",
- " 0.005555 | \n",
- " 5.218094e-05 | \n",
+ " 5.555330e-03 | \n",
+ " 6.101004e-05 | \n",
"
\n",
" \n",
" | 4 | \n",
" 10000 | \n",
- " 6.3e-07 - 2.0e+01 | \n",
+ " (6.3e-07 - 2.0e+01) | \n",
" (U-238 / total) | \n",
" (nu-fission / flux) | \n",
- " 0.007165 | \n",
- " 5.625590e-05 | \n",
+ " 7.154887e-03 | \n",
+ " 8.053460e-05 | \n",
"
\n",
" \n",
" | 5 | \n",
" 10000 | \n",
- " 6.3e-07 - 2.0e+01 | \n",
+ " (6.3e-07 - 2.0e+01) | \n",
" (U-238 / total) | \n",
" (scatter / flux) | \n",
- " 0.227653 | \n",
- " 8.544314e-04 | \n",
+ " 2.277701e-01 | \n",
+ " 1.079289e-03 | \n",
"
\n",
" \n",
" | 6 | \n",
" 10000 | \n",
- " 6.3e-07 - 2.0e+01 | \n",
+ " (6.3e-07 - 2.0e+01) | \n",
" (U-235 / total) | \n",
" (nu-fission / flux) | \n",
- " 0.008089 | \n",
- " 5.080374e-05 | \n",
+ " 8.066738e-03 | \n",
+ " 5.254797e-05 | \n",
"
\n",
" \n",
" | 7 | \n",
" 10000 | \n",
- " 6.3e-07 - 2.0e+01 | \n",
+ " (6.3e-07 - 2.0e+01) | \n",
" (U-235 / total) | \n",
" (scatter / flux) | \n",
- " 0.003370 | \n",
- " 1.361116e-05 | \n",
+ " 3.366802e-03 | \n",
+ " 1.647058e-05 | \n",
"
\n",
" \n",
"\n",
""
],
"text/plain": [
- " cell energy [MeV] nuclide score mean \\\n",
- "bin \n",
- "0 10000 0.0e+00 - 6.3e-07 (U-238 / total) (nu-fission / flux) 0.000001 \n",
- "1 10000 0.0e+00 - 6.3e-07 (U-238 / total) (scatter / flux) 0.209986 \n",
- "2 10000 0.0e+00 - 6.3e-07 (U-235 / total) (nu-fission / flux) 0.355667 \n",
- "3 10000 0.0e+00 - 6.3e-07 (U-235 / total) (scatter / flux) 0.005555 \n",
- "4 10000 6.3e-07 - 2.0e+01 (U-238 / total) (nu-fission / flux) 0.007165 \n",
- "5 10000 6.3e-07 - 2.0e+01 (U-238 / total) (scatter / flux) 0.227653 \n",
- "6 10000 6.3e-07 - 2.0e+01 (U-235 / total) (nu-fission / flux) 0.008089 \n",
- "7 10000 6.3e-07 - 2.0e+01 (U-235 / total) (scatter / flux) 0.003370 \n",
+ " cell energy [MeV] nuclide score \\\n",
+ "0 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (nu-fission / flux) \n",
+ "1 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (scatter / flux) \n",
+ "2 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (nu-fission / flux) \n",
+ "3 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (scatter / flux) \n",
+ "4 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (nu-fission / flux) \n",
+ "5 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (scatter / flux) \n",
+ "6 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (nu-fission / flux) \n",
+ "7 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (scatter / flux) \n",
"\n",
- " std. dev. \n",
- "bin \n",
- "0 6.859257e-09 \n",
- "1 1.966887e-03 \n",
- "2 3.717881e-03 \n",
- "3 5.218094e-05 \n",
- "4 5.625590e-05 \n",
- "5 8.544314e-04 \n",
- "6 5.080374e-05 \n",
- "7 1.361116e-05 "
+ " mean std. dev. \n",
+ "0 6.657029e-07 7.377419e-09 \n",
+ "1 2.099891e-01 2.303838e-03 \n",
+ "2 3.564204e-01 3.951669e-03 \n",
+ "3 5.555330e-03 6.101004e-05 \n",
+ "4 7.154887e-03 8.053460e-05 \n",
+ "5 2.277701e-01 1.079289e-03 \n",
+ "6 8.066738e-03 5.254797e-05 \n",
+ "7 3.366802e-03 1.647058e-05 "
]
},
"execution_count": 33,
@@ -1313,11 +1257,11 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "[[[ 6.64174599e-07]\n",
- " [ 3.55666541e-01]]\n",
+ "[[[ 6.65702880e-07]\n",
+ " [ 3.56420449e-01]]\n",
"\n",
- " [[ 7.16505734e-03]\n",
- " [ 8.08949336e-03]]]\n"
+ " [[ 7.15488656e-03]\n",
+ " [ 8.06673774e-03]]]\n"
]
}
],
@@ -1345,9 +1289,9 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "[[[ 0.00555465]]\n",
+ "[[[ 0.00555533]]\n",
"\n",
- " [[ 0.00337011]]]\n"
+ " [[ 0.0033668 ]]]\n"
]
}
],
@@ -1369,8 +1313,8 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "[[[ 0.22765348]\n",
- " [ 0.00337011]]]\n"
+ "[[[ 0.22777006]\n",
+ " [ 0.0033668 ]]]\n"
]
}
],
@@ -1411,64 +1355,54 @@
" mean | \n",
" std. dev. | \n",
" \n",
- " \n",
- " | bin | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 10000 | \n",
- " 0.0e+00 - 6.3e-07 | \n",
+ " (0.0e+00 - 6.3e-07) | \n",
" U-238 | \n",
" nu-fission | \n",
" 0.000002 | \n",
- " 1.284890e-08 | \n",
+ " 1.283958e-08 | \n",
"
\n",
" \n",
" | 1 | \n",
" 10000 | \n",
- " 0.0e+00 - 6.3e-07 | \n",
+ " (0.0e+00 - 6.3e-07) | \n",
" U-235 | \n",
" nu-fission | \n",
- " 0.867982 | \n",
- " 7.022256e-03 | \n",
+ " 0.868553 | \n",
+ " 6.880390e-03 | \n",
"
\n",
" \n",
" | 2 | \n",
" 10000 | \n",
- " 6.3e-07 - 2.0e+01 | \n",
+ " (6.3e-07 - 2.0e+01) | \n",
" U-238 | \n",
" nu-fission | \n",
- " 0.082801 | \n",
- " 6.087096e-04 | \n",
+ " 0.082149 | \n",
+ " 8.837250e-04 | \n",
"
\n",
" \n",
" | 3 | \n",
" 10000 | \n",
- " 6.3e-07 - 2.0e+01 | \n",
+ " (6.3e-07 - 2.0e+01) | \n",
" U-235 | \n",
" nu-fission | \n",
- " 0.093484 | \n",
- " 5.275039e-04 | \n",
+ " 0.092618 | \n",
+ " 5.195308e-04 | \n",
"
\n",
" \n",
"\n",
""
],
"text/plain": [
- " cell energy [MeV] nuclide score mean std. dev.\n",
- "bin \n",
- "0 10000 0.0e+00 - 6.3e-07 U-238 nu-fission 0.000002 1.284890e-08\n",
- "1 10000 0.0e+00 - 6.3e-07 U-235 nu-fission 0.867982 7.022256e-03\n",
- "2 10000 6.3e-07 - 2.0e+01 U-238 nu-fission 0.082801 6.087096e-04\n",
- "3 10000 6.3e-07 - 2.0e+01 U-235 nu-fission 0.093484 5.275039e-04"
+ " cell energy [MeV] nuclide score mean std. dev.\n",
+ "0 10000 (0.0e+00 - 6.3e-07) U-238 nu-fission 0.000002 1.283958e-08\n",
+ "1 10000 (0.0e+00 - 6.3e-07) U-235 nu-fission 0.868553 6.880390e-03\n",
+ "2 10000 (6.3e-07 - 2.0e+01) U-238 nu-fission 0.082149 8.837250e-04\n",
+ "3 10000 (6.3e-07 - 2.0e+01) U-235 nu-fission 0.092618 5.195308e-04"
]
},
"execution_count": 37,
@@ -1504,114 +1438,104 @@
" mean | \n",
" std. dev. | \n",
" \n",
- " \n",
- " | bin | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 10002 | \n",
- " 1.0e-08 - 1.1e-07 | \n",
+ " (1.0e-08 - 1.1e-07) | \n",
" H-1 | \n",
" scatter | \n",
- " 4.620525 | \n",
- " 0.038249 | \n",
+ " 4.619398 | \n",
+ " 0.040124 | \n",
"
\n",
" \n",
" | 1 | \n",
" 10002 | \n",
- " 1.1e-07 - 1.2e-06 | \n",
+ " (1.1e-07 - 1.2e-06) | \n",
" H-1 | \n",
" scatter | \n",
- " 2.036841 | \n",
- " 0.013203 | \n",
+ " 2.030757 | \n",
+ " 0.011239 | \n",
"
\n",
" \n",
" | 2 | \n",
" 10002 | \n",
- " 1.2e-06 - 1.3e-05 | \n",
+ " (1.2e-06 - 1.3e-05) | \n",
" H-1 | \n",
" scatter | \n",
- " 1.659916 | \n",
- " 0.010107 | \n",
+ " 1.658488 | \n",
+ " 0.009777 | \n",
"
\n",
" \n",
" | 3 | \n",
" 10002 | \n",
- " 1.3e-05 - 1.4e-04 | \n",
+ " (1.3e-05 - 1.4e-04) | \n",
" H-1 | \n",
" scatter | \n",
- " 1.861546 | \n",
- " 0.013328 | \n",
+ " 1.853002 | \n",
+ " 0.007378 | \n",
"
\n",
" \n",
" | 4 | \n",
" 10002 | \n",
- " 1.4e-04 - 1.5e-03 | \n",
+ " (1.4e-04 - 1.5e-03) | \n",
" H-1 | \n",
" scatter | \n",
- " 2.049664 | \n",
- " 0.008215 | \n",
+ " 2.050773 | \n",
+ " 0.012484 | \n",
"
\n",
" \n",
" | 5 | \n",
" 10002 | \n",
- " 1.5e-03 - 1.6e-02 | \n",
+ " (1.5e-03 - 1.6e-02) | \n",
" H-1 | \n",
" scatter | \n",
- " 2.162157 | \n",
- " 0.010245 | \n",
+ " 2.131759 | \n",
+ " 0.007821 | \n",
"
\n",
" \n",
" | 6 | \n",
" 10002 | \n",
- " 1.6e-02 - 1.7e-01 | \n",
+ " (1.6e-02 - 1.7e-01) | \n",
" H-1 | \n",
" scatter | \n",
- " 2.224496 | \n",
- " 0.013796 | \n",
+ " 2.213710 | \n",
+ " 0.015159 | \n",
"
\n",
" \n",
" | 7 | \n",
" 10002 | \n",
- " 1.7e-01 - 1.9e+00 | \n",
+ " (1.7e-01 - 1.9e+00) | \n",
" H-1 | \n",
" scatter | \n",
- " 1.997585 | \n",
- " 0.009161 | \n",
+ " 2.011925 | \n",
+ " 0.009406 | \n",
"
\n",
" \n",
" | 8 | \n",
" 10002 | \n",
- " 1.9e+00 - 2.0e+01 | \n",
+ " (1.9e+00 - 2.0e+01) | \n",
" H-1 | \n",
" scatter | \n",
- " 0.373472 | \n",
- " 0.003922 | \n",
+ " 0.371280 | \n",
+ " 0.003949 | \n",
"
\n",
" \n",
"\n",
""
],
"text/plain": [
- " cell energy [MeV] nuclide score mean std. dev.\n",
- "bin \n",
- "0 10002 1.0e-08 - 1.1e-07 H-1 scatter 4.620525 0.038249\n",
- "1 10002 1.1e-07 - 1.2e-06 H-1 scatter 2.036841 0.013203\n",
- "2 10002 1.2e-06 - 1.3e-05 H-1 scatter 1.659916 0.010107\n",
- "3 10002 1.3e-05 - 1.4e-04 H-1 scatter 1.861546 0.013328\n",
- "4 10002 1.4e-04 - 1.5e-03 H-1 scatter 2.049664 0.008215\n",
- "5 10002 1.5e-03 - 1.6e-02 H-1 scatter 2.162157 0.010245\n",
- "6 10002 1.6e-02 - 1.7e-01 H-1 scatter 2.224496 0.013796\n",
- "7 10002 1.7e-01 - 1.9e+00 H-1 scatter 1.997585 0.009161\n",
- "8 10002 1.9e+00 - 2.0e+01 H-1 scatter 0.373472 0.003922"
+ " cell energy [MeV] nuclide score mean std. dev.\n",
+ "0 10002 (1.0e-08 - 1.1e-07) H-1 scatter 4.619398 0.040124\n",
+ "1 10002 (1.1e-07 - 1.2e-06) H-1 scatter 2.030757 0.011239\n",
+ "2 10002 (1.2e-06 - 1.3e-05) H-1 scatter 1.658488 0.009777\n",
+ "3 10002 (1.3e-05 - 1.4e-04) H-1 scatter 1.853002 0.007378\n",
+ "4 10002 (1.4e-04 - 1.5e-03) H-1 scatter 2.050773 0.012484\n",
+ "5 10002 (1.5e-03 - 1.6e-02) H-1 scatter 2.131759 0.007821\n",
+ "6 10002 (1.6e-02 - 1.7e-01) H-1 scatter 2.213710 0.015159\n",
+ "7 10002 (1.7e-01 - 1.9e+00) H-1 scatter 2.011925 0.009406\n",
+ "8 10002 (1.9e+00 - 2.0e+01) H-1 scatter 0.371280 0.003949"
]
},
"execution_count": 38,
@@ -1644,7 +1568,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
- "version": "2.7.9"
+ "version": "2.7.6"
}
},
"nbformat": 4,
diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst
index 12baf937d..465ea8923 100644
--- a/docs/source/pythonapi/index.rst
+++ b/docs/source/pythonapi/index.rst
@@ -57,6 +57,15 @@ on a given module or class.
summary
tallies
+**Multi-Group Cross Section Generation**
+
+.. toctree::
+ :maxdepth: 1
+
+ mgxs
+ energy_groups
+ mgxs_library
+
**Example Jupyter Notebooks:**
.. toctree::
@@ -65,6 +74,7 @@ on a given module or class.
examples/post-processing
examples/pandas-dataframes
examples/tally-arithmetic
+ examples/multi-group-cross-sections
.. _Jupyter: https://jupyter.org/
.. _NumPy: http://www.numpy.org/
diff --git a/docs/source/pythonapi/mgxs.rst b/docs/source/pythonapi/mgxs.rst
new file mode 100644
index 000000000..c7084e565
--- /dev/null
+++ b/docs/source/pythonapi/mgxs.rst
@@ -0,0 +1,66 @@
+.. _pythonapi_mgxs:
+
+==========================
+Multi-Group Cross Sections
+==========================
+
+.. currentmodule:: openmc.mgxs.mgxs
+
+----------------------------
+Summary of Available Classes
+----------------------------
+
+.. autosummary::
+
+ MGXS
+ AbsorptionXS
+ CaptureXS
+ Chi
+ FissionXS
+ NuFissionXS
+ NuScatterXS
+ NuScatterMatrixXS
+ ScatterXS
+ ScatterMatrixXS
+ TotalXS
+ TransportXS
+
+-------------------
+Class Documentation
+-------------------
+
+.. autoclass:: MGXS
+ :members:
+
+.. autoclass:: AbsorptionXS
+ :members:
+
+.. autoclass:: CaptureXS
+ :members:
+
+.. autoclass:: Chi
+ :members:
+
+.. autoclass:: FissionXS
+ :members:
+
+.. autoclass:: NuFissionXS
+ :members:
+
+.. autoclass:: NuScatterXS
+ :members:
+
+.. autoclass:: NuScatterMatrixXS
+ :members:
+
+.. autoclass:: ScatterXS
+ :members:
+
+.. autoclass:: ScatterMatrixXS
+ :members:
+
+.. autoclass:: TotalXS
+ :members:
+
+.. autoclass:: TransportXS
+ :members:
diff --git a/docs/source/pythonapi/mgxs_library.rst b/docs/source/pythonapi/mgxs_library.rst
new file mode 100644
index 000000000..8ac545700
--- /dev/null
+++ b/docs/source/pythonapi/mgxs_library.rst
@@ -0,0 +1,8 @@
+.. _pythonapi_mgxs_library:
+
+============
+MGXS Library
+============
+
+.. automodule:: openmc.mgxs.library
+ :members:
diff --git a/openmc/__init__.py b/openmc/__init__.py
index d966a155a..397d9f3e2 100644
--- a/openmc/__init__.py
+++ b/openmc/__init__.py
@@ -12,6 +12,8 @@ from openmc.trigger import *
from openmc.tallies import *
from openmc.cmfd import *
from openmc.executor import *
+from openmc.statepoint import *
+from openmc.summary import *
try:
from openmc.opencg_compatible import *
diff --git a/openmc/cross.py b/openmc/cross.py
index 735bb4cd2..435557ede 100644
--- a/openmc/cross.py
+++ b/openmc/cross.py
@@ -1,9 +1,20 @@
+import sys
+
from openmc import Filter, Nuclide
+from openmc.filter import _FILTER_TYPES
+import openmc.checkvalue as cv
+
+
+if sys.version_info[0] >= 3:
+ basestring = str
+
+# Acceptable tally arithmetic binary operations
+_TALLY_ARITHMETIC_OPS = ['+', '-', '*', '/', '^']
class CrossScore(object):
"""A special-purpose tally score used to encapsulate all combinations of two
- tally's scores as a outer product for tally arithmetic.
+ tally's scores as an outer product for tally arithmetic.
Parameters
----------
@@ -40,6 +51,38 @@ class CrossScore(object):
if binary_op is not None:
self.binary_op = binary_op
+ def __hash__(self):
+ return hash(str(self))
+
+ def __eq__(self, other):
+ return str(other) == str(self)
+
+ def __ne__(self, other):
+ return not self == other
+
+ def __deepcopy__(self, memo):
+ existing = memo.get(id(self))
+
+ # If this is the first time we have tried to copy this object, create a copy
+ if existing is None:
+ clone = type(self).__new__(type(self))
+ clone._left_score = self.left_score
+ clone._right_score = self.right_score
+ clone._binary_op = self.binary_op
+
+ memo[id(self)] = clone
+
+ return clone
+
+ # If this object has been copied before, return the first copy made
+ else:
+ return existing
+
+ def __repr__(self):
+ string = '({0} {1} {2})'.format(self.left_score,
+ self.binary_op, self.right_score)
+ return string
+
@property
def left_score(self):
return self._left_score
@@ -54,28 +97,24 @@ class CrossScore(object):
@left_score.setter
def left_score(self, left_score):
+ cv.check_type('left_score', left_score, (basestring, CrossScore))
self._left_score = left_score
@right_score.setter
def right_score(self, right_score):
+ cv.check_type('right_score', right_score, (basestring, CrossScore))
self._right_score = right_score
@binary_op.setter
def binary_op(self, binary_op):
+ cv.check_type('binary_op', binary_op, (basestring, CrossScore))
+ cv.check_value('binary_op', binary_op, _TALLY_ARITHMETIC_OPS)
self._binary_op = binary_op
- def __eq__(self, other):
- return str(other) == str(self)
-
- def __repr__(self):
- string = '({0} {1} {2})'.format(self.left_score,
- self.binary_op, self.right_score)
- return string
-
class CrossNuclide(object):
"""A special-purpose nuclide used to encapsulate all combinations of two
- tally's nuclides as a outer product for tally arithmetic.
+ tally's nuclides as an outer product for tally arithmetic.
Parameters
----------
@@ -112,33 +151,33 @@ class CrossNuclide(object):
if binary_op is not None:
self.binary_op = binary_op
- @property
- def left_nuclide(self):
- return self._left_nuclide
-
- @property
- def right_nuclide(self):
- return self._right_nuclide
-
- @property
- def binary_op(self):
- return self._binary_op
-
- @left_nuclide.setter
- def left_nuclide(self, left_nuclide):
- self._left_nuclide = left_nuclide
-
- @right_nuclide.setter
- def right_nuclide(self, right_nuclide):
- self._right_nuclide = right_nuclide
-
- @binary_op.setter
- def binary_op(self, binary_op):
- self._binary_op = binary_op
+ def __hash__(self):
+ return hash(str(self))
def __eq__(self, other):
return str(other) == str(self)
+ def __ne__(self, other):
+ return not self == other
+
+ def __deepcopy__(self, memo):
+ existing = memo.get(id(self))
+
+ # If this is the first time we have tried to copy this object, create a copy
+ if existing is None:
+ clone = type(self).__new__(type(self))
+ clone._left_nuclide = self.left_nuclide
+ clone._right_nuclide = self.right_nuclide
+ clone._binary_op = self.binary_op
+
+ memo[id(self)] = clone
+
+ return clone
+
+ # If this object has been copied before, return the first copy made
+ else:
+ return existing
+
def __repr__(self):
string = ''
@@ -161,10 +200,38 @@ class CrossNuclide(object):
return string
+ @property
+ def left_nuclide(self):
+ return self._left_nuclide
+
+ @property
+ def right_nuclide(self):
+ return self._right_nuclide
+
+ @property
+ def binary_op(self):
+ return self._binary_op
+
+ @left_nuclide.setter
+ def left_nuclide(self, left_nuclide):
+ cv.check_type('left_nuclide', left_nuclide, (Nuclide, CrossNuclide))
+ self._left_nuclide = left_nuclide
+
+ @right_nuclide.setter
+ def right_nuclide(self, right_nuclide):
+ cv.check_type('right_nuclide', right_nuclide, (Nuclide, CrossNuclide))
+ self._right_nuclide = right_nuclide
+
+ @binary_op.setter
+ def binary_op(self, binary_op):
+ cv.check_type('binary_op', binary_op, basestring)
+ cv.check_value('binary_op', binary_op, _TALLY_ARITHMETIC_OPS)
+ self._binary_op = binary_op
+
class CrossFilter(object):
"""A special-purpose filter used to encapsulate all combinations of two
- tally's filter bins as a outer product for tally arithmetic.
+ tally's filter bins as an outer product for tally arithmetic.
Parameters
----------
@@ -192,12 +259,10 @@ class CrossFilter(object):
left_type = left_filter.type
right_type = right_filter.type
- self.type = '({0} {1} {2})'.format(left_type, binary_op, right_type)
+ self._type = '({0} {1} {2})'.format(left_type, binary_op, right_type)
self._bins = {}
- self._bins['left'] = left_filter.bins
- self._bins['right'] = right_filter.bins
- self._num_bins = left_filter.num_bins * right_filter.num_bins
+ self._stride = None
self._left_filter = None
self._right_filter = None
@@ -205,13 +270,34 @@ class CrossFilter(object):
if left_filter is not None:
self.left_filter = left_filter
+ self._bins['left'] = left_filter.bins
if right_filter is not None:
self.right_filter = right_filter
+ self._bins['right'] = right_filter.bins
if binary_op is not None:
self.binary_op = binary_op
def __hash__(self):
- return hash((self.type, self.bins))
+ return hash((self.left_filter, self.right_filter))
+
+ def __eq__(self, other):
+ return str(other) == str(self)
+
+ def __ne__(self, other):
+ return not self == other
+
+ def __repr__(self):
+
+ string = 'CrossFilter\n'
+ filter_type = '({0} {1} {2})'.format(self.left_filter.type,
+ self.binary_op,
+ self.right_filter.type)
+ filter_bins = '({0} {1} {2})'.format(self.left_filter.bins,
+ self.binary_op,
+ self.right_filter.bins)
+ string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', filter_type)
+ string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', filter_bins)
+ return string
def __deepcopy__(self, memo):
existing = memo.get(id(self))
@@ -221,9 +307,12 @@ class CrossFilter(object):
clone = type(self).__new__(type(self))
clone._left_filter = self.left_filter
clone._right_filter = self.right_filter
+ clone._binary_op = self.binary_op
clone._type = self.type
clone._bins = self.bins
clone._num_bins = self.num_bins
+ clone._stride = self.stride
+
memo[id(self)] = clone
return clone
@@ -250,54 +339,49 @@ class CrossFilter(object):
@property
def bins(self):
- return (self._bins['left'], self._bins['right'])
+ return self._bins['left'], self._bins['right']
@property
def num_bins(self):
- return self._num_bins
+ if self.left_filter is not None and self.right_filter is not None:
+ return self.left_filter.num_bins * self.right_filter.num_bins
+ else:
+ return 0
@property
def stride(self):
- return self.left_filter.stride * self.right_filter.stride
+ return self._stride
@type.setter
def type(self, filter_type):
+ if filter_type not in _FILTER_TYPES.values():
+ msg = 'Unable to set Filter type to "{0}" since it is not one ' \
+ 'of the supported types'.format(type)
+ raise ValueError(msg)
+
self._type = filter_type
@left_filter.setter
def left_filter(self, left_filter):
+ cv.check_type('left_filter', left_filter, (Filter, CrossFilter))
self._left_filter = left_filter
+ self._bins['left'] = left_filter.bins
@right_filter.setter
def right_filter(self, right_filter):
+ cv.check_type('right_filter', right_filter, (Filter, CrossFilter))
self._right_filter = right_filter
+ self._bins['right'] = right_filter.bins
@binary_op.setter
def binary_op(self, binary_op):
+ cv.check_type('binary_op', binary_op, basestring)
+ cv.check_value('binary_op', binary_op, _TALLY_ARITHMETIC_OPS)
self._binary_op = binary_op
- def __eq__(self, other):
- return str(other) == str(self)
-
- def split_filters(self):
-
- split_filters = []
-
- # If left Filter is not a CrossFilter, simply append to list
- if isinstance(self.left_filter, Filter):
- split_filters.append(self.left_filter)
- # Recursively descend CrossFilter tree to collect all Filters
- else:
- split_filters.extend(self.left_filter.split_filters())
-
- # If right Filter is not a CrossFilter, simply append to list
- if isinstance(self.right_filter, Filter):
- split_filters.append(self.right_filter)
- # Recursively descend CrossFilter tree to collect all Filters
- else:
- split_filters.extend(self.right_filter.split_filters())
-
- return split_filters
+ @stride.setter
+ def stride(self, stride):
+ self._stride = stride
def get_bin_index(self, filter_bin):
"""Returns the index in the CrossFilter for some bin.
@@ -316,7 +400,7 @@ class CrossFilter(object):
Returns
-------
- filter_index : int
+ filter_index : Integral
The index in the Tally data array for this filter bin.
"""
@@ -326,15 +410,56 @@ class CrossFilter(object):
filter_index = left_index * self.right_filter.num_bins + right_index
return filter_index
- def __repr__(self):
+ def get_pandas_dataframe(self, datasize, summary=None):
+ """Builds a Pandas DataFrame for the CrossFilter's bins.
- string = 'CrossFilter\n'
- filter_type = '({0} {1} {2})'.format(self.left_filter.type,
- self.binary_op,
- self.right_filter.type)
- filter_bins = '({0} {1} {2})'.format(self.left_filter.bins,
- self.binary_op,
- self.right_filter.bins)
- string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', filter_type)
- string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', filter_bins)
- return string
+ This method constructs a Pandas DataFrame object for the CrossFilter
+ with columns annotated by filter bin information. This is a helper
+ method for the Tally.get_pandas_dataframe(...) method. This method
+ recursively builds and concatenates Pandas DataFrames for the left
+ and right filters and crossfilters.
+
+ This capability has been tested for Pandas >=0.13.1. However, it is
+ recommended to use v0.16 or newer versions of Pandas since this method
+ uses Pandas' Multi-index functionality.
+
+ Parameters
+ ----------
+ datasize : Integral
+ The total number of bins in the tally corresponding to this filter
+ summary : None or Summary
+ An optional Summary object to be used to construct columns for
+ distribcell tally filters (default is None). The geometric
+ information in the Summary object is embedded into a Multi-index
+ column with a geometric "path" to each distribcell instance.
+ NOTE: This option requires the OpenCG Python package.
+
+ Returns
+ -------
+ pandas.DataFrame
+ A Pandas DataFrame with columns of strings that characterize the
+ crossfilter's bins. Each entry in the DataFrame will include one
+ or more binary operations used to construct the crossfilter's bins.
+ The number of rows in the DataFrame is the same as the total number
+ of bins in the corresponding tally, with the filter bins
+ appropriately tiled to map to the corresponding tally bins.
+
+ See also
+ --------
+ Tally.get_pandas_dataframe(), Filter.get_pandas_dataframe()
+
+ """
+
+ # If left and right filters are identical, do not combine bins
+ if self.left_filter == self.right_filter:
+ df = self.left_filter.get_pandas_dataframe(datasize, summary)
+
+ # If left and right filters are different, combine their bins
+ else:
+ left_df = self.left_filter.get_pandas_dataframe(datasize, summary)
+ right_df = self.right_filter.get_pandas_dataframe(datasize, summary)
+ left_df = left_df.astype(str)
+ right_df = right_df.astype(str)
+ df = '(' + left_df + ' ' + self.binary_op + ' ' + right_df + ')'
+
+ return df
diff --git a/openmc/element.py b/openmc/element.py
index 2f81b9f30..56821b5d2 100644
--- a/openmc/element.py
+++ b/openmc/element.py
@@ -38,22 +38,30 @@ class Element(object):
if xs is not None:
self.xs = xs
- def __eq__(self, element2):
- # Check type
- if not isinstance(element2, Element):
+ def __eq__(self, other):
+ if isinstance(other, Element):
+ if self._name != other._name:
+ return False
+ elif self._xs != other._xs:
+ return False
+ else:
+ return True
+ elif isinstance(other, basestring) and other == self.name:
+ return True
+ else:
return False
- # Check name and xs
- if self._name != element2._name:
- return False
- elif self._xs != element2._xs:
- return False
- else:
- return True
+ def __ne__(self, other):
+ return not self == other
def __hash__(self):
return hash((self._name, self._xs))
+ def __repr__(self):
+ string = 'Element - {0}\n'.format(self._name)
+ string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs)
+ return string
+
@property
def xs(self):
return self._xs
@@ -70,9 +78,4 @@ class Element(object):
@name.setter
def name(self, name):
check_type('name', name, basestring)
- self._name = name
-
- def __repr__(self):
- string = 'Element - {0}\n'.format(self._name)
- string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs)
- return string
+ self._name = name
\ No newline at end of file
diff --git a/openmc/executor.py b/openmc/executor.py
index 54c8a64c1..58cb91246 100644
--- a/openmc/executor.py
+++ b/openmc/executor.py
@@ -30,14 +30,16 @@ class Executor(object):
stdout=subprocess.PIPE)
# Capture and re-print OpenMC output in real-time
- while (True and output):
- line = p.stdout.readline()
- print(line, end='')
-
+ while True:
# If OpenMC is finished, break loop
+ line = p.stdout.readline()
if not line and p.poll() != None:
break
+ # If user requested output, print to screen
+ if output:
+ print(line, end='')
+
# Return the returncode (integer, zero if no problems encountered)
return p.returncode
diff --git a/openmc/filter.py b/openmc/filter.py
index 6c4377ff3..5c0343df7 100644
--- a/openmc/filter.py
+++ b/openmc/filter.py
@@ -1,20 +1,26 @@
from collections import Iterable
import copy
from numbers import Real, Integral
+import sys
import numpy as np
from openmc import Mesh
-from openmc.checkvalue import check_type, check_iterable_type, \
- check_greater_than, _isinstance
+from openmc.summary import Summary
+import openmc.checkvalue as cv
+
+
+if sys.version_info[0] >= 3:
+ basestring = str
+
_FILTER_TYPES = ['universe', 'material', 'cell', 'cellborn', 'surface',
'mesh', 'energy', 'energyout', 'mu', 'polar', 'azimuthal',
'distribcell', 'delayedgroup']
class Filter(object):
- """A filter used to constrain a tally to a specific criterion, e.g. only tally
- events when the particle is in a certain cell and energy range.
+ """A filter used to constrain a tally to a specific criterion, e.g. only
+ tally events when the particle is in a certain cell and energy range.
Parameters
----------
@@ -22,46 +28,60 @@ class Filter(object):
The type of the tally filter. Acceptable values are "universe",
"material", "cell", "cellborn", "surface", "mesh", "energy",
"energyout", and "distribcell".
- bins : int or Iterable of int or Iterable of float
+ bins : Integral or Iterable of Integral or Iterable of Real
The bins for the filter. This takes on different meaning for different
- filters.
+ filters. See the OpenMC online documentation for more details.
Attributes
----------
type : str
The type of the tally filter.
- bins : int or Iterable of int or Iterable of float
+ bins : Integral or Iterable of Integral or Iterable of Real
The bins for the filter
+ num_bins : Integral
+ The number of filter bins
+ mesh : Mesh or None
+ A Mesh object for 'mesh' type filters.
+ offset : Integral
+ A value used to index tally bins for 'distribcell' tallies.
+ stride : Integral
+ The number of filter, nuclide and score bins within each of this
+ filter's bins.
"""
# Initialize Filter class attributes
def __init__(self, type=None, bins=None):
- self.type = type
+
+ self._type = None
self._num_bins = 0
- self.bins = bins
+ self._bins = None
self._mesh = None
self._offset = -1
self._stride = None
- def __eq__(self, filter2):
- # Check type
- if self.type != filter2.type:
- return False
+ if type is not None:
+ self.type = type
+ if bins is not None:
+ self.bins = bins
- # Check number of bins
- elif len(self.bins) != len(filter2.bins):
+ def __eq__(self, other):
+ if not isinstance(other, Filter):
return False
-
- # Check bin edges
- elif not np.allclose(self.bins, filter2.bins):
+ elif self.type != other.type:
+ return False
+ elif len(self.bins) != len(other.bins):
+ return False
+ elif not np.allclose(self.bins, other.bins):
return False
-
else:
return True
+ def __ne__(self, other):
+ return not self == other
+
def __hash__(self):
- return hash((self._type, self._bins))
+ return hash((self.type, tuple(self.bins)))
def __deepcopy__(self, memo):
existing = memo.get(id(self))
@@ -84,6 +104,13 @@ class Filter(object):
else:
return existing
+ def __repr__(self):
+ string = 'Filter\n'
+ string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self.type)
+ string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', self.bins)
+ string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self.offset)
+ return string
+
@property
def type(self):
return self._type
@@ -94,7 +121,14 @@ class Filter(object):
@property
def num_bins(self):
- return self._num_bins
+ if self.bins is None:
+ return 0
+ elif self.type in ['energy', 'energyout']:
+ return len(self.bins) - 1
+ elif self.type in ['cell', 'cellborn', 'surface', 'universe', 'material']:
+ return len(self.bins)
+ else:
+ return self._num_bins
@property
def mesh(self):
@@ -121,15 +155,13 @@ class Filter(object):
@bins.setter
def bins(self, bins):
- if bins is None:
- self.num_bins = 0
- elif self._type is None:
+ if self.type is None:
msg = 'Unable to set bins for Filter to "{0}" since ' \
'the Filter type has not yet been set'.format(bins)
raise ValueError(msg)
# If the bin edge is a single value, it is a Cell, Material, etc. ID
- if not _isinstance(bins, Iterable):
+ if not isinstance(bins, Iterable):
bins = [bins]
# If the bins are in a collection, convert it to a list
@@ -137,14 +169,14 @@ class Filter(object):
bins = list(bins)
if self.type in ['cell', 'cellborn', 'surface', 'material',
- 'universe', 'distribcell', 'delayedgroup']:
- check_iterable_type('filter bins', bins, Integral)
+ 'universe', 'distribcell', 'delayedgroup']:
+ cv.check_iterable_type('filter bins', bins, Integral)
for edge in bins:
- check_greater_than('filter bin', edge, 0, equality=True)
+ cv.check_greater_than('filter bin', edge, 0, equality=True)
- elif self._type in ['energy', 'energyout']:
+ elif self.type in ['energy', 'energyout']:
for edge in bins:
- if not _isinstance(edge, Real):
+ if not cv._isinstance(edge, Real):
msg = 'Unable to add bin edge "{0}" to a "{1}" Filter ' \
'since it is a non-integer or floating point ' \
'value'.format(edge, self.type)
@@ -163,12 +195,12 @@ class Filter(object):
raise ValueError(msg)
# mesh filters
- elif self._type == 'mesh':
+ elif self.type == 'mesh':
if not len(bins) == 1:
msg = 'Unable to add bins "{0}" to a mesh Filter since ' \
'only a single mesh can be used per tally'.format(bins)
raise ValueError(msg)
- elif not _isinstance(bins[0], Integral):
+ elif not isinstance(bins[0], Integral):
msg = 'Unable to add bin "{0}" to mesh Filter since it ' \
'is a non-integer'.format(bins[0])
raise ValueError(msg)
@@ -180,16 +212,15 @@ class Filter(object):
# If all error checks passed, add bin edges
self._bins = np.array(bins)
- # FIXME
@num_bins.setter
def num_bins(self, num_bins):
- check_type('filter num_bins', num_bins, Integral)
- check_greater_than('filter num_bins', num_bins, 0, equality=True)
+ cv.check_type('filter num_bins', num_bins, Integral)
+ cv.check_greater_than('filter num_bins', num_bins, 0, equality=True)
self._num_bins = num_bins
@mesh.setter
def mesh(self, mesh):
- check_type('filter mesh', mesh, Mesh)
+ cv.check_type('filter mesh', mesh, Mesh)
self._mesh = mesh
self.type = 'mesh'
@@ -197,12 +228,12 @@ class Filter(object):
@offset.setter
def offset(self, offset):
- check_type('filter offset', offset, Integral)
+ cv.check_type('filter offset', offset, Integral)
self._offset = offset
@stride.setter
def stride(self, stride):
- check_type('filter stride', stride, Integral)
+ cv.check_type('filter stride', stride, Integral)
if stride < 0:
msg = 'Unable to set stride "{0}" for a "{1}" Filter since it ' \
'is a negative value'.format(stride, self.type)
@@ -277,25 +308,63 @@ class Filter(object):
return merged_filter
+ def is_subset(self, other):
+ """Determine if another filter is a subset of this filter.
+
+ If all of the bins in the other filter are included as bins in this
+ filter, then it is a subset of this filter.
+
+ Parameters
+ ----------
+ other : Filter
+ The filter to query as a subset of this filter
+
+ Returns
+ -------
+ bool
+ Whether or not the other filter is a subset of this filter
+
+ """
+
+ if not isinstance(other, Filter):
+ return False
+ elif self.type != other.type:
+ return False
+ elif self.type in ['energy', 'energyout']:
+ if len(self.bins) != len(other.bins):
+ return False
+ else:
+ return np.allclose(self.bins, other.bins)
+
+ for bin in other.bins:
+ if bin not in self.bins:
+ return False
+
+ return True
+
def get_bin_index(self, filter_bin):
"""Returns the index in the Filter for some bin.
Parameters
----------
- filter_bin : int or tuple
+ filter_bin : Integral or tuple
The bin is the integer ID for 'material', 'surface', 'cell',
'cellborn', and 'universe' Filters. The bin is an integer for the
cell instance ID for 'distribcell' Filters. The bin is a 2-tuple of
floats for 'energy' and 'energyout' filters corresponding to the
- energy boundaries of the bin of interest. The bin is a (x,y,z)
- 3-tuple for 'mesh' filters corresponding to the mesh cell of
+ energy boundaries of the bin of interest. The bin is an (x,y,z)
+ 3-tuple for 'mesh' filters corresponding to the mesh cell
interest.
Returns
-------
- filter_index : int
+ filter_index : Integral
The index in the Tally data array for this filter bin.
+ See also
+ --------
+ Filter.get_bin()
+
"""
try:
@@ -317,10 +386,14 @@ class Filter(object):
# Use lower energy bound to find index for energy Filters
elif self.type in ['energy', 'energyout']:
- val = np.where(self.bins == filter_bin[0])[0][0]
- filter_index = val
+ deltas = np.abs(self.bins - filter_bin[1]) / filter_bin[1]
+ min_delta = np.min(deltas)
+ if min_delta < 1E-3:
+ filter_index = deltas.argmin() - 1
+ else:
+ raise ValueError
- # Filter bins for distribcell are the "IDs" of each unique placement
+ # Filter bins for distribcells are "IDs" of each unique placement
# of the Cell in the Geometry (integers starting at 0)
elif self.type == 'distribcell':
filter_index = filter_bin
@@ -332,14 +405,355 @@ class Filter(object):
except ValueError:
msg = 'Unable to get the bin index for Filter since "{0}" ' \
- 'is not one of the bins'.format(filter_bin)
+ 'is not one of the bins'.format(filter_bin)
raise ValueError(msg)
return filter_index
- def __repr__(self):
- string = 'Filter\n'
- string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self.type)
- string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', self.bins)
- string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self.offset)
- return string
+ def get_bin(self, bin_index):
+ """Returns the filter bin for some filter bin index.
+
+ Parameters
+ ----------
+ bin_index : Integral
+ The zero-based index into the filter's array of bins. The bin
+ index for 'material', 'surface', 'cell', 'cellborn', and 'universe'
+ filters corresponds to the ID in the filter's list of bins. For
+ 'distribcell' tallies the bin index necessarily can only be zero
+ since only one cell can be tracked per tally. The bin index for
+ 'energy' and 'energyout' filters corresponds to the energy range of
+ interest in the filter bins of energies. The bin index for 'mesh'
+ filters is the index into the flattened array of (x,y) or (x,y,z)
+ mesh cell bins.
+
+ Returns
+ -------
+ bin : 1-, 2-, or 3-tuple of Real
+ The bin in the Tally data array. The bin for 'material', surface',
+ 'cell', 'cellborn', 'universe' and 'distribcell' filters is a
+ 1-tuple of the ID corresponding to the appropriate filter bin.
+ The bin for 'energy' and 'energyout' filters is a 2-tuple of the
+ lower and upper energies bounding the energy interval for the filter
+ bin. The bin for 'mesh' tallies is a 2-tuple or 3-tuple of the x,y
+ or x,y,z mesh cell indices corresponding to the bin in a 2D/3D mesh.
+
+ See also
+ --------
+ Filter.get_bin_index()
+
+ """
+
+ cv.check_type('bin_index', bin_index, Integral)
+ cv.check_greater_than('bin_index', bin_index, 0, equality=True)
+ cv.check_less_than('bin_index', bin_index, self.num_bins)
+
+ if self.type == 'mesh':
+
+ # Construct 3-tuple of x,y,z cell indices for a 3D mesh
+ if len(self.mesh.dimension) == 3:
+ nx, ny, nz = self.mesh.dimension
+ x = bin_index / (ny * nz)
+ y = (bin_index - (x * ny * nz)) / nz
+ z = bin_index - (x * ny * nz) - (y * nz)
+ filter_bin = (x, y, z)
+
+ # Construct 2-tuple of x,y cell indices for a 2D mesh
+ else:
+ nx, ny = self.mesh.dimension
+ x = bin_index / ny
+ y = bin_index - (x * ny)
+ filter_bin = (x, y)
+
+ # Construct 2-tuple of lower, upper energies for energy(out) filters
+ elif self.type in ['energy', 'energyout']:
+ filter_bin = (self.bins[bin_index], self.bins[bin_index+1])
+ # Construct 1-tuple of with the cell ID for distribcell filters
+ elif self.type == 'distribcell':
+ filter_bin = (self.bins[0],)
+ # Construct 1-tuple with domain ID (e.g., material) for other filters
+ else:
+ filter_bin = (self.bins[bin_index],)
+
+ return filter_bin
+
+ def get_pandas_dataframe(self, data_size, summary=None):
+ """Builds a Pandas DataFrame for the Filter's bins.
+
+ This method constructs a Pandas DataFrame object for the filter with
+ columns annotated by filter bin information. This is a helper method
+ for the Tally.get_pandas_dataframe(...) method.
+
+ This capability has been tested for Pandas >=0.13.1. However, it is
+ recommended to use v0.16 or newer versions of Pandas since this method
+ uses Pandas' Multi-index functionality.
+
+ Parameters
+ ----------
+ data_size : Integral
+ The total number of bins in the tally corresponding to this filter
+ summary : None or Summary
+ An optional Summary object to be used to construct columns for
+ distribcell tally filters (default is None). The geometric
+ information in the Summary object is embedded into a Multi-index
+ column with a geometric "path" to each distribcell instance.
+ NOTE: This option requires the OpenCG Python package.
+
+ Returns
+ -------
+ pandas.DataFrame
+ A Pandas DataFrame with columns of strings that characterize the
+ filter's bins. The number of rows in the DataFrame is the same as
+ the total number of bins in the corresponding tally, with the filter
+ bin appropriately tiled to map to the corresponding tally bins.
+
+ For 'cell', 'cellborn', 'surface', 'material', and 'universe'
+ filters, the DataFrame includes a single column with the cell,
+ surface, material or universe ID corresponding to each filter bin.
+
+ For 'distribcell' filters, the DataFrame either includes:
+
+ 1. a single column with the cell instance IDs (without summary info)
+ 2. separate columns for the cell IDs, universe IDs, and lattice IDs
+ and x,y,z cell indices corresponding to each (with summary info).
+
+ For 'energy' and 'energyout' filters, the DataFrame include a single
+ column with each element comprising a string with the lower, upper
+ energy bounds for each filter bin.
+
+ For 'mesh' filters, the DataFrame includes three columns for the
+ x,y,z mesh cell indices corresponding to each filter bin.
+
+ Raises
+ ------
+ ImportError
+ When Pandas is not installed, or summary info is requested but
+ OpenCG is not installed.
+
+ See also
+ --------
+ Tally.get_pandas_dataframe(), CrossFilter.get_pandas_dataframe()
+
+ """
+
+ # Attempt to import Pandas
+ try:
+ import pandas as pd
+ except ImportError:
+ msg = 'The Pandas Python package must be installed on your system'
+ raise ImportError(msg)
+
+ # Initialize Pandas DataFrame
+ df = pd.DataFrame()
+
+ # mesh filters
+ if self.type == 'mesh':
+
+ # Initialize dictionary to build Pandas Multi-index column
+ filter_dict = {}
+
+ # Append Mesh ID as outermost index of mult-index
+ mesh_key = 'mesh {0}'.format(self.mesh.id)
+
+ # Find mesh dimensions - use 3D indices for simplicity
+ if (len(self.mesh.dimension) == 3):
+ nx, ny, nz = self.mesh.dimension
+ else:
+ nx, ny = self.mesh.dimension
+ nz = 1
+
+ # Generate multi-index sub-column for x-axis
+ filter_bins = np.arange(1, nx+1)
+ repeat_factor = ny * nz * self.stride
+ filter_bins = np.repeat(filter_bins, repeat_factor)
+ tile_factor = data_size / len(filter_bins)
+ filter_bins = np.tile(filter_bins, tile_factor)
+ filter_dict[(mesh_key, 'x')] = filter_bins
+
+ # Generate multi-index sub-column for y-axis
+ filter_bins = np.arange(1, ny+1)
+ repeat_factor = nz * self.stride
+ filter_bins = np.repeat(filter_bins, repeat_factor)
+ tile_factor = data_size / len(filter_bins)
+ filter_bins = np.tile(filter_bins, tile_factor)
+ filter_dict[(mesh_key, 'y')] = filter_bins
+
+ # Generate multi-index sub-column for z-axis
+ filter_bins = np.arange(1, nz+1)
+ repeat_factor = self.stride
+ filter_bins = np.repeat(filter_bins, repeat_factor)
+ tile_factor = data_size / len(filter_bins)
+ filter_bins = np.tile(filter_bins, tile_factor)
+ filter_dict[(mesh_key, 'z')] = filter_bins
+
+ # Initialize a Pandas DataFrame from the mesh dictionary
+ df = pd.concat([df, pd.DataFrame(filter_dict)])
+
+ # distribcell filters
+ elif self.type == 'distribcell':
+ level_df = None
+
+ if isinstance(summary, Summary):
+ # Attempt to import the OpenCG package
+ try:
+ import opencg
+ except ImportError:
+ msg = 'The OpenCG package must be installed ' \
+ 'to use a Summary for distribcell dataframes'
+ raise ImportError(msg)
+
+ # Create and extract the OpenCG geometry the Summary
+ summary.make_opencg_geometry()
+ opencg_geometry = summary.opencg_geometry
+ openmc_geometry = summary.openmc_geometry
+
+ # Use OpenCG to compute the number of regions
+ opencg_geometry.initialize_cell_offsets()
+ num_regions = opencg_geometry.num_regions
+
+ # Initialize a dictionary mapping OpenMC distribcell
+ # offsets to OpenCG LocalCoords linked lists
+ offsets_to_coords = {}
+
+ # Use OpenCG to compute LocalCoords linked list for
+ # each region and store in dictionary
+ for region in range(num_regions):
+ coords = opencg_geometry.find_region(region)
+ path = opencg.get_path(coords)
+ cell_id = path[-1]
+
+ # If this region is in Cell corresponding to the
+ # distribcell filter bin, store it in dictionary
+ if cell_id == self.bins[0]:
+ offset = openmc_geometry.get_offset(path, self.offset)
+ offsets_to_coords[offset] = coords
+
+ # Each distribcell offset is a DataFrame bin
+ # Unravel the paths into DataFrame columns
+ num_offsets = len(offsets_to_coords)
+
+ # Initialize termination condition for while loop
+ levels_remain = True
+ counter = 0
+
+ # Iterate over each level in the CSG tree hierarchy
+ while levels_remain:
+ levels_remain = False
+
+ # Initialize dictionary to build Pandas Multi-index
+ # column for this level in the CSG tree hierarchy
+ level_dict = {}
+
+ # Initialize prefix Multi-index keys
+ counter += 1
+ level_key = 'level {0}'.format(counter)
+ univ_key = (level_key, 'univ', 'id')
+ cell_key = (level_key, 'cell', 'id')
+ lat_id_key = (level_key, 'lat', 'id')
+ lat_x_key = (level_key, 'lat', 'x')
+ lat_y_key = (level_key, 'lat', 'y')
+ lat_z_key = (level_key, 'lat', 'z')
+
+ # Allocate NumPy arrays for each CSG level and
+ # each Multi-index column in the DataFrame
+ level_dict[univ_key] = np.empty(num_offsets)
+ level_dict[cell_key] = np.empty(num_offsets)
+ level_dict[lat_id_key] = np.empty(num_offsets)
+ level_dict[lat_x_key] = np.empty(num_offsets)
+ level_dict[lat_y_key] = np.empty(num_offsets)
+ level_dict[lat_z_key] = np.empty(num_offsets)
+
+ # Initialize Multi-index columns to NaN - this is
+ # necessary since some distribcell instances may
+ # have very different LocalCoords linked lists
+ level_dict[univ_key][:] = np.NAN
+ level_dict[cell_key][:] = np.NAN
+ level_dict[lat_id_key][:] = np.NAN
+ level_dict[lat_x_key][:] = np.NAN
+ level_dict[lat_y_key][:] = np.NAN
+ level_dict[lat_z_key][:] = np.NAN
+
+ # Iterate over all regions (distribcell instances)
+ for offset in range(num_offsets):
+ coords = offsets_to_coords[offset]
+
+ # If entire LocalCoords has been unraveled into
+ # Multi-index columns already, continue
+ if coords is None:
+ continue
+
+ # Assign entry to Universe Multi-index column
+ if coords._type == 'universe':
+ level_dict[univ_key][offset] = coords._universe._id
+ level_dict[cell_key][offset] = coords._cell._id
+
+ # Assign entry to Lattice Multi-index column
+ else:
+ level_dict[lat_id_key][offset] = coords._lattice._id
+ level_dict[lat_x_key][offset] = coords._lat_x
+ level_dict[lat_y_key][offset] = coords._lat_y
+ level_dict[lat_z_key][offset] = coords._lat_z
+
+ # Move to next node in LocalCoords linked list
+ if coords._next is None:
+ offsets_to_coords[offset] = None
+ else:
+ offsets_to_coords[offset] = coords._next
+ levels_remain = True
+
+ # Tile the Multi-index columns
+ for level_key, level_bins in level_dict.items():
+ level_bins = np.repeat(level_bins, self.stride)
+ tile_factor = data_size / len(level_bins)
+ level_bins = np.tile(level_bins, tile_factor)
+ level_dict[level_key] = level_bins
+
+ # Initialize a Pandas DataFrame from the level dictionary
+ if level_df is None:
+ level_df = pd.DataFrame(level_dict)
+ else:
+ level_df = pd.concat([level_df, pd.DataFrame(level_dict)], axis=1)
+
+ # Create DataFrame column for distribcell instances IDs
+ # NOTE: This is performed regardless of whether the user
+ # requests Summary geometric information
+ filter_bins = np.arange(self.num_bins)
+ filter_bins = np.repeat(filter_bins, self.stride)
+ tile_factor = data_size / len(filter_bins)
+ filter_bins = np.tile(filter_bins, tile_factor)
+ filter_bins = filter_bins
+ df = pd.DataFrame({self.type : filter_bins})
+
+ # If OpenCG level info DataFrame was created, concatenate
+ # with DataFrame of distribcell instance IDs
+ if level_df is not None:
+ level_df = level_df.dropna(axis=1, how='all')
+ level_df = level_df.astype(np.int)
+ df = pd.concat([level_df, df], axis=1)
+
+ # energy, energyout filters
+ elif 'energy' in self.type:
+ bins = self.bins
+ num_bins = self.num_bins
+
+ # Create strings for
+ template = '({0:.1e} - {1:.1e})'
+ filter_bins = []
+ for i in range(num_bins):
+ filter_bins.append(template.format(bins[i], bins[i+1]))
+
+ # Tile the energy bins into a DataFrame column
+ filter_bins = np.repeat(filter_bins, self.stride)
+ tile_factor = data_size / len(filter_bins)
+ filter_bins = np.tile(filter_bins, tile_factor)
+ filter_bins = filter_bins
+ df = pd.concat([df, pd.DataFrame({self.type + ' [MeV]' : filter_bins})])
+
+ # universe, material, surface, cell, and cellborn filters
+ else:
+ filter_bins = np.repeat(self.bins, self.stride)
+ tile_factor = data_size / len(filter_bins)
+ filter_bins = np.tile(filter_bins, tile_factor)
+ filter_bins = filter_bins
+ df = pd.concat([df, pd.DataFrame({self.type : filter_bins})])
+
+ return df
diff --git a/openmc/geometry.py b/openmc/geometry.py
index 18fa698b5..e848e0cdd 100644
--- a/openmc/geometry.py
+++ b/openmc/geometry.py
@@ -1,3 +1,4 @@
+from collections import OrderedDict
from xml.etree import ElementTree as ET
import openmc
@@ -110,7 +111,7 @@ class Geometry(object):
"""
- nuclides = {}
+ nuclides = OrderedDict()
materials = self.get_all_materials()
for material in materials:
@@ -134,7 +135,9 @@ class Geometry(object):
for cell in material_cells:
materials.add(cell._fill)
- return list(materials)
+ materials = list(materials)
+ materials.sort(key=lambda x: x.id)
+ return materials
def get_all_material_cells(self):
all_cells = self.get_all_cells()
@@ -144,7 +147,9 @@ class Geometry(object):
if cell._type == 'normal':
material_cells.add(cell)
- return list(material_cells)
+ material_cells = list(material_cells)
+ material_cells.sort(key=lambda x: x.id)
+ return material_cells
def get_all_material_universes(self):
"""Return all universes composed of at least one non-fill cell
@@ -165,7 +170,9 @@ class Geometry(object):
if cell._type == 'normal':
material_universes.add(universe)
- return list(material_universes)
+ material_universes = list(material_universes)
+ material_universes.sort(key=lambda x: x.id)
+ return material_universes
class GeometryFile(object):
@@ -198,7 +205,13 @@ class GeometryFile(object):
"""
- root_universe = self._geometry._root_universe
+ # Clear OpenMC written IDs used to optimize XML generation
+ openmc.universe.WRITTEN_IDS = {}
+
+ # Reset xml element tree
+ self._geometry_file.clear()
+
+ root_universe = self.geometry.root_universe
root_universe.create_xml_subelement(self._geometry_file)
# Clean the indentation in the file to be user-readable
diff --git a/openmc/material.py b/openmc/material.py
index 3ca8f2413..41a67f6b7 100644
--- a/openmc/material.py
+++ b/openmc/material.py
@@ -83,6 +83,38 @@ class Material(object):
# If specified, this file will be used instead of composition values
self._distrib_otf_file = None
+ def __repr__(self):
+ string = 'Material\n'
+ string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id)
+ string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name)
+
+ string += '{0: <16}{1}{2}'.format('\tDensity', '=\t', self._density)
+ string += ' [{0}]\n'.format(self._density_units)
+
+ string += '{0: <16}\n'.format('\tS(a,b) Tables')
+
+ for sab in self._sab:
+ string += '{0: <16}{1}[{2}{3}]\n'.format('\tS(a,b)', '=\t',
+ sab[0], sab[1])
+
+ string += '{0: <16}\n'.format('\tNuclides')
+
+ for nuclide in self._nuclides:
+ percent = self._nuclides[nuclide][1]
+ percent_type = self._nuclides[nuclide][2]
+ string += '{0: <16}'.format('\t{0}'.format(nuclide))
+ string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type)
+
+ string += '{0: <16}\n'.format('\tElements')
+
+ for element in self._elements:
+ percent = self._nuclides[element][1]
+ percent_type = self._nuclides[element][2]
+ string += '{0: >16}'.format('\t{0}'.format(element))
+ string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type)
+
+ return string
+
@property
def id(self):
return self._id
@@ -125,7 +157,7 @@ class Material(object):
msg = 'Unable to set Material ID to "{0}" since a Material with ' \
'this ID was already initialized'.format(material_id)
raise ValueError(msg)
- check_greater_than('material ID', material_id, 0)
+ check_greater_than('material ID', material_id, 0, equality=True)
self._id = material_id
MATERIAL_IDS.append(material_id)
@@ -326,7 +358,7 @@ class Material(object):
"""
- nuclides = {}
+ nuclides = OrderedDict()
for nuclide_name, nuclide_tuple in self._nuclides.items():
nuclide = nuclide_tuple[0]
@@ -335,38 +367,6 @@ class Material(object):
return nuclides
- def __repr__(self):
- string = 'Material\n'
- string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id)
- string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name)
-
- string += '{0: <16}{1}{2}'.format('\tDensity', '=\t', self._density)
- string += ' [{0}]\n'.format(self._density_units)
-
- string += '{0: <16}\n'.format('\tS(a,b) Tables')
-
- for sab in self._sab:
- string += '{0: <16}{1}[{2}{3}]\n'.format('\tS(a,b)', '=\t',
- sab[0], sab[1])
-
- string += '{0: <16}\n'.format('\tNuclides')
-
- for nuclide in self._nuclides:
- percent = self._nuclides[nuclide][1]
- percent_type = self._nuclides[nuclide][2]
- string += '{0: <16}'.format('\t{0}'.format(nuclide))
- string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type)
-
- string += '{0: <16}\n'.format('\tElements')
-
- for element in self._elements:
- percent = self._nuclides[element][1]
- percent_type = self._nuclides[element][2]
- string += '{0: >16}'.format('\t{0}'.format(element))
- string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type)
-
- return string
-
def _get_nuclide_xml(self, nuclide, distrib=False):
xml_element = ET.Element("nuclide")
xml_element.set("name", nuclide[0]._name)
@@ -581,6 +581,9 @@ class MaterialsFile(object):
"""
+ # Reset xml element tree
+ self._materials_file.clear()
+
self._create_material_subelements()
# Clean the indentation in the file to be user-readable
diff --git a/openmc/mesh.py b/openmc/mesh.py
index af13d984d..822370c01 100644
--- a/openmc/mesh.py
+++ b/openmc/mesh.py
@@ -4,8 +4,10 @@ from numbers import Real, Integral
from xml.etree import ElementTree as ET
import sys
-from openmc.checkvalue import (check_type, check_length, check_value,
- check_greater_than)
+import numpy as np
+
+import openmc.checkvalue as cv
+
if sys.version_info[0] >= 3:
basestring = str
@@ -142,14 +144,14 @@ class Mesh(object):
self._id = AUTO_MESH_ID
AUTO_MESH_ID += 1
else:
- check_type('mesh ID', mesh_id, Integral)
- check_greater_than('mesh ID', mesh_id, 0)
+ cv.check_type('mesh ID', mesh_id, Integral)
+ cv.check_greater_than('mesh ID', mesh_id, 0, equality=True)
self._id = mesh_id
@name.setter
def name(self, name):
if name is not None:
- check_type('name for mesh ID="{0}"'.format(self._id),
+ cv.check_type('name for mesh ID="{0}"'.format(self._id),
name, basestring)
self._name = name
else:
@@ -157,34 +159,34 @@ class Mesh(object):
@type.setter
def type(self, meshtype):
- check_type('type for mesh ID="{0}"'.format(self._id),
+ cv.check_type('type for mesh ID="{0}"'.format(self._id),
meshtype, basestring)
- check_value('type for mesh ID="{0}"'.format(self._id),
+ cv.check_value('type for mesh ID="{0}"'.format(self._id),
meshtype, ['regular'])
self._type = meshtype
@dimension.setter
def dimension(self, dimension):
- check_type('mesh dimension', dimension, Iterable, Integral)
- check_length('mesh dimension', dimension, 2, 3)
+ cv.check_type('mesh dimension', dimension, Iterable, Integral)
+ cv.check_length('mesh dimension', dimension, 2, 3)
self._dimension = dimension
@lower_left.setter
def lower_left(self, lower_left):
- check_type('mesh lower_left', lower_left, Iterable, Real)
- check_length('mesh lower_left', lower_left, 2, 3)
+ cv.check_type('mesh lower_left', lower_left, Iterable, Real)
+ cv.check_length('mesh lower_left', lower_left, 2, 3)
self._lower_left = lower_left
@upper_right.setter
def upper_right(self, upper_right):
- check_type('mesh upper_right', upper_right, Iterable, Real)
- check_length('mesh upper_right', upper_right, 2, 3)
+ cv.check_type('mesh upper_right', upper_right, Iterable, Real)
+ cv.check_length('mesh upper_right', upper_right, 2, 3)
self._upper_right = upper_right
@width.setter
def width(self, width):
- check_type('mesh width', width, Iterable, Real)
- check_length('mesh width', width, 2, 3)
+ cv.check_type('mesh width', width, Iterable, Real)
+ cv.check_length('mesh width', width, 2, 3)
self._width = width
def __repr__(self):
diff --git a/openmc/mgxs/__init__.py b/openmc/mgxs/__init__.py
new file mode 100644
index 000000000..4fcf8b6ae
--- /dev/null
+++ b/openmc/mgxs/__init__.py
@@ -0,0 +1,3 @@
+from openmc.mgxs.groups import EnergyGroups
+from openmc.mgxs.library import Library
+from openmc.mgxs.mgxs import *
diff --git a/openmc/mgxs/groups.py b/openmc/mgxs/groups.py
new file mode 100644
index 000000000..3436c0e03
--- /dev/null
+++ b/openmc/mgxs/groups.py
@@ -0,0 +1,238 @@
+from collections import Iterable
+from numbers import Real
+import copy
+import sys
+
+import numpy as np
+
+import openmc.checkvalue as cv
+
+
+if sys.version_info[0] >= 3:
+ basestring = str
+
+
+class EnergyGroups(object):
+ """An energy groups structure used for multi-group cross-sections.
+
+ Parameters
+ ----------
+ group_edges : Iterable of Real
+ The energy group boundaries [MeV]
+
+ Attributes
+ ----------
+ group_edges : Iterable of Real
+ The energy group boundaries [MeV]
+ num_group : Integral
+ The number of energy groups
+
+ """
+
+ def __init__(self, group_edges=None):
+ self._group_edges = None
+
+ if group_edges is not None:
+ self.group_edges = group_edges
+
+ def __deepcopy__(self, memo):
+ existing = memo.get(id(self))
+
+ # If this is the first time we have tried to copy object, create copy
+ if existing is None:
+ clone = type(self).__new__(type(self))
+ clone._group_edges = copy.deepcopy(self.group_edges, memo)
+
+ memo[id(self)] = clone
+
+ return clone
+
+ # If this object has been copied before, return the first copy made
+ else:
+ return existing
+
+ def __eq__(self, other):
+ if not isinstance(other, EnergyGroups):
+ return False
+ elif self.group_edges != other.group_edges:
+ return False
+ else:
+ return True
+
+ def __ne__(self, other):
+ return not self == other
+
+ def __hash__(self):
+ return hash(tuple(self.group_edges))
+
+ @property
+ def group_edges(self):
+ return self._group_edges
+
+ @property
+ def num_groups(self):
+ return len(self.group_edges) - 1
+
+ @group_edges.setter
+ def group_edges(self, edges):
+ cv.check_type('group edges', edges, Iterable, Real)
+ cv.check_greater_than('number of group edges', len(edges), 1)
+ self._group_edges = np.array(edges)
+
+ def get_group(self, energy):
+ """Returns the energy group in which the given energy resides.
+
+ Parameters
+ ----------
+ energy : Real
+ The energy of interest in MeV
+
+ Returns
+ -------
+ Integral
+ The energy group index, starting at 1 for the highest energies
+
+ Raises
+ ------
+ ValueError
+ If the group edges have not yet been set.
+
+ """
+
+ if self.group_edges is None:
+ msg = 'Unable to get energy group for energy "{0}" MeV since ' \
+ 'the group edges have not yet been set'.format(energy)
+ raise ValueError(msg)
+
+ index = np.where(self.group_edges > energy)[0][0]
+ group = self.num_groups - index + 1
+ return group
+
+ def get_group_bounds(self, group):
+ """Returns the energy boundaries for the energy group of interest.
+
+ Parameters
+ ----------
+ group : Integral
+ The energy group index, starting at 1 for the highest energies
+
+ Returns
+ -------
+ 2-tuple
+ The low and high energy bounds for the group in MeV
+
+ Raises
+ ------
+ ValueError
+ If the group edges have not yet been set.
+
+ """
+
+ if self.group_edges is None:
+ msg = 'Unable to get energy group bounds for group "{0}" since ' \
+ 'the group edges have not yet been set'.format(group)
+ raise ValueError(msg)
+
+ cv.check_greater_than('group', group, 0)
+ cv.check_less_than('group', group, self.num_groups, equality=True)
+
+ lower = self.group_edges[self.num_groups-group]
+ upper = self.group_edges[self.num_groups-group+1]
+ return lower, upper
+
+ def get_group_indices(self, groups='all'):
+ """Returns the array indices for one or more energy groups.
+
+ Parameters
+ ----------
+ groups : str, tuple
+ The energy groups of interest - a tuple of the energy group indices,
+ starting at 1 for the highest energies (default is 'all')
+
+ Returns
+ -------
+ ndarray
+ The ndarray array indices for each energy group of interest
+
+ Raises
+ ------
+ ValueError
+ If the group edges have not yet been set, or if a group is requested
+ that is outside the bounds of the number of energy groups.
+
+ """
+
+ if self.group_edges is None:
+ msg = 'Unable to get energy group indices for groups "{0}" since ' \
+ 'the group edges have not yet been set'.format(groups)
+ raise ValueError(msg)
+
+ if groups == 'all':
+ return np.arange(self.num_groups)
+ else:
+ indices = np.zeros(len(groups), dtype=np.int)
+
+ for i, group in enumerate(groups):
+ cv.check_greater_than('group', group, 0)
+ cv.check_less_than('group', group, self.num_groups, equality=True)
+ indices[i] = group - 1
+
+ return indices
+
+ def get_condensed_groups(self, coarse_groups):
+ """Return a coarsened version of this EnergyGroups object.
+
+ This method merges together energy groups in this object into wider
+ energy groups as defined by the list of groups specified by the user,
+ and returns a new, coarse EnergyGroups object.
+
+ Parameters
+ ----------
+ coarse_groups : Iterable of 2-tuple
+ The energy groups of interest - a list of 2-tuples, each directly
+ corresponding to one of the new coarse groups. The values in the
+ 2-tuples are upper/lower energy groups used to construct a new
+ coarse group. For example, if [(1,2), (3,4)] was used as the coarse
+ groups, fine groups 1 and 2 would be merged into coarse group 1
+ while fine groups 3 and 4 would be merged into coarse group 2.
+
+ Returns
+ -------
+ EnergyGroups
+ A coarsened version of this EnergyGroups object.
+
+ Raises
+ ------
+ ValueError
+ If the group edges have not yet been set.
+ """
+
+ cv.check_type('group edges', coarse_groups, Iterable)
+ for group in coarse_groups:
+ cv.check_type('group edges', group, Iterable)
+ cv.check_length('group edges', group, 2)
+ cv.check_greater_than('lower group', group[0], 1, True)
+ cv.check_less_than('lower group', group[0], self.num_groups, True)
+ cv.check_greater_than('upper group', group[0], 1, True)
+ cv.check_less_than('upper group', group[0], self.num_groups, True)
+ cv.check_less_than('lower group', group[0], group[1], False)
+
+ # Compute the group indices into the coarse group
+ group_bounds = [group[1] for group in coarse_groups]
+ group_bounds.insert(0, coarse_groups[0][0])
+
+ # Determine the indices mapping the fine-to-coarse energy groups
+ group_bounds = np.asarray(group_bounds)
+ group_indices = np.flipud(self.num_groups - group_bounds)
+ group_indices[-1] += 1
+
+ # Determine the edges between coarse energy groups and sort
+ # in increasing order in case the user passed in unordered groups
+ group_edges = self.group_edges[group_indices]
+ group_edges = np.sort(group_edges)
+
+ # Create a new condensed EnergyGroups object
+ condensed_groups = EnergyGroups()
+ condensed_groups.group_edges = group_edges
+
+ return condensed_groups
diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py
new file mode 100644
index 000000000..13537848e
--- /dev/null
+++ b/openmc/mgxs/library.py
@@ -0,0 +1,611 @@
+import sys
+import os
+import copy
+import pickle
+from numbers import Integral
+from collections import OrderedDict
+
+import openmc
+import openmc.mgxs
+import openmc.checkvalue as cv
+
+
+if sys.version_info[0] >= 3:
+ basestring = str
+
+
+class Library(object):
+ """A multi-group cross section library for some energy group structure.
+
+ This class can be used for both OpenMC input generation and tally data
+ post-processing to compute spatially-homogenized and energy-integrated
+ multi-group cross sections for deterministic neutronics calculations.
+
+ This class helps automate the generation of MGXS objects for some energy
+ group structure and domain type. The Library serves as a collection for
+ MGXS objects with routines to automate the initialization of tallies for
+ input files, the loading of tally data from statepoint files, data storage,
+ energy group condensation and more.
+
+ Parameters
+ ----------
+ openmc_geometry : openmc.Geometry
+ An geometry which has been initialized with a root universe
+ by_nuclide : bool
+ If true, computes cross sections for each nuclide in each domain
+ mgxs_types : Iterable of str
+ The types of cross sections in the library (e.g., ['total', 'scatter'])
+ name : str, optional
+ Name of the multi-group cross section. library Used as a label to
+ identify tallies in OpenMC 'tallies.xml' file.
+
+ Attributes
+ ----------
+ openmc_geometry : openmc.Geometry
+ An geometry which has been initialized with a root universe
+ by_nuclide : bool
+ If true, computes cross sections for each nuclide in each domain
+ mgxs_types : Iterable of str
+ The types of cross sections in the library (e.g., ['total', 'scatter'])
+ domain_type : {'material', 'cell', 'distribcell', 'universe'}
+ Domain type for spatial homogenization
+ correction : 'P0' or None
+ Apply the P0 correction to scattering matrices if set to 'P0'
+ energy_groups : EnergyGroups
+ Energy group structure for energy condensation
+ tally_trigger : Trigger
+ An (optional) tally precision trigger given to each tally used to
+ compute the cross section
+ all_mgxs : OrderedDict
+ MGXS objects keyed by domain ID and cross section type
+ statepoint : openmc.StatePoint
+ The statepoint with tally data used to the compute cross sections
+ name : str, optional
+ Name of the multi-group cross section library. Used as a label to
+ identify tallies in OpenMC 'tallies.xml' file.
+
+ """
+
+ def __init__(self, openmc_geometry, by_nuclide=False,
+ mgxs_types=None, name=''):
+
+ self._name = ''
+ self._openmc_geometry = None
+ self._by_nuclide = None
+ self._mgxs_types = []
+ self._domain_type = None
+ self._correction = 'P0'
+ self._energy_groups = None
+ self._tally_trigger = None
+ self._all_mgxs = OrderedDict()
+ self._sp_filename = None
+
+ self.name = name
+ self.openmc_geometry = openmc_geometry
+ self.by_nuclide = by_nuclide
+
+ if mgxs_types is not None:
+ self.mgxs_types = mgxs_types
+
+ def __deepcopy__(self, memo):
+ existing = memo.get(id(self))
+
+ # If this is the first time we have tried to copy this object, copy it
+ if existing is None:
+ clone = type(self).__new__(type(self))
+ clone._name = self.name
+ clone._openmc_geometry = self.openmc_geometry
+ clone._by_nuclide = self.by_nuclide
+ clone._mgxs_types = self.mgxs_types
+ clone._domain_type = self.domain_type
+ clone._correction = self.correction
+ clone._energy_groups = copy.deepcopy(self.energy_groups, memo)
+ clone._tally_trigger = copy.deepcopy(self.tally_trigger, memo)
+ clone._all_mgxs = self.all_mgxs
+ clone._sp_filename = self._sp_filename
+
+ clone._all_mgxs = OrderedDict()
+ for domain in self.domains:
+ clone.all_mgxs[domain.id] = OrderedDict()
+ for mgxs_type in self.mgxs_types:
+ mgxs = copy.deepcopy(self.all_mgxs[domain.id][mgxs_type])
+ clone.all_mgxs[domain.id][mgxs_type] = mgxs
+
+ memo[id(self)] = clone
+
+ return clone
+
+ # If this object has been copied before, return the first copy made
+ else:
+ return existing
+
+ @property
+ def openmc_geometry(self):
+ return self._openmc_geometry
+
+ @property
+ def name(self):
+ return self._name
+
+ @property
+ def mgxs_types(self):
+ return self._mgxs_types
+
+ @property
+ def by_nuclide(self):
+ return self._by_nuclide
+
+ @property
+ def domains(self):
+ if self.domain_type is None:
+ raise ValueError('Unable to get all domains without a domain type')
+
+ if self.domain_type == 'material':
+ return self.openmc_geometry.get_all_materials()
+ elif self.domain_type == 'cell' or self.domain_type == 'distribcell':
+ return self.openmc_geometry.get_all_material_cells()
+ elif self.domain_type == 'universe':
+ return self.openmc_geometry.get_all_universes()
+
+ @property
+ def domain_type(self):
+ return self._domain_type
+
+ @property
+ def correction(self):
+ return self._correction
+
+ @property
+ def energy_groups(self):
+ return self._energy_groups
+
+ @property
+ def tally_trigger(self):
+ return self._tally_trigger
+
+ @property
+ def num_groups(self):
+ return self.energy_groups.num_groups
+
+ @property
+ def all_mgxs(self):
+ return self._all_mgxs
+
+ @property
+ def statepoint(self):
+ return self._sp_filename
+
+ @openmc_geometry.setter
+ def openmc_geometry(self, openmc_geometry):
+ cv.check_type('openmc_geometry', openmc_geometry, openmc.Geometry)
+ self._openmc_geometry = openmc_geometry
+
+ @name.setter
+ def name(self, name):
+ cv.check_type('name', name, basestring)
+ self._name = name
+
+ @mgxs_types.setter
+ def mgxs_types(self, mgxs_types):
+ if mgxs_types == 'all':
+ self._mgxs_types = openmc.mgxs.MGXS_TYPES
+ else:
+ cv.check_iterable_type('mgxs_types', mgxs_types, basestring)
+ for mgxs_type in mgxs_types:
+ cv.check_value('mgxs_type', mgxs_type, openmc.mgxs.MGXS_TYPES)
+ self._mgxs_types = mgxs_types
+
+ @by_nuclide.setter
+ def by_nuclide(self, by_nuclide):
+ cv.check_type('by_nuclide', by_nuclide, bool)
+ self._by_nuclide = by_nuclide
+
+ @domain_type.setter
+ def domain_type(self, domain_type):
+ cv.check_value('domain type', domain_type, tuple(openmc.mgxs.DOMAIN_TYPES))
+ self._domain_type = domain_type
+
+ @correction.setter
+ def correction(self, correction):
+ cv.check_value('correction', correction, ('P0', None))
+ self._correction = correction
+
+ @energy_groups.setter
+ def energy_groups(self, energy_groups):
+ cv.check_type('energy groups', energy_groups, openmc.mgxs.EnergyGroups)
+ self._energy_groups = energy_groups
+
+ @tally_trigger.setter
+ def tally_trigger(self, tally_trigger):
+ cv.check_type('tally trigger', tally_trigger, openmc.Trigger)
+ self._tally_trigger = tally_trigger
+
+ def build_library(self):
+ """Initialize MGXS objects in each domain and for each reaction type
+ in the library.
+
+ This routine will populate the all_mgxs instance attribute dictionary
+ with MGXS subclass objects keyed by each domain ID (e.g., Material IDs)
+ and cross section type (e.g., 'nu-fission', 'total', etc.).
+
+ """
+
+ # Initialize MGXS for each domain and mgxs type and store in dictionary
+ for domain in self.domains:
+ self.all_mgxs[domain.id] = OrderedDict()
+ for mgxs_type in self.mgxs_types:
+ mgxs = openmc.mgxs.MGXS.get_mgxs(mgxs_type, name=self.name)
+ mgxs.domain = domain
+ mgxs.domain_type = self.domain_type
+ mgxs.energy_groups = self.energy_groups
+ mgxs.by_nuclide = self.by_nuclide
+
+ # If a tally trigger was specified, add it to the MGXS
+ if self.tally_trigger:
+ mgxs.tally_trigger = self.tally_trigger
+
+ # Specify whether to use a transport ('P0') correction
+ if isinstance(mgxs, openmc.mgxs.ScatterMatrixXS):
+ mgxs.correction = self.correction
+
+ self.all_mgxs[domain.id][mgxs_type] = mgxs
+
+ def add_to_tallies_file(self, tallies_file, merge=True):
+ """Add all tallies from all MGXS objects to a tallies file.
+
+ NOTE: This assumes that build_library() has been called
+
+ Parameters
+ ----------
+ tallies_file : openmc.TalliesFile
+ A TalliesFile object to add each MGXS' tallies to generate a
+ "tallies.xml" input file for OpenMC
+ merge : bool
+ Indicate whether tallies should be merged when possible. Defaults
+ to True.
+
+ """
+
+ cv.check_type('tallies_file', tallies_file, openmc.TalliesFile)
+
+ # Add tallies from each MGXS for each domain and mgxs type
+ for domain in self.domains:
+ for mgxs_type in self.mgxs_types:
+ mgxs = self.get_mgxs(domain, mgxs_type)
+ for tally_id, tally in mgxs.tallies.items():
+ tallies_file.add_tally(tally, merge=merge)
+
+ def load_from_statepoint(self, statepoint):
+ """Extracts tallies in an OpenMC StatePoint with the data needed to
+ compute multi-group cross sections.
+
+ This method is needed to compute cross section data from tallies
+ in an OpenMC StatePoint object.
+
+ NOTE: The statepoint must first be linked with an OpenMC Summary object.
+
+ Parameters
+ ----------
+ statepoint : openmc.StatePoint
+ An OpenMC StatePoint object with tally data
+
+ Raises
+ ------
+ ValueError
+ When this method is called with a statepoint that has not been
+ linked with a summary object.
+
+ """
+
+ cv.check_type('statepoint', statepoint, openmc.StatePoint)
+
+ if not statepoint.with_summary:
+ msg = 'Unable to load data from a statepoint which has not been ' \
+ 'linked with a summary file'
+ raise ValueError(msg)
+
+ self._sp_filename = statepoint._f.filename
+
+ # Load tallies for each MGXS for each domain and mgxs type
+ for domain in self.domains:
+ for mgxs_type in self.mgxs_types:
+ mgxs = self.get_mgxs(domain, mgxs_type)
+ mgxs.load_from_statepoint(statepoint)
+
+ def get_mgxs(self, domain, mgxs_type):
+ """Return the MGXS object for some domain and reaction rate type.
+
+ This routine searches the library for an MGXS object for the spatial
+ domain and reaction rate type requested by the user.
+
+ NOTE: This routine must be called after the build_library() routine.
+
+ Parameters
+ ----------
+ domain : Material or Cell or Universe or Integral
+ The material, cell, or universe object of interest (or its ID)
+ mgxs_type : {'total', 'transport', 'absorption', 'capture', 'fission', 'nu-fission', 'scatter', 'nu-scatter', 'scatter matrix', 'nu-scatter matrix', 'chi'}
+ The type of multi-group cross section object to return
+
+ Returns
+ -------
+ openmc.mgxs.MGXS
+ The MGXS object for the requested domain and reaction rate type
+
+ Raises
+ ------
+ ValueError
+ If no MGXS object can be found for the requested domain or
+ multi-group cross section type
+
+ """
+
+ if self.domain_type == 'material':
+ cv.check_type('domain', domain, (openmc.Material, Integral))
+ elif self.domain_type == 'cell' or self.domain_type == 'distribcell':
+ cv.check_type('domain', domain, (openmc.Cell, Integral))
+ elif self.domain_type == 'universe':
+ cv.check_type('domain', domain, (openmc.Universe, Integral))
+
+ # Check that requested domain is included in library
+ if cv._isinstance(domain, Integral):
+ domain_id = domain
+ for domain in self.domains:
+ if domain_id == domain.id:
+ break
+ else:
+ msg = 'Unable to find MGXS for {0} "{1}" in ' \
+ 'library'.format(self.domain_type, domain)
+ raise ValueError(msg)
+ else:
+ domain_id = domain.id
+
+ # Check that requested domain is included in library
+ if mgxs_type not in self.mgxs_types:
+ msg = 'Unable to find MGXS type "{0}"'.format(mgxs_type)
+ raise ValueError(msg)
+
+ return self.all_mgxs[domain_id][mgxs_type]
+
+ def get_condensed_library(self, coarse_groups):
+ """Construct an energy-condensed version of this library.
+
+ This routine condenses each of the multi-group cross sections in the
+ library to a coarse energy group structure. NOTE: This routine must
+ be called after the load_from_statepoint(...) routine loads the tallies
+ from the statepoint into each of the cross sections.
+
+ Parameters
+ ----------
+ coarse_groups : openmc.mgxs.EnergyGroups
+ The coarse energy group structure of interest
+
+ Returns
+ -------
+ Library
+ A new multi-group cross section library condensed to the group
+ structure of interest
+
+ Raises
+ ------
+ ValueError
+ When this method is called before a statepoint has been loaded
+
+ See also
+ --------
+ MGXS.get_condensed_xs(coarse_groups)
+
+ """
+
+ if self.statepoint is None:
+ msg = 'Unable to get a condensed coarse group cross section ' \
+ 'library since the statepoint has not yet been loaded'
+ raise ValueError(msg)
+
+ cv.check_type('coarse_groups', coarse_groups, openmc.mgxs.EnergyGroups)
+ cv.check_less_than('coarse groups', coarse_groups.num_groups,
+ self.num_groups, equality=True)
+ cv.check_value('upper coarse energy', coarse_groups.group_edges[-1],
+ [self.energy_groups.group_edges[-1]])
+ cv.check_value('lower coarse energy', coarse_groups.group_edges[0],
+ [self.energy_groups.group_edges[0]])
+
+ # Clone this Library to initialize the condensed version
+ condensed_library = copy.deepcopy(self)
+ condensed_library.energy_groups = coarse_groups
+
+ # Condense the MGXS for each domain and mgxs type
+ for domain in self.domains:
+ for mgxs_type in self.mgxs_types:
+ mgxs = condensed_library.get_mgxs(domain, mgxs_type)
+ condensed_mgxs = mgxs.get_condensed_xs(coarse_groups)
+ condensed_library.all_mgxs[domain.id][mgxs_type] = condensed_mgxs
+
+ return condensed_library
+
+ def get_subdomain_avg_library(self):
+ """Construct a subdomain-averaged version of this library.
+
+ This routine averages each multi-group cross section across distribcell
+ instances. The method performs spatial homogenization to compute the
+ scalar flux-weighted average cross section across the subdomains.
+
+ NOTE: This method is only relevant for distribcell domain types and
+ simplys returns a deep copy of the library for all other domains types.
+
+ Returns
+ -------
+ Library
+ A new multi-group cross section library averaged across subdomains
+
+ Raises
+ ------
+ ValueError
+ When this method is called before a statepoint has been loaded
+
+ See also
+ --------
+ MGXS.get_subdomain_avg_xs(subdomains)
+
+ """
+
+ if self.statepoint is None:
+ msg = 'Unable to get a subdomain-averaged cross section ' \
+ 'library since the statepoint has not yet been loaded'
+ raise ValueError(msg)
+
+ # Clone this Library to initialize the subdomain-averaged version
+ subdomain_avg_library = copy.deepcopy(self)
+
+ if subdomain_avg_library.domain_type == 'distribcell':
+ subdomain_avg_library.domain_type = 'cell'
+ else:
+ return subdomain_avg_library
+
+ # Subdomain average the MGXS for each domain and mgxs type
+ for domain in self.domains:
+ for mgxs_type in self.mgxs_types:
+ mgxs = subdomain_avg_library.get_mgxs(domain, mgxs_type)
+ avg_mgxs = mgxs.get_subdomain_avg_xs()
+ subdomain_avg_library.all_mgxs[domain.id][mgxs_type] = avg_mgxs
+
+ return subdomain_avg_library
+
+ def build_hdf5_store(self, filename='mgxs.h5', directory='mgxs',
+ subdomains='all', nuclides='all', xs_type='macro'):
+ """Export the multi-group cross section library to an HDF5 binary file.
+
+ This method constructs an HDF5 file which stores the library's
+ multi-group cross section data. The data is stored in a hierarchy of
+ HDF5 groups from the domain type, domain id, subdomain id (for
+ distribcell domains), nuclides and cross section types. Two datasets for
+ the mean and standard deviation are stored for each subdomain entry in
+ the HDF5 file. The number of groups is stored as a file attribute.
+
+ NOTE: This requires the h5py Python package.
+
+ Parameters
+ ----------
+ filename : str
+ Filename for the HDF5 file. Defaults to 'mgxs.h5'.
+ directory : str
+ Directory for the HDF5 file. Defaults to 'mgxs'.
+ subdomains : {'all', 'avg'}
+ Report all subdomains or the average of all subdomain cross sections
+ in the report. Defaults to 'all'.
+ nuclides : {'all', 'sum'}
+ The nuclides of the cross-sections to include in the report. This
+ may be a list of nuclide name strings (e.g., ['U-235', 'U-238']).
+ The special string 'all' will report the cross sections for all
+ nuclides in the spatial domain. The special string 'sum' will report
+ the cross sections summed over all nuclides. Defaults to 'all'.
+ xs_type: {'macro', 'micro'}
+ Store the macro or micro cross section in units of cm^-1 or barns.
+ Defaults to 'macro'.
+
+ Raises
+ ------
+ ValueError
+ When this method is called before a statepoint has been loaded
+
+ See also
+ --------
+ MGXS.build_hdf5_store(filename, directory, xs_type)
+
+ """
+
+ if self.statepoint is None:
+ msg = 'Unable to get a condensed coarse group cross section ' \
+ 'library since a statepoint has not yet been loaded'
+ raise ValueError(msg)
+
+ cv.check_type('filename', filename, basestring)
+ cv.check_type('directory', directory, basestring)
+
+ import h5py
+
+ # Make directory if it does not exist
+ if not os.path.exists(directory):
+ os.makedirs(directory)
+
+ # Add an attribute for the number of energy groups to the HDF5 file
+ full_filename = os.path.join(directory, filename)
+ full_filename = full_filename.replace(' ', '-')
+ f = h5py.File(full_filename, 'w')
+ f.attrs["# groups"] = self.num_groups
+ f.close()
+
+ # Export MGXS for each domain and mgxs type to an HDF5 file
+ for domain in self.domains:
+ for mgxs_type in self.mgxs_types:
+ mgxs = self.all_mgxs[domain.id][mgxs_type]
+
+ if subdomains == 'avg':
+ mgxs = mgxs.get_subdomain_avg_xs()
+
+ mgxs.build_hdf5_store(filename, directory,
+ xs_type=xs_type, nuclides=nuclides)
+
+ def dump_to_file(self, filename='mgxs', directory='mgxs'):
+ """Store this Library object in a pickle binary file.
+
+ Parameters
+ ----------
+ filename : str
+ Filename for the pickle file. Defaults to 'mgxs'.
+ directory : str
+ Directory for the pickle file. Defaults to 'mgxs'.
+
+ See also
+ --------
+ Library.load_from_file(filename, directory)
+
+ """
+
+ cv.check_type('filename', filename, basestring)
+ cv.check_type('directory', directory, basestring)
+
+ # Make directory if it does not exist
+ if not os.path.exists(directory):
+ os.makedirs(directory)
+
+ full_filename = os.path.join(directory, filename + '.pkl')
+ full_filename = full_filename.replace(' ', '-')
+
+ # Load and return pickled Library object
+ pickle.dump(self, open(full_filename, 'wb'))
+
+ @staticmethod
+ def load_from_file(filename='mgxs', directory='mgxs'):
+ """Load a Library object from a pickle binary file.
+
+ Parameters
+ ----------
+ filename : str
+ Filename for the pickle file. Defaults to 'mgxs'.
+ directory : str
+ Directory for the pickle file. Defaults to 'mgxs'.
+
+ Returns
+ -------
+ Library
+ A Library object loaded from the pickle binary file
+
+ See also
+ --------
+ Library.dump_to_file(mgxs_lib, filename, directory)
+
+ """
+
+ cv.check_type('filename', filename, basestring)
+ cv.check_type('directory', directory, basestring)
+
+ # Make directory if it does not exist
+ if not os.path.exists(directory):
+ os.makedirs(directory)
+
+ full_filename = os.path.join(directory, filename + '.pkl')
+ full_filename = full_filename.replace(' ', '-')
+
+ # Load and return pickled Library object
+ return pickle.load(open(full_filename, 'rb'))
diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py
new file mode 100644
index 000000000..9e2fcbf00
--- /dev/null
+++ b/openmc/mgxs/mgxs.py
@@ -0,0 +1,2277 @@
+from __future__ import division
+
+from collections import Iterable, OrderedDict
+from numbers import Integral
+import os
+import sys
+import copy
+import abc
+
+import numpy as np
+
+import openmc
+import openmc.checkvalue as cv
+from openmc.mgxs import EnergyGroups
+
+
+if sys.version_info[0] >= 3:
+ basestring = str
+
+
+# Supported cross section types
+MGXS_TYPES = ['total',
+ 'transport',
+ 'absorption',
+ 'capture',
+ 'fission',
+ 'nu-fission',
+ 'scatter',
+ 'nu-scatter',
+ 'scatter matrix',
+ 'nu-scatter matrix',
+ 'chi']
+
+
+# Supported domain types
+# TODO: Implement Mesh domains
+DOMAIN_TYPES = ['cell',
+ 'distribcell',
+ 'universe',
+ 'material']
+
+# Supported domain classes
+# TODO: Implement Mesh domains
+_DOMAINS = [openmc.Cell,
+ openmc.Universe,
+ openmc.Material]
+
+
+class MGXS(object):
+ """An abstract multi-group cross section for some energy group structure
+ within some spatial domain.
+
+ This class can be used for both OpenMC input generation and tally data
+ post-processing to compute spatially-homogenized and energy-integrated
+ multi-group cross sections for deterministic neutronics calculations.
+
+ NOTE: Users should instantiate the subclasses of this abstract class.
+
+ Parameters
+ ----------
+ domain : Material or Cell or Universe
+ The domain for spatial homogenization
+ domain_type : {'material', 'cell', 'distribcell', 'universe'}
+ The domain type for spatial homogenization
+ energy_groups : 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.
+
+ 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
+ Domain for spatial homogenization
+ domain_type : {'material', 'cell', 'distribcell', 'universe'}
+ Domain type for spatial homogenization
+ energy_groups : EnergyGroups
+ Energy group structure for energy condensation
+ tally_trigger : Trigger
+ An (optional) tally precision trigger given to each tally used to
+ compute the cross section
+ tallies : OrderedDict
+ OpenMC tallies needed to compute the multi-group cross section
+ xs_tally : Tally
+ Derived tally for the multi-group cross section. This attribute
+ is None unless the multi-group cross section has been computed.
+ num_sumbdomains : Integral
+ 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 : Integral
+ 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 : list of str or 'sum'
+ A list of nuclide string names (e.g., 'U-238', 'O-16') when by_nuclide
+ is True and 'sum' when by_nuclide is False.
+
+ """
+
+ # This is an abstract class which cannot be instantiated
+ __metaclass__ = abc.ABCMeta
+
+ def __init__(self, domain=None, domain_type=None,
+ energy_groups=None, by_nuclide=False, name=''):
+
+ self._name = ''
+ self._rxn_type = None
+ self._by_nuclide = None
+ self._domain = None
+ self._domain_type = None
+ self._energy_groups = None
+ self._tally_trigger = None
+ self._tallies = None
+ self._xs_tally = None
+
+ self.name = name
+ self.by_nuclide = by_nuclide
+
+ if domain_type is not None:
+ self.domain_type = domain_type
+ if domain is not None:
+ self.domain = domain
+ if energy_groups is not None:
+ self.energy_groups = energy_groups
+
+ def __deepcopy__(self, memo):
+ existing = memo.get(id(self))
+
+ # If this is the first time we have tried to copy this object, copy it
+ if existing is None:
+ clone = type(self).__new__(type(self))
+ clone._name = self.name
+ clone._rxn_type = self.rxn_type
+ clone._by_nuclide = self.by_nuclide
+ clone._domain = self.domain
+ clone._domain_type = self.domain_type
+ clone._energy_groups = copy.deepcopy(self.energy_groups, memo)
+ clone._tally_trigger = copy.deepcopy(self.tally_trigger, memo)
+ clone._xs_tally = copy.deepcopy(self.xs_tally, memo)
+
+ clone._tallies = OrderedDict()
+ for tally_type, tally in self.tallies.items():
+ clone.tallies[tally_type] = copy.deepcopy(tally, memo)
+
+ memo[id(self)] = clone
+
+ return clone
+
+ # If this object has been copied before, return the first copy made
+ else:
+ return existing
+
+ @property
+ def name(self):
+ return self._name
+
+ @property
+ def rxn_type(self):
+ return self._rxn_type
+
+ @property
+ def by_nuclide(self):
+ return self._by_nuclide
+
+ @property
+ def domain(self):
+ return self._domain
+
+ @property
+ def domain_type(self):
+ return self._domain_type
+
+ @property
+ def energy_groups(self):
+ return self._energy_groups
+
+ @property
+ def tally_trigger(self):
+ return self._tally_trigger
+
+ @property
+ def num_groups(self):
+ return self.energy_groups.num_groups
+
+ @property
+ def tallies(self):
+ return self._tallies
+
+ @property
+ def xs_tally(self):
+ return self._xs_tally
+
+ @property
+ def num_subdomains(self):
+ tally = list(self.tallies.values())[0]
+ domain_filter = tally.find_filter(self.domain_type)
+ return domain_filter.num_bins
+
+ @property
+ def num_nuclides(self):
+ if self.by_nuclide:
+ return len(self.get_all_nuclides())
+ else:
+ return 1
+
+ @property
+ def nuclides(self):
+ if self.by_nuclide:
+ return self.get_all_nuclides()
+ else:
+ return 'sum'
+
+ @name.setter
+ def name(self, name):
+ cv.check_type('name', name, basestring)
+ self._name = name
+
+ @by_nuclide.setter
+ def by_nuclide(self, by_nuclide):
+ cv.check_type('by_nuclide', by_nuclide, bool)
+ self._by_nuclide = by_nuclide
+
+ @domain.setter
+ def domain(self, domain):
+ cv.check_type('domain', domain, tuple(_DOMAINS))
+ self._domain = domain
+
+ @domain_type.setter
+ def domain_type(self, domain_type):
+ cv.check_value('domain type', domain_type, tuple(DOMAIN_TYPES))
+ self._domain_type = domain_type
+
+ @energy_groups.setter
+ def energy_groups(self, energy_groups):
+ cv.check_type('energy groups', energy_groups, openmc.mgxs.EnergyGroups)
+ self._energy_groups = energy_groups
+
+ @tally_trigger.setter
+ def tally_trigger(self, tally_trigger):
+ cv.check_type('tally trigger', tally_trigger, openmc.Trigger)
+ self._tally_trigger = tally_trigger
+
+ @staticmethod
+ def get_mgxs(mgxs_type, domain=None, domain_type=None,
+ energy_groups=None, by_nuclide=False, name=''):
+ """Return a MGXS subclass object for some energy group structure within
+ some spatial domain for some reaction type.
+
+ This is a factory method which can be used to quickly create MGXS
+ subclass objects for various reaction types.
+
+ Parameters
+ ----------
+ mgxs_type : {'total', 'transport', 'absorption', 'capture', 'fission', 'nu-fission', 'scatter', 'nu-scatter', 'scatter matrix', 'nu-scatter matrix', 'chi'}
+ The type of multi-group cross section object to return
+ domain : Material or Cell or Universe
+ The domain for spatial homogenization
+ domain_type : {'material', 'cell', 'distribcell', 'universe'}
+ The domain type for spatial homogenization
+ energy_groups : EnergyGroups
+ The energy group structure for energy condensation
+ by_nuclide : bool
+ If true, computes cross sections for each nuclide in domain.
+ Defaults to False
+ name : str, optional
+ Name of the multi-group cross section. Used as a label to identify
+ tallies in OpenMC 'tallies.xml' file. Defaults to the empty string.
+
+ Returns
+ -------
+ MGXS
+ A subclass of the abstract MGXS class for the multi-group cross
+ section type requested by the user
+
+ """
+
+ cv.check_value('mgxs_type', mgxs_type, MGXS_TYPES)
+
+ if mgxs_type == 'total':
+ mgxs = TotalXS(domain, domain_type, energy_groups)
+ elif mgxs_type == 'transport':
+ mgxs = TransportXS(domain, domain_type, energy_groups)
+ elif mgxs_type == 'absorption':
+ mgxs = AbsorptionXS(domain, domain_type, energy_groups)
+ elif mgxs_type == 'capture':
+ mgxs = CaptureXS(domain, domain_type, energy_groups)
+ elif mgxs_type == 'fission':
+ mgxs = FissionXS(domain, domain_type, energy_groups)
+ elif mgxs_type == 'nu-fission':
+ mgxs = NuFissionXS(domain, domain_type, energy_groups)
+ elif mgxs_type == 'scatter':
+ mgxs = ScatterXS(domain, domain_type, energy_groups)
+ elif mgxs_type == 'nu-scatter':
+ mgxs = NuScatterXS(domain, domain_type, energy_groups)
+ elif mgxs_type == 'scatter matrix':
+ mgxs = ScatterMatrixXS(domain, domain_type, energy_groups)
+ elif mgxs_type == 'nu-scatter matrix':
+ mgxs = NuScatterMatrixXS(domain, domain_type, energy_groups)
+ elif mgxs_type == 'chi':
+ mgxs = Chi(domain, domain_type, energy_groups)
+
+ mgxs.by_nuclide = by_nuclide
+ mgxs.name = name
+ return mgxs
+
+ def get_all_nuclides(self):
+ """Get all nuclides in the cross section's spatial domain.
+
+ Returns
+ -------
+ list of str
+ A list of the string names for each nuclide in the spatial domain
+ (e.g., ['U-235', 'U-238', 'O-16'])
+
+ Raises
+ ------
+ ValueError
+ When this method is called before the spatial domain has been set.
+
+ """
+
+ if self.domain is None:
+ raise ValueError('Unable to get all nuclides without a domain')
+
+ nuclides = self.domain.get_all_nuclides()
+ return nuclides.keys()
+
+ def get_nuclide_density(self, nuclide):
+ """Get the atomic number density in units of atoms/b-cm for a nuclide
+ in the cross section's spatial domain.
+
+ Parameters
+ ----------
+ nuclide : str
+ A nuclide name string (e.g., 'U-235')
+
+ Returns
+ -------
+ Real
+ The atomic number density (atom/b-cm) for the nuclide of interest
+
+ Raises
+ -------
+ ValueError
+ When the density is requested for a nuclide which is not found in
+ the spatial domain.
+
+ """
+
+ cv.check_type('nuclide', nuclide, basestring)
+
+ # Get list of all nuclides in the spatial domain
+ nuclides = self.domain.get_all_nuclides()
+
+ if nuclide not in nuclides:
+ msg = 'Unable to get density for nuclide "{0}" which is not in ' \
+ '{1} "{2}"'.format(nuclide, self.domain_type, self.domain.id)
+ ValueError(msg)
+
+ density = nuclides[nuclide][1]
+ return density
+
+ def get_nuclide_densities(self, nuclides='all'):
+ """Get an array of atomic number densities in units of atom/b-cm for all
+ nuclides in the cross section's spatial domain.
+
+ Parameters
+ ----------
+ nuclides : Iterable of str or 'all' or 'sum'
+ A list of nuclide name strings (e.g., ['U-235', 'U-238']). The
+ special string 'all' will return the atom densities for all nuclides
+ in the spatial domain. The special string 'sum' will return the atom
+ density summed across all nuclides in the spatial domain. Defaults
+ to 'all'.
+
+ Returns
+ -------
+ ndarray of Real
+ An array of the atomic number densities (atom/b-cm) for each of the
+ nuclides in the spatial domain
+
+ Raises
+ ------
+ ValueError
+ When this method is called before the spatial domain has been set.
+
+ """
+
+ if self.domain is None:
+ raise ValueError('Unable to get nuclide densities without a domain')
+
+ # Sum the atomic number densities for all nuclides
+ if nuclides == 'sum':
+ nuclides = self.get_all_nuclides()
+ densities = np.zeros(1, dtype=np.float)
+ for nuclide in nuclides:
+ densities[0] += self.get_nuclide_density(nuclide)
+
+ # Tabulate the atomic number densities for all nuclides
+ elif nuclides == 'all':
+ nuclides = self.get_all_nuclides()
+ densities = np.zeros(self.num_nuclides, dtype=np.float)
+ for i, nuclide in enumerate(nuclides):
+ densities[i] += self.get_nuclide_density(nuclide)
+
+ # Tabulate the atomic number densities for each specified nuclide
+ else:
+ densities = np.zeros(len(nuclides), dtype=np.float)
+ for i, nuclide in enumerate(nuclides):
+ densities[i] = self.get_nuclide_density(nuclide)
+
+ return densities
+
+ def create_tallies(self, scores, all_filters, keys, estimator):
+ """Instantiates tallies needed to compute the multi-group cross section.
+
+ This is a helper method for MGXS subclasses to create tallies
+ for input file generation. The tallies are stored in the tallies dict.
+ This method is called by each subclass' create_tallies(...) method
+ which define the parameters given to this parent class method.
+
+ Parameters
+ ----------
+ scores : Iterable of str
+ Scores for each tally
+ all_filters : Iterable of tuple of Filter
+ Tuples of non-spatial domain filters for each tally
+ keys : Iterable of str
+ Key string used to store each tally in the tallies dictionary
+ estimator : {'analog' or 'tracklength'}
+ Type of estimator to use for each tally
+
+ """
+
+ cv.check_iterable_type('scores', scores, basestring)
+ cv.check_length('scores', scores, len(keys))
+ cv.check_iterable_type('filters', all_filters, openmc.Filter, 1, 2)
+ cv.check_type('keys', keys, Iterable, basestring)
+ cv.check_value('estimator', estimator, ['analog', 'tracklength'])
+
+ self._tallies = OrderedDict()
+
+ # Create a domain Filter object
+ domain_filter = openmc.Filter(self.domain_type, self.domain.id)
+
+ # Create each Tally needed to compute the multi group cross section
+ for score, key, filters in zip(scores, keys, all_filters):
+ self.tallies[key] = openmc.Tally(name=self.name)
+ self.tallies[key].add_score(score)
+ self.tallies[key].estimator = estimator
+ self.tallies[key].add_filter(domain_filter)
+
+ # If a tally trigger was specified, add it to each tally
+ if self.tally_trigger:
+ trigger_clone = copy.deepcopy(self.tally_trigger)
+ trigger_clone.add_score(score)
+ self.tallies[key].add_trigger(trigger_clone)
+
+ # Add all non-domain specific Filters (e.g., 'energy') to the Tally
+ for filter in filters:
+ self.tallies[key].add_filter(filter)
+
+ # If this is a by-nuclide cross-section, add all nuclides to Tally
+ if self.by_nuclide and score != 'flux':
+ all_nuclides = self.domain.get_all_nuclides()
+ for nuclide in all_nuclides:
+ self.tallies[key].add_nuclide(nuclide)
+ else:
+ self.tallies[key].add_nuclide('total')
+
+ @abc.abstractmethod
+ def compute_xs(self):
+ """Performs generic cleanup after a subclass' uses tally arithmetic to
+ compute a multi-group cross section as a derived tally.
+
+ This method replaces CrossNuclides generated by tally arithmetic with
+ the original Nuclide objects in the xs_tally instance attribute. The
+ simple Nuclides allow for cleaner output through Pandas DataFrames as
+ well as simpler data access through the get_xs(...) class method.
+
+ In addition, this routine resets NaNs in the multi group cross section
+ array to 0.0. This may be needed occur if no events were scored in
+ certain tally bins, which will lead to a divide-by-zero situation.
+
+ """
+
+ # If computing xs for each nuclide, replace CrossNuclides with originals
+ if self.by_nuclide:
+ self.xs_tally._nuclides = []
+ nuclides = self.domain.get_all_nuclides()
+ for nuclide in nuclides:
+ self.xs_tally.add_nuclide(openmc.Nuclide(nuclide))
+
+ # Remove NaNs which may have resulted from divide-by-zero operations
+ self._xs_tally._mean = np.nan_to_num(self.xs_tally.mean)
+ self._xs_tally._std_dev = np.nan_to_num(self.xs_tally.std_dev)
+
+ def load_from_statepoint(self, statepoint):
+ """Extracts tallies in an OpenMC StatePoint with the data needed to
+ compute multi-group cross sections.
+
+ This method is needed to compute cross section data from tallies
+ in an OpenMC StatePoint object.
+
+ NOTE: The statepoint must first be linked with an OpenMC Summary object.
+
+ Parameters
+ ----------
+ statepoint : openmc.StatePoint
+ An OpenMC StatePoint object with tally data
+
+ Raises
+ ------
+ ValueError
+ When this method is called with a statepoint that has not been
+ linked with a summary object.
+
+ """
+
+ cv.check_type('statepoint', statepoint, openmc.statepoint.StatePoint)
+
+ if not statepoint.with_summary:
+ msg = 'Unable to load data from a statepoint which has not been ' \
+ 'linked with a summary file'
+ raise ValueError(msg)
+
+ # Override the domain object that loaded from an OpenMC summary file
+ # NOTE: This is necessary for micro cross-sections which require
+ # the isotopic number densities as computed by OpenMC
+ if self.domain_type == 'cell' or self.domain_type == 'distribcell':
+ self.domain = statepoint.summary.get_cell_by_id(self.domain.id)
+ elif self.domain_type == 'universe':
+ self.domain = statepoint.summary.get_universe_by_id(self.domain.id)
+ elif self.domain_type == 'material':
+ self.domain = statepoint.summary.get_material_by_id(self.domain.id)
+ else:
+ msg = 'Unable to load data from a statepoint for domain type {0} ' \
+ 'which is not yet supported'.format(self.domain_type)
+ raise ValueError(msg)
+
+ # Use tally "slicing" to ensure that tallies correspond to our domain
+ # NOTE: This is important if tally merging was used
+ if self.domain_type != 'distribcell':
+ filters = [self.domain_type]
+ filter_bins = [(self.domain.id,)]
+ # Distribcell filters only accept single cell - neglect it when slicing
+ else:
+ filters = []
+ filter_bins = []
+
+ # Find, slice and store Tallies from StatePoint
+ # The tally slicing is needed if tally merging was used
+ for tally_type, tally in self.tallies.items():
+ sp_tally = statepoint.get_tally(tally.scores, tally.filters,
+ tally.nuclides,
+ estimator=tally.estimator)
+ sp_tally = sp_tally.get_slice(tally.scores, filters,
+ filter_bins, tally.nuclides)
+ self.tallies[tally_type] = sp_tally
+
+ # Compute the cross section from the tallies
+ self.compute_xs()
+
+ def get_xs(self, groups='all', subdomains='all', nuclides='all',
+ xs_type='macro', order_groups='increasing', value='mean'):
+ """Returns an array of multi-group cross sections.
+
+ This method constructs a 2D NumPy array for the requested multi-group
+ cross section data data for one or more energy groups and subdomains.
+
+ Parameters
+ ----------
+ groups : Iterable of Integral or 'all'
+ Energy groups of interest. Defaults to 'all'.
+ subdomains : Iterable of Integral or 'all'
+ Subdomain IDs of interest. Defaults to 'all'.
+ nuclides : Iterable of str or 'all' or 'sum'
+ A list of nuclide name strings (e.g., ['U-235', 'U-238']). The
+ special string 'all' will return the cross sections for all nuclides
+ in the spatial domain. The special string 'sum' will return the
+ cross section summed over all nuclides. Defaults to 'all'.
+ xs_type: {'macro', 'micro'}
+ Return the macro or micro cross section in units of cm^-1 or barns.
+ Defaults to 'macro'.
+ order_groups: {'increasing', 'decreasing'}
+ Return the cross section indexed according to increasing or
+ decreasing energy groups (decreasing or increasing energies).
+ Defaults to 'increasing'.
+ value : str
+ A string for the type of value to return - 'mean', 'std_dev' or
+ 'rel_err' are accepted. Defaults to 'mean'.
+
+ Returns
+ -------
+ ndarray
+ A NumPy array of the multi-group cross section indexed in the order
+ each group, subdomain and nuclide is listed in the parameters.
+
+ Raises
+ ------
+ ValueError
+ When this method is called before the multi-group cross section is
+ computed from tally data.
+
+ """
+
+ if self.xs_tally is None:
+ msg = 'Unable to get cross section since it has not been computed'
+ raise ValueError(msg)
+
+ cv.check_value('value', value, ['mean', 'std_dev', 'rel_err'])
+ cv.check_value('xs_type', xs_type, ['macro', 'micro'])
+
+ filters = []
+ filter_bins = []
+
+ # Construct a collection of the domain filter bins
+ if subdomains != 'all':
+ cv.check_iterable_type('subdomains', subdomains, Integral)
+ for subdomain in subdomains:
+ filters.append(self.domain_type)
+ filter_bins.append((subdomain,))
+
+ # Construct list of energy group bounds tuples for all requested groups
+ if groups != 'all':
+ cv.check_iterable_type('groups', groups, Integral)
+ for group in groups:
+ filters.append('energy')
+ filter_bins.append((self.energy_groups.get_group_bounds(group),))
+
+ # Construct a collection of the nuclides to retrieve from the xs tally
+ if self.by_nuclide:
+ if nuclides == 'all' or nuclides == 'sum' or nuclides == ['sum']:
+ query_nuclides = self.get_all_nuclides()
+ else:
+ query_nuclides = nuclides
+ else:
+ query_nuclides = ['total']
+
+ # If user requested the sum for all nuclides, use tally summation
+ if nuclides == 'sum' or nuclides == ['sum']:
+ xs_tally = self.xs_tally.summation(nuclides=query_nuclides)
+ xs = xs_tally.get_values(filters=filters,
+ filter_bins=filter_bins, value=value)
+ else:
+ xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins,
+ nuclides=query_nuclides, value=value)
+
+ # Divide by atom number densities for microscopic cross sections
+ if xs_type == 'micro':
+ if self.by_nuclide:
+ densities = self.get_nuclide_densities(nuclides)
+ else:
+ densities = self.get_nuclide_densities('sum')
+ if value == 'mean' or value == 'std_dev':
+ xs /= densities[np.newaxis, :, np.newaxis]
+
+ # Reverse data if user requested increasing energy groups since
+ # tally data is stored in order of increasing energies
+ if order_groups == 'increasing':
+ if groups == 'all':
+ num_groups = self.num_groups
+ else:
+ num_groups = len(groups)
+
+ # Reshape tally data array with separate axes for domain and energy
+ num_subdomains = xs.shape[0] / num_groups
+ new_shape = (num_subdomains, num_groups) + xs.shape[1:]
+ xs = np.reshape(xs, new_shape)
+
+ # Reverse energies to align with increasing energy groups
+ xs = xs[:, ::-1, :]
+
+ # Eliminate trivial dimensions
+ xs = np.squeeze(xs)
+ xs = np.atleast_1d(xs)
+
+ return xs
+
+ def get_condensed_xs(self, coarse_groups):
+ """Construct an energy-condensed version of this cross section.
+
+ Parameters
+ ----------
+ coarse_groups : openmc.mgxs.EnergyGroups
+ The coarse energy group structure of interest
+
+ Returns
+ -------
+ MGXS
+ A new MGXS condensed to the group structure of interest
+
+ """
+
+ if self.xs_tally is None:
+ msg = 'Unable to get a condensed coarse group cross section ' \
+ 'since the fine group cross section has not been computed'
+ raise ValueError(msg)
+
+ cv.check_type('coarse_groups', coarse_groups, EnergyGroups)
+ cv.check_less_than('coarse groups', coarse_groups.num_groups,
+ self.num_groups, equality=True)
+ cv.check_value('upper coarse energy', coarse_groups.group_edges[-1],
+ [self.energy_groups.group_edges[-1]])
+ cv.check_value('lower coarse energy', coarse_groups.group_edges[0],
+ [self.energy_groups.group_edges[0]])
+
+ # Clone this MGXS to initialize the condensed version
+ condensed_xs = copy.deepcopy(self)
+ condensed_xs.energy_groups = coarse_groups
+
+ # Build energy indices to sum across
+ energy_indices = []
+ for group in range(coarse_groups.num_groups, 0, -1):
+ low, high = coarse_groups.get_group_bounds(group)
+ low_index = np.where(self.energy_groups.group_edges == low)[0][0]
+ energy_indices.append(low_index)
+
+ fine_edges = self.energy_groups.group_edges
+
+ # Condense each of the tallies to the coarse group structure
+ for tally_type, tally in condensed_xs.tallies.items():
+
+ # Make condensed tally derived and null out sum, sum_sq
+ tally._derived = True
+ tally._sum = None
+ tally._sum_sq = None
+
+ # Get tally data arrays reshaped with one dimension per filter
+ mean = tally.get_reshaped_data(value='mean')
+ std_dev = tally.get_reshaped_data(value='std_dev')
+
+ # Sum across all applicable fine energy group filters
+ for i, filter in enumerate(tally.filters):
+ if 'energy' not in filter.type:
+ continue
+ elif len(filter.bins) != len(fine_edges):
+ continue
+ elif not np.allclose(filter.bins, fine_edges):
+ continue
+ else:
+ filter.bins = coarse_groups.group_edges
+ mean = np.add.reduceat(mean, energy_indices, axis=i)
+ std_dev = np.add.reduceat(std_dev**2, energy_indices, axis=i)
+ std_dev = np.sqrt(std_dev)
+
+ # Reshape condensed data arrays with one dimension for all filters
+ new_shape = \
+ (tally.num_filter_bins, tally.num_nuclides, tally.num_score_bins,)
+ mean = np.reshape(mean, new_shape)
+ std_dev = np.reshape(std_dev, new_shape)
+
+ # Override tally's data with the new condensed data
+ tally._mean = mean
+ tally._std_dev = std_dev
+
+ # Compute the energy condensed multi-group cross section
+ condensed_xs.compute_xs()
+ return condensed_xs
+
+ def get_subdomain_avg_xs(self, subdomains='all'):
+ """Construct a subdomain-averaged version of this cross section.
+
+ This method is useful for averaging cross sections across distribcell
+ instances. The method performs spatial homogenization to compute the
+ scalar flux-weighted average cross section across the subdomains.
+
+ Parameters
+ ----------
+ subdomains : Iterable of Integral or 'all'
+ The subdomain IDs to average across. Defaults to 'all'.
+
+ Returns
+ -------
+ MGXS
+ A new MGXS averaged across the subdomains of interest
+
+ Raises
+ ------
+ ValueError
+ When this method is called before the multi-group cross section is
+ computed from tally data.
+
+ """
+
+ if self.xs_tally is None:
+ msg = 'Unable to get subdomain-averaged cross section since the ' \
+ 'subdomain-distributed cross section has not been computed'
+ raise ValueError(msg)
+
+ # Construct a collection of the subdomain filter bins to average across
+ if subdomains != 'all':
+ cv.check_iterable_type('subdomains', subdomains, Integral)
+ elif self.domain_type == 'distribcell':
+ subdomains = np.arange(self.num_subdomains)
+ else:
+ subdomains = [0]
+
+ # Clone this MGXS to initialize the subdomain-averaged version
+ avg_xs = copy.deepcopy(self)
+
+ # If domain is distribcell, make the new domain 'cell'
+ if self.domain_type == 'distribcell':
+ avg_xs.domain_type = 'cell'
+
+ # Average each of the tallies across subdomains
+ for tally_type, tally in avg_xs.tallies.items():
+
+ # Make condensed tally derived and null out sum, sum_sq
+ tally._derived = True
+ tally._sum = None
+ tally._sum_sq = None
+
+ # Get tally data arrays reshaped with one dimension per filter
+ mean = tally.get_reshaped_data(value='mean')
+ std_dev = tally.get_reshaped_data(value='std_dev')
+
+ # Get the mean of the mean, std. dev. across requested subdomains
+ mean = np.mean(mean[subdomains, ...], axis=0)
+ std_dev = np.mean(std_dev[subdomains, ...]**2, axis=0)
+ std_dev = np.sqrt(std_dev)
+
+ # If domain is distribcell, make subdomain-averaged a 'cell' domain
+ domain_filter = tally.find_filter(self._domain_type)
+ if domain_filter.type == 'distribcell':
+ domain_filter.type = 'cell'
+ domain_filter.num_bins = 1
+
+ # Reshape averaged data arrays with one dimension for all filters
+ new_shape = \
+ (tally.num_filter_bins, tally.num_nuclides, tally.num_score_bins,)
+ mean = np.reshape(mean, new_shape)
+ std_dev = np.reshape(std_dev, new_shape)
+
+ # Override tally's data with the new condensed data
+ tally._mean = mean
+ tally._std_dev = std_dev
+
+ # Compute the subdomain-averaged multi-group cross section
+ avg_xs.compute_xs()
+
+ return avg_xs
+
+ def print_xs(self, subdomains='all', nuclides='all', xs_type='macro'):
+ """Print a string representation for the multi-group cross section.
+
+ Parameters
+ ----------
+ subdomains : Iterable of Integral or 'all'
+ The subdomain IDs of the cross sections to include in the report.
+ Defaults to 'all'.
+ nuclides : Iterable of str or 'all' or 'sum'
+ The nuclides of the cross-sections to include in the report. This
+ may be a list of nuclide name strings (e.g., ['U-235', 'U-238']).
+ The special string 'all' will report the cross sections for all
+ nuclides in the spatial domain. The special string 'sum' will report
+ the cross sections summed over all nuclides. Defaults to 'all'.
+ xs_type: {'macro', 'micro'}
+ Return the macro or micro cross section in units of cm^-1 or barns.
+ Defaults to 'macro'.
+
+ """
+
+ # Construct a collection of the subdomains to report
+ if subdomains != 'all':
+ cv.check_iterable_type('subdomains', subdomains, Integral)
+ elif self.domain_type == 'distribcell':
+ subdomains = np.arange(self.num_subdomains, dtype=np.int)
+ else:
+ subdomains = [self.domain.id]
+
+ # Construct a collection of the nuclides to report
+ if self.by_nuclide:
+ if nuclides == 'all':
+ nuclides = self.get_all_nuclides()
+ elif nuclides == 'sum':
+ nuclides = ['sum']
+ else:
+ cv.check_iterable_type('nuclides', nuclides, basestring)
+ else:
+ nuclides = ['sum']
+
+ cv.check_value('xs_type', xs_type, ['macro', 'micro'])
+
+ # Build header for string with type and domain info
+ string = 'Multi-Group XS\n'
+ string += '{0: <16}=\t{1}\n'.format('\tReaction Type', self.rxn_type)
+ string += '{0: <16}=\t{1}\n'.format('\tDomain Type', self.domain_type)
+ string += '{0: <16}=\t{1}\n'.format('\tDomain ID', self.domain.id)
+
+ # If cross section data has not been computed, only print string header
+ if self.xs_tally is None:
+ print(string)
+ return
+
+ # Loop over all subdomains
+ for subdomain in subdomains:
+
+ if self.domain_type == 'distribcell':
+ string += '{0: <16}=\t{1}\n'.format('\tSubdomain', subdomain)
+
+ # Loop over all Nuclides
+ for nuclide in nuclides:
+
+ # Build header for nuclide type
+ if nuclide != 'sum':
+ string += '{0: <16}=\t{1}\n'.format('\tNuclide', nuclide)
+
+ # Build header for cross section type
+ if xs_type == 'macro':
+ string += '{0: <16}\n'.format('\tCross Sections [cm^-1]:')
+ else:
+ string += '{0: <16}\n'.format('\tCross Sections [barns]:')
+
+ template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]:\t'
+
+ # Loop over energy groups ranges
+ for group in range(1, self.num_groups+1):
+ bounds = self.energy_groups.get_group_bounds(group)
+ string += template.format('', group, bounds[0], bounds[1])
+ average = self.get_xs([group], [subdomain], [nuclide],
+ xs_type=xs_type, value='mean')
+ rel_err = self.get_xs([group], [subdomain], [nuclide],
+ xs_type=xs_type, value='rel_err')
+ average = average.flatten()[0]
+ rel_err = rel_err.flatten()[0] * 100.
+ string += '{:.2e} +/- {:1.2e}%'.format(average, rel_err)
+ string += '\n'
+ string += '\n'
+ string += '\n'
+
+ print(string)
+
+ def build_hdf5_store(self, filename='mgxs.h5', directory='mgxs',
+ subdomains='all', nuclides='all',
+ xs_type='macro', append=True):
+ """Export the multi-group cross section data to an HDF5 binary file.
+
+ This method constructs an HDF5 file which stores the multi-group
+ cross section data. The data is stored in a hierarchy of HDF5 groups
+ from the domain type, domain id, subdomain id (for distribcell domains),
+ nuclides and cross section type. Two datasets for the mean and standard
+ deviation are stored for each subdomain entry in the HDF5 file.
+
+ NOTE: This requires the h5py Python package.
+
+ Parameters
+ ----------
+ filename : str
+ Filename for the HDF5 file. Defaults to 'mgxs.h5'.
+ directory : str
+ Directory for the HDF5 file. Defaults to 'mgxs'.
+ subdomains : Iterable of Integral or 'all'
+ The subdomain IDs of the cross sections to include in the report.
+ Defaults to 'all'.
+ nuclides : Iterable of str or 'all' or 'sum'
+ The nuclides of the cross-sections to include in the report. This
+ may be a list of nuclide name strings (e.g., ['U-235', 'U-238']).
+ The special string 'all' will report the cross sections for all
+ nuclides in the spatial domain. The special string 'sum' will report
+ the cross sections summed over all nuclides. Defaults to 'all'.
+ xs_type: {'macro', 'micro'}
+ Store the macro or micro cross section in units of cm^-1 or barns.
+ Defaults to 'macro'.
+ append : bool
+ If true, appends to an existing HDF5 file with the same filename
+ directory (if one exists). Defaults to True.
+
+ Raises
+ ------
+ ValueError
+ When this method is called before the multi-group cross section is
+ computed from tally data.
+ ImportError
+ When h5py is not installed.
+
+ """
+
+ if self.xs_tally is None:
+ msg = 'Unable to get build HDF5 store since the ' \
+ 'cross section has not been computed'
+ raise ValueError(msg)
+
+ import h5py
+
+ # Make directory if it does not exist
+ if not os.path.exists(directory):
+ os.makedirs(directory)
+
+ filename = os.path.join(directory, filename)
+ filename = filename.replace(' ', '-')
+
+ if append and os.path.isfile(filename):
+ xs_results = h5py.File(filename, 'a')
+ else:
+ xs_results = h5py.File(filename, 'w')
+
+ # Construct a collection of the subdomains to report
+ if subdomains != 'all':
+ cv.check_iterable_type('subdomains', subdomains, Integral)
+ elif self.domain_type == 'distribcell':
+ subdomains = np.arange(self.num_subdomains, dtype=np.int)
+ else:
+ subdomains = [self.domain.id]
+
+ # Construct a collection of the nuclides to report
+ if self.by_nuclide:
+ if nuclides == 'all':
+ nuclides = self.get_all_nuclides()
+ densities = np.zeros(len(nuclides), dtype=np.float)
+ elif nuclides == 'sum':
+ nuclides = ['sum']
+ else:
+ cv.check_iterable_type('nuclides', nuclides, basestring)
+ else:
+ nuclides = ['sum']
+
+ cv.check_value('xs_type', xs_type, ['macro', 'micro'])
+
+ # Create an HDF5 group within the file for the domain
+ domain_type_group = xs_results.require_group(self.domain_type)
+ domain_group = domain_type_group.require_group(str(self.domain.id))
+
+ # Determine number of digits to pad subdomain group keys
+ num_digits = len(str(self.num_subdomains))
+
+ # Create a separate HDF5 group for each subdomain
+ for i, subdomain in enumerate(subdomains):
+
+ # Create an HDF5 group for the subdomain
+ if self.domain_type == 'distribcell':
+ group_name = ''.zfill(num_digits)
+ subdomain_group = domain_group.require_group(group_name)
+ else:
+ subdomain_group = domain_group
+
+ # Create a separate HDF5 group for the rxn type
+ rxn_group = subdomain_group.require_group(self.rxn_type)
+
+ # Create a separate HDF5 group for each nuclide
+ for j, nuclide in enumerate(nuclides):
+
+ if nuclide != 'sum':
+ density = densities[j]
+ nuclide_group = rxn_group.require_group(nuclide)
+ nuclide_group.require_dataset('density', dtype=np.float64,
+ data=[density], shape=(1,))
+ else:
+ nuclide_group = rxn_group
+
+ # Extract the cross section for this subdomain and nuclide
+ average = self.get_xs(subdomains=[subdomain], nuclides=[nuclide],
+ xs_type=xs_type, value='mean')
+ std_dev = self.get_xs(subdomains=[subdomain], nuclides=[nuclide],
+ xs_type=xs_type, value='std_dev')
+ average = average.squeeze()
+ std_dev = std_dev.squeeze()
+
+ # Add MGXS results data to the HDF5 group
+ nuclide_group.require_dataset('average', dtype=np.float64,
+ shape=average.shape, data=average)
+ nuclide_group.require_dataset('std. dev.', dtype=np.float64,
+ shape=std_dev.shape, data=std_dev)
+
+ # Close the results HDF5 file
+ xs_results.close()
+
+ def export_xs_data(self, filename='mgxs', directory='mgxs',
+ format='csv', groups='all', xs_type='macro'):
+ """Export the multi-group cross section data to a file.
+
+ This method leverages the functionality in the Pandas library to export
+ the multi-group cross section data in a variety of output file formats
+ for storage and/or post-processing.
+
+ Parameters
+ ----------
+ filename : str
+ Filename for the exported file. Defaults to 'mgxs'.
+ directory : str
+ Directory for the exported file. Defaults to 'mgxs'.
+ format : {'csv', 'excel', 'pickle', 'latex'}
+ The format for the exported data file. Defaults to 'csv'.
+ groups : Iterable of Integral or 'all'
+ Energy groups of interest. Defaults to 'all'.
+ xs_type: {'macro', 'micro'}
+ Store the macro or micro cross section in units of cm^-1 or barns.
+ Defaults to 'macro'.
+
+ """
+
+ cv.check_type('filename', filename, basestring)
+ cv.check_type('directory', directory, basestring)
+ cv.check_value('format', format, ['csv', 'excel', 'pickle', 'latex'])
+ cv.check_value('xs_type', xs_type, ['macro', 'micro'])
+
+ # Make directory if it does not exist
+ if not os.path.exists(directory):
+ os.makedirs(directory)
+
+ filename = os.path.join(directory, filename)
+ filename = filename.replace(' ', '-')
+
+ # Get a Pandas DataFrame for the data
+ df = self.get_pandas_dataframe(groups=groups, xs_type=xs_type)
+
+ # Capitalize column label strings
+ df.columns = df.columns.astype(str)
+ df.columns = map(str.title, df.columns)
+
+ # Export the data using Pandas IO API
+ if format == 'csv':
+ df.to_csv(filename + '.csv', index=False)
+ elif format == 'excel':
+ df.to_excel(filename + '.xls', index=False)
+ elif format == 'pickle':
+ df.to_pickle(filename + '.pkl')
+ elif format == 'latex':
+ if self.domain_type == 'distribcell':
+ msg = 'Unable to export distribcell multi-group cross section' \
+ 'data to a LaTeX table'
+ raise NotImplementedError(msg)
+
+ df.to_latex(filename + '.tex', bold_rows=True,
+ longtable=True, index=False)
+
+ # Surround LaTeX table with code needed to run pdflatex
+ with open(filename + '.tex','r') as original:
+ data = original.read()
+ with open(filename + '.tex','w') as modified:
+ modified.write(
+ '\\documentclass[preview, 12pt, border=1mm]{standalone}\n')
+ modified.write('\\usepackage{caption}\n')
+ modified.write('\\usepackage{longtable}\n')
+ modified.write('\\usepackage{booktabs}\n')
+ modified.write('\\begin{document}\n\n')
+ modified.write(data)
+ modified.write('\n\\end{document}')
+
+ def get_pandas_dataframe(self, groups='all', nuclides='all',
+ xs_type='macro', summary=None):
+ """Build a Pandas DataFrame for the MGXS data.
+
+ This method leverages the Tally.get_pandas_dataframe(...) method, but
+ renames the columns with terminology appropriate for cross section data.
+
+ Parameters
+ ----------
+ groups : Iterable of Integral or 'all'
+ Energy groups of interest. Defaults to 'all'.
+ nuclides : Iterable of str or 'all' or 'sum'
+ The nuclides of the cross-sections to include in the dataframe. This
+ may be a list of nuclide name strings (e.g., ['U-235', 'U-238']).
+ The special string 'all' will include the cross sections for all
+ nuclides in the spatial domain. The special string 'sum' will
+ include the cross sections summed over all nuclides. Defaults
+ to 'all'.
+ xs_type: {'macro', 'micro'}
+ Return macro or micro cross section in units of cm^-1 or barns.
+ Defaults to 'macro'.
+ summary : None or Summary
+ An optional Summary object to be used to construct columns for
+ distribcell tally filters (default is None). The geometric
+ information in the Summary object is embedded into a multi-index
+ column with a geometric "path" to each distribcell intance.
+ NOTE: This option requires the OpenCG Python package.
+
+ Returns
+ -------
+ pandas.DataFrame
+ A Pandas DataFrame for the cross section data.
+
+ Raises
+ ------
+ ValueError
+ When this method is called before the multi-group cross section is
+ computed from tally data.
+
+ """
+
+ if self.xs_tally is None:
+ msg = 'Unable to get Pandas DataFrame since the ' \
+ 'cross section has not been computed'
+ raise ValueError(msg)
+
+ if groups != 'all':
+ cv.check_iterable_type('groups', groups, Integral)
+ if nuclides != 'all' and nuclides != 'sum':
+ cv.check_iterable_type('nuclides', nuclides, basestring)
+ cv.check_value('xs_type', xs_type, ['macro', 'micro'])
+
+ # Get a Pandas DataFrame from the derived xs tally
+ if self.by_nuclide and nuclides == 'sum':
+
+ # Use tally summation to sum across all nuclides
+ query_nuclides = self.get_all_nuclides()
+ xs_tally = self.xs_tally.summation(nuclides=query_nuclides)
+ df = xs_tally.get_pandas_dataframe(summary=summary)
+
+ # Remove nuclide column since it is homogeneous and redundant
+ df.drop('nuclide', axis=1, inplace=True)
+
+ # If the user requested a specific set of nuclides
+ elif self.by_nuclide and nuclides != 'all':
+ xs_tally = self.xs_tally.get_slice(nuclides=nuclides)
+ df = xs_tally.get_pandas_dataframe(summary=summary)
+
+ # If the user requested all nuclides, keep nuclide column in dataframe
+ else:
+ df = self.xs_tally.get_pandas_dataframe(summary=summary)
+
+ # Remove the score column since it is homogeneous and redundant
+ if summary and self.domain_type == 'distribcell':
+ df = df.drop('score', level=0, axis=1)
+ else:
+ df = df.drop('score', axis=1)
+
+ # Rename energy(out) columns
+ columns = []
+ if 'energy [MeV]' in df:
+ df.rename(columns={'energy [MeV]': 'group in'}, inplace=True)
+ columns.append('group in')
+ if 'energyout [MeV]' in df:
+ df.rename(columns={'energyout [MeV]': 'group out'}, inplace=True)
+ columns.append('group out')
+
+ # Loop over all energy groups and override the bounds with indices
+ template = '({0:.1e} - {1:.1e})'
+ bins = self.energy_groups.group_edges
+ for column in columns:
+ for i in range(self.num_groups):
+ group = template.format(bins[i], bins[i+1])
+ row_indices = df[column] == group
+ df.loc[row_indices, column] = self.num_groups - i
+
+ # Select out those groups the user requested
+ if groups != 'all':
+ if 'group in' in df:
+ df = df[df['group in'].isin(groups)]
+ if 'group out' in df:
+ df = df[df['group out'].isin(groups)]
+
+ # If user requested micro cross sections, divide out the atom densities
+ if xs_type == 'micro':
+ if self.by_nuclide:
+ densities = self.get_nuclide_densities(nuclides)
+ else:
+ densities = self.get_nuclide_densities('sum')
+ tile_factor = df.shape[0] / len(densities)
+ df['mean'] /= np.tile(densities, tile_factor)
+ df['std. dev.'] /= np.tile(densities, tile_factor)
+
+ # Sort the dataframe by domain type id (e.g., distribcell id) and
+ # energy groups such that data is from fast to thermal
+ df.sort([self.domain_type] + columns, inplace=True)
+
+ return df
+
+
+class TotalXS(MGXS):
+ """A total multi-group cross section."""
+
+ def __init__(self, domain=None, domain_type=None,
+ groups=None, by_nuclide=False, name=''):
+ super(TotalXS, self).__init__(domain, domain_type,
+ groups, by_nuclide, name)
+ self._rxn_type = 'total'
+
+ @property
+ def tallies(self):
+ """Construct the OpenMC tallies needed to compute this cross section.
+
+ This method constructs two tracklength tallies to compute the 'flux'
+ and 'total' reaction rates in the spatial domain and energy groups
+ of interest.
+
+ """
+
+ # Instantiate tallies if they do not exist
+ if super(TotalXS, self).tallies is None:
+
+ # Create a list of scores for each Tally to be created
+ scores = ['flux', 'total']
+ estimator = 'tracklength'
+ keys = scores
+
+ # Create the non-domain specific Filters for the Tallies
+ group_edges = self.energy_groups.group_edges
+ energy_filter = openmc.Filter('energy', group_edges)
+ filters = [[energy_filter], [energy_filter]]
+
+ # Initialize the Tallies
+ super(TotalXS, self).create_tallies(scores, filters,
+ keys, estimator)
+
+ return super(TotalXS, self).tallies
+
+ def compute_xs(self):
+ """Computes the multi-group total cross sections using OpenMC
+ tally arithmetic.
+ """
+
+ self._xs_tally = self.tallies['total'] / self.tallies['flux']
+ super(TotalXS, self).compute_xs()
+
+
+class TransportXS(MGXS):
+ """A transport-corrected total multi-group cross section."""
+
+ def __init__(self, domain=None, domain_type=None,
+ groups=None, by_nuclide=False, name=''):
+ super(TransportXS, self).__init__(domain, domain_type,
+ groups, by_nuclide, name)
+ self._rxn_type = 'transport'
+
+ @property
+ def tallies(self):
+ """Construct the OpenMC tallies needed to compute this cross section.
+
+ This method constructs three analog tallies to compute the 'flux',
+ 'total' and 'scatter-P1' reaction rates in the spatial domain and
+ energy groups of interest.
+
+ """
+
+ # Instantiate tallies if they do not exist
+ if super(TransportXS, self).tallies is None:
+
+ # Create a list of scores for each Tally to be created
+ scores = ['flux', 'total', 'scatter-P1']
+ estimator = 'analog'
+ keys = scores
+
+ # Create the non-domain specific Filters for the Tallies
+ group_edges = self.energy_groups.group_edges
+ energy_filter = openmc.Filter('energy', group_edges)
+ energyout_filter = openmc.Filter('energyout', group_edges)
+ filters = [[energy_filter], [energy_filter], [energyout_filter]]
+
+ # Initialize the Tallies
+ super(TransportXS, self).create_tallies(scores, filters,
+ keys, estimator)
+
+ return super(TransportXS, self).tallies
+
+ def compute_xs(self):
+ """Computes the multi-group transport cross sections using OpenMC
+ tally arithmetic."""
+
+ # Use tally slicing to remove scatter-P0 data from scatter-P1 tally
+ scatter_p1 = self.tallies['scatter-P1']
+ self.tallies['scatter-P1'] = scatter_p1.get_slice(scores=['scatter-P1'])
+ self.tallies['scatter-P1'].filters[-1].type = 'energy'
+
+ self._xs_tally = self.tallies['total'] - self.tallies['scatter-P1']
+ self._xs_tally /= self.tallies['flux']
+ super(TransportXS, self).compute_xs()
+
+
+class AbsorptionXS(MGXS):
+ """An absorption multi-group cross section."""
+
+ def __init__(self, domain=None, domain_type=None,
+ groups=None, by_nuclide=False, name=''):
+ super(AbsorptionXS, self).__init__(domain, domain_type,
+ groups, by_nuclide, name)
+ self._rxn_type = 'absorption'
+
+ @property
+ def tallies(self):
+ """Construct the OpenMC tallies needed to compute this cross section.
+
+ This method constructs two tracklength tallies to compute the 'flux'
+ and 'absorption' reaction rates in the spatial domain and energy
+ groups of interest.
+
+ """
+
+ # Instantiate tallies if they do not exist
+ if super(AbsorptionXS, self).tallies is None:
+
+ # Create a list of scores for each Tally to be created
+ scores = ['flux', 'absorption']
+ estimator = 'tracklength'
+ keys = scores
+
+ # Create the non-domain specific Filters for the Tallies
+ group_edges = self.energy_groups.group_edges
+ energy_filter = openmc.Filter('energy', group_edges)
+ filters = [[energy_filter], [energy_filter]]
+
+ # Initialize the Tallies
+ super(AbsorptionXS, self).create_tallies(scores, filters,
+ keys, estimator)
+
+ return super(AbsorptionXS, self).tallies
+
+ def compute_xs(self):
+ """Computes the multi-group absorption cross sections using OpenMC
+ tally arithmetic."""
+
+ self._xs_tally = self.tallies['absorption'] / self.tallies['flux']
+ super(AbsorptionXS, self).compute_xs()
+
+
+class CaptureXS(MGXS):
+ """A capture multi-group cross section.
+
+ The Neutron capture reaction rate is defined as the difference between
+ OpenMC's 'absorption' and 'fission' reaction rate score types. This includes
+ not only radiative capture, but all forms of neutron disappearance aside
+ from fission (e.g., MT > 100).
+
+ """
+
+ def __init__(self, domain=None, domain_type=None,
+ groups=None, by_nuclide=False, name=''):
+ super(CaptureXS, self).__init__(domain, domain_type,
+ groups, by_nuclide, name)
+ self._rxn_type = 'capture'
+
+ @property
+ def tallies(self):
+ """Construct the OpenMC tallies needed to compute this cross section.
+
+ This method constructs two tracklength tallies to compute the 'flux'
+ and 'capture' reaction rates in the spatial domain and energy
+ groups of interest.
+
+ """
+
+ # Instantiate tallies if they do not exist
+ if super(CaptureXS, self).tallies is None:
+
+ # Create a list of scores for each Tally to be created
+ scores = ['flux', 'absorption', 'fission']
+ estimator = 'tracklength'
+ keys = scores
+
+ # Create the non-domain specific Filters for the Tallies
+ group_edges = self.energy_groups.group_edges
+ energy_filter = openmc.Filter('energy', group_edges)
+ filters = [[energy_filter], [energy_filter], [energy_filter]]
+
+ # Initialize the Tallies
+ super(CaptureXS, self).create_tallies(scores, filters,
+ keys, estimator)
+
+ return super(CaptureXS, self).tallies
+
+ def compute_xs(self):
+ """Computes the multi-group capture cross sections using OpenMC
+ tally arithmetic."""
+
+ self._xs_tally = self.tallies['absorption'] - self.tallies['fission']
+ self._xs_tally /= self.tallies['flux']
+ super(CaptureXS, self).compute_xs()
+
+
+class FissionXS(MGXS):
+ """A fission multi-group cross section."""
+
+ def __init__(self, domain=None, domain_type=None,
+ groups=None, by_nuclide=False, name=''):
+ super(FissionXS, self).__init__(domain, domain_type,
+ groups, by_nuclide, name)
+ self._rxn_type = 'fission'
+
+ @property
+ def tallies(self):
+ """Construct the OpenMC tallies needed to compute this cross section.
+
+ This method constructs two tracklength tallies to compute the 'flux'
+ and 'fission' reaction rates in the spatial domain and energy
+ groups of interest.
+
+ """
+
+ # Instantiate tallies if they do not exist
+ if super(FissionXS, self).tallies is None:
+
+ # Create a list of scores for each Tally to be created
+ scores = ['flux', 'fission']
+ estimator = 'tracklength'
+ keys = scores
+
+ # Create the non-domain specific Filters for the Tallies
+ group_edges = self.energy_groups.group_edges
+ energy_filter = openmc.Filter('energy', group_edges)
+ filters = [[energy_filter], [energy_filter]]
+
+ # Initialize the Tallies
+ super(FissionXS, self).create_tallies(scores, filters,
+ keys, estimator)
+
+ return super(FissionXS, self).tallies
+
+ def compute_xs(self):
+ """Computes the multi-group fission cross sections using OpenMC
+ tally arithmetic."""
+
+ self._xs_tally = self.tallies['fission'] / self.tallies['flux']
+ super(FissionXS, self).compute_xs()
+
+
+class NuFissionXS(MGXS):
+ """A fission production multi-group cross section."""
+
+ def __init__(self, domain=None, domain_type=None,
+ groups=None, by_nuclide=False, name=''):
+ super(NuFissionXS, self).__init__(domain, domain_type,
+ groups, by_nuclide, name)
+ self._rxn_type = 'nu-fission'
+
+ @property
+ def tallies(self):
+ """Construct the OpenMC tallies needed to compute this cross section.
+
+ This method constructs two tracklength tallies to compute the 'flux'
+ and 'nu-fission' reaction rates in the spatial domain and energy
+ groups of interest.
+
+ """
+
+ # Instantiate tallies if they do not exist
+ if super(NuFissionXS, self).tallies is None:
+
+ # Create a list of scores for each Tally to be created
+ scores = ['flux', 'nu-fission']
+ estimator = 'tracklength'
+ keys = scores
+
+ # Create the non-domain specific Filters for the Tallies
+ group_edges = self.energy_groups.group_edges
+ energy_filter = openmc.Filter('energy', group_edges)
+ filters = [[energy_filter], [energy_filter]]
+
+ # Initialize the Tallies
+ super(NuFissionXS, self).create_tallies(scores, filters,
+ keys, estimator)
+
+ return super(NuFissionXS, self).tallies
+
+ def compute_xs(self):
+ """Computes the multi-group nu-fission cross sections using OpenMC
+ tally arithmetic."""
+
+ self._xs_tally = self.tallies['nu-fission'] / self.tallies['flux']
+ super(NuFissionXS, self).compute_xs()
+
+
+class ScatterXS(MGXS):
+ """A scatter multi-group cross section."""
+
+ def __init__(self, domain=None, domain_type=None,
+ groups=None, by_nuclide=False, name=''):
+ super(ScatterXS, self).__init__(domain, domain_type,
+ groups, by_nuclide, name)
+ self._rxn_type = 'scatter'
+
+ @property
+ def tallies(self):
+ """Construct the OpenMC tallies needed to compute this cross section.
+
+ This method constructs two tracklength tallies to compute the 'flux'
+ and 'scatter' reaction rates in the spatial domain and energy
+ groups of interest.
+
+ """
+
+ # Instantiate tallies if they do not exist
+ if super(ScatterXS, self).tallies is None:
+
+ # Create a list of scores for each Tally to be created
+ scores = ['flux', 'scatter']
+ estimator = 'tracklength'
+ keys = scores
+
+ # Create the non-domain specific Filters for the Tallies
+ group_edges = self.energy_groups.group_edges
+ energy_filter = openmc.Filter('energy', group_edges)
+ filters = [[energy_filter], [energy_filter]]
+
+ # Intialize the Tallies
+ super(ScatterXS, self).create_tallies(scores, filters,
+ keys, estimator)
+
+ return super(ScatterXS, self).tallies
+
+ def compute_xs(self):
+ """Computes the scattering multi-group cross sections using
+ OpenMC tally arithmetic."""
+
+ self._xs_tally = self.tallies['scatter'] / self.tallies['flux']
+ super(ScatterXS, self).compute_xs()
+
+
+class NuScatterXS(MGXS):
+ """A nu-scatter multi-group cross section."""
+
+ def __init__(self, domain=None, domain_type=None,
+ groups=None, by_nuclide=False, name=''):
+ super(NuScatterXS, self).__init__(domain, domain_type,
+ groups, by_nuclide, name)
+ self._rxn_type = 'nu-scatter'
+
+ @property
+ def tallies(self):
+ """Construct the OpenMC tallies needed to compute this cross section.
+
+ This method constructs two analog tallies to compute the 'flux'
+ and 'nu-scatter' reaction rates in the spatial domain and energy
+ groups of interest.
+
+ """
+
+ # Instantiate tallies if they do not exist
+ if super(NuScatterXS, self).tallies is None:
+
+ # Create a list of scores for each Tally to be created
+ scores = ['flux', 'nu-scatter']
+ estimator = 'analog'
+ keys = scores
+
+ # Create the non-domain specific Filters for the Tallies
+ group_edges = self.energy_groups.group_edges
+ energy_filter = openmc.Filter('energy', group_edges)
+ filters = [[energy_filter], [energy_filter]]
+
+ # Initialize the Tallies
+ super(NuScatterXS, self).create_tallies(scores, filters,
+ keys, estimator)
+
+ return super(NuScatterXS, self).tallies
+
+ def compute_xs(self):
+ """Computes the nu-scattering multi-group cross section using OpenMC
+ tally arithmetic."""
+
+ self._xs_tally = self.tallies['nu-scatter'] / self.tallies['flux']
+ super(NuScatterXS, self).compute_xs()
+
+
+class ScatterMatrixXS(MGXS):
+ """A scattering matrix multi-group cross section.
+
+ Attributes
+ ----------
+ correction : 'P0' or None
+ Apply the P0 correction to scattering matrices if set to 'P0'
+
+ """
+
+ def __init__(self, domain=None, domain_type=None,
+ groups=None, by_nuclide=False, name=''):
+ super(ScatterMatrixXS, self).__init__(domain, domain_type,
+ groups, by_nuclide, name)
+ self._rxn_type = 'scatter matrix'
+ self._correction = 'P0'
+
+ def __deepcopy__(self, memo):
+ clone = super(ScatterMatrixXS, self).__deepcopy__(memo)
+ clone._correction = self.correction
+ return clone
+
+ @property
+ def correction(self):
+ return self._correction
+
+ @property
+ def tallies(self):
+ """Construct the OpenMC tallies needed to compute this cross section.
+
+ This method constructs three analog tallies to compute the 'flux',
+ 'scatter' and 'scatter-P1' reaction rates in the spatial domain and
+ energy groups of interest.
+
+ """
+
+ # Instantiate tallies if they do not exist
+ if super(ScatterMatrixXS, self).tallies is None:
+
+ group_edges = self.energy_groups.group_edges
+ energy = openmc.Filter('energy', group_edges)
+ energyout = openmc.Filter('energyout', group_edges)
+
+ # Create a list of scores for each Tally to be created
+ if self.correction == 'P0':
+ scores = ['flux', 'scatter', 'scatter-P1']
+ filters = [[energy], [energy, energyout], [energyout]]
+ else:
+ scores = ['flux', 'scatter']
+ filters = [[energy], [energy, energyout]]
+
+ estimator = 'analog'
+ keys = scores
+
+ # Initialize the Tallies
+ super(ScatterMatrixXS, self).create_tallies(scores, filters,
+ keys, estimator)
+
+ return super(ScatterMatrixXS, self).tallies
+
+ @correction.setter
+ def correction(self, correction):
+ cv.check_value('correction', correction, ('P0', None))
+ self._correction = correction
+
+ def compute_xs(self):
+ """Computes the multi-group scattering matrix using OpenMC
+ tally arithmetic."""
+
+ # If using P0 correction subtract scatter-P1 from the diagonal
+ if self.correction == 'P0':
+ scatter_p1 = self.tallies['scatter-P1']
+ scatter_p1 = scatter_p1.get_slice(scores=['scatter-P1'])
+ energy_filter = openmc.Filter(type='energy')
+ energy_filter.bins = self.energy_groups.group_edges
+ scatter_p1 = scatter_p1.diagonalize_filter(energy_filter)
+ rxn_tally = self.tallies['scatter'] - scatter_p1
+ else:
+ rxn_tally = self.tallies['scatter']
+
+ self._xs_tally = rxn_tally / self.tallies['flux']
+ super(ScatterMatrixXS, self).compute_xs()
+
+ def get_xs(self, in_groups='all', out_groups='all',
+ subdomains='all', nuclides='all', xs_type='macro',
+ order_groups='increasing', value='mean'):
+ """Returns an array of multi-group cross sections.
+
+ This method constructs a 2D NumPy array for the requested scattering
+ matrix data data for one or more energy groups and subdomains.
+
+ Parameters
+ ----------
+ in_groups : Iterable of Integral or 'all'
+ Incoming energy groups of interest. Defaults to 'all'.
+ out_groups : Iterable of Integral or 'all'
+ Outgoing energy groups of interest. Defaults to 'all'.
+ subdomains : Iterable of Integral or 'all'
+ Subdomain IDs of interest. Defaults to 'all'.
+ nuclides : Iterable of str or 'all' or 'sum'
+ A list of nuclide name strings (e.g., ['U-235', 'U-238']). The
+ special string 'all' will return the cross sections for all nuclides
+ in the spatial domain. The special string 'sum' will return the
+ cross section summed over all nuclides. Defaults to 'all'.
+ xs_type: {'macro', 'micro'}
+ Return the macro or micro cross section in units of cm^-1 or barns.
+ Defaults to 'macro'.
+ order_groups: {'increasing', 'decreasing'}
+ Return the cross section indexed according to increasing or
+ decreasing energy groups (decreasing or increasing energies).
+ Defaults to 'increasing'.
+ value : str
+ A string for the type of value to return - 'mean', 'std_dev', or
+ 'rel_err' are accepted. Defaults to the empty string.
+
+ Returns
+ -------
+ ndarray
+ A NumPy array of the multi-group cross section indexed in the order
+ each group and subdomain is listed in the parameters.
+
+ Raises
+ ------
+ ValueError
+ When this method is called before the multi-group cross section is
+ computed from tally data.
+
+ """
+
+ if self.xs_tally is None:
+ msg = 'Unable to get cross section since it has not been computed'
+ raise ValueError(msg)
+
+ cv.check_value('value', value, ['mean', 'std_dev', 'rel_err'])
+ cv.check_value('xs_type', xs_type, ['macro', 'micro'])
+
+ filters = []
+ filter_bins = []
+
+ # Construct a collection of the domain filter bins
+ if subdomains != 'all':
+ cv.check_iterable_type('subdomains', subdomains, Integral)
+ for subdomain in subdomains:
+ filters.append(self.domain_type)
+ filter_bins.append((subdomain,))
+
+ # Construct list of energy group bounds tuples for all requested groups
+ if in_groups != 'all':
+ cv.check_iterable_type('groups', in_groups, Integral)
+ for group in in_groups:
+ filters.append('energy')
+ filter_bins.append((self.energy_groups.get_group_bounds(group),))
+
+ # Construct list of energy group bounds tuples for all requested groups
+ if out_groups != 'all':
+ cv.check_iterable_type('groups', out_groups, Integral)
+ for group in out_groups:
+ filters.append('energyout')
+ filter_bins.append((self.energy_groups.get_group_bounds(group),))
+
+ # Construct a collection of the nuclides to retrieve from the xs tally
+ if self.by_nuclide:
+ if nuclides == 'all' or nuclides == 'sum' or nuclides == ['sum']:
+ query_nuclides = self.get_all_nuclides()
+ else:
+ query_nuclides = nuclides
+ else:
+ query_nuclides = ['total']
+
+ # Use tally summation if user requested the sum for all nuclides
+ if nuclides == 'sum' or nuclides == ['sum']:
+ xs_tally = self.xs_tally.summation(nuclides=query_nuclides)
+ xs = xs_tally.get_values(filters=filters,
+ filter_bins=filter_bins, value=value)
+ else:
+ xs = self.xs_tally.get_values(filters=filters,
+ filter_bins=filter_bins,
+ nuclides=query_nuclides, value=value)
+
+ xs = np.nan_to_num(xs)
+
+ # Divide by atom number densities for microscopic cross sections
+ if xs_type == 'micro':
+ if self.by_nuclide:
+ densities = self.get_nuclide_densities(nuclides)
+ else:
+ densities = self.get_nuclide_densities('sum')
+ if value == 'mean' or value == 'std_dev':
+ xs /= densities[np.newaxis, :, np.newaxis]
+
+ # Reverse data if user requested increasing energy groups since
+ # tally data is stored in order of increasing energies
+ if order_groups == 'increasing':
+ if in_groups == 'all':
+ num_in_groups = self.num_groups
+ else:
+ num_in_groups = len(in_groups)
+ if out_groups == 'all':
+ num_out_groups = self.num_groups
+ else:
+ num_out_groups = len(out_groups)
+
+ # Reshape tally data array with separate axes for domain and energy
+ num_subdomains = xs.shape[0] / (num_in_groups * num_out_groups)
+ new_shape = (num_subdomains, num_in_groups, num_out_groups)
+ new_shape += xs.shape[1:]
+ xs = np.reshape(xs, new_shape)
+
+ # Reverse energies to align with increasing energy groups
+ xs = xs[:, ::-1, ::-1, :]
+
+ # Eliminate trivial dimensions
+ xs = np.squeeze(xs)
+ xs = np.atleast_2d(xs)
+
+ return xs
+
+ def print_xs(self, subdomains='all', nuclides='all', xs_type='macro'):
+ """Prints a string representation for the multi-group cross section.
+
+ Parameters
+ ----------
+ subdomains : Iterable of Integral or 'all'
+ The subdomain IDs of the cross sections to include in the report.
+ Defaults to 'all'.
+ nuclides : Iterable of str or 'all' or 'sum'
+ The nuclides of the cross-sections to include in the report. This
+ may be a list of nuclide name strings (e.g., ['U-235', 'U-238']).
+ The special string 'all' will report the cross sections for all
+ nuclides in the spatial domain. The special string 'sum' will report
+ the cross sections summed over all nuclides. Defaults to 'all'.
+ xs_type: {'macro', 'micro'}
+ Return the macro or micro cross section in units of cm^-1 or barns.
+ Defaults to 'macro'.
+
+ """
+
+ # Construct a collection of the subdomains to report
+ if subdomains != 'all':
+ cv.check_iterable_type('subdomains', subdomains, Integral)
+ elif self.domain_type == 'distribcell':
+ subdomains = np.arange(self.num_subdomains, dtype=np.int)
+ else:
+ subdomains = [self.domain.id]
+
+ # Construct a collection of the nuclides to report
+ if self.by_nuclide:
+ if nuclides == 'all':
+ nuclides = self.get_all_nuclides()
+ if nuclides == 'sum':
+ nuclides = ['sum']
+ else:
+ cv.check_iterable_type('nuclides', nuclides, basestring)
+ else:
+ nuclides = ['sum']
+
+ cv.check_value('xs_type', xs_type, ['macro', 'micro'])
+
+ # Build header for string with type and domain info
+ string = 'Multi-Group XS\n'
+ string += '{0: <16}=\t{1}\n'.format('\tReaction Type', self.rxn_type)
+ string += '{0: <16}=\t{1}\n'.format('\tDomain Type', self.domain_type)
+ string += '{0: <16}=\t{1}\n'.format('\tDomain ID', self.domain.id)
+
+ # If cross section data has not been computed, only print string header
+ if self.xs_tally is None:
+ print(string)
+ return
+
+ string += '{0: <16}\n'.format('\tEnergy Groups:')
+ template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]\n'
+
+ # Loop over energy groups ranges
+ for group in range(1, self.num_groups+1):
+ bounds = self.energy_groups.get_group_bounds(group)
+ string += template.format('', group, bounds[0], bounds[1])
+
+ if subdomains == 'all':
+ if self.domain_type == 'distribcell':
+ subdomains = np.arange(self.num_subdomains, dtype=np.int)
+ else:
+ subdomains = [self.domain.id]
+
+ # Loop over all subdomains
+ for subdomain in subdomains:
+
+ if self.domain_type == 'distribcell':
+ string += \
+ '{0: <16}=\t{1}\n'.format('\tSubdomain', subdomain)
+
+ # Loop over all Nuclides
+ for nuclide in nuclides:
+
+ # Build header for nuclide type
+ if xs_type != 'sum':
+ string += '{0: <16}=\t{1}\n'.format('\tNuclide', nuclide)
+
+ # Build header for cross section type
+ if xs_type == 'macro':
+ string += '{0: <16}\n'.format('\tCross Sections [cm^-1]:')
+ else:
+ string += '{0: <16}\n'.format('\tCross Sections [barns]:')
+
+ template = '{0: <12}Group {1} -> Group {2}:\t\t'
+
+ # Loop over incoming/outgoing energy groups ranges
+ for in_group in range(1, self.num_groups+1):
+ for out_group in range(1, self.num_groups+1):
+ string += template.format('', in_group, out_group)
+ average = \
+ self.get_xs([in_group], [out_group],
+ [subdomain], [nuclide],
+ xs_type=xs_type, value='mean')
+ rel_err = \
+ self.get_xs([in_group], [out_group],
+ [subdomain], [nuclide],
+ xs_type=xs_type, value='rel_err')
+ average = average.flatten()[0]
+ rel_err = rel_err.flatten()[0] * 100.
+ string += '{:1.2e} +/- {:1.2e}%'.format(average, rel_err)
+ string += '\n'
+ string += '\n'
+ string += '\n'
+ string += '\n'
+
+ print(string)
+
+
+class NuScatterMatrixXS(ScatterMatrixXS):
+ """A scattering production matrix multi-group cross section."""
+
+ def __init__(self, domain=None, domain_type=None,
+ groups=None, by_nuclide=False, name=''):
+ super(NuScatterMatrixXS, self).__init__(domain, domain_type,
+ groups, by_nuclide, name)
+ self._rxn_type = 'nu-scatter matrix'
+
+ @property
+ def tallies(self):
+ """Construct the OpenMC tallies needed to compute this cross section.
+
+ This method constructs three analog tallies to compute the 'flux',
+ 'nu-scatter' and 'scatter-P1' reaction rates in the spatial domain and
+ energy groups of interest.
+
+ """
+
+ # Instantiate tallies if they do not exist
+ if super(NuScatterMatrixXS, self).tallies is None:
+
+ # Create the non-domain specific Filters for the Tallies
+ group_edges = self.energy_groups.group_edges
+ energy = openmc.Filter('energy', group_edges)
+ energyout = openmc.Filter('energyout', group_edges)
+
+ # Create a list of scores for each Tally to be created
+ if self.correction == 'P0':
+ scores = ['flux', 'nu-scatter', 'scatter-P1']
+ estimator = 'analog'
+ keys = ['flux', 'scatter', 'scatter-P1']
+ filters = [[energy], [energy, energyout], [energyout]]
+ else:
+ scores = ['flux', 'nu-scatter']
+ estimator = 'analog'
+ keys = ['flux', 'scatter']
+ filters = [[energy], [energy, energyout]]
+
+ # Intialize the Tallies
+ super(ScatterMatrixXS, self).create_tallies(scores, filters,
+ keys, estimator)
+
+ return super(ScatterMatrixXS, self).tallies
+
+class Chi(MGXS):
+ """The fission spectrum."""
+
+ def __init__(self, domain=None, domain_type=None,
+ groups=None, by_nuclide=False, name=''):
+ super(Chi, self).__init__(domain, domain_type, groups, by_nuclide, name)
+ self._rxn_type = 'chi'
+
+ @property
+ def tallies(self):
+ """Construct the OpenMC tallies needed to compute this cross section.
+
+ This method constructs two analog tallies to compute 'nu-fission'
+ reaction rates with 'energy' and 'energyout' filters in the spatial
+ domain and energy groups of interest.
+
+ """
+
+ # Instantiate tallies if they do not exist
+ if super(Chi, self).tallies is None:
+
+ # Create a list of scores for each Tally to be created
+ scores = ['nu-fission', 'nu-fission']
+ estimator = 'analog'
+ keys = ['nu-fission-in', 'nu-fission-out']
+
+ # Create the non-domain specific Filters for the Tallies
+ group_edges = self.energy_groups.group_edges
+ energyout = openmc.Filter('energyout', group_edges)
+ energyin = openmc.Filter('energy', [group_edges[0], group_edges[-1]])
+ filters = [[energyin], [energyout]]
+
+ # Intialize the Tallies
+ super(Chi, self).create_tallies(scores, filters, keys, estimator)
+
+ return super(Chi, self).tallies
+
+ def compute_xs(self):
+ """Computes chi fission spectrum using OpenMC tally arithmetic."""
+
+ # Retrieve the fission production tallies
+ nu_fission_in = self.tallies['nu-fission-in']
+ nu_fission_out = self.tallies['nu-fission-out']
+
+ # Remove coarse energy filter to keep it out of tally arithmetic
+ energy_filter = nu_fission_in.find_filter('energy')
+ nu_fission_in.remove_filter(energy_filter)
+
+ # Compute chi
+ self._xs_tally = nu_fission_out / nu_fission_in
+
+ # Add the coarse energy filter back to the nu-fission tally
+ nu_fission_in.add_filter(energy_filter)
+
+ super(Chi, self).compute_xs()
+
+ def get_xs(self, groups='all', subdomains='all', nuclides='all',
+ xs_type='macro', order_groups='increasing', value='mean'):
+ """Returns an array of the fission spectrum.
+
+ This method constructs a 2D NumPy array for the requested multi-group
+ cross section data data for one or more energy groups and subdomains.
+
+ Parameters
+ ----------
+ groups : Iterable of Integral or 'all'
+ Energy groups of interest. Defaults to 'all'.
+ subdomains : Iterable of Integral or 'all'
+ Subdomain IDs of interest. Defaults to 'all'.
+ nuclides : Iterable of str or 'all' or 'sum'
+ A list of nuclide name strings (e.g., ['U-235', 'U-238']). The
+ special string 'all' will return the cross sections for all nuclides
+ in the spatial domain. The special string 'sum' will return the
+ cross section summed over all nuclides. Defaults to 'all'.
+ xs_type: {'macro', 'micro'}
+ This parameter is not relevant for chi but is included here to
+ mirror the parent MGXS.get_xs(...) class method
+ order_groups: {'increasing', 'decreasing'}
+ Return the cross section indexed according to increasing or
+ decreasing energy groups (decreasing or increasing energies).
+ Defaults to 'increasing'.
+ value : str
+ A string for the type of value to return - 'mean', 'std_dev', or
+ 'rel_err' are accepted. Defaults to 'mean'.
+
+ Returns
+ -------
+ ndarray
+ A NumPy array of the multi-group cross section indexed in the order
+ each group, subdomain and nuclide is listed in the parameters.
+
+ Raises
+ ------
+ ValueError
+ When this method is called before the multi-group cross section is
+ computed from tally data.
+
+ """
+
+ if self.xs_tally is None:
+ msg = 'Unable to get cross section since it has not been computed'
+ raise ValueError(msg)
+
+ cv.check_value('value', value, ['mean', 'std_dev', 'rel_err'])
+ cv.check_value('xs_type', xs_type, ['macro', 'micro'])
+
+ filters = []
+ filter_bins = []
+
+ # Construct a collection of the domain filter bins
+ if subdomains != 'all':
+ cv.check_iterable_type('subdomains', subdomains, Integral)
+ for subdomain in subdomains:
+ filters.append(self.domain_type)
+ filter_bins.append((subdomain,))
+
+ # Construct list of energy group bounds tuples for all requested groups
+ if groups != 'all':
+ cv.check_iterable_type('groups', groups, Integral)
+ for group in groups:
+ filters.append('energyout')
+ filter_bins.append((self.energy_groups.get_group_bounds(group),))
+
+ # If chi was computed for each nuclide in the domain
+ if self.by_nuclide:
+
+ # Get the sum as the fission source weighted average chi for all
+ # nuclides in the domain
+ if nuclides == 'sum' or nuclides == ['sum']:
+
+ # Retrieve the fission production tallies
+ nu_fission_in = self.tallies['nu-fission-in']
+ nu_fission_out = self.tallies['nu-fission-out']
+
+ # Sum out all nuclides
+ nuclides = self.get_all_nuclides()
+ nu_fission_in = nu_fission_in.summation(nuclides=nuclides)
+ nu_fission_out = nu_fission_out.summation(nuclides=nuclides)
+
+ # Remove coarse energy filter to keep it out of tally arithmetic
+ energy_filter = nu_fission_in.find_filter('energy')
+ nu_fission_in.remove_filter(energy_filter)
+
+ # Compute chi and store it as the xs_tally attribute so we can
+ # use the generic get_xs(...) method
+ xs_tally = nu_fission_out / nu_fission_in
+
+ # Add the coarse energy filter back to the nu-fission tally
+ nu_fission_in.add_filter(energy_filter)
+
+ xs = xs_tally.get_values(filters=filters,
+ filter_bins=filter_bins, value=value)
+
+ # Get chi for all nuclides in the domain
+ elif nuclides == 'all':
+ nuclides = self.get_all_nuclides()
+ xs = self.xs_tally.get_values(filters=filters,
+ filter_bins=filter_bins,
+ nuclides=nuclides, value=value)
+
+ # Get chi for user-specified nuclides in the domain
+ else:
+ cv.check_iterable_type('nuclides', nuclides, basestring)
+ xs = self.xs_tally.get_values(filters=filters,
+ filter_bins=filter_bins,
+ nuclides=nuclides, value=value)
+
+ # If chi was computed as an average of nuclides in the domain
+ else:
+ xs = self.xs_tally.get_values(filters=filters,
+ filter_bins=filter_bins, value=value)
+
+ # Reverse data if user requested increasing energy groups since
+ # tally data is stored in order of increasing energies
+ if order_groups == 'increasing':
+
+ # Reshape tally data array with separate axes for domain and energy
+ if groups == 'all':
+ num_groups = self.num_groups
+ else:
+ num_groups = len(groups)
+ num_subdomains = xs.shape[0] / num_groups
+ new_shape = (num_subdomains, num_groups) + xs.shape[1:]
+ xs = np.reshape(xs, new_shape)
+
+ # Reverse energies to align with increasing energy groups
+ xs = xs[:, ::-1, :]
+
+ # Eliminate trivial dimensions
+ xs = np.squeeze(xs)
+ xs = np.atleast_1d(xs)
+
+ xs = np.nan_to_num(xs)
+ return xs
+
+ def get_pandas_dataframe(self, groups='all', nuclides='all',
+ xs_type='macro', summary=None):
+ """Build a Pandas DataFrame for the MGXS data.
+
+ This method leverages the Tally.get_pandas_dataframe(...) method, but
+ renames the columns with terminology appropriate for cross section data.
+
+ Parameters
+ ----------
+ groups : Iterable of Integral or 'all'
+ Energy groups of interest. Defaults to 'all'.
+ nuclides : Iterable of str or 'all' or 'sum'
+ The nuclides of the cross-sections to include in the dataframe. This
+ may be a list of nuclide name strings (e.g., ['U-235', 'U-238']).
+ The special string 'all' will include the cross sections for all
+ nuclides in the spatial domain. The special string 'sum' will
+ include the cross sections summed over all nuclides. Defaults to
+ 'all'.
+ xs_type: {'macro', 'micro'}
+ Return macro or micro cross section in units of cm^-1 or barns.
+ Defaults to 'macro'.
+ summary : None or Summary
+ An optional Summary object to be used to construct columns for
+ distribcell tally filters (default is None). The geometric
+ information in the Summary object is embedded into a multi-index
+ column with a geometric "path" to each distribcell intance.
+ NOTE: This option requires the OpenCG Python package.
+
+ Returns
+ -------
+ pandas.DataFrame
+ A Pandas DataFrame for the cross section data.
+
+ Raises
+ ------
+ ValueError
+ When this method is called before the multi-group cross section is
+ computed from tally data.
+
+ """
+
+ # Build the dataframe using the parent class method
+ df = super(Chi, self).get_pandas_dataframe(groups, nuclides,
+ xs_type, summary)
+
+ # If user requested micro cross sections, multiply by the atom
+ # densities to cancel out division made by the parent class method
+ if xs_type == 'micro':
+ if self.by_nuclide:
+ densities = self.get_nuclide_densities(nuclides)
+ else:
+ densities = self.get_nuclide_densities('sum')
+ tile_factor = df.shape[0] / len(densities)
+ df['mean'] *= np.tile(densities, tile_factor)
+ df['std. dev.'] *= np.tile(densities, tile_factor)
+
+ return df
diff --git a/openmc/nuclide.py b/openmc/nuclide.py
index 7e7cd5af3..f24e62a48 100644
--- a/openmc/nuclide.py
+++ b/openmc/nuclide.py
@@ -41,25 +41,32 @@ class Nuclide(object):
if xs is not None:
self.xs = xs
- def __eq__(self, nuclide2):
- # Check type
- if not isinstance(nuclide2, Nuclide):
- return False
-
- # Check name
- elif self._name != nuclide2._name:
- return False
-
- # Check xs
- elif self._xs != nuclide2._xs:
- return False
-
- else:
+ def __eq__(self, other):
+ if isinstance(other, Nuclide):
+ if self._name != other._name:
+ return False
+ elif self._xs != other._xs:
+ return False
+ else:
+ return True
+ elif isinstance(other, basestring) and other == self.name:
return True
+ else:
+ return False
+
+ def __ne__(self, other):
+ return not self == other
def __hash__(self):
return hash((self._name, self._xs))
+ def __repr__(self):
+ string = 'Nuclide - {0}\n'.format(self._name)
+ string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs)
+ if self._zaid is not None:
+ string += '{0: <16}{1}{2}\n'.format('\tZAID', '=\t', self._zaid)
+ return string
+
@property
def name(self):
return self._name
@@ -85,11 +92,4 @@ class Nuclide(object):
@zaid.setter
def zaid(self, zaid):
check_type('zaid', zaid, Integral)
- self._zaid = zaid
-
- def __repr__(self):
- string = 'Nuclide - {0}\n'.format(self._name)
- string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs)
- if self._zaid is not None:
- string += '{0: <16}{1}{2}\n'.format('\tZAID', '=\t', self._zaid)
- return string
+ self._zaid = zaid
\ No newline at end of file
diff --git a/openmc/plots.py b/openmc/plots.py
index 66419a6ff..6cff095ec 100644
--- a/openmc/plots.py
+++ b/openmc/plots.py
@@ -144,7 +144,7 @@ class Plot(object):
AUTO_PLOT_ID += 1
else:
check_type('plot ID', plot_id, Integral)
- check_greater_than('plot ID', plot_id, 0)
+ check_greater_than('plot ID', plot_id, 0, equality=True)
self._id = plot_id
@name.setter
@@ -363,6 +363,9 @@ class PlotsFile(object):
"""
+ # Reset xml element tree
+ self._plots_file.clear()
+
self._create_plot_subelements()
# Clean the indentation in the file to be user-readable
diff --git a/openmc/region.py b/openmc/region.py
index 5baac22dd..f8f3a7378 100644
--- a/openmc/region.py
+++ b/openmc/region.py
@@ -213,6 +213,9 @@ class Intersection(Region):
def __init__(self, *nodes):
self.nodes = list(nodes)
+ def __str__(self):
+ return '(' + ' '.join(map(str, self.nodes)) + ')'
+
@property
def nodes(self):
return self._nodes
@@ -222,9 +225,6 @@ class Intersection(Region):
check_type('nodes', nodes, Iterable, Region)
self._nodes = nodes
- def __str__(self):
- return '(' + ' '.join(map(str, self.nodes)) + ')'
-
class Union(Region):
"""Union of two or more regions.
@@ -252,6 +252,9 @@ class Union(Region):
def __init__(self, *nodes):
self.nodes = list(nodes)
+ def __str__(self):
+ return '(' + ' | '.join(map(str, self.nodes)) + ')'
+
@property
def nodes(self):
return self._nodes
@@ -261,9 +264,6 @@ class Union(Region):
check_type('nodes', nodes, Iterable, Region)
self._nodes = nodes
- def __str__(self):
- return '(' + ' | '.join(map(str, self.nodes)) + ')'
-
class Complement(Region):
"""Complement of a region.
@@ -295,6 +295,9 @@ class Complement(Region):
def __init__(self, node):
self.node = node
+ def __str__(self):
+ return '~' + str(self.node)
+
@property
def node(self):
return self._node
@@ -303,6 +306,3 @@ class Complement(Region):
def node(self, node):
check_type('node', node, Region)
self._node = node
-
- def __str__(self):
- return '~' + str(self.node)
diff --git a/openmc/settings.py b/openmc/settings.py
index 981166af5..519b5c7cf 100644
--- a/openmc/settings.py
+++ b/openmc/settings.py
@@ -1178,6 +1178,13 @@ class SettingsFile(object):
"""
+ # Reset xml element tree
+ self._settings_file.clear()
+ self._source_subelement = None
+ self._trigger_subelement = None
+ self._eigenvalue_subelement = None
+ self._source_element = None
+
self._create_eigenvalue_subelement()
self._create_source_subelement()
self._create_output_subelement()
diff --git a/openmc/statepoint.py b/openmc/statepoint.py
index e64693746..2edf9badd 100644
--- a/openmc/statepoint.py
+++ b/openmc/statepoint.py
@@ -1,4 +1,3 @@
-import copy
import sys
import re
import numpy as np
@@ -33,42 +32,42 @@ class StatePoint(object):
each batch
cmfd_src : ndarray
CMFD fission source distribution over all mesh cells and energy groups.
- current_batch : int
+ current_batch : Integral
Number of batches simulated
date_and_time : str
Date and time when simulation began
entropy : ndarray
Shannon entropy of fission source at each batch
- gen_per_batch : int
+ gen_per_batch : Integral
Number of fission generations per batch
global_tallies : ndarray of compound datatype
Global tallies for k-effective estimates and leakage. The compound
datatype has fields 'name', 'sum', 'sum_sq', 'mean', and 'std_dev'.
k_combined : list
Combined estimator for k-effective and its uncertainty
- k_col_abs : float
+ k_col_abs : Real
Cross-product of collision and absorption estimates of k-effective
- k_col_tra : float
+ k_col_tra : Real
Cross-product of collision and tracklength estimates of k-effective
- k_abs_tra : float
+ k_abs_tra : Real
Cross-product of absorption and tracklength estimates of k-effective
k_generation : ndarray
Estimate of k-effective for each batch/generation
meshes : dict
Dictionary whose keys are mesh IDs and whose values are Mesh objects
- n_batches : int
+ n_batches : Integral
Number of batches
- n_inactive : int
+ n_inactive : Integral
Number of inactive batches
- n_particles : int
+ n_particles : Integral
Number of particles per generation
- n_realizations : int
+ n_realizations : Integral
Number of tally realizations
path : str
Working directory for simulation
run_mode : str
Simulation run mode, e.g. 'k-eigenvalue'
- seed : int
+ seed : Integral
Pseudorandom number generator seed
source : ndarray of compound datatype
Array of source sites. The compound datatype has fields 'wgt', 'xyz',
@@ -80,10 +79,10 @@ class StatePoint(object):
Dictionary whose keys are tally IDs and whose values are Tally objects
tallies_present : bool
Indicate whether user-defined tallies are present
- version: tuple of int
+ version: tuple of Integral
Version of OpenMC
- with_summary : bool
- Indicate whether statepoint data has been linked against a summary file
+ summary : None or openmc.summary.Summary
+ A summary object if the statepoint has been linked with a summary file
"""
@@ -109,7 +108,7 @@ class StatePoint(object):
# Set flags for what data has been read
self._meshes_read = False
self._tallies_read = False
- self._with_summary = False
+ self._summary = False
self._global_tallies = None
def close(self):
@@ -121,31 +120,19 @@ class StatePoint(object):
@property
def cmfd_balance(self):
- if self.cmfd_on:
- return self._f['cmfd/cmfd_balance'].value
- else:
- return None
+ return self._f['cmfd/cmfd_balance'].value if self.cmfd_on else None
@property
def cmfd_dominance(self):
- if self.cmfd_on:
- return self._f['cmfd/cmfd_dominance'].value
- else:
- return None
+ return self._f['cmfd/cmfd_dominance'].value if self.cmfd_on else None
@property
def cmfd_entropy(self):
- if self.cmfd_on:
- return self._f['cmfd/cmfd_entropy'].value
- else:
- return None
+ return self._f['cmfd/cmfd_entropy'].value if self.cmfd_on else None
@property
def cmfd_indices(self):
- if self.cmfd_on:
- return self._f['cmfd/indices'].value
- else:
- return None
+ return self._f['cmfd/indices'].value if self.cmfd_on else None
@property
def cmfd_src(self):
@@ -157,10 +144,7 @@ class StatePoint(object):
@property
def cmfd_srccmp(self):
- if self.cmfd_on:
- return self._f['cmfd/cmfd_srccmp'].value
- else:
- return None
+ return self._f['cmfd/cmfd_srccmp'].value if self.cmfd_on else None
@property
def current_batch(self):
@@ -328,10 +312,7 @@ class StatePoint(object):
@property
def source(self):
- if self.source_present:
- return self._f['source_bank'].value
- else:
- return None
+ return self._f['source_bank'].value if self.source_present else None
@property
def source_present(self):
@@ -459,16 +440,20 @@ class StatePoint(object):
self._f['version_minor'].value,
self._f['version_release'].value)
+ @property
+ def summary(self):
+ return self._summary
+
@property
def with_summary(self):
- return self._with_summary
+ return False if self.summary is None else True
def get_tally(self, scores=[], filters=[], nuclides=[],
name=None, id=None, estimator=None):
"""Finds and returns a Tally object with certain properties.
This routine searches the list of Tallies and returns the first Tally
- found it finds which satisfies all of the input parameters.
+ found which satisfies all of the input parameters.
NOTE: The input parameters do not need to match the complete Tally
specification and may only represent a subset of the Tally's properties.
@@ -482,7 +467,7 @@ class StatePoint(object):
A list of Nuclide objects (default is []).
name : str, optional
The name specified for the Tally (default is None).
- id : int, optional
+ id : Integral, optional
The id specified for the Tally (default is None).
estimator: str, optional
The type of estimator ('tracklength', 'analog'; default is None).
@@ -536,8 +521,16 @@ class StatePoint(object):
# Iterate over the Filters requested by the user
for filter in filters:
- if filter not in test_tally.filters:
- contains_filters = False
+ contains_filters = False
+
+ # Test if requested filter is a subset of any of the test
+ # tally's filters and if so continue to next filter
+ for test_filter in test_tally.filters:
+ if test_filter.is_subset(filter):
+ contains_filters = True
+ break
+
+ if not contains_filters:
break
if not contains_filters:
@@ -624,4 +617,4 @@ class StatePoint(object):
material_ids.append(summary.materials[bin].id)
filter.bins = material_ids
- self._with_summary = True
+ self._summary = summary
diff --git a/openmc/summary.py b/openmc/summary.py
index 2c704557c..b38e6d759 100644
--- a/openmc/summary.py
+++ b/openmc/summary.py
@@ -83,9 +83,8 @@ class Summary(object):
name, xs = sab_table.decode().split('.')
material.add_s_alpha_beta(name, xs)
- # Set the Material's density to g/cm3 - this is what is used in
- # OpenMC
- material.set_density(density=density, units='g/cm3')
+ # Set the Material's density to atom/b-cm as used by OpenMC
+ material.set_density(density=density, units='atom/b-cm')
# Add all nuclides to the Material
for fullname, density in zip(nuclides, nuc_densities):
diff --git a/openmc/surface.py b/openmc/surface.py
index 92f047b66..ed446c374 100644
--- a/openmc/surface.py
+++ b/openmc/surface.py
@@ -75,6 +75,22 @@ class Surface(object):
def __pos__(self):
return Halfspace(self, '+')
+ def __repr__(self):
+ string = 'Surface\n'
+ string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id)
+ string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name)
+ string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self._type)
+ string += '{0: <16}{1}{2}\n'.format('\tBoundary', '=\t', self._boundary_type)
+
+ coeffs = '{0: <16}'.format('\tCoefficients') + '\n'
+
+ for coeff in self._coeffs:
+ coeffs += '{0: <16}{1}{2}\n'.format(coeff, '=\t', self._coeffs[coeff])
+
+ string += coeffs
+
+ return string
+
@property
def id(self):
return self._id
@@ -103,7 +119,7 @@ class Surface(object):
AUTO_SURFACE_ID += 1
else:
check_type('surface ID', surface_id, Integral)
- check_greater_than('surface ID', surface_id, 0)
+ check_greater_than('surface ID', surface_id, 0, equality=True)
self._id = surface_id
@name.setter
@@ -120,22 +136,6 @@ class Surface(object):
check_value('boundary type', boundary_type, _BC_TYPES)
self._boundary_type = boundary_type
- def __repr__(self):
- string = 'Surface\n'
- string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id)
- string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name)
- string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self._type)
- string += '{0: <16}{1}{2}\n'.format('\tBoundary', '=\t', self._boundary_type)
-
- coeffs = '{0: <16}'.format('\tCoefficients') + '\n'
-
- for coeff in self._coeffs:
- coeffs += '{0: <16}{1}{2}\n'.format(coeff, '=\t', self._coeffs[coeff])
-
- string += coeffs
-
- return string
-
def create_xml_subelement(self):
element = ET.Element("surface")
element.set("id", str(self._id))
diff --git a/openmc/tallies.py b/openmc/tallies.py
index a70cba580..c9e4854e2 100644
--- a/openmc/tallies.py
+++ b/openmc/tallies.py
@@ -1,4 +1,6 @@
-from collections import Iterable
+from __future__ import division
+
+from collections import Iterable, defaultdict
import copy
import os
import pickle
@@ -11,8 +13,8 @@ import numpy as np
from openmc import Mesh, Filter, Trigger, Nuclide
from openmc.cross import CrossScore, CrossNuclide, CrossFilter
-from openmc.summary import Summary
-from openmc.checkvalue import check_type, check_value, check_greater_than
+from openmc.filter import _FILTER_TYPES
+import openmc.checkvalue as cv
from openmc.clean_xml import *
@@ -34,7 +36,7 @@ class Tally(object):
Parameters
----------
- tally_id : int, optional
+ tally_id : Integral, optional
Unique identifier for the tally. If none is specified, an identifier
will automatically be assigned
name : str, optional
@@ -42,7 +44,7 @@ class Tally(object):
Attributes
----------
- id : int
+ id : Integral
Unique identifier for the tally
name : str
Name of the tally
@@ -56,17 +58,17 @@ class Tally(object):
Type of estimator for the tally
triggers : list of openmc.trigger.Trigger
List of tally triggers
- num_score_bins : int
+ num_score_bins : Integral
Total number of scores, accounting for the fact that a single
user-specified score, e.g. scatter-P3 or flux-Y2,2, might have multiple
bins
- num_scores : int
+ num_scores : Integral
Total number of user-specified scores
- num_filter_bins : int
+ num_filter_bins : Integral
Total number of filter bins accounting for all filters
- num_bins : int
+ num_bins : Integral
Total number of bins for the tally
- num_realizations : int
+ num_realizations : Integral
Total number of realizations
with_summary : bool
Whether or not a Summary has been linked
@@ -117,10 +119,10 @@ class Tally(object):
clone.estimator = self.estimator
clone.num_score_bins = self.num_score_bins
clone.num_realizations = self.num_realizations
- clone._sum = copy.deepcopy(self.sum, memo)
- clone._sum_sq = copy.deepcopy(self.sum_sq, memo)
- clone._mean = copy.deepcopy(self.mean, memo)
- clone._std_dev = copy.deepcopy(self.std_dev, memo)
+ clone._sum = copy.deepcopy(self._sum, memo)
+ clone._sum_sq = copy.deepcopy(self._sum_sq, memo)
+ clone._mean = copy.deepcopy(self._mean, memo)
+ clone._std_dev = copy.deepcopy(self._std_dev, memo)
clone._with_summary = self.with_summary
clone._with_batch_statistics = self.with_batch_statistics
clone._derived = self.derived
@@ -151,36 +153,42 @@ class Tally(object):
else:
return existing
- def __eq__(self, tally2):
+ def __eq__(self, other):
+ if not isinstance(other, Tally):
+ return False
+
# Check all filters
- if len(self.filters) != len(tally2.filters):
+ if len(self.filters) != len(other.filters):
return False
for filter in self.filters:
- if filter not in tally2.filters:
+ if filter not in other.filters:
return False
# Check all nuclides
- if len(self.nuclides) != len(tally2.nuclides):
+ if len(self.nuclides) != len(other.nuclides):
return False
for nuclide in self.nuclides:
- if nuclide not in tally2.nuclides:
+ if nuclide not in other.nuclides:
return False
# Check all scores
- if len(self.scores) != len(tally2.scores):
+ if len(self.scores) != len(other.scores):
return False
for score in self.scores:
- if score not in tally2.scores:
+ if score not in other.scores:
return False
- if self.estimator != tally2.estimator:
+ if self.estimator != other.estimator:
return False
return True
+ def __ne__(self, other):
+ return not self == other
+
def __hash__(self):
hashable = []
@@ -198,6 +206,32 @@ class Tally(object):
return hash(tuple(hashable))
+ def __repr__(self):
+ string = 'Tally\n'
+ string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self.id)
+ string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self.name)
+
+ string += '{0: <16}{1}\n'.format('\tFilters', '=\t')
+
+ for filter in self.filters:
+ string += '{0: <16}\t\t{1}\t{2}\n'.format('', filter.type,
+ filter.bins)
+
+ string += '{0: <16}{1}'.format('\tNuclides', '=\t')
+
+ for nuclide in self.nuclides:
+ if isinstance(nuclide, Nuclide):
+ string += '{0} '.format(nuclide.name)
+ else:
+ string += '{0} '.format(nuclide)
+
+ string += '\n'
+
+ string += '{0: <16}{1}{2}\n'.format('\tScores', '=\t', self.scores)
+ string += '{0: <16}{1}{2}\n'.format('\tEstimator', '=\t', self.estimator)
+
+ return string
+
@property
def id(self):
return self._id
@@ -234,7 +268,7 @@ class Tally(object):
def num_filter_bins(self):
num_bins = 1
- for filter in self._filters:
+ for filter in self.filters:
num_bins *= filter.num_bins
return num_bins
@@ -347,7 +381,7 @@ class Tally(object):
@estimator.setter
def estimator(self, estimator):
- check_value('estimator', estimator,
+ cv.check_value('estimator', estimator,
['analog', 'tracklength', 'collision'])
self._estimator = estimator
@@ -366,7 +400,8 @@ class Tally(object):
'since "{1}" is not a Trigger'.format(self.id, trigger)
raise ValueError(msg)
- self._triggers.append(trigger)
+ if trigger not in self.triggers:
+ self.triggers.append(trigger)
@id.setter
def id(self, tally_id):
@@ -375,14 +410,14 @@ class Tally(object):
self._id = AUTO_TALLY_ID
AUTO_TALLY_ID += 1
else:
- check_type('tally ID', tally_id, Integral)
- check_greater_than('tally ID', tally_id, 0)
+ cv.check_type('tally ID', tally_id, Integral)
+ cv.check_greater_than('tally ID', tally_id, 0, equality=True)
self._id = tally_id
@name.setter
def name(self, name):
if name is not None:
- check_type('tally name', name, basestring)
+ cv.check_type('tally name', name, basestring)
self._name = name
else:
self._name = None
@@ -434,7 +469,6 @@ class Tally(object):
# If the score is already in the Tally, don't add it again
if score in self.scores:
return
-
# Normal score strings
if isinstance(score, basestring):
self._scores.append(score.strip())
@@ -448,28 +482,28 @@ class Tally(object):
@num_realizations.setter
def num_realizations(self, num_realizations):
- check_type('number of realizations', num_realizations, Integral)
- check_greater_than('number of realizations', num_realizations, 0, True)
+ cv.check_type('number of realizations', num_realizations, Integral)
+ cv.check_greater_than('number of realizations', num_realizations, 0, True)
self._num_realizations = num_realizations
@with_summary.setter
def with_summary(self, with_summary):
- check_type('with_summary', with_summary, bool)
+ cv.check_type('with_summary', with_summary, bool)
self._with_summary = with_summary
@with_batch_statistics.setter
def with_batch_statistics(self, with_batch_statistics):
- check_type('with_batch_statistics', with_batch_statistics, bool)
+ cv.check_type('with_batch_statistics', with_batch_statistics, bool)
self._with_batch_statistics = with_batch_statistics
@sum.setter
def sum(self, sum):
- check_type('sum', sum, Iterable)
+ cv.check_type('sum', sum, Iterable)
self._sum = sum
@sum_sq.setter
def sum_sq(self, sum_sq):
- check_type('sum_sq', sum_sq, Iterable)
+ cv.check_type('sum_sq', sum_sq, Iterable)
self._sum_sq = sum_sq
def remove_score(self, score):
@@ -523,32 +557,6 @@ class Tally(object):
self._nuclides.remove(nuclide)
- def __repr__(self):
- string = 'Tally\n'
- string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self.id)
- string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self.name)
-
- string += '{0: <16}{1}\n'.format('\tFilters', '=\t')
-
- for filter in self.filters:
- string += '{0: <16}\t\t{1}\t{2}\n'.format('', filter.type,
- filter.bins)
-
- string += '{0: <16}{1}'.format('\tNuclides', '=\t')
-
- for nuclide in self.nuclides:
- if isinstance(nuclide, Nuclide):
- string += '{0} '.format(nuclide.name)
- else:
- string += '{0} '.format(nuclide)
-
- string += '\n'
-
- string += '{0: <16}{1}{2}\n'.format('\tScores', '=\t', self.scores)
- string += '{0: <16}{1}{2}\n'.format('\tEstimator', '=\t', self.estimator)
-
- return string
-
def can_merge(self, tally):
"""Determine if another tally can be merged with this one
@@ -764,8 +772,7 @@ class Tally(object):
----------
filter_type : str
The type of Filter (e.g., 'cell', 'energy', etc.)
-
- filter_bin : int, list
+ filter_bin : Integral or tuple
The bin is an integer ID for 'material', 'surface', 'cell',
'cellborn', and 'universe' Filters. The bin is an integer for the
cell instance ID for 'distribcell' Filters. The bin is a 2-tuple of
@@ -863,40 +870,199 @@ class Tally(object):
return score_index
- def get_values(self, scores=[], filters=[], filter_bins=[],
- nuclides=[], value='mean'):
- """Returns a tally score value given a list of filters to satisfy.
+ def get_filter_indices(self, filters=[], filter_bins=[]):
+ """Get indices into the filter axis of this tally's data arrays.
- This method constructs a 3D NumPy array for the requested Tally data
- indexed by filter bin, nuclide bin, and score index. The method will
- order the data in the array as specified in the parameter lists
+ This is a helper method for the Tally.get_values(...) method to
+ extract tally data. This method returns the indices into the filter
+ axis of the tally's data array (axis=0) for particular combinations
+ of filters and their corresponding bins.
Parameters
----------
- scores : list
- A list of one or more score strings
- (e.g., ['absorption', 'nu-fission']; default is [])
-
- filters : list
+ filters : list of str
A list of filter type strings
(e.g., ['mesh', 'energy']; default is [])
-
filter_bins : list of Iterables
A list of the filter bins corresponding to the filter_types
parameter (e.g., [(1,), (0., 0.625e-6)]; default is []). Each bin
in the list is the integer ID for 'material', 'surface', 'cell',
'cellborn', and 'universe' Filters. Each bin is an integer for the
- cell instance ID for 'distribcell Filters. Each bin is a 2-tuple of
+ cell instance ID for 'distribcell' Filters. Each bin is a 2-tuple of
floats for 'energy' and 'energyout' filters corresponding to the
energy boundaries of the bin of interest. The bin is a (x,y,z)
3-tuple for 'mesh' filters corresponding to the mesh cell of
- interest. The order of the bins in the list must correspond of the
+ interest. The order of the bins in the list must correspond to the
filter_types parameter.
- nuclides : list
+ Returns
+ -------
+ ndarray
+ A NumPy array of the filter indices
+
+ """
+
+ cv.check_iterable_type('filters', filters, basestring)
+ cv.check_iterable_type('filter_bins', filter_bins, tuple)
+
+ # Determine the score indices from any of the requested scores
+ if filters:
+ # Initialize empty list of indices for each bin in each Filter
+ filter_indices = []
+
+ # Loop over all of the Tally's Filters
+ for i, filter in enumerate(self.filters):
+ user_filter = False
+
+ # If a user-requested Filter, get the user-requested bins
+ for j, test_filter in enumerate(filters):
+ if filter.type == test_filter:
+ bins = filter_bins[j]
+ user_filter = True
+ break
+
+ # If not a user-requested Filter, get all bins
+ if not user_filter:
+ # Create list of 2- or 3-tuples tuples for mesh cell bins
+ if filter.type == 'mesh':
+ dimension = filter.mesh.dimension
+ xyz = map(lambda x: np.arange(1, x+1), dimension)
+ bins = list(itertools.product(*xyz))
+
+ # Create list of 2-tuples for energy boundary bins
+ elif filter.type in ['energy', 'energyout']:
+ bins = []
+ for k in range(filter.num_bins):
+ bins.append((filter.bins[k], filter.bins[k+1]))
+
+ # Create list of cell instance IDs for distribcell Filters
+ elif filter.type == 'distribcell':
+ bins = np.arange(filter.num_bins)
+
+ # Create list of IDs for bins for all other filter types
+ else:
+ bins = filter.bins
+
+ # Initialize a NumPy array for the Filter bin indices
+ filter_indices.append(np.zeros(len(bins), dtype=np.int))
+
+ # Add indices for each bin in this Filter to the list
+ for j, bin in enumerate(bins):
+ filter_index = self.get_filter_index(filter.type, bin)
+ filter_indices[i][j] = filter_index
+
+ # Account for stride in each of the previous filters
+ for indices in filter_indices[:i]:
+ indices *= filter.num_bins
+
+ # Apply outer product sum between all filter bin indices
+ filter_indices = list(map(sum, itertools.product(*filter_indices)))
+
+ # If user did not specify any specific Filters, use them all
+ else:
+ filter_indices = np.arange(self.num_filter_bins)
+
+ return filter_indices
+
+ def get_nuclide_indices(self, nuclides):
+ """Get indices into the nuclide axis of this tally's data arrays.
+
+ This is a helper method for the Tally.get_values(...) method to
+ extract tally data. This method returns the indices into the nuclide
+ axis of the tally's data array (axis=1) for one or more nuclides.
+
+ Parameters
+ ----------
+ nuclides : list of str
A list of nuclide name strings
(e.g., ['U-235', 'U-238']; default is [])
+ Returns
+ -------
+ ndarray
+ A NumPy array of the nuclide indices
+
+ """
+
+ cv.check_iterable_type('nuclides', nuclides, basestring)
+
+ # Determine the score indices from any of the requested scores
+ if nuclides:
+ nuclide_indices = np.zeros(len(nuclides), dtype=np.int)
+ for i, nuclide in enumerate(nuclides):
+ nuclide_indices[i] = self.get_nuclide_index(nuclide)
+
+ # If user did not specify any specific Nuclides, use them all
+ else:
+ nuclide_indices = np.arange(self.num_nuclides)
+
+ return nuclide_indices
+
+ def get_score_indices(self, scores):
+ """Get indices into the score axis of this tally's data arrays.
+
+ This is a helper method for the Tally.get_values(...) method to
+ extract tally data. This method returns the indices into the score
+ axis of the tally's data array (axis=2) for one or more scores.
+
+ Parameters
+ ----------
+ scores : list of str
+ A list of one or more score strings
+ (e.g., ['absorption', 'nu-fission']; default is [])
+
+ Returns
+ -------
+ ndarray
+ A NumPy array of the score indices
+
+ """
+
+ cv.check_iterable_type('scores', scores, basestring)
+
+ # Determine the score indices from any of the requested scores
+ if scores:
+ score_indices = np.zeros(len(scores), dtype=np.int)
+ for i, score in enumerate(scores):
+ score_indices[i] = self.get_score_index(score)
+
+ # If user did not specify any specific scores, use them all
+ else:
+ score_indices = np.arange(self.num_scores)
+
+ return score_indices
+
+ def get_values(self, scores=[], filters=[], filter_bins=[],
+ nuclides=[], value='mean'):
+ """Returns one or more tallied values given a list of scores, filters,
+ filter bins and nuclides.
+
+ This method constructs a 3D NumPy array for the requested Tally data
+ indexed by filter bin, nuclide bin, and score index. The method will
+ order the data in the array as specified in the parameter lists.
+
+ Parameters
+ ----------
+ scores : list of str
+ A list of one or more score strings
+ (e.g., ['absorption', 'nu-fission']; default is [])
+ filters : list of str
+ A list of filter type strings
+ (e.g., ['mesh', 'energy']; default is [])
+ filter_bins : list of Iterables
+ A list of the filter bins corresponding to the filter_types
+ parameter (e.g., [(1,), (0., 0.625e-6)]; default is []). Each bin
+ in the list is the integer ID for 'material', 'surface', 'cell',
+ 'cellborn', and 'universe' Filters. Each bin is an integer for the
+ cell instance ID for 'distribcell' Filters. Each bin is a 2-tuple of
+ floats for 'energy' and 'energyout' filters corresponding to the
+ energy boundaries of the bin of interest. The bin is a (x,y,z)
+ 3-tuple for 'mesh' filters corresponding to the mesh cell of
+ interest. The order of the bins in the list must correspond to the
+ filter_types parameter.
+ nuclides : list of str
+ A list of nuclide name strings
+ (e.g., ['U-235', 'U-238']; default is [])
value : str
A string for the type of value to return - 'mean' (default),
'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted
@@ -928,81 +1094,10 @@ class Tally(object):
'Tally.get_values(...)'.format(self.id)
raise ValueError(msg)
- ############################ FILTERS #########################
- # Determine the score indices from any of the requested scores
- if filters:
- # Initialize empty list of indices for each bin in each Filter
- filter_indices = []
-
- # Loop over all of the Tally's Filters
- for i, filter in enumerate(self.filters):
- user_filter = False
-
- # If a user-requested Filter, get the user-requested bins
- for j, test_filter in enumerate(filters):
- if filter.type == test_filter:
- bins = filter_bins[j]
- user_filter = True
- break
-
- # If not a user-requested Filter, get all bins
- if not user_filter:
- # Create list of 2- or 3-tuples tuples for mesh cell bins
- if filter.type == 'mesh':
- dimension = filter.mesh.dimension
- xyz = map(lambda x: np.arange(1, x+1), dimension)
- bins = list(itertools.product(*xyz))
-
- # Create list of 2-tuples for energy boundary bins
- elif filter.type in ['energy', 'energyout']:
- bins = []
- for k in range(filter.num_bins):
- bins.append((filter.bins[k], filter.bins[k+1]))
-
- # Create list of IDs for bins for all other Filter types
- else:
- bins = filter.bins
-
- # Initialize a NumPy array for the Filter bin indices
- filter_indices.append(np.zeros(len(bins), dtype=np.int))
-
- # Add indices for each bin in this Filter to the list
- for j, bin in enumerate(bins):
- filter_index = self.get_filter_index(filter.type, bin)
- filter_indices[i][j] = filter_index
-
- # Account for stride in each of the previous filters
- for indices in filter_indices[:i]:
- indices *= filter.num_bins
-
- # Apply outer product sum between all filter bin indices
- filter_indices = list(map(sum, itertools.product(*filter_indices)))
-
- # If user did not specify any specific Filters, use them all
- else:
- filter_indices = np.arange(self.num_filter_bins)
-
- ############################ NUCLIDES ########################
- # Determine the score indices from any of the requested scores
- if nuclides:
- nuclide_indices = np.zeros(len(nuclides), dtype=np.int)
- for i, nuclide in enumerate(nuclides):
- nuclide_indices[i] = self.get_nuclide_index(nuclide)
-
- # If user did not specify any specific Nuclides, use them all
- else:
- nuclide_indices = np.arange(self.num_nuclides)
-
- ############################# SCORES #########################
- # Determine the score indices from any of the requested scores
- if scores:
- score_indices = np.zeros(len(scores), dtype=np.int)
- for i, score in enumerate(scores):
- score_indices[i] = self.get_score_index(score)
-
- # If user did not specify any specific scores, use them all
- else:
- score_indices = np.arange(self.num_scores)
+ # Get filter, nuclide and score indices
+ filter_indices = self.get_filter_indices(filters, filter_bins)
+ nuclide_indices = self.get_nuclide_indices(nuclides)
+ score_indices = self.get_score_indices(scores)
# Construct outer product of all three index types with each other
indices = np.ix_(filter_indices, nuclide_indices, score_indices)
@@ -1021,7 +1116,7 @@ class Tally(object):
else:
msg = 'Unable to return results from Tally ID="{0}" since the ' \
'the requested value "{1}" is not \'mean\', \'std_dev\', ' \
- '\rel_err\', \'sum\', or \'sum_sq\''.format(self.id, value)
+ '\'rel_err\', \'sum\', or \'sum_sq\''.format(self.id, value)
raise LookupError(msg)
return data
@@ -1032,21 +1127,19 @@ class Tally(object):
This method constructs a Pandas DataFrame object for the Tally data
with columns annotated by filter, nuclide and score bin information.
- This capability has been tested for Pandas >=v0.13.1. However, if
- possible, it is recommended to use the v0.16 or newer versions of
- Pandas since this this method uses the Multi-index Pandas feature.
+
+ This capability has been tested for Pandas >=0.13.1. However, it is
+ recommended to use v0.16 or newer versions of Pandas since this method
+ uses the Multi-index Pandas feature.
Parameters
----------
filters : bool
Include columns with filter bin information (default is True).
-
nuclides : bool
Include columns with nuclide bin information (default is True).
-
scores : bool
Include columns with score bin information (default is True).
-
summary : None or Summary
An optional Summary object to be used to construct columns for
distribcell tally filters (default is None). The geometric
@@ -1066,6 +1159,8 @@ class Tally(object):
KeyError
When this method is called before the Tally is populated with data
by the StatePoint.read_results() method.
+ ImportError
+ When Pandas can not be found on the caller's system
"""
@@ -1084,11 +1179,11 @@ class Tally(object):
'Summary info'.format(self.id)
raise KeyError(msg)
- # Attempt to import the pandas package
+ # Attempt to import Pandas
try:
import pandas as pd
except ImportError:
- msg = 'The pandas Python package must be installed on your system'
+ msg = 'The Pandas Python package must be installed on your system'
raise ImportError(msg)
# Initialize a pandas dataframe for the tally data
@@ -1097,239 +1192,13 @@ class Tally(object):
# Find the total length of the tally data array
data_size = self.mean.size
- # Split CrossFilters into separate filters
- split_filters = []
- for filter in self.filters:
- if isinstance(filter, CrossFilter):
- split_filters.extend(filter.split_filters())
- else:
- split_filters.append(filter)
-
# Build DataFrame columns for filters if user requested them
if filters:
- for filter in split_filters:
-
- # mesh filters
- if filter.type == 'mesh':
-
- # Initialize dictionary to build Pandas Multi-index column
- filter_dict = {}
-
- # Append Mesh ID as outermost index of mult-index
- mesh_id = filter.mesh.id
- mesh_key = 'mesh {0}'.format(mesh_id)
-
- # Find mesh dimensions - use 3D indices for simplicity
- if (len(filter.mesh.dimension) == 3):
- nx, ny, nz = filter.mesh.dimension
- else:
- nx, ny = filter.mesh.dimension
- nz = 1
-
- # Generate multi-index sub-column for x-axis
- filter_bins = np.arange(1, nx+1)
- repeat_factor = ny * nz * filter.stride
- filter_bins = np.repeat(filter_bins, repeat_factor)
- tile_factor = data_size / len(filter_bins)
- filter_bins = np.tile(filter_bins, tile_factor)
- filter_dict[(mesh_key, 'x')] = filter_bins
-
- # Generate multi-index sub-column for y-axis
- filter_bins = np.arange(1, ny+1)
- repeat_factor = nz * filter.stride
- filter_bins = np.repeat(filter_bins, repeat_factor)
- tile_factor = data_size / len(filter_bins)
- filter_bins = np.tile(filter_bins, tile_factor)
- filter_dict[(mesh_key, 'y')] = filter_bins
-
- # Generate multi-index sub-column for z-axis
- filter_bins = np.arange(1, nz+1)
- repeat_factor = filter.stride
- filter_bins = np.repeat(filter_bins, repeat_factor)
- tile_factor = data_size / len(filter_bins)
- filter_bins = np.tile(filter_bins, tile_factor)
- filter_dict[(mesh_key, 'z')] = filter_bins
-
- # Append the multi-index column to the DataFrame
- df = pd.concat([df, pd.DataFrame(filter_dict)], axis=1)
-
- # distribcell filters
- elif filter.type == 'distribcell':
- if isinstance(summary, Summary):
- # Attempt to import the OpenCG package
- try:
- import opencg
- except ImportError:
- msg = 'The OpenCG package must be installed ' \
- 'to use a Summary for distribcell dataframes'
- raise ImportError(msg)
-
- # Create and extract the OpenCG geometry the Summary
- summary.make_opencg_geometry()
- opencg_geometry = summary.opencg_geometry
- openmc_geometry = summary.openmc_geometry
-
- # Use OpenCG to compute the number of regions
- opencg_geometry.initializeCellOffsets()
- num_regions = opencg_geometry._num_regions
-
- # Initialize a dictionary mapping OpenMC distribcell
- # offsets to OpenCG LocalCoords linked lists
- offsets_to_coords = {}
-
- # Use OpenCG to compute LocalCoords linked list for
- # each region and store in dictionary
- for region in range(num_regions):
- coords = opencg_geometry.findRegion(region)
- path = opencg.get_path(coords)
- cell_id = path[-1]
-
- # If this region is in Cell corresponding to the
- # distribcell filter bin, store it in dictionary
- if cell_id == filter.bins[0]:
- offset = openmc_geometry.get_offset(path,
- filter.offset)
- offsets_to_coords[offset] = coords
-
- # Each distribcell offset is a DataFrame bin
- # Unravel the paths into DataFrame columns
- num_offsets = len(offsets_to_coords)
-
- # Initialize termination condition for while loop
- levels_remain = True
- counter = 0
-
- # Iterate over each level in the CSG tree hierarchy
- while levels_remain:
- levels_remain = False
-
- # Initialize dictionary to build Pandas Multi-index
- # column for this level in the CSG tree hierarchy
- level_dict = {}
-
- # Initialize prefix Multi-index keys
- counter += 1
- level_key = 'level {0}'.format(counter)
- univ_key = (level_key, 'univ', 'id')
- cell_key = (level_key, 'cell', 'id')
- lat_id_key = (level_key, 'lat', 'id')
- lat_x_key = (level_key, 'lat', 'x')
- lat_y_key = (level_key, 'lat', 'y')
- lat_z_key = (level_key, 'lat', 'z')
-
- # Allocate NumPy arrays for each CSG level and
- # each Multi-index column in the DataFrame
- level_dict[univ_key] = np.empty(num_offsets)
- level_dict[cell_key] = np.empty(num_offsets)
- level_dict[lat_id_key] = np.empty(num_offsets)
- level_dict[lat_x_key] = np.empty(num_offsets)
- level_dict[lat_y_key] = np.empty(num_offsets)
- level_dict[lat_z_key] = np.empty(num_offsets)
-
- # Initialize Multi-index columns to NaN - this is
- # necessary since some distribcell instances may
- # have very different LocalCoords linked lists
- level_dict[univ_key][:] = np.nan
- level_dict[cell_key][:] = np.nan
- level_dict[lat_id_key][:] = np.nan
- level_dict[lat_x_key][:] = np.nan
- level_dict[lat_y_key][:] = np.nan
- level_dict[lat_z_key][:] = np.nan
-
- # Iterate over all regions (distribcell instances)
- for offset in range(num_offsets):
- coords = offsets_to_coords[offset]
-
- # If entire LocalCoords has been unraveled into
- # Multi-index columns already, continue
- if coords is None:
- continue
-
- # Assign entry to Universe Multi-index column
- if coords._type == 'universe':
- univ_id = coords._universe._id
- cell_id = coords._cell._id
- level_dict[univ_key][offset] = univ_id
- level_dict[cell_key][offset] = cell_id
-
- # Assign entry to Lattice Multi-index column
- else:
- lat_id = coords._lattice._id
- lat_x = coords._lat_x
- lat_y = coords._lat_y
- lat_z = coords._lat_z
- level_dict[lat_id_key][offset] = lat_id
- level_dict[lat_x_key][offset] = lat_x
- level_dict[lat_y_key][offset] = lat_y
- level_dict[lat_z_key][offset] = lat_z
-
- # Move to next node in LocalCoords linked list
- if coords._next is None:
- offsets_to_coords[offset] = None
- else:
- offsets_to_coords[offset] = coords._next
- levels_remain = True
-
- # Tile the Multi-index columns
- for level_key, level_bins in level_dict.items():
- level_bins = \
- np.repeat(level_bins, filter.stride)
- tile_factor = data_size / len(level_bins)
- level_bins = np.tile(level_bins, tile_factor)
- level_dict[level_key] = level_bins
-
- # Append the multi-index column to the DataFrame
- df = pd.concat([df, pd.DataFrame(level_dict)],
- axis=1)
-
- # Create DataFrame column for distribcell instances IDs
- # NOTE: This is performed regardless of whether the user
- # requests Summary geomeric information
- filter_bins = np.arange(filter.num_bins)
- filter_bins = np.repeat(filter_bins, filter.stride)
- tile_factor = data_size / len(filter_bins)
- filter_bins = np.tile(filter_bins, tile_factor)
- df[filter.type] = filter_bins
-
- # energy, energyout filters
- elif 'energy' in filter.type:
- bins = filter.bins
-
- # Create strings for dataFrame rows
- template = '{0:.1e} - {1:.1e}'
- filter_bins = []
- for i in range(filter.num_bins):
- filter_bins.append(template.format(bins[i], bins[i+1]))
-
- # Tile the energy bins into a DataFrame column
- filter_bins = np.repeat(filter_bins, filter.stride)
- tile_factor = data_size / len(filter_bins)
- filter_bins = np.tile(filter_bins, tile_factor)
- df[filter.type + ' [MeV]'] = filter_bins
-
- # mu, polar, and azimuthal
- elif filter.type in ['mu', 'polar', 'azimuthal']:
- bins = filter.bins
-
- # Create strings for dataFrame rows
- template = '{0:1.2f} - {1:1.2f}'
- filter_bins = []
- for i in range(filter.num_bins):
- filter_bins.append(template.format(bins[i], bins[i+1]))
-
- # Tile the bins into a DataFrame column
- filter_bins = np.repeat(filter_bins, filter.stride)
- tile_factor = data_size / len(filter_bins)
- filter_bins = np.tile(filter_bins, tile_factor)
- df[filter.type] = filter_bins
-
- # universe, material, surface, cell, and cellborn filters
- else:
- filter_bins = np.repeat(filter.bins, filter.stride)
- tile_factor = data_size / len(filter_bins)
- filter_bins = np.tile(filter_bins, tile_factor)
- df[filter.type] = filter_bins
+ # Append each Filter's DataFrame to the overall DataFrame
+ for filter in self.filters:
+ filter_df = filter.get_pandas_dataframe(data_size, summary)
+ df = pd.concat([df, filter_df], axis=1)
# Include DataFrame column for nuclides if user requested it
if nuclides:
@@ -1356,10 +1225,76 @@ class Tally(object):
df['mean'] = self.mean.ravel()
df['std. dev.'] = self.std_dev.ravel()
- df.index.name = 'bin'
df = df.dropna(axis=1)
+
+ # Expand the columns into Pandas MultiIndices for readability
+ if pd.__version__ >= '0.16':
+ columns = copy.deepcopy(df.columns.values)
+
+ # Convert all elements in columns list to tuples
+ for i, column in enumerate(columns):
+ if not isinstance(column, tuple):
+ columns[i] = (column,)
+
+ # Make each tuple the same length
+ max_len_column = len(max(columns, key=len))
+ for i, column in enumerate(columns):
+ delta_len = max_len_column - len(column)
+ if delta_len > 0:
+ new_column = list(column)
+ new_column.extend(['']*delta_len)
+ columns[i] = tuple(new_column)
+
+ # Create and set a MultiIndex for the DataFrame's columns
+ df.columns = pd.MultiIndex.from_tuples(columns)
+
return df
+ def get_reshaped_data(self, value='mean'):
+ """Returns an array of tally data with one dimension per filter.
+
+ The tally data in OpenMC is stored as a 3D array with the dimensions
+ corresponding to filters, nuclides and scores. As a result, tally data
+ can be opaque for a user to directly index (i.e., without use of the
+ Tally.get_values(...) method) since one must know how to properly use
+ the number of bins and strides for each filter to index into the first
+ (filter) dimension.
+
+ This builds and returns a reshaped version of the tally data array with
+ unique dimensions corresponding to each tally filter. For example,
+ suppose this tally has arrays of data with shape (8,5,5) corresponding
+ to two filters (2 and 4 bins, respectively), five nuclides and five
+ scores. This method will return a version of the data array with the
+ with a new shape of (2,4,5,5) such that the first two dimensions
+ correspond directly to the two filters with two and four bins.
+
+ Parameters
+ ----------
+ value : str
+ A string for the type of value to return - 'mean' (default),
+ 'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted
+
+ Returns
+ -------
+ ndarray
+ The tally data array indexed by filters, nuclides and scores.
+
+ """
+
+ # Get the 3D array of data in filters, nuclides and scores
+ data = self.get_values(value=value)
+
+ # Build a new array shape with one dimension per filter
+ new_shape = ()
+ for filter in self.filters:
+ new_shape += (filter.num_bins, )
+ new_shape += (self.num_nuclides,)
+ new_shape += (self.num_score_bins,)
+
+ # Reshape the data with one dimension for each filter
+ data = np.reshape(data, new_shape)
+ return data
+
def export_results(self, filename='tally-results', directory='.',
format='hdf5', append=True):
"""Exports tallly results to an HDF5 or Python pickle binary file.
@@ -1368,14 +1303,11 @@ class Tally(object):
----------
filename : str
The name of the file for the results (default is 'tally-results')
-
directory : str
The name of the directory for the results (default is '.')
-
format : str
The format for the exported file - HDF5 ('hdf5', default) and
Python pickle ('pkl') files are supported
-
append : bool
Whether or not to append the results to the file (default is True)
@@ -1388,9 +1320,9 @@ class Tally(object):
"""
# Ensure that StatePoint.read_results() was called first
- if self._sum is None or self._sum_sq is None:
+ if self._sum is None or self._sum_sq is None and not self.derived:
msg = 'The Tally ID="{0}" has no data to export. Call the ' \
- 'StatePoint.read_results() routine before using ' \
+ 'StatePoint.read_results() method before using ' \
'Tally.export_results(...)'.format(self.id)
raise KeyError(msg)
@@ -1525,7 +1457,7 @@ class Tally(object):
Returns
-------
Tally
- A new Tally outer that is the outer product with this one.
+ A new Tally that is the outer product with this one.
Raises
------
@@ -1541,11 +1473,27 @@ class Tally(object):
'since it does not contain any results.'.format(other.id)
raise ValueError(msg)
- new_name = '({0} {1} {2})'.format(self.name, binary_op, other.name)
- new_tally = Tally(name=new_name)
+ new_tally = Tally()
new_tally.with_batch_statistics = True
new_tally._derived = True
+ # Construct a combined derived name from the two tally operands
+ if self.name != '' and other.name != '':
+ new_name = '({0} {1} {2})'.format(self.name, binary_op, other.name)
+ new_tally.name = new_name
+
+ # Find any shared filters between the two tallies
+ self_filters = set(self.filters)
+ other_filters = set(other.filters)
+ filter_intersect = self_filters.intersection(other_filters)
+
+ # Align the shared filters to follow in each tally operand
+ for i, filter in enumerate(filter_intersect):
+ self_index = self.filters.index(filter)
+ other_filter = other.filters[self_index]
+ if other_filter != filter:
+ other = other.swap_filters(filter, other_filter)
+
data = self._align_tally_data(other)
if binary_op == '+':
@@ -1553,26 +1501,22 @@ class Tally(object):
new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 +
data['other']['std. dev.']**2)
elif binary_op == '-':
- data = self._align_tally_data(other)
new_tally._mean = data['self']['mean'] - data['other']['mean']
new_tally._std_dev = np.sqrt(data['self']['std. dev.']**2 +
data['other']['std. dev.']**2)
elif binary_op == '*':
- data = self._align_tally_data(other)
self_rel_err = data['self']['std. dev.'] / data['self']['mean']
other_rel_err = data['other']['std. dev.'] / data['other']['mean']
new_tally._mean = data['self']['mean'] * data['other']['mean']
new_tally._std_dev = np.abs(new_tally.mean) * \
np.sqrt(self_rel_err**2 + other_rel_err**2)
elif binary_op == '/':
- data = self._align_tally_data(other)
self_rel_err = data['self']['std. dev.'] / data['self']['mean']
other_rel_err = data['other']['std. dev.'] / data['other']['mean']
new_tally._mean = data['self']['mean'] / data['other']['mean']
new_tally._std_dev = np.abs(new_tally.mean) * \
np.sqrt(self_rel_err**2 + other_rel_err**2)
elif binary_op == '^':
- data = self._align_tally_data(other)
mean_ratio = data['other']['mean'] / data['self']['mean']
first_term = mean_ratio * data['self']['std. dev.']
second_term = \
@@ -1587,23 +1531,49 @@ class Tally(object):
new_tally.with_summary = self.with_summary
if self.num_realizations == other.num_realizations:
new_tally.num_realizations = self.num_realizations
- new_tally.num_score_bins = self.num_score_bins * other.num_score_bins
- # Generate filter "outer products"
+ # If filters are identical, simply reuse them in derived tally
if self.filters == other.filters:
for self_filter in self.filters:
new_tally.add_filter(self_filter)
+
+ # Generate filter "outer products" for non-identical filters
else:
- all_filters = [self.filters, other.filters]
- for self_filter, other_filter in itertools.product(*all_filters):
- new_filter = CrossFilter(self_filter, other_filter, binary_op)
- new_tally.add_filter(new_filter)
+
+ # Find the common longest sequence of shared filters
+ match = 0
+ for self_filter, other_filter in zip(self.filters, other.filters):
+ if self_filter == other_filter:
+ match += 1
+ else:
+ break
+
+ match_filters = self.filters[:match]
+ cross_filters = [self.filters[match:], other.filters[match:]]
+
+ # Simply reuse shared filters in derived tally
+ for filter in match_filters:
+ new_tally.add_filter(filter)
+
+ # Use cross filters to combine non-shared filters in derived tally
+ if len(self.filters) != match and len(other.filters) == match:
+ for filter in cross_filters[0]:
+ new_tally.add_filter(filter)
+ elif len(other.filters) == match and len(other.filters) != match:
+ for filter in cross_filters[1]:
+ new_tally.add_filter(filter)
+ else:
+ for self_filter, other_filter in itertools.product(*cross_filters):
+ new_filter = CrossFilter(self_filter, other_filter, binary_op)
+ new_tally.add_filter(new_filter)
# Generate score "outer products"
if self.scores == other.scores:
+ new_tally.num_score_bins = self.num_score_bins
for self_score in self.scores:
new_tally.add_score(self_score)
else:
+ new_tally.num_score_bins = self.num_score_bins * other.num_score_bins
all_scores = [self.scores, other.scores]
for self_score, other_score in itertools.product(*all_scores):
new_score = CrossScore(self_score, other_score, binary_op)
@@ -1619,6 +1589,12 @@ class Tally(object):
new_nuclide = CrossNuclide(self_nuclide, other_nuclide, binary_op)
new_tally.add_nuclide(new_nuclide)
+ # Correct each Filter's stride
+ stride = new_tally.num_nuclides * new_tally.num_score_bins
+ for filter in reversed(new_tally.filters):
+ filter.stride = stride
+ stride *= filter.num_bins
+
return new_tally
def _align_tally_data(self, other):
@@ -1644,7 +1620,6 @@ class Tally(object):
A dictionary of dictionaries to "aligned" 'mean' and 'std. dev'
NumPy arrays for each tally's data.
-
"""
self_mean = copy.deepcopy(self.mean)
@@ -1656,14 +1631,39 @@ class Tally(object):
# Determine the number of paired combinations of filter bins
# between the two tallies and repeat arrays along filter axes
- self_repeat_factor = other.num_filter_bins
- other_tile_factor = self.num_filter_bins
+ diff1 = list(set(self.filters).difference(set(other.filters)))
+ diff2 = list(set(other.filters).difference(set(self.filters)))
- # Replicate the data
- self_mean = np.repeat(self_mean, self_repeat_factor, axis=0)
- other_mean = np.tile(other_mean, (other_tile_factor, 1, 1))
- self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=0)
- other_std_dev = np.tile(other_std_dev, (other_tile_factor, 1, 1))
+ # Determine the factors by which each tally operands' data arrays
+ # must be tiled or repeated for the tally outer product
+ other_tile_factor = 1
+ self_repeat_factor = 1
+ for filter in diff1:
+ other_tile_factor *= filter.num_bins
+ for filter in diff2:
+ self_repeat_factor *= filter.num_bins
+
+ # Tile / repeat the tally data for the tally outer product
+ self_shape = list(self.mean.shape)
+ other_shape = list(other.mean.shape)
+ self_shape[0] *= self_repeat_factor
+ self_mean = np.repeat(self_mean, self_repeat_factor)
+ self_std_dev = np.repeat(self_std_dev, self_repeat_factor)
+
+ if self_repeat_factor == 1:
+ other_shape[0] *= other_tile_factor
+ other_mean = np.repeat(other_mean, other_tile_factor, axis=0)
+ other_std_dev = np.repeat(other_std_dev, other_tile_factor, axis=0)
+ else:
+ other_mean = np.tile(other_mean, (other_tile_factor, 1, 1))
+ other_std_dev = np.tile(other_std_dev, (other_tile_factor, 1, 1))
+
+ # NumPy repeat and tile routines return 1D flattened arrays
+ # Reshape arrays as 3D with filters, nuclides and scores axes
+ self_mean.shape = tuple(self_shape)
+ self_std_dev.shape = tuple(self_shape)
+ other_mean.shape = tuple(other_shape)
+ other_std_dev.shape = tuple(other_shape)
if self.nuclides != other.nuclides:
@@ -1678,6 +1678,13 @@ class Tally(object):
self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=1)
other_std_dev = np.tile(other_std_dev, (1, other_tile_factor, 1))
+ # NumPy repeat and tile routines return 1D flattened arrays
+ # Reshape arrays as 3D with filters, nuclides and scores axes
+ self_shape = list(self.mean.shape)
+ self_shape[1] *= self_repeat_factor
+ self_mean.shape = tuple(self_shape)
+ self_std_dev.shape = tuple(self_shape)
+
if self.scores != other.scores:
# Determine the number of paired combinations of score bins
@@ -1691,6 +1698,13 @@ class Tally(object):
self_std_dev = np.repeat(self_std_dev, self_repeat_factor, axis=2)
other_std_dev = np.tile(other_std_dev, (1, 1, other_tile_factor))
+ # NumPy repeat and tile routines return 1D flattened arrays
+ # Reshape arrays as 3D with filters, nuclides and scores axes
+ self_shape = list(self.mean.shape)
+ self_shape[2] *= self_repeat_factor
+ self_mean.shape = tuple(self_shape)
+ self_std_dev.shape = tuple(self_shape)
+
data = {}
data['self'] = {}
data['other'] = {}
@@ -1700,6 +1714,119 @@ class Tally(object):
data['other']['std. dev.'] = other_std_dev
return data
+ def swap_filters(self, filter1, filter2):
+ """Reverse the ordering of two filters in this tally
+
+ This is a helper method for tally arithmetic which helps align the data
+ in two tallies with shared filters. This method copies this tally and
+ reverses the order of the two filters.
+
+ Parameters
+ ----------
+ filter1 : Filter
+ The filter to swap with filter2
+
+ filter2 : Filter
+ The filter to swap with filter1
+
+ Returns
+ -------
+ swap_tally
+ A copy of this tally with the filters swapped
+
+ Raises
+ ------
+ ValueError
+ If this is a derived tally or this method is called before the tally
+ is populated with data by the StatePoint.read_results() method.
+
+ """
+
+ # Check that results have been read
+ if not self.derived and self.sum is None:
+ msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \
+ 'since it does not contain any results.'.format(self.id)
+ raise ValueError(msg)
+
+ cv.check_type('filter1', filter1, Filter)
+ cv.check_type('filter2', filter2, Filter)
+
+ if filter1 == filter2:
+ msg = 'Unable to swap a filter with itself'
+ raise ValueError(msg)
+ elif filter1 not in self.filters:
+ msg = 'Unable to swap "{0}" filter1 in Tally ID="{1}" since it ' \
+ 'does not contain such a filter'.format(filter1.type, self.id)
+ raise ValueError(msg)
+ elif filter2 not in self.filters:
+ msg = 'Unable to swap "{0}" filter2 in Tally ID="{1}" since it ' \
+ 'does not contain such a filter'.format(filter2.type, self.id)
+ raise ValueError(msg)
+
+ swap_tally = copy.deepcopy(self)
+
+ # Swap the filters in the copied version of this Tally
+ filter1_index = swap_tally.filters.index(filter1)
+ filter2_index = swap_tally.filters.index(filter2)
+ swap_tally.filters[filter1_index] = filter2
+ swap_tally.filters[filter2_index] = filter1
+
+ # Update the strides for each of the filters
+ stride = swap_tally.num_nuclides * swap_tally.num_score_bins
+ for filter in reversed(swap_tally.filters):
+ filter.stride = stride
+ stride *= filter.num_bins
+
+ # Construct lists of tuples for the bins in each of the two filters
+ filters = [filter1.type, filter2.type]
+ if filter1.type == 'distribcell':
+ filter1_bins = np.arange(filter.num_bins)
+ else:
+ filter1_bins = [(filter1.get_bin(i)) for i in range(filter1.num_bins)]
+
+ if filter1.type == 'distribcell':
+ filter2_bins = np.arange(filter2.num_bins)
+ else:
+ filter2_bins = [filter2.get_bin(i) for i in range(filter2.num_bins)]
+
+ # Adjust the sum data array to relect the new filter order
+ if self.sum is not None:
+ for bin1, bin2 in itertools.product(filter1_bins, filter2_bins):
+ filter_bins = [(bin1,), (bin2,)]
+ data = self.get_values(filters=filters,
+ filter_bins=filter_bins, value='sum')
+ indices = swap_tally.get_filter_indices(filters, filter_bins)
+ swap_tally.sum[indices, :, :] = data
+
+ # Adjust the sum_sq data array to relect the new filter order
+ if self.sum_sq is not None:
+ for bin1, bin2 in itertools.product(filter1_bins, filter2_bins):
+ filter_bins = [(bin1,), (bin2,)]
+ data = self.get_values(filters=filters,
+ filter_bins=filter_bins, value='sum_sq')
+ indices = swap_tally.get_filter_indices(filters, filter_bins)
+ swap_tally.sum_sq[indices, :, :] = data
+
+ # Adjust the mean data array to relect the new filter order
+ if self.mean is not None:
+ for bin1, bin2 in itertools.product(filter1_bins, filter2_bins):
+ filter_bins = [(bin1,), (bin2,)]
+ data = self.get_values(filters=filters,
+ filter_bins=filter_bins, value='mean')
+ indices = swap_tally.get_filter_indices(filters, filter_bins)
+ swap_tally._mean[indices, :, :] = data
+
+ # Adjust the std_dev data array to relect the new filter order
+ if self.std_dev is not None:
+ for bin1, bin2 in itertools.product(filter1_bins, filter2_bins):
+ filter_bins = [(bin1,), (bin2,)]
+ data = self.get_values(filters=filters,
+ filter_bins=filter_bins, value='std_dev')
+ indices = swap_tally.get_filter_indices(filters, filter_bins)
+ swap_tally._std_dev[indices, :, :] = data
+
+ return swap_tally
+
def __add__(self, other):
"""Adds this tally to another tally or scalar value.
@@ -1750,8 +1877,8 @@ class Tally(object):
new_tally._derived = True
new_tally.with_batch_statistics = True
new_tally.name = self.name
- new_tally._mean = self._mean + other
- new_tally._std_dev = self._std_dev
+ new_tally._mean = self.mean + other
+ new_tally._std_dev = self.std_dev
new_tally.estimator = self.estimator
new_tally.with_summary = self.with_summary
new_tally.num_realization = self.num_realizations
@@ -1819,8 +1946,8 @@ class Tally(object):
new_tally = Tally(name='derived')
new_tally._derived = True
new_tally.name = self.name
- new_tally._mean = self._mean - other
- new_tally._std_dev = self._std_dev
+ new_tally._mean = self.mean - other
+ new_tally._std_dev = self.std_dev
new_tally.estimator = self.estimator
new_tally.with_summary = self.with_summary
new_tally.num_realization = self.num_realizations
@@ -1889,8 +2016,8 @@ class Tally(object):
new_tally = Tally(name='derived')
new_tally._derived = True
new_tally.name = self.name
- new_tally._mean = self._mean * other
- new_tally._std_dev = self._std_dev * np.abs(other)
+ new_tally._mean = self.mean * other
+ new_tally._std_dev = self.std_dev * np.abs(other)
new_tally.estimator = self.estimator
new_tally.with_summary = self.with_summary
new_tally.num_realization = self.num_realizations
@@ -1910,7 +2037,7 @@ class Tally(object):
return new_tally
- def __div__(self, other):
+ def __truediv__(self, other):
"""Divides this tally by another tally or scalar value.
This method builds a new tally with data that is the dividend of
@@ -1959,8 +2086,8 @@ class Tally(object):
new_tally = Tally(name='derived')
new_tally._derived = True
new_tally.name = self.name
- new_tally._mean = self._mean / other
- new_tally._std_dev = self._std_dev * np.abs(1. / other)
+ new_tally._mean = self.mean / other
+ new_tally._std_dev = self.std_dev * np.abs(1. / other)
new_tally.estimator = self.estimator
new_tally.with_summary = self.with_summary
new_tally.num_realization = self.num_realizations
@@ -2158,20 +2285,18 @@ class Tally(object):
"""Build a sliced tally for the specified filters, scores and nuclides.
This method constructs a new tally to encapsulate a subset of the data
- represented by this tally. The subset of data to included in the tally
+ represented by this tally. The subset of data to include in the tally
slice is determined by the scores, filters and nuclides specified in
the input parameters.
Parameters
----------
- scores : list
+ scores : list of str
A list of one or more score strings
(e.g., ['absorption', 'nu-fission']; default is [])
-
- filters : list
+ filters : list of str
A list of filter type strings
(e.g., ['mesh', 'energy']; default is [])
-
filter_bins : list of Iterables
A list of the filter bins corresponding to the filter_types
parameter (e.g., [(1,), (0., 0.625e-6)]; default is []). Each bin
@@ -2181,10 +2306,9 @@ class Tally(object):
floats for 'energy' and 'energyout' filters corresponding to the
energy boundaries of the bin of interest. The bin is a (x,y,z)
3-tuple for 'mesh' filters corresponding to the mesh cell of
- interest. The order of the bins in the list must correspond of the
+ interest. The order of the bins in the list must correspond to the
filter_types parameter.
-
- nuclides : list
+ nuclides : list of str
A list of nuclide name strings
(e.g., ['U-235', 'U-238']; default is [])
@@ -2203,21 +2327,29 @@ class Tally(object):
"""
# Ensure that StatePoint.read_results() was called first
- if self.sum is None:
+ if not self.derived and self.sum is None:
msg = 'Unable to use tally arithmetic with Tally ID="{0}" ' \
'since it does not contain any results.'.format(self.id)
raise ValueError(msg)
new_tally = copy.deepcopy(self)
- new_sum = self.get_values(scores, filters, filter_bins,
- nuclides, 'sum')
- new_sum_sq = self.get_values(scores, filters, filter_bins,
- nuclides, 'sum_sq')
- new_tally.sum = new_sum
- new_tally.sum_sq = new_sum_sq
- new_tally._mean = None
- new_tally._std_dev = None
+ if self.sum is not None:
+ new_sum = self.get_values(scores, filters, filter_bins,
+ nuclides, 'sum')
+ new_tally.sum = new_sum
+ if self.sum_sq is not None:
+ new_sum_sq = self.get_values(scores, filters, filter_bins,
+ nuclides, 'sum_sq')
+ new_tally.sum_sq = new_sum_sq
+ if self.mean is not None:
+ new_mean = self.get_values(scores, filters, filter_bins,
+ nuclides, 'mean')
+ new_tally._mean = new_mean
+ if self.std_dev is not None:
+ new_std_dev = self.get_values(scores, filters, filter_bins,
+ nuclides, 'std_dev')
+ new_tally._std_dev = new_std_dev
# SCORES
if scores:
@@ -2260,10 +2392,178 @@ class Tally(object):
for filter_bin in filter_bins[i]:
bin_index = filter.get_bin_index(filter_bin)
- bin_indices.append(bin_index)
+ if filter_type in ['energy', 'energyout']:
+ bin_indices.extend([bin_index, bin_index+1])
+ elif filter_type == 'distribcell':
+ indices = [(bin,) for bin in range(filter.num_bins)]
+ bin_indices.extend(indices)
+ else:
+ bin_indices.append(bin_index)
- new_bins = filter.bins[bin_indices]
- filter.bins = new_bins
+ filter.bins = filter.bins[bin_indices]
+ filter.num_bins = len(filter_bins[i])
+
+ # Correct each Filter's stride
+ stride = new_tally.num_nuclides * new_tally.num_score_bins
+ for filter in reversed(new_tally.filters):
+ filter.stride = stride
+ stride *= filter.num_bins
+
+ return new_tally
+
+ def summation(self, scores=[], filter_type=None,
+ filter_bins=[], nuclides=[]):
+ """Vectorized sum of tally data across scores, filter bins and/or
+ nuclides using tally addition.
+
+ This method constructs a new tally to encapsulate the sum of the data
+ represented by the summation of the data in this tally. The tally data
+ sum is determined by the scores, filter bins and nuclides specified
+ in the input parameters.
+
+ Parameters
+ ----------
+ scores : list of str
+ A list of one or more score strings to sum across
+ (e.g., ['absorption', 'nu-fission']; default is [])
+ filter_type : str
+ A filter type string (e.g., 'cell', 'energy') corresponding to the
+ filter bins to sum across
+ filter_bins : Iterable of Integral or tuple
+ A list of the filter bins corresponding to the filter_type parameter
+ Each bin in the list is the integer ID for 'material', 'surface',
+ 'cell', 'cellborn', and 'universe' Filters. Each bin is an integer
+ for the cell instance ID for 'distribcell Filters. Each bin is a
+ 2-tuple of floats for 'energy' and 'energyout' filters corresponding
+ to the energy boundaries of the bin of interest. Each bin is an
+ (x,y,z) 3-tuple for 'mesh' filters corresponding to the mesh cell of
+ interest.
+ nuclides : list of str
+ A list of nuclide name strings to sum across
+ (e.g., ['U-235', 'U-238']; default is [])
+
+ Returns
+ -------
+ Tally
+ A new tally which encapsulates the sum of data requested.
+ """
+
+ # If user did not specify any scores, do not sum across scores
+ if len(scores) == 0:
+ scores = [[]]
+ # Sum across any scores specified by the user
+ else:
+ scores = [[score] for score in scores]
+
+ # If user did not specify any nuclides, do not sum across nuclides
+ if len(nuclides) == 0:
+ nuclides = [[]]
+ # Sum across any nuclides specified by the user
+ else:
+ nuclides = [[nuclide] for nuclide in nuclides]
+
+ # Sum across any filter bins specified by the user
+ if filter_type in _FILTER_TYPES:
+ filter_bins = [[(filter_bin,)] for filter_bin in filter_bins]
+ filters = [[filter_type]]
+ # If user did not specify a filter type, do not sum across filter bins
+ else:
+ filter_bins = [[]]
+ filters = [[]]
+
+ # Initialize Tally sum
+ tally_sum = 0
+
+ # Iterate over all Tally slice operands in summation
+ prod = [scores, filters, filter_bins, nuclides]
+ summed_filters = defaultdict(list)
+ for scores, filters, filter_bins, nuclides in itertools.product(*prod):
+ tally_slice = self.get_slice(scores, filters, filter_bins, nuclides)
+
+ # Remove filters summed across to avoid bulky CrossFilters
+ if filter_type:
+ filter = tally_slice.find_filter(filter_type)
+ tally_slice.remove_filter(filter)
+ summed_filters[filter_type].append(filter)
+
+ # Accumulate this Tally slice into the Tally sum
+ tally_sum += tally_slice
+
+ # Add back the filter(s) which were summed across to derived tally
+ for filter_type in summed_filters:
+ filters = summed_filters[filter_type]
+ for i in range(1, len(filters)):
+ filters[i] = CrossFilter(filters[i-1], filters[i], '+')
+ tally_sum.add_filter(filters[-1])
+
+ return tally_sum
+
+ def diagonalize_filter(self, new_filter):
+ """Diagonalize the tally data array along a new axis of filter bins.
+
+ This is a helper method for the tally arithmetic methods. This method
+ adds the new filter to a derived tally constructed copied from this one.
+ The data in the derived tally arrays is "diagonalized" along the bins in
+ the new filter. This functionality is used by the openmc.mgxs module; to
+ transport-correct scattering matrices by subtracting a 'scatter-P1'
+ reaction rate tally with an energy filter from an 'scatter' reaction
+ rate tally with both energy and energyout filters.
+
+ Parameters
+ ----------
+ new_filter : Filter
+ The filter along which to diagonalize the data in the new
+
+ Returns
+ -------
+ Tally
+ A new derived Tally with data diagaonalized along the new filter.
+
+ """
+
+ cv.check_type('new_filter', new_filter, Filter)
+
+ if new_filter in self.filters:
+ msg = 'Unable to diagonalize Tally ID="{0}" which already ' \
+ 'contains a "{1}" filter'.format(self.id, new_filter.type)
+ raise ValueError(msg)
+
+ # Add the new filter to a copy of this Tally
+ new_tally = copy.deepcopy(self)
+ new_tally.add_filter(new_filter)
+
+ # Determine the shape of data in the new diagonalized Tally
+ num_filter_bins = new_tally.num_filter_bins
+ num_nuclides = new_tally.num_nuclides
+ num_score_bins = new_tally.num_score_bins
+ new_shape = (num_filter_bins, num_nuclides, num_score_bins)
+
+ # Determine "base" indices along the new "diagonal", and the factor
+ # by which the "base" indices should be repeated to account for all
+ # other filter bins in the diagonalized tally
+ indices = np.arange(0, new_filter.num_bins**2, new_filter.num_bins+1)
+ diag_factor = int(self.num_filter_bins / new_filter.num_bins)
+ diag_indices = np.zeros(self.num_filter_bins, dtype=np.int)
+
+ # Determine the filter indices along the new "diagonal"
+ for i in range(diag_factor):
+ start = i * new_filter.num_bins
+ end = (i+1) * new_filter.num_bins
+ diag_indices[start:end] = indices + (i * new_filter.num_bins**2)
+
+ # Inject this Tally's data along the diagonal of the diagonalized Tally
+ if self.sum is not None:
+ new_tally._sum = np.zeros(new_shape, dtype=np.float64)
+ new_tally._sum[diag_indices, :, :] = self.sum
+ if self.sum_sq is not None:
+ new_tally._sum_sq = np.zeros(new_shape, dtype=np.float64)
+ new_tally._sum_sq[diag_indices, :, :] = self.sum_sq
+ if self.mean is not None:
+ new_tally._mean = np.zeros(new_shape, dtype=np.float64)
+ new_tally._mean[diag_indices, :, :] = self.mean
+ if self.std_dev is not None:
+ new_tally._std_dev = np.zeros(new_shape, dtype=np.float64)
+ new_tally._std_dev[diag_indices, :, :] = self.std_dev
# Correct each Filter's stride
stride = new_tally.num_nuclides * new_tally.num_score_bins
@@ -2286,6 +2586,14 @@ class TalliesFile(object):
self._meshes = []
self._tallies_file = ET.Element("tallies")
+ @property
+ def tallies(self):
+ return self._tallies
+
+ @property
+ def meshes(self):
+ return self._meshes
+
def add_tally(self, tally, merge=False):
"""Add a tally to the file
@@ -2293,6 +2601,7 @@ class TalliesFile(object):
----------
tally : Tally
Tally to add to file
+
merge : bool
Indicate whether the tally should be merged with an existing tally,
if possible. Defaults to False.
@@ -2406,6 +2715,9 @@ class TalliesFile(object):
"""
+ # Reset xml element tree
+ self._tallies_file.clear()
+
self._create_mesh_subelements()
self._create_tally_subelements()
diff --git a/openmc/trigger.py b/openmc/trigger.py
index e695defde..bcac8c31c 100644
--- a/openmc/trigger.py
+++ b/openmc/trigger.py
@@ -58,6 +58,22 @@ class Trigger(object):
else:
return existing
+ def __eq__(self, other):
+ if str(self) == str(other):
+ return True
+ else:
+ return False
+
+ def __ne__(self, other):
+ return not self == other
+
+ def __repr__(self):
+ string = 'Trigger\n'
+ string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self._trigger_type)
+ string += '{0: <16}{1}{2}\n'.format('\tThreshold', '=\t', self._threshold)
+ string += '{0: <16}{1}{2}\n'.format('\tScores', '=\t', self._scores)
+ return string
+
@property
def trigger_type(self):
return self._trigger_type
@@ -102,13 +118,6 @@ class Trigger(object):
else:
self._scores.append(score)
- def __repr__(self):
- string = 'Trigger\n'
- string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self._trigger_type)
- string += '{0: <16}{1}{2}\n'.format('\tThreshold', '=\t', self._threshold)
- string += '{0: <16}{1}{2}\n'.format('\tScores', '=\t', self._scores)
- return string
-
def get_trigger_xml(self, element):
"""Return XML representation of the trigger
diff --git a/openmc/universe.py b/openmc/universe.py
index e9f7f3284..cd12405b2 100644
--- a/openmc/universe.py
+++ b/openmc/universe.py
@@ -73,6 +73,30 @@ class Cell(object):
self._translation = None
self._offsets = None
+ def __repr__(self):
+ string = 'Cell\n'
+ string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id)
+ string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name)
+
+ if isinstance(self._fill, openmc.Material):
+ string += '{0: <16}{1}{2}\n'.format('\tMaterial', '=\t',
+ self._fill._id)
+ elif isinstance(self._fill, (Universe, Lattice)):
+ string += '{0: <16}{1}{2}\n'.format('\tFill', '=\t',
+ self._fill._id)
+ else:
+ string += '{0: <16}{1}{2}\n'.format('\tFill', '=\t', self._fill)
+
+ string += '{0: <16}{1}{2}\n'.format('\tRegion', '=\t', self._region)
+
+ string += '{0: <16}{1}{2}\n'.format('\tRotation', '=\t',
+ self._rotation)
+ string += '{0: <16}{1}{2}\n'.format('\tTranslation', '=\t',
+ self._translation)
+ string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self._offsets)
+
+ return string
+
@property
def id(self):
return self._id
@@ -120,7 +144,7 @@ class Cell(object):
AUTO_CELL_ID += 1
else:
cv.check_type('cell ID', cell_id, Integral)
- cv.check_greater_than('cell ID', cell_id, 0)
+ cv.check_greater_than('cell ID', cell_id, 0, equality=True)
self._id = cell_id
@name.setter
@@ -251,7 +275,7 @@ class Cell(object):
"""
- nuclides = {}
+ nuclides = OrderedDict()
if self._type != 'void':
nuclides.update(self._fill.get_all_nuclides())
@@ -269,13 +293,34 @@ class Cell(object):
"""
- cells = {}
+ cells = OrderedDict()
if self._type == 'fill' or self._type == 'lattice':
cells.update(self._fill.get_all_cells())
return cells
+ def get_all_materials(self):
+ """Return all materials that are contained within the cell
+
+ Returns
+ -------
+ materials : dict
+ Dictionary whose keys are material IDs and values are Material instances
+
+ """
+
+ materials = OrderedDict()
+ if self.fill_type == 'material':
+ materials[self.fill.id] = self.fill
+
+ # Append all Cells in each Cell in the Universe to the dictionary
+ cells = self.get_all_cells()
+ for cell_id, cell in cells.items():
+ materials.update(cell.get_all_materials())
+
+ return materials
+
def get_all_universes(self):
"""Return all universes that are contained within this one if any of
its cells are filled with a universe or lattice.
@@ -288,7 +333,7 @@ class Cell(object):
"""
- universes = {}
+ universes = OrderedDict()
if self._type == 'fill':
universes[self._fill._id] = self._fill
@@ -298,30 +343,6 @@ class Cell(object):
return universes
- def __repr__(self):
- string = 'Cell\n'
- string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id)
- string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name)
-
- if isinstance(self._fill, openmc.Material):
- string += '{0: <16}{1}{2}\n'.format('\tMaterial', '=\t',
- self._fill._id)
- elif isinstance(self._fill, (Universe, Lattice)):
- string += '{0: <16}{1}{2}\n'.format('\tFill', '=\t',
- self._fill._id)
- else:
- string += '{0: <16}{1}{2}\n'.format('\tFill', '=\t', self._fill)
-
- string += '{0: <16}{1}{2}\n'.format('\tRegion', '=\t', self._region)
-
- string += '{0: <16}{1}{2}\n'.format('\tRotation', '=\t',
- self._rotation)
- string += '{0: <16}{1}{2}\n'.format('\tTranslation', '=\t',
- self._translation)
- string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self._offsets)
-
- return string
-
def create_xml_subelement(self, xml_element):
element = ET.Element("cell")
element.set("id", str(self._id))
@@ -415,7 +436,7 @@ class Universe(object):
# Keys - Cell IDs
# Values - Cells
- self._cells = {}
+ self._cells = OrderedDict()
# Keys - Cell IDs
# Values - Offsets
@@ -442,7 +463,7 @@ class Universe(object):
AUTO_UNIVERSE_ID += 1
else:
cv.check_type('universe ID', universe_id, Integral)
- cv.check_greater_than('universe ID', universe_id, 0, True)
+ cv.check_greater_than('universe ID', universe_id, 0, equality=True)
self._id = universe_id
@name.setter
@@ -541,7 +562,7 @@ class Universe(object):
"""
- nuclides = {}
+ nuclides = OrderedDict()
# Append all Nuclides in each Cell in the Universe to the dictionary
for cell_id, cell in self._cells.items():
@@ -559,7 +580,7 @@ class Universe(object):
"""
- cells = {}
+ cells = OrderedDict()
# Add this Universe's cells to the dictionary
cells.update(self._cells)
@@ -570,6 +591,25 @@ class Universe(object):
return cells
+ def get_all_materials(self):
+ """Return all materials that are contained within the universe
+
+ Returns
+ -------
+ materials : dict
+ Dictionary whose keys are material IDs and values are Material instances
+
+ """
+
+ materials = OrderedDict()
+
+ # Append all Cells in each Cell in the Universe to the dictionary
+ cells = self.get_all_cells()
+ for cell_id, cell in cells.items():
+ materials.update(cell.get_all_materials())
+
+ return materials
+
def get_all_universes(self):
"""Return all universes that are contained within this one.
@@ -584,7 +624,7 @@ class Universe(object):
# Get all Cells in this Universe
cells = self.get_all_cells()
- universes = {}
+ universes = OrderedDict()
# Append all Universes containing each Cell to the dictionary
for cell_id, cell in cells.items():
@@ -603,6 +643,7 @@ class Universe(object):
return string
def create_xml_subelement(self, xml_element):
+
# Iterate over all Cells
for cell_id, cell in self._cells.items():
@@ -684,7 +725,7 @@ class Lattice(object):
AUTO_UNIVERSE_ID += 1
else:
cv.check_type('lattice ID', lattice_id, Integral)
- cv.check_greater_than('lattice ID', lattice_id, 0)
+ cv.check_greater_than('lattice ID', lattice_id, 0, equality=True)
self._id = lattice_id
@name.setter
@@ -717,7 +758,7 @@ class Lattice(object):
"""
- univs = dict()
+ univs = OrderedDict()
for k in range(len(self._universes)):
for j in range(len(self._universes[k])):
if isinstance(self._universes[k][j], Universe):
@@ -745,7 +786,7 @@ class Lattice(object):
"""
- nuclides = {}
+ nuclides = OrderedDict()
# Get all unique Universes contained in each of the lattice cells
unique_universes = self.get_unique_universes()
@@ -766,7 +807,7 @@ class Lattice(object):
"""
- cells = {}
+ cells = OrderedDict()
unique_universes = self.get_unique_universes()
for universe_id, universe in unique_universes.items():
@@ -774,6 +815,25 @@ class Lattice(object):
return cells
+ def get_all_materials(self):
+ """Return all materials that are contained within the lattice
+
+ Returns
+ -------
+ materials : dict
+ Dictionary whose keys are material IDs and values are Material instances
+
+ """
+
+ materials = OrderedDict()
+
+ # Append all Cells in each Cell in the Universe to the dictionary
+ cells = self.get_all_cells()
+ for cell_id, cell in cells.items():
+ materials.update(cell.get_all_materials())
+
+ return materials
+
def get_all_universes(self):
"""Return all universes that are contained within the lattice
@@ -787,7 +847,7 @@ class Lattice(object):
# Initialize a dictionary of all Universes contained by the Lattice
# in each nested Universe level
- all_universes = {}
+ all_universes = OrderedDict()
# Get all unique Universes contained in each of the lattice cells
unique_universes = self.get_unique_universes()
@@ -836,6 +896,50 @@ class RectLattice(Lattice):
self._lower_left = None
self._offsets = None
+ def __repr__(self):
+ string = 'RectLattice\n'
+ string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id)
+ string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name)
+ string += '{0: <16}{1}{2}\n'.format('\tDimension', '=\t',
+ self._dimension)
+ string += '{0: <16}{1}{2}\n'.format('\tLower Left', '=\t',
+ self._lower_left)
+ string += '{0: <16}{1}{2}\n'.format('\tPitch', '=\t', self._pitch)
+
+ if self._outer is not None:
+ string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t',
+ self._outer._id)
+ else:
+ string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t',
+ self._outer)
+
+ string += '{0: <16}\n'.format('\tUniverses')
+
+ # Lattice nested Universe IDs - column major for Fortran
+ for i, universe in enumerate(np.ravel(self._universes)):
+ string += '{0} '.format(universe._id)
+
+ # Add a newline character every time we reach end of row of cells
+ if (i+1) % self._dimension[-1] == 0:
+ string += '\n'
+
+ string = string.rstrip('\n')
+
+ if self._offsets is not None:
+ string += '{0: <16}\n'.format('\tOffsets')
+
+ # Lattice cell offsets
+ for i, offset in enumerate(np.ravel(self._offsets)):
+ string += '{0} '.format(offset)
+
+ # Add a newline character when we reach end of row of cells
+ if (i+1) % self._dimension[-1] == 0:
+ string += '\n'
+
+ string = string.rstrip('\n')
+
+ return string
+
@property
def dimension(self):
return self._dimension
@@ -893,51 +997,8 @@ class RectLattice(Lattice):
return offset
- def __repr__(self):
- string = 'RectLattice\n'
- string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id)
- string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name)
- string += '{0: <16}{1}{2}\n'.format('\tDimension', '=\t',
- self._dimension)
- string += '{0: <16}{1}{2}\n'.format('\tLower Left', '=\t',
- self._lower_left)
- string += '{0: <16}{1}{2}\n'.format('\tPitch', '=\t', self._pitch)
-
- if self._outer is not None:
- string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t',
- self._outer._id)
- else:
- string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t',
- self._outer)
-
- string += '{0: <16}\n'.format('\tUniverses')
-
- # Lattice nested Universe IDs - column major for Fortran
- for i, universe in enumerate(np.ravel(self._universes)):
- string += '{0} '.format(universe._id)
-
- # Add a newline character every time we reach end of row of cells
- if (i+1) % self._dimension[-1] == 0:
- string += '\n'
-
- string = string.rstrip('\n')
-
- if self._offsets is not None:
- string += '{0: <16}\n'.format('\tOffsets')
-
- # Lattice cell offsets
- for i, offset in enumerate(np.ravel(self._offsets)):
- string += '{0} '.format(offset)
-
- # Add a newline character when we reach end of row of cells
- if (i+1) % self._dimension[-1] == 0:
- string += '\n'
-
- string = string.rstrip('\n')
-
- return string
-
def create_xml_subelement(self, xml_element):
+
# Determine if XML element already contains subelement for this Lattice
path = './lattice[@id=\'{0}\']'.format(self._id)
test = xml_element.find(path)
@@ -1052,6 +1113,34 @@ class HexLattice(Lattice):
self._num_axial = None
self._center = None
+ def __repr__(self):
+ string = 'HexLattice\n'
+ string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id)
+ string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name)
+ string += '{0: <16}{1}{2}\n'.format('\t# Rings', '=\t', self._num_rings)
+ string += '{0: <16}{1}{2}\n'.format('\t# Axial', '=\t', self._num_axial)
+ string += '{0: <16}{1}{2}\n'.format('\tCenter', '=\t',
+ self._center)
+ string += '{0: <16}{1}{2}\n'.format('\tPitch', '=\t', self._pitch)
+
+ if self._outer is not None:
+ string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t',
+ self._outer._id)
+ else:
+ string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t',
+ self._outer)
+
+ string += '{0: <16}\n'.format('\tUniverses')
+
+ if self._num_axial is not None:
+ slices = [self._repr_axial_slice(x) for x in self._universes]
+ string += '\n'.join(slices)
+
+ else:
+ string += self._repr_axial_slice(self._universes)
+
+ return string
+
@property
def num_rings(self):
return self._num_rings
@@ -1172,34 +1261,6 @@ class HexLattice(Lattice):
6*(self._num_rings - 1 - r))
raise ValueError(msg)
- def __repr__(self):
- string = 'HexLattice\n'
- string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id)
- string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name)
- string += '{0: <16}{1}{2}\n'.format('\t# Rings', '=\t', self._num_rings)
- string += '{0: <16}{1}{2}\n'.format('\t# Axial', '=\t', self._num_axial)
- string += '{0: <16}{1}{2}\n'.format('\tCenter', '=\t',
- self._center)
- string += '{0: <16}{1}{2}\n'.format('\tPitch', '=\t', self._pitch)
-
- if self._outer is not None:
- string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t',
- self._outer._id)
- else:
- string += '{0: <16}{1}{2}\n'.format('\tOuter', '=\t',
- self._outer)
-
- string += '{0: <16}\n'.format('\tUniverses')
-
- if self._num_axial is not None:
- slices = [self._repr_axial_slice(x) for x in self._universes]
- string += '\n'.join(slices)
-
- else:
- string += self._repr_axial_slice(self._universes)
-
- return string
-
def create_xml_subelement(self, xml_element):
# Determine if XML element already contains subelement for this Lattice
path = './hex_lattice[@id=\'{0}\']'.format(self._id)
diff --git a/setup.py b/setup.py
index 3273f1db7..0c3d5c116 100644
--- a/setup.py
+++ b/setup.py
@@ -11,7 +11,7 @@ except ImportError:
kwargs = {'name': 'openmc',
'version': '0.7.0',
- 'packages': ['openmc'],
+ 'packages': ['openmc', 'openmc.mgxs'],
'scripts': glob.glob('scripts/openmc-*'),
# Metadata
diff --git a/tests/test_mgxs_library_condense/inputs_true.dat b/tests/test_mgxs_library_condense/inputs_true.dat
new file mode 100644
index 000000000..f681e5ff7
--- /dev/null
+++ b/tests/test_mgxs_library_condense/inputs_true.dat
@@ -0,0 +1 @@
+7e5c0de6e50c494abeea443d74606db809d74ce8bb2571eb4e1c98b3c9a33885b0aef2a4a82b6f95a1725b078d4a5ff01f68e1cc72addbd2d6bd0fb8251ad2e7
\ No newline at end of file
diff --git a/tests/test_mgxs_library_condense/results_true.dat b/tests/test_mgxs_library_condense/results_true.dat
new file mode 100644
index 000000000..9549f16c8
--- /dev/null
+++ b/tests/test_mgxs_library_condense/results_true.dat
@@ -0,0 +1,49 @@
+ material group in nuclide mean std. dev.
+0 1 1 total 0.419289 0.01638 material group in nuclide mean std. dev.
+0 1 1 total 0.07774 0.003273 material group in group out nuclide mean std. dev.
+0 1 1 1 total 0.352665 0.015654 material group out nuclide mean std. dev.
+0 1 1 total 1 0.119622 material group in nuclide mean std. dev.
+0 2 1 total 0.247316 0.009562 material group in nuclide mean std. dev.
+0 2 1 total 0 0 material group in group out nuclide mean std. dev.
+0 2 1 1 total 0.244838 0.009996 material group out nuclide mean std. dev.
+0 2 1 total 0 0 material group in nuclide mean std. dev.
+0 3 1 total 0.409938 0.042262 material group in nuclide mean std. dev.
+0 3 1 total 0 0 material group in group out nuclide mean std. dev.
+0 3 1 1 total 0.403354 0.041386 material group out nuclide mean std. dev.
+0 3 1 total 0 0 material group in nuclide mean std. dev.
+0 4 1 total 0.344007 0.05352 material group in nuclide mean std. dev.
+0 4 1 total 0 0 material group in group out nuclide mean std. dev.
+0 4 1 1 total 0.340438 0.052067 material group out nuclide mean std. dev.
+0 4 1 total 0 0 material group in nuclide mean std. dev.
+0 5 1 total 0 0 material group in nuclide mean std. dev.
+0 5 1 total 0 0 material group in group out nuclide mean std. dev.
+0 5 1 1 total 0 0 material group out nuclide mean std. dev.
+0 5 1 total 0 0 material group in nuclide mean std. dev.
+0 6 1 total 0 0 material group in nuclide mean std. dev.
+0 6 1 total 0 0 material group in group out nuclide mean std. dev.
+0 6 1 1 total 0 0 material group out nuclide mean std. dev.
+0 6 1 total 0 0 material group in nuclide mean std. dev.
+0 7 1 total 0 0 material group in nuclide mean std. dev.
+0 7 1 total 0 0 material group in group out nuclide mean std. dev.
+0 7 1 1 total 0 0 material group out nuclide mean std. dev.
+0 7 1 total 0 0 material group in nuclide mean std. dev.
+0 8 1 total 0 0 material group in nuclide mean std. dev.
+0 8 1 total 0 0 material group in group out nuclide mean std. dev.
+0 8 1 1 total 0 0 material group out nuclide mean std. dev.
+0 8 1 total 0 0 material group in nuclide mean std. dev.
+0 9 1 total 0.751873 0.559701 material group in nuclide mean std. dev.
+0 9 1 total 0 0 material group in group out nuclide mean std. dev.
+0 9 1 1 total 0.695491 0.50757 material group out nuclide mean std. dev.
+0 9 1 total 0 0 material group in nuclide mean std. dev.
+0 10 1 total 0 0 material group in nuclide mean std. dev.
+0 10 1 total 0 0 material group in group out nuclide mean std. dev.
+0 10 1 1 total 0 0 material group out nuclide mean std. dev.
+0 10 1 total 0 0 material group in nuclide mean std. dev.
+0 11 1 total 0.457329 0.403578 material group in nuclide mean std. dev.
+0 11 1 total 0 0 material group in group out nuclide mean std. dev.
+0 11 1 1 total 0.446737 0.392775 material group out nuclide mean std. dev.
+0 11 1 total 0 0 material group in nuclide mean std. dev.
+0 12 1 total 0.574978 0.38864 material group in nuclide mean std. dev.
+0 12 1 total 0 0 material group in group out nuclide mean std. dev.
+0 12 1 1 total 0.559478 0.377512 material group out nuclide mean std. dev.
+0 12 1 total 0 0
\ No newline at end of file
diff --git a/tests/test_mgxs_library_condense/test_mgxs_library_condense.py b/tests/test_mgxs_library_condense/test_mgxs_library_condense.py
new file mode 100644
index 000000000..4c84de2bf
--- /dev/null
+++ b/tests/test_mgxs_library_condense/test_mgxs_library_condense.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+
+import os
+import sys
+import glob
+import hashlib
+sys.path.insert(0, os.pardir)
+from testing_harness import PyAPITestHarness
+import openmc
+import openmc.mgxs
+
+
+class MGXSTestHarness(PyAPITestHarness):
+ def _build_inputs(self):
+
+ # The openmc.mgxs module needs a summary.h5 file
+ self._input_set.settings.output = {'summary': True}
+
+ # Generate inputs using parent class routine
+ super(MGXSTestHarness, self)._build_inputs()
+
+ # Initialize a two-group structure
+ energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, 20.])
+
+ # Initialize MGXS Library for a few cross section types
+ self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry.geometry)
+ self.mgxs_lib.by_nuclide = False
+ self.mgxs_lib.mgxs_types = ['transport', 'nu-fission',
+ 'nu-scatter matrix', 'chi']
+ self.mgxs_lib.energy_groups = energy_groups
+ self.mgxs_lib.domain_type = 'material'
+ self.mgxs_lib.build_library()
+
+ # Initialize a tallies file
+ self._input_set.tallies = openmc.TalliesFile()
+ self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False)
+ self._input_set.tallies.export_to_xml()
+
+ def _get_results(self, hash_output=False):
+ """Digest info in the statepoint and return as a string."""
+
+ # Read the statepoint file.
+ statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0]
+ sp = openmc.StatePoint(statepoint)
+
+ # Read the summary file.
+ summary = glob.glob(os.path.join(os.getcwd(), 'summary.h5'))[0]
+ su = openmc.Summary(summary)
+ sp.link_with_summary(su)
+
+ # Load the MGXS library from the statepoint
+ self.mgxs_lib.load_from_statepoint(sp)
+
+ # Build a condensed 1-group MGXS Library
+ one_group = openmc.mgxs.EnergyGroups([0., 20.])
+ condense_lib = self.mgxs_lib.get_condensed_library(one_group)
+
+ # Build a string from Pandas Dataframe for each 1-group MGXS
+ outstr = ''
+ for domain in condense_lib.domains:
+ for mgxs_type in condense_lib.mgxs_types:
+ mgxs = condense_lib.get_mgxs(domain, mgxs_type)
+ df = mgxs.get_pandas_dataframe()
+ outstr += df.to_string()
+
+ print(outstr)
+
+ # Hash the results if necessary
+ if hash_output:
+ sha512 = hashlib.sha512()
+ sha512.update(outstr.encode('utf-8'))
+ outstr = sha512.hexdigest()
+
+ return outstr
+
+
+ def _cleanup(self):
+ super(MGXSTestHarness, self)._cleanup()
+ f = os.path.join(os.getcwd(), 'tallies.xml')
+ if os.path.exists(f): os.remove(f)
+
+
+if __name__ == '__main__':
+ harness = MGXSTestHarness('statepoint.10.*', True)
+ harness.main()
diff --git a/tests/test_mgxs_library_hdf5/inputs_true.dat b/tests/test_mgxs_library_hdf5/inputs_true.dat
new file mode 100644
index 000000000..f681e5ff7
--- /dev/null
+++ b/tests/test_mgxs_library_hdf5/inputs_true.dat
@@ -0,0 +1 @@
+7e5c0de6e50c494abeea443d74606db809d74ce8bb2571eb4e1c98b3c9a33885b0aef2a4a82b6f95a1725b078d4a5ff01f68e1cc72addbd2d6bd0fb8251ad2e7
\ No newline at end of file
diff --git a/tests/test_mgxs_library_hdf5/results_true.dat b/tests/test_mgxs_library_hdf5/results_true.dat
new file mode 100644
index 000000000..eec581046
--- /dev/null
+++ b/tests/test_mgxs_library_hdf5/results_true.dat
@@ -0,0 +1,168 @@
+domain=1 type=transport
+[ 0.38437891 0.81208747]
+[ 0.01648997 0.07418959]
+domain=1 type=nu-fission
+[ 0.02127008 0.69604034]
+[ 0.0008939 0.05345764]
+domain=1 type=nu-scatter matrix
+[[ 3.49923892e-01 1.73140769e-04]
+ [ 1.94810926e-03 3.79607212e-01]]
+[[ 0.01664928 0.0001732 ]
+ [ 0.00195193 0.04007819]]
+domain=1 type=chi
+[ 1. 0.]
+[ 0.11962178 0. ]
+domain=2 type=transport
+[ 0.24504295 0.26645769]
+[ 0.00882749 0.05220872]
+domain=2 type=nu-fission
+[ 0. 0.]
+[ 0. 0.]
+domain=2 type=nu-scatter matrix
+[[ 0.24365718 0. ]
+ [ 0. 0.25478661]]
+[[ 0.00908307 0. ]
+ [ 0. 0.05556256]]
+domain=2 type=chi
+[ 0. 0.]
+[ 0. 0.]
+domain=3 type=transport
+[ 0.28227749 1.42731974]
+[ 0.03724175 0.24712746]
+domain=3 type=nu-fission
+[ 0. 0.]
+[ 0. 0.]
+domain=3 type=nu-scatter matrix
+[[ 0.25396726 0.02727268]
+ [ 0. 1.37652669]]
+[[ 0.03617307 0.00180698]
+ [ 0. 0.2402569 ]]
+domain=3 type=chi
+[ 0. 0.]
+[ 0. 0.]
+domain=4 type=transport
+[ 0.25572316 1.17976682]
+[ 0.05191655 0.22938034]
+domain=4 type=nu-fission
+[ 0. 0.]
+[ 0. 0.]
+domain=4 type=nu-scatter matrix
+[[ 0.23297756 0.02228141]
+ [ 0. 1.14680862]]
+[[ 0.04977114 0.00262525]
+ [ 0. 0.22219839]]
+domain=4 type=chi
+[ 0. 0.]
+[ 0. 0.]
+domain=5 type=transport
+[ 0. 0.]
+[ 0. 0.]
+domain=5 type=nu-fission
+[ 0. 0.]
+[ 0. 0.]
+domain=5 type=nu-scatter matrix
+[[ 0. 0.]
+ [ 0. 0.]]
+[[ 0. 0.]
+ [ 0. 0.]]
+domain=5 type=chi
+[ 0. 0.]
+[ 0. 0.]
+domain=6 type=transport
+[ 0. 0.]
+[ 0. 0.]
+domain=6 type=nu-fission
+[ 0. 0.]
+[ 0. 0.]
+domain=6 type=nu-scatter matrix
+[[ 0. 0.]
+ [ 0. 0.]]
+[[ 0. 0.]
+ [ 0. 0.]]
+domain=6 type=chi
+[ 0. 0.]
+[ 0. 0.]
+domain=7 type=transport
+[ 0. 0.]
+[ 0. 0.]
+domain=7 type=nu-fission
+[ 0. 0.]
+[ 0. 0.]
+domain=7 type=nu-scatter matrix
+[[ 0. 0.]
+ [ 0. 0.]]
+[[ 0. 0.]
+ [ 0. 0.]]
+domain=7 type=chi
+[ 0. 0.]
+[ 0. 0.]
+domain=8 type=transport
+[ 0. 0.]
+[ 0. 0.]
+domain=8 type=nu-fission
+[ 0. 0.]
+[ 0. 0.]
+domain=8 type=nu-scatter matrix
+[[ 0. 0.]
+ [ 0. 0.]]
+[[ 0. 0.]
+ [ 0. 0.]]
+domain=8 type=chi
+[ 0. 0.]
+[ 0. 0.]
+domain=9 type=transport
+[ 0.50403601 1.68709544]
+[ 0.37962374 2.53662237]
+domain=9 type=nu-fission
+[ 0. 0.]
+[ 0. 0.]
+domain=9 type=nu-scatter matrix
+[[ 0.50403601 0. ]
+ [ 0. 1.41795483]]
+[[ 0.37962374 0. ]
+ [ 0. 2.15802716]]
+domain=9 type=chi
+[ 0. 0.]
+[ 0. 0.]
+domain=10 type=transport
+[ 0. 0.]
+[ 0. 0.]
+domain=10 type=nu-fission
+[ 0. 0.]
+[ 0. 0.]
+domain=10 type=nu-scatter matrix
+[[ 0. 0.]
+ [ 0. 0.]]
+[[ 0. 0.]
+ [ 0. 0.]]
+domain=10 type=chi
+[ 0. 0.]
+[ 0. 0.]
+domain=11 type=transport
+[ 0.30282618 1.00614519]
+[ 0.40131081 1.09163785]
+domain=11 type=nu-fission
+[ 0. 0.]
+[ 0. 0.]
+domain=11 type=nu-scatter matrix
+[[ 0.27567871 0.02714747]
+ [ 0. 0.95792921]]
+[[ 0.38567601 0.02000859]
+ [ 0. 1.05195936]]
+domain=11 type=chi
+[ 0. 0.]
+[ 0. 0.]
+domain=12 type=transport
+[ 0.25593293 1.11334475]
+[ 0.26842571 0.98867569]
+domain=12 type=nu-fission
+[ 0. 0.]
+[ 0. 0.]
+domain=12 type=nu-scatter matrix
+[[ 0.22631045 0.02962248]
+ [ 0. 1.07168976]]
+[[ 0.25487194 0.0177599 ]
+ [ 0. 0.95829029]]
+domain=12 type=chi
+[ 0. 0.]
+[ 0. 0.]
diff --git a/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py b/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py
new file mode 100644
index 000000000..642073104
--- /dev/null
+++ b/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+
+import os
+import sys
+import glob
+import hashlib
+import h5py
+sys.path.insert(0, os.pardir)
+from testing_harness import PyAPITestHarness
+import openmc
+import openmc.mgxs
+
+
+class MGXSTestHarness(PyAPITestHarness):
+ def _build_inputs(self):
+
+ # The openmc.mgxs module needs a summary.h5 file
+ self._input_set.settings.output = {'summary': True}
+
+ # Generate inputs using parent class routine
+ super(MGXSTestHarness, self)._build_inputs()
+
+ # Initialize a two-group structure
+ energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, 20.])
+
+ # Initialize MGXS Library for a few cross section types
+ self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry.geometry)
+ self.mgxs_lib.by_nuclide = False
+ self.mgxs_lib.mgxs_types = ['transport', 'nu-fission',
+ 'nu-scatter matrix', 'chi']
+ self.mgxs_lib.energy_groups = energy_groups
+ self.mgxs_lib.domain_type = 'material'
+ self.mgxs_lib.build_library()
+
+ # Initialize a tallies file
+ self._input_set.tallies = openmc.TalliesFile()
+ self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False)
+ self._input_set.tallies.export_to_xml()
+
+ def _get_results(self, hash_output=False):
+ """Digest info in the statepoint and return as a string."""
+
+ # Read the statepoint file.
+ statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0]
+ sp = openmc.StatePoint(statepoint)
+
+ # Read the summary file.
+ summary = glob.glob(os.path.join(os.getcwd(), 'summary.h5'))[0]
+ su = openmc.Summary(summary)
+ sp.link_with_summary(su)
+
+ # Load the MGXS library from the statepoint
+ self.mgxs_lib.load_from_statepoint(sp)
+
+ # Export the MGXS Library to an HDF5 file
+ self.mgxs_lib.build_hdf5_store(directory='.')
+
+ # Open the MGXS HDF5 file
+ f = h5py.File('mgxs.h5', 'r')
+
+ # Build a string from the datasets in the HDF5 file
+ outstr = ''
+ for domain in self.mgxs_lib.domains:
+ for mgxs_type in self.mgxs_lib.mgxs_types:
+ outstr += 'domain={0} type={1}\n'.format(domain.id, mgxs_type)
+ key = 'material/{0}/{1}/average'.format(domain.id, mgxs_type)
+ outstr += str(f[key][...]) + '\n'
+ key = 'material/{0}/{1}/std. dev.'.format(domain.id, mgxs_type)
+ outstr += str(f[key][...]) + '\n'
+
+ # Close the MGXS HDF5 file
+ f.close()
+
+ # Hash the results if necessary
+ if hash_output:
+ sha512 = hashlib.sha512()
+ sha512.update(outstr.encode('utf-8'))
+ outstr = sha512.hexdigest()
+
+ return outstr
+
+
+ def _cleanup(self):
+ super(MGXSTestHarness, self)._cleanup()
+ f = os.path.join(os.getcwd(), 'tallies.xml')
+ if os.path.exists(f): os.remove(f)
+ f = os.path.join(os.getcwd(), 'mgxs.h5')
+ if os.path.exists(f): os.remove(f)
+
+
+if __name__ == '__main__':
+ harness = MGXSTestHarness('statepoint.10.*', True)
+ harness.main()
diff --git a/tests/test_mgxs_library_no_nuclides/inputs_true.dat b/tests/test_mgxs_library_no_nuclides/inputs_true.dat
new file mode 100644
index 000000000..f681e5ff7
--- /dev/null
+++ b/tests/test_mgxs_library_no_nuclides/inputs_true.dat
@@ -0,0 +1 @@
+7e5c0de6e50c494abeea443d74606db809d74ce8bb2571eb4e1c98b3c9a33885b0aef2a4a82b6f95a1725b078d4a5ff01f68e1cc72addbd2d6bd0fb8251ad2e7
\ No newline at end of file
diff --git a/tests/test_mgxs_library_no_nuclides/results_true.dat b/tests/test_mgxs_library_no_nuclides/results_true.dat
new file mode 100644
index 000000000..bbcb28375
--- /dev/null
+++ b/tests/test_mgxs_library_no_nuclides/results_true.dat
@@ -0,0 +1,121 @@
+ material group in nuclide mean std. dev.
+1 1 1 total 0.384379 0.01649
+0 1 2 total 0.812087 0.07419 material group in nuclide mean std. dev.
+1 1 1 total 0.02127 0.000894
+0 1 2 total 0.69604 0.053458 material group in group out nuclide mean std. dev.
+3 1 1 1 total 0.349924 0.016649
+2 1 1 2 total 0.000173 0.000173
+1 1 2 1 total 0.001948 0.001952
+0 1 2 2 total 0.379607 0.040078 material group out nuclide mean std. dev.
+1 1 1 total 1 0.119622
+0 1 2 total 0 0.000000 material group in nuclide mean std. dev.
+1 2 1 total 0.245043 0.008827
+0 2 2 total 0.266458 0.052209 material group in nuclide mean std. dev.
+1 2 1 total 0 0
+0 2 2 total 0 0 material group in group out nuclide mean std. dev.
+3 2 1 1 total 0.243657 0.009083
+2 2 1 2 total 0.000000 0.000000
+1 2 2 1 total 0.000000 0.000000
+0 2 2 2 total 0.254787 0.055563 material group out nuclide mean std. dev.
+1 2 1 total 0 0
+0 2 2 total 0 0 material group in nuclide mean std. dev.
+1 3 1 total 0.282277 0.037242
+0 3 2 total 1.427320 0.247127 material group in nuclide mean std. dev.
+1 3 1 total 0 0
+0 3 2 total 0 0 material group in group out nuclide mean std. dev.
+3 3 1 1 total 0.253967 0.036173
+2 3 1 2 total 0.027273 0.001807
+1 3 2 1 total 0.000000 0.000000
+0 3 2 2 total 1.376527 0.240257 material group out nuclide mean std. dev.
+1 3 1 total 0 0
+0 3 2 total 0 0 material group in nuclide mean std. dev.
+1 4 1 total 0.255723 0.051917
+0 4 2 total 1.179767 0.229380 material group in nuclide mean std. dev.
+1 4 1 total 0 0
+0 4 2 total 0 0 material group in group out nuclide mean std. dev.
+3 4 1 1 total 0.232978 0.049771
+2 4 1 2 total 0.022281 0.002625
+1 4 2 1 total 0.000000 0.000000
+0 4 2 2 total 1.146809 0.222198 material group out nuclide mean std. dev.
+1 4 1 total 0 0
+0 4 2 total 0 0 material group in nuclide mean std. dev.
+1 5 1 total 0 0
+0 5 2 total 0 0 material group in nuclide mean std. dev.
+1 5 1 total 0 0
+0 5 2 total 0 0 material group in group out nuclide mean std. dev.
+3 5 1 1 total 0 0
+2 5 1 2 total 0 0
+1 5 2 1 total 0 0
+0 5 2 2 total 0 0 material group out nuclide mean std. dev.
+1 5 1 total 0 0
+0 5 2 total 0 0 material group in nuclide mean std. dev.
+1 6 1 total 0 0
+0 6 2 total 0 0 material group in nuclide mean std. dev.
+1 6 1 total 0 0
+0 6 2 total 0 0 material group in group out nuclide mean std. dev.
+3 6 1 1 total 0 0
+2 6 1 2 total 0 0
+1 6 2 1 total 0 0
+0 6 2 2 total 0 0 material group out nuclide mean std. dev.
+1 6 1 total 0 0
+0 6 2 total 0 0 material group in nuclide mean std. dev.
+1 7 1 total 0 0
+0 7 2 total 0 0 material group in nuclide mean std. dev.
+1 7 1 total 0 0
+0 7 2 total 0 0 material group in group out nuclide mean std. dev.
+3 7 1 1 total 0 0
+2 7 1 2 total 0 0
+1 7 2 1 total 0 0
+0 7 2 2 total 0 0 material group out nuclide mean std. dev.
+1 7 1 total 0 0
+0 7 2 total 0 0 material group in nuclide mean std. dev.
+1 8 1 total 0 0
+0 8 2 total 0 0 material group in nuclide mean std. dev.
+1 8 1 total 0 0
+0 8 2 total 0 0 material group in group out nuclide mean std. dev.
+3 8 1 1 total 0 0
+2 8 1 2 total 0 0
+1 8 2 1 total 0 0
+0 8 2 2 total 0 0 material group out nuclide mean std. dev.
+1 8 1 total 0 0
+0 8 2 total 0 0 material group in nuclide mean std. dev.
+1 9 1 total 0.504036 0.379624
+0 9 2 total 1.687095 2.536622 material group in nuclide mean std. dev.
+1 9 1 total 0 0
+0 9 2 total 0 0 material group in group out nuclide mean std. dev.
+3 9 1 1 total 0.504036 0.379624
+2 9 1 2 total 0.000000 0.000000
+1 9 2 1 total 0.000000 0.000000
+0 9 2 2 total 1.417955 2.158027 material group out nuclide mean std. dev.
+1 9 1 total 0 0
+0 9 2 total 0 0 material group in nuclide mean std. dev.
+1 10 1 total 0 0
+0 10 2 total 0 0 material group in nuclide mean std. dev.
+1 10 1 total 0 0
+0 10 2 total 0 0 material group in group out nuclide mean std. dev.
+3 10 1 1 total 0 0
+2 10 1 2 total 0 0
+1 10 2 1 total 0 0
+0 10 2 2 total 0 0 material group out nuclide mean std. dev.
+1 10 1 total 0 0
+0 10 2 total 0 0 material group in nuclide mean std. dev.
+1 11 1 total 0.302826 0.401311
+0 11 2 total 1.006145 1.091638 material group in nuclide mean std. dev.
+1 11 1 total 0 0
+0 11 2 total 0 0 material group in group out nuclide mean std. dev.
+3 11 1 1 total 0.275679 0.385676
+2 11 1 2 total 0.027147 0.020009
+1 11 2 1 total 0.000000 0.000000
+0 11 2 2 total 0.957929 1.051959 material group out nuclide mean std. dev.
+1 11 1 total 0 0
+0 11 2 total 0 0 material group in nuclide mean std. dev.
+1 12 1 total 0.255933 0.268426
+0 12 2 total 1.113345 0.988676 material group in nuclide mean std. dev.
+1 12 1 total 0 0
+0 12 2 total 0 0 material group in group out nuclide mean std. dev.
+3 12 1 1 total 0.226310 0.254872
+2 12 1 2 total 0.029622 0.017760
+1 12 2 1 total 0.000000 0.000000
+0 12 2 2 total 1.071690 0.958290 material group out nuclide mean std. dev.
+1 12 1 total 0 0
+0 12 2 total 0 0
\ No newline at end of file
diff --git a/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py b/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py
new file mode 100644
index 000000000..2afa9039e
--- /dev/null
+++ b/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+
+import os
+import sys
+import glob
+import hashlib
+sys.path.insert(0, os.pardir)
+from testing_harness import PyAPITestHarness
+import openmc
+import openmc.mgxs
+
+
+class MGXSTestHarness(PyAPITestHarness):
+ def _build_inputs(self):
+
+ # The openmc.mgxs module needs a summary.h5 file
+ self._input_set.settings.output = {'summary': True}
+
+ # Generate inputs using parent class routine
+ super(MGXSTestHarness, self)._build_inputs()
+
+ # Initialize a two-group structure
+ energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, 20.])
+
+ # Initialize MGXS Library for a few cross section types
+ self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry.geometry)
+ self.mgxs_lib.by_nuclide = False
+ self.mgxs_lib.mgxs_types = ['transport', 'nu-fission',
+ 'nu-scatter matrix', 'chi']
+ self.mgxs_lib.energy_groups = energy_groups
+ self.mgxs_lib.domain_type = 'material'
+ self.mgxs_lib.build_library()
+
+ # Initialize a tallies file
+ self._input_set.tallies = openmc.TalliesFile()
+ self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False)
+ self._input_set.tallies.export_to_xml()
+
+ def _get_results(self, hash_output=False):
+ """Digest info in the statepoint and return as a string."""
+
+ # Read the statepoint file.
+ statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0]
+ sp = openmc.StatePoint(statepoint)
+
+ # Read the summary file.
+ summary = glob.glob(os.path.join(os.getcwd(), 'summary.h5'))[0]
+ su = openmc.Summary(summary)
+ sp.link_with_summary(su)
+
+ # Load the MGXS library from the statepoint
+ self.mgxs_lib.load_from_statepoint(sp)
+
+ # Build a string from Pandas Dataframe for each MGXS
+ outstr = ''
+ for domain in self.mgxs_lib.domains:
+ for mgxs_type in self.mgxs_lib.mgxs_types:
+ mgxs = self.mgxs_lib.get_mgxs(domain, mgxs_type)
+ df = mgxs.get_pandas_dataframe()
+ outstr += df.to_string()
+
+ # Hash the results if necessary
+ if hash_output:
+ sha512 = hashlib.sha512()
+ sha512.update(outstr.encode('utf-8'))
+ outstr = sha512.hexdigest()
+
+ return outstr
+
+
+ def _cleanup(self):
+ super(MGXSTestHarness, self)._cleanup()
+ f = os.path.join(os.getcwd(), 'tallies.xml')
+ if os.path.exists(f): os.remove(f)
+
+
+if __name__ == '__main__':
+ harness = MGXSTestHarness('statepoint.10.*', True)
+ harness.main()
diff --git a/tests/test_mgxs_library_nuclides/inputs_true.dat b/tests/test_mgxs_library_nuclides/inputs_true.dat
new file mode 100644
index 000000000..7c064c3c1
--- /dev/null
+++ b/tests/test_mgxs_library_nuclides/inputs_true.dat
@@ -0,0 +1 @@
+04dcfca7d68981d7ec19d428c541acd6345ec2d608c581d56ce21d23548f52977fe713b5cdd7434bebf62067444d6562ef322175736a6a63e3985e5e48718081
\ No newline at end of file
diff --git a/tests/test_mgxs_library_nuclides/results_true.dat b/tests/test_mgxs_library_nuclides/results_true.dat
new file mode 100644
index 000000000..f8e5baac5
--- /dev/null
+++ b/tests/test_mgxs_library_nuclides/results_true.dat
@@ -0,0 +1,1971 @@
+ material group in nuclide mean std. dev.
+34 1 1 U-234 0.000000 0.000000
+35 1 1 U-235 0.008559 0.001742
+36 1 1 U-236 0.002643 0.000794
+37 1 1 U-238 0.213622 0.010911
+38 1 1 Np-237 0.000000 0.000000
+39 1 1 Pu-238 0.000000 0.000000
+40 1 1 Pu-239 0.005787 0.001050
+41 1 1 Pu-240 0.005702 0.000850
+42 1 1 Pu-241 0.000869 0.000366
+43 1 1 Pu-242 0.000655 0.000537
+44 1 1 Am-241 0.000000 0.000000
+45 1 1 Am-242m 0.000000 0.000000
+46 1 1 Am-243 0.000000 0.000000
+47 1 1 Cm-242 0.000000 0.000000
+48 1 1 Cm-243 0.000000 0.000000
+49 1 1 Cm-244 0.000000 0.000000
+50 1 1 Cm-245 0.000000 0.000000
+51 1 1 Mo-95 0.000302 0.000216
+52 1 1 Tc-99 0.000782 0.000434
+53 1 1 Ru-101 0.000346 0.000212
+54 1 1 Ru-103 0.000000 0.000000
+55 1 1 Ag-109 0.000000 0.000000
+56 1 1 Xe-135 0.000000 0.000000
+57 1 1 Cs-133 0.000189 0.000264
+58 1 1 Nd-143 0.000721 0.000364
+59 1 1 Nd-145 0.000637 0.000253
+60 1 1 Sm-147 0.000009 0.000238
+61 1 1 Sm-149 0.000000 0.000000
+62 1 1 Sm-150 0.000003 0.000243
+63 1 1 Sm-151 0.000000 0.000000
+64 1 1 Sm-152 0.000874 0.000388
+65 1 1 Eu-153 0.000173 0.000173
+66 1 1 Gd-155 0.000000 0.000000
+67 1 1 O-16 0.142506 0.008222
+0 1 2 U-234 0.001948 0.001952
+1 1 2 U-235 0.179956 0.028209
+2 1 2 U-236 0.000000 0.000000
+3 1 2 U-238 0.239279 0.039048
+4 1 2 Np-237 0.000000 0.000000
+5 1 2 Pu-238 0.000000 0.000000
+6 1 2 Pu-239 0.159745 0.015751
+7 1 2 Pu-240 0.007792 0.003677
+8 1 2 Pu-241 0.017533 0.003806
+9 1 2 Pu-242 0.000000 0.000000
+10 1 2 Am-241 0.000000 0.000000
+11 1 2 Am-242m 0.000000 0.000000
+12 1 2 Am-243 0.000000 0.000000
+13 1 2 Cm-242 0.000000 0.000000
+14 1 2 Cm-243 0.000000 0.000000
+15 1 2 Cm-244 0.000000 0.000000
+16 1 2 Cm-245 0.000000 0.000000
+17 1 2 Mo-95 0.002250 0.004232
+18 1 2 Tc-99 0.003544 0.002528
+19 1 2 Ru-101 0.000000 0.000000
+20 1 2 Ru-103 0.000000 0.000000
+21 1 2 Ag-109 0.000000 0.000000
+22 1 2 Xe-135 0.027274 0.004025
+23 1 2 Cs-133 0.000000 0.000000
+24 1 2 Nd-143 0.006532 0.002517
+25 1 2 Nd-145 0.001948 0.001952
+26 1 2 Sm-147 0.000000 0.000000
+27 1 2 Sm-149 0.007792 0.005701
+28 1 2 Sm-150 0.000000 0.000000
+29 1 2 Sm-151 0.000000 0.000000
+30 1 2 Sm-152 0.000000 0.000000
+31 1 2 Eu-153 0.001686 0.001968
+32 1 2 Gd-155 0.000000 0.000000
+33 1 2 O-16 0.154807 0.023798 material group in nuclide mean std. dev.
+34 1 1 U-234 6.771527e-06 2.982583e-07
+35 1 1 U-235 9.687933e-03 4.305720e-04
+36 1 1 U-236 6.279974e-05 3.653120e-06
+37 1 1 U-238 6.335930e-03 4.715525e-04
+38 1 1 Np-237 1.237030e-05 6.333955e-07
+39 1 1 Pu-238 7.369063e-06 5.017525e-07
+40 1 1 Pu-239 4.007893e-03 2.607619e-04
+41 1 1 Pu-240 6.479096e-05 3.728060e-06
+42 1 1 Pu-241 1.074454e-03 4.688479e-05
+43 1 1 Pu-242 5.512610e-06 2.976651e-07
+44 1 1 Am-241 1.088373e-06 8.489934e-08
+45 1 1 Am-242m 1.143307e-06 9.912400e-08
+46 1 1 Am-243 7.745526e-07 5.413923e-08
+47 1 1 Cm-242 4.311566e-07 1.922427e-08
+48 1 1 Cm-243 2.363328e-07 2.235666e-08
+49 1 1 Cm-244 2.840125e-07 2.412051e-08
+50 1 1 Cm-245 3.017505e-07 1.594090e-08
+51 1 1 Mo-95 0.000000e+00 0.000000e+00
+52 1 1 Tc-99 0.000000e+00 0.000000e+00
+53 1 1 Ru-101 0.000000e+00 0.000000e+00
+54 1 1 Ru-103 0.000000e+00 0.000000e+00
+55 1 1 Ag-109 0.000000e+00 0.000000e+00
+56 1 1 Xe-135 0.000000e+00 0.000000e+00
+57 1 1 Cs-133 0.000000e+00 0.000000e+00
+58 1 1 Nd-143 0.000000e+00 0.000000e+00
+59 1 1 Nd-145 0.000000e+00 0.000000e+00
+60 1 1 Sm-147 0.000000e+00 0.000000e+00
+61 1 1 Sm-149 0.000000e+00 0.000000e+00
+62 1 1 Sm-150 0.000000e+00 0.000000e+00
+63 1 1 Sm-151 0.000000e+00 0.000000e+00
+64 1 1 Sm-152 0.000000e+00 0.000000e+00
+65 1 1 Eu-153 0.000000e+00 0.000000e+00
+66 1 1 Gd-155 0.000000e+00 0.000000e+00
+67 1 1 O-16 0.000000e+00 0.000000e+00
+0 1 2 U-234 4.267300e-07 3.529845e-08
+1 1 2 U-235 3.629246e-01 2.964548e-02
+2 1 2 U-236 5.921657e-06 4.881464e-07
+3 1 2 U-238 5.196256e-07 4.286610e-08
+4 1 2 Np-237 2.424211e-07 1.741823e-08
+5 1 2 Pu-238 3.255627e-05 2.692686e-06
+6 1 2 Pu-239 2.868384e-01 2.056896e-02
+7 1 2 Pu-240 4.398266e-06 3.658267e-07
+8 1 2 Pu-241 4.607239e-02 3.797176e-03
+9 1 2 Pu-242 8.451967e-08 6.979002e-09
+10 1 2 Am-241 4.678607e-06 3.253889e-07
+11 1 2 Am-242m 1.417675e-04 1.218350e-05
+12 1 2 Am-243 7.648834e-08 6.303843e-09
+13 1 2 Cm-242 9.433314e-07 7.794362e-08
+14 1 2 Cm-243 1.767995e-06 1.454123e-07
+15 1 2 Cm-244 1.533962e-07 1.266951e-08
+16 1 2 Cm-245 1.145063e-05 9.419051e-07
+17 1 2 Mo-95 0.000000e+00 0.000000e+00
+18 1 2 Tc-99 0.000000e+00 0.000000e+00
+19 1 2 Ru-101 0.000000e+00 0.000000e+00
+20 1 2 Ru-103 0.000000e+00 0.000000e+00
+21 1 2 Ag-109 0.000000e+00 0.000000e+00
+22 1 2 Xe-135 0.000000e+00 0.000000e+00
+23 1 2 Cs-133 0.000000e+00 0.000000e+00
+24 1 2 Nd-143 0.000000e+00 0.000000e+00
+25 1 2 Nd-145 0.000000e+00 0.000000e+00
+26 1 2 Sm-147 0.000000e+00 0.000000e+00
+27 1 2 Sm-149 0.000000e+00 0.000000e+00
+28 1 2 Sm-150 0.000000e+00 0.000000e+00
+29 1 2 Sm-151 0.000000e+00 0.000000e+00
+30 1 2 Sm-152 0.000000e+00 0.000000e+00
+31 1 2 Eu-153 0.000000e+00 0.000000e+00
+32 1 2 Gd-155 0.000000e+00 0.000000e+00
+33 1 2 O-16 0.000000e+00 0.000000e+00 material group in group out nuclide mean std. dev.
+102 1 1 1 U-234 0.000000 0.000000
+103 1 1 1 U-235 0.002846 0.001185
+104 1 1 1 U-236 0.001951 0.000829
+105 1 1 1 U-238 0.197520 0.011618
+106 1 1 1 Np-237 0.000000 0.000000
+107 1 1 1 Pu-238 0.000000 0.000000
+108 1 1 1 Pu-239 0.001285 0.000461
+109 1 1 1 Pu-240 0.001027 0.000635
+110 1 1 1 Pu-241 0.000004 0.000242
+111 1 1 1 Pu-242 0.000481 0.000372
+112 1 1 1 Am-241 0.000000 0.000000
+113 1 1 1 Am-242m 0.000000 0.000000
+114 1 1 1 Am-243 0.000000 0.000000
+115 1 1 1 Cm-242 0.000000 0.000000
+116 1 1 1 Cm-243 0.000000 0.000000
+117 1 1 1 Cm-244 0.000000 0.000000
+118 1 1 1 Cm-245 0.000000 0.000000
+119 1 1 1 Mo-95 0.000302 0.000216
+120 1 1 1 Tc-99 0.000262 0.000195
+121 1 1 1 Ru-101 0.000000 0.000000
+122 1 1 1 Ru-103 0.000000 0.000000
+123 1 1 1 Ag-109 0.000000 0.000000
+124 1 1 1 Xe-135 0.000000 0.000000
+125 1 1 1 Cs-133 0.000016 0.000234
+126 1 1 1 Nd-143 0.000721 0.000364
+127 1 1 1 Nd-145 0.000463 0.000281
+128 1 1 1 Sm-147 0.000009 0.000238
+129 1 1 1 Sm-149 0.000000 0.000000
+130 1 1 1 Sm-150 0.000003 0.000243
+131 1 1 1 Sm-151 0.000000 0.000000
+132 1 1 1 Sm-152 0.000700 0.000424
+133 1 1 1 Eu-153 0.000000 0.000000
+134 1 1 1 Gd-155 0.000000 0.000000
+135 1 1 1 O-16 0.142333 0.008156
+68 1 1 2 U-234 0.000000 0.000000
+69 1 1 2 U-235 0.000000 0.000000
+70 1 1 2 U-236 0.000000 0.000000
+71 1 1 2 U-238 0.000000 0.000000
+72 1 1 2 Np-237 0.000000 0.000000
+73 1 1 2 Pu-238 0.000000 0.000000
+74 1 1 2 Pu-239 0.000000 0.000000
+75 1 1 2 Pu-240 0.000000 0.000000
+76 1 1 2 Pu-241 0.000000 0.000000
+77 1 1 2 Pu-242 0.000000 0.000000
+78 1 1 2 Am-241 0.000000 0.000000
+79 1 1 2 Am-242m 0.000000 0.000000
+80 1 1 2 Am-243 0.000000 0.000000
+81 1 1 2 Cm-242 0.000000 0.000000
+82 1 1 2 Cm-243 0.000000 0.000000
+83 1 1 2 Cm-244 0.000000 0.000000
+84 1 1 2 Cm-245 0.000000 0.000000
+85 1 1 2 Mo-95 0.000000 0.000000
+86 1 1 2 Tc-99 0.000000 0.000000
+87 1 1 2 Ru-101 0.000000 0.000000
+88 1 1 2 Ru-103 0.000000 0.000000
+89 1 1 2 Ag-109 0.000000 0.000000
+90 1 1 2 Xe-135 0.000000 0.000000
+91 1 1 2 Cs-133 0.000000 0.000000
+92 1 1 2 Nd-143 0.000000 0.000000
+93 1 1 2 Nd-145 0.000000 0.000000
+94 1 1 2 Sm-147 0.000000 0.000000
+95 1 1 2 Sm-149 0.000000 0.000000
+96 1 1 2 Sm-150 0.000000 0.000000
+97 1 1 2 Sm-151 0.000000 0.000000
+98 1 1 2 Sm-152 0.000000 0.000000
+99 1 1 2 Eu-153 0.000000 0.000000
+100 1 1 2 Gd-155 0.000000 0.000000
+101 1 1 2 O-16 0.000173 0.000173
+34 1 2 1 U-234 0.000000 0.000000
+35 1 2 1 U-235 0.000000 0.000000
+36 1 2 1 U-236 0.000000 0.000000
+37 1 2 1 U-238 0.000000 0.000000
+38 1 2 1 Np-237 0.000000 0.000000
+39 1 2 1 Pu-238 0.000000 0.000000
+40 1 2 1 Pu-239 0.000000 0.000000
+41 1 2 1 Pu-240 0.000000 0.000000
+42 1 2 1 Pu-241 0.000000 0.000000
+43 1 2 1 Pu-242 0.000000 0.000000
+44 1 2 1 Am-241 0.000000 0.000000
+45 1 2 1 Am-242m 0.000000 0.000000
+46 1 2 1 Am-243 0.000000 0.000000
+47 1 2 1 Cm-242 0.000000 0.000000
+48 1 2 1 Cm-243 0.000000 0.000000
+49 1 2 1 Cm-244 0.000000 0.000000
+50 1 2 1 Cm-245 0.000000 0.000000
+51 1 2 1 Mo-95 0.000000 0.000000
+52 1 2 1 Tc-99 0.000000 0.000000
+53 1 2 1 Ru-101 0.000000 0.000000
+54 1 2 1 Ru-103 0.000000 0.000000
+55 1 2 1 Ag-109 0.000000 0.000000
+56 1 2 1 Xe-135 0.000000 0.000000
+57 1 2 1 Cs-133 0.000000 0.000000
+58 1 2 1 Nd-143 0.000000 0.000000
+59 1 2 1 Nd-145 0.000000 0.000000
+60 1 2 1 Sm-147 0.000000 0.000000
+61 1 2 1 Sm-149 0.000000 0.000000
+62 1 2 1 Sm-150 0.000000 0.000000
+63 1 2 1 Sm-151 0.000000 0.000000
+64 1 2 1 Sm-152 0.000000 0.000000
+65 1 2 1 Eu-153 0.000000 0.000000
+66 1 2 1 Gd-155 0.000000 0.000000
+67 1 2 1 O-16 0.001948 0.001952
+0 1 2 2 U-234 0.000000 0.000000
+1 1 2 2 U-235 0.010470 0.006106
+2 1 2 2 U-236 0.000000 0.000000
+3 1 2 2 U-238 0.208109 0.039197
+4 1 2 2 Np-237 0.000000 0.000000
+5 1 2 2 Pu-238 0.000000 0.000000
+6 1 2 2 Pu-239 0.000000 0.000000
+7 1 2 2 Pu-240 0.000000 0.000000
+8 1 2 2 Pu-241 0.000000 0.000000
+9 1 2 2 Pu-242 0.000000 0.000000
+10 1 2 2 Am-241 0.000000 0.000000
+11 1 2 2 Am-242m 0.000000 0.000000
+12 1 2 2 Am-243 0.000000 0.000000
+13 1 2 2 Cm-242 0.000000 0.000000
+14 1 2 2 Cm-243 0.000000 0.000000
+15 1 2 2 Cm-244 0.000000 0.000000
+16 1 2 2 Cm-245 0.000000 0.000000
+17 1 2 2 Mo-95 0.000302 0.002551
+18 1 2 2 Tc-99 0.003544 0.002528
+19 1 2 2 Ru-101 0.000000 0.000000
+20 1 2 2 Ru-103 0.000000 0.000000
+21 1 2 2 Ag-109 0.000000 0.000000
+22 1 2 2 Xe-135 0.000000 0.000000
+23 1 2 2 Cs-133 0.000000 0.000000
+24 1 2 2 Nd-143 0.002636 0.002073
+25 1 2 2 Nd-145 0.000000 0.000000
+26 1 2 2 Sm-147 0.000000 0.000000
+27 1 2 2 Sm-149 0.000000 0.000000
+28 1 2 2 Sm-150 0.000000 0.000000
+29 1 2 2 Sm-151 0.000000 0.000000
+30 1 2 2 Sm-152 0.000000 0.000000
+31 1 2 2 Eu-153 0.001686 0.001968
+32 1 2 2 Gd-155 0.000000 0.000000
+33 1 2 2 O-16 0.152859 0.022894 material group out nuclide mean std. dev.
+34 1 1 U-234 0 0.000000
+35 1 1 U-235 1 0.127079
+36 1 1 U-236 0 0.000000
+37 1 1 U-238 1 0.153215
+38 1 1 Np-237 0 0.000000
+39 1 1 Pu-238 0 0.000000
+40 1 1 Pu-239 1 0.150979
+41 1 1 Pu-240 0 0.000000
+42 1 1 Pu-241 1 0.203534
+43 1 1 Pu-242 0 0.000000
+44 1 1 Am-241 0 0.000000
+45 1 1 Am-242m 0 0.000000
+46 1 1 Am-243 0 0.000000
+47 1 1 Cm-242 0 0.000000
+48 1 1 Cm-243 0 0.000000
+49 1 1 Cm-244 0 0.000000
+50 1 1 Cm-245 0 0.000000
+51 1 1 Mo-95 0 0.000000
+52 1 1 Tc-99 0 0.000000
+53 1 1 Ru-101 0 0.000000
+54 1 1 Ru-103 0 0.000000
+55 1 1 Ag-109 0 0.000000
+56 1 1 Xe-135 0 0.000000
+57 1 1 Cs-133 0 0.000000
+58 1 1 Nd-143 0 0.000000
+59 1 1 Nd-145 0 0.000000
+60 1 1 Sm-147 0 0.000000
+61 1 1 Sm-149 0 0.000000
+62 1 1 Sm-150 0 0.000000
+63 1 1 Sm-151 0 0.000000
+64 1 1 Sm-152 0 0.000000
+65 1 1 Eu-153 0 0.000000
+66 1 1 Gd-155 0 0.000000
+67 1 1 O-16 0 0.000000
+0 1 2 U-234 0 0.000000
+1 1 2 U-235 0 0.000000
+2 1 2 U-236 0 0.000000
+3 1 2 U-238 0 0.000000
+4 1 2 Np-237 0 0.000000
+5 1 2 Pu-238 0 0.000000
+6 1 2 Pu-239 0 0.000000
+7 1 2 Pu-240 0 0.000000
+8 1 2 Pu-241 0 0.000000
+9 1 2 Pu-242 0 0.000000
+10 1 2 Am-241 0 0.000000
+11 1 2 Am-242m 0 0.000000
+12 1 2 Am-243 0 0.000000
+13 1 2 Cm-242 0 0.000000
+14 1 2 Cm-243 0 0.000000
+15 1 2 Cm-244 0 0.000000
+16 1 2 Cm-245 0 0.000000
+17 1 2 Mo-95 0 0.000000
+18 1 2 Tc-99 0 0.000000
+19 1 2 Ru-101 0 0.000000
+20 1 2 Ru-103 0 0.000000
+21 1 2 Ag-109 0 0.000000
+22 1 2 Xe-135 0 0.000000
+23 1 2 Cs-133 0 0.000000
+24 1 2 Nd-143 0 0.000000
+25 1 2 Nd-145 0 0.000000
+26 1 2 Sm-147 0 0.000000
+27 1 2 Sm-149 0 0.000000
+28 1 2 Sm-150 0 0.000000
+29 1 2 Sm-151 0 0.000000
+30 1 2 Sm-152 0 0.000000
+31 1 2 Eu-153 0 0.000000
+32 1 2 Gd-155 0 0.000000
+33 1 2 O-16 0 0.000000 material group in nuclide mean std. dev.
+5 2 1 Zr-90 0.118578 0.008347
+6 2 1 Zr-91 0.040887 0.002988
+7 2 1 Zr-92 0.033882 0.004365
+8 2 1 Zr-94 0.046281 0.005422
+9 2 1 Zr-96 0.005415 0.002113
+0 2 2 Zr-90 0.122479 0.032627
+1 2 2 Zr-91 0.035669 0.009683
+2 2 2 Zr-92 0.049331 0.021936
+3 2 2 Zr-94 0.058978 0.020081
+4 2 2 Zr-96 0.000000 0.000000 material group in nuclide mean std. dev.
+5 2 1 Zr-90 0 0
+6 2 1 Zr-91 0 0
+7 2 1 Zr-92 0 0
+8 2 1 Zr-94 0 0
+9 2 1 Zr-96 0 0
+0 2 2 Zr-90 0 0
+1 2 2 Zr-91 0 0
+2 2 2 Zr-92 0 0
+3 2 2 Zr-94 0 0
+4 2 2 Zr-96 0 0 material group in group out nuclide mean std. dev.
+15 2 1 1 Zr-90 0.118578 0.008347
+16 2 1 1 Zr-91 0.039963 0.003053
+17 2 1 1 Zr-92 0.033882 0.004365
+18 2 1 1 Zr-94 0.046281 0.005422
+19 2 1 1 Zr-96 0.004953 0.002087
+10 2 1 2 Zr-90 0.000000 0.000000
+11 2 1 2 Zr-91 0.000000 0.000000
+12 2 1 2 Zr-92 0.000000 0.000000
+13 2 1 2 Zr-94 0.000000 0.000000
+14 2 1 2 Zr-96 0.000000 0.000000
+5 2 2 1 Zr-90 0.000000 0.000000
+6 2 2 1 Zr-91 0.000000 0.000000
+7 2 2 1 Zr-92 0.000000 0.000000
+8 2 2 1 Zr-94 0.000000 0.000000
+9 2 2 1 Zr-96 0.000000 0.000000
+0 2 2 2 Zr-90 0.122479 0.032627
+1 2 2 2 Zr-91 0.023998 0.011915
+2 2 2 2 Zr-92 0.049331 0.021936
+3 2 2 2 Zr-94 0.058978 0.020081
+4 2 2 2 Zr-96 0.000000 0.000000 material group out nuclide mean std. dev.
+5 2 1 Zr-90 0 0
+6 2 1 Zr-91 0 0
+7 2 1 Zr-92 0 0
+8 2 1 Zr-94 0 0
+9 2 1 Zr-96 0 0
+0 2 2 Zr-90 0 0
+1 2 2 Zr-91 0 0
+2 2 2 Zr-92 0 0
+3 2 2 Zr-94 0 0
+4 2 2 Zr-96 0 0 material group in nuclide mean std. dev.
+4 3 1 H-1 0.206179 0.034791
+5 3 1 O-16 0.075190 0.004750
+6 3 1 B-10 0.000741 0.000470
+7 3 1 B-11 0.000167 0.000208
+0 3 2 H-1 1.323003 0.239067
+1 3 2 O-16 0.071243 0.013291
+2 3 2 B-10 0.033075 0.004283
+3 3 2 B-11 0.000000 0.000000 material group in nuclide mean std. dev.
+4 3 1 H-1 0 0
+5 3 1 O-16 0 0
+6 3 1 B-10 0 0
+7 3 1 B-11 0 0
+0 3 2 H-1 0 0
+1 3 2 O-16 0 0
+2 3 2 B-10 0 0
+3 3 2 B-11 0 0 material group in group out nuclide mean std. dev.
+12 3 1 1 H-1 0.178758 0.033618
+13 3 1 1 O-16 0.075042 0.004782
+14 3 1 1 B-10 0.000000 0.000000
+15 3 1 1 B-11 0.000167 0.000208
+8 3 1 2 H-1 0.027124 0.001806
+9 3 1 2 O-16 0.000148 0.000148
+10 3 1 2 B-10 0.000000 0.000000
+11 3 1 2 B-11 0.000000 0.000000
+4 3 2 1 H-1 0.000000 0.000000
+5 3 2 1 O-16 0.000000 0.000000
+6 3 2 1 B-10 0.000000 0.000000
+7 3 2 1 B-11 0.000000 0.000000
+0 3 2 2 H-1 1.305284 0.235145
+1 3 2 2 O-16 0.071243 0.013291
+2 3 2 2 B-10 0.000000 0.000000
+3 3 2 2 B-11 0.000000 0.000000 material group out nuclide mean std. dev.
+4 3 1 H-1 0 0
+5 3 1 O-16 0 0
+6 3 1 B-10 0 0
+7 3 1 B-11 0 0
+0 3 2 H-1 0 0
+1 3 2 O-16 0 0
+2 3 2 B-10 0 0
+3 3 2 B-11 0 0 material group in nuclide mean std. dev.
+4 4 1 H-1 0.188813 0.045599
+5 4 1 O-16 0.066636 0.008217
+6 4 1 B-10 0.000232 0.000233
+7 4 1 B-11 0.000042 0.000300
+0 4 2 H-1 1.088920 0.221595
+1 4 2 O-16 0.064481 0.014318
+2 4 2 B-10 0.026367 0.010478
+3 4 2 B-11 0.000000 0.000000 material group in nuclide mean std. dev.
+4 4 1 H-1 0 0
+5 4 1 O-16 0 0
+6 4 1 B-10 0 0
+7 4 1 B-11 0 0
+0 4 2 H-1 0 0
+1 4 2 O-16 0 0
+2 4 2 B-10 0 0
+3 4 2 B-11 0 0 material group in group out nuclide mean std. dev.
+12 4 1 1 H-1 0.166764 0.043861
+13 4 1 1 O-16 0.066172 0.007943
+14 4 1 1 B-10 0.000000 0.000000
+15 4 1 1 B-11 0.000042 0.000300
+8 4 1 2 H-1 0.021817 0.002327
+9 4 1 2 O-16 0.000464 0.000466
+10 4 1 2 B-10 0.000000 0.000000
+11 4 1 2 B-11 0.000000 0.000000
+4 4 2 1 H-1 0.000000 0.000000
+5 4 2 1 O-16 0.000000 0.000000
+6 4 2 1 B-10 0.000000 0.000000
+7 4 2 1 B-11 0.000000 0.000000
+0 4 2 2 H-1 1.082328 0.222438
+1 4 2 2 O-16 0.064481 0.014318
+2 4 2 2 B-10 0.000000 0.000000
+3 4 2 2 B-11 0.000000 0.000000 material group out nuclide mean std. dev.
+4 4 1 H-1 0 0
+5 4 1 O-16 0 0
+6 4 1 B-10 0 0
+7 4 1 B-11 0 0
+0 4 2 H-1 0 0
+1 4 2 O-16 0 0
+2 4 2 B-10 0 0
+3 4 2 B-11 0 0 material group in nuclide mean std. dev.
+27 5 1 Fe-54 0 0
+28 5 1 Fe-56 0 0
+29 5 1 Fe-57 0 0
+30 5 1 Fe-58 0 0
+31 5 1 Ni-58 0 0
+32 5 1 Ni-60 0 0
+33 5 1 Ni-61 0 0
+34 5 1 Ni-62 0 0
+35 5 1 Ni-64 0 0
+36 5 1 Mn-55 0 0
+37 5 1 Mo-92 0 0
+38 5 1 Mo-94 0 0
+39 5 1 Mo-95 0 0
+40 5 1 Mo-96 0 0
+41 5 1 Mo-97 0 0
+42 5 1 Mo-98 0 0
+43 5 1 Mo-100 0 0
+44 5 1 Si-28 0 0
+45 5 1 Si-29 0 0
+46 5 1 Si-30 0 0
+47 5 1 Cr-50 0 0
+48 5 1 Cr-52 0 0
+49 5 1 Cr-53 0 0
+50 5 1 Cr-54 0 0
+51 5 1 C-Nat 0 0
+52 5 1 Cu-63 0 0
+53 5 1 Cu-65 0 0
+0 5 2 Fe-54 0 0
+1 5 2 Fe-56 0 0
+2 5 2 Fe-57 0 0
+3 5 2 Fe-58 0 0
+4 5 2 Ni-58 0 0
+5 5 2 Ni-60 0 0
+6 5 2 Ni-61 0 0
+7 5 2 Ni-62 0 0
+8 5 2 Ni-64 0 0
+9 5 2 Mn-55 0 0
+10 5 2 Mo-92 0 0
+11 5 2 Mo-94 0 0
+12 5 2 Mo-95 0 0
+13 5 2 Mo-96 0 0
+14 5 2 Mo-97 0 0
+15 5 2 Mo-98 0 0
+16 5 2 Mo-100 0 0
+17 5 2 Si-28 0 0
+18 5 2 Si-29 0 0
+19 5 2 Si-30 0 0
+20 5 2 Cr-50 0 0
+21 5 2 Cr-52 0 0
+22 5 2 Cr-53 0 0
+23 5 2 Cr-54 0 0
+24 5 2 C-Nat 0 0
+25 5 2 Cu-63 0 0
+26 5 2 Cu-65 0 0 material group in nuclide mean std. dev.
+27 5 1 Fe-54 0 0
+28 5 1 Fe-56 0 0
+29 5 1 Fe-57 0 0
+30 5 1 Fe-58 0 0
+31 5 1 Ni-58 0 0
+32 5 1 Ni-60 0 0
+33 5 1 Ni-61 0 0
+34 5 1 Ni-62 0 0
+35 5 1 Ni-64 0 0
+36 5 1 Mn-55 0 0
+37 5 1 Mo-92 0 0
+38 5 1 Mo-94 0 0
+39 5 1 Mo-95 0 0
+40 5 1 Mo-96 0 0
+41 5 1 Mo-97 0 0
+42 5 1 Mo-98 0 0
+43 5 1 Mo-100 0 0
+44 5 1 Si-28 0 0
+45 5 1 Si-29 0 0
+46 5 1 Si-30 0 0
+47 5 1 Cr-50 0 0
+48 5 1 Cr-52 0 0
+49 5 1 Cr-53 0 0
+50 5 1 Cr-54 0 0
+51 5 1 C-Nat 0 0
+52 5 1 Cu-63 0 0
+53 5 1 Cu-65 0 0
+0 5 2 Fe-54 0 0
+1 5 2 Fe-56 0 0
+2 5 2 Fe-57 0 0
+3 5 2 Fe-58 0 0
+4 5 2 Ni-58 0 0
+5 5 2 Ni-60 0 0
+6 5 2 Ni-61 0 0
+7 5 2 Ni-62 0 0
+8 5 2 Ni-64 0 0
+9 5 2 Mn-55 0 0
+10 5 2 Mo-92 0 0
+11 5 2 Mo-94 0 0
+12 5 2 Mo-95 0 0
+13 5 2 Mo-96 0 0
+14 5 2 Mo-97 0 0
+15 5 2 Mo-98 0 0
+16 5 2 Mo-100 0 0
+17 5 2 Si-28 0 0
+18 5 2 Si-29 0 0
+19 5 2 Si-30 0 0
+20 5 2 Cr-50 0 0
+21 5 2 Cr-52 0 0
+22 5 2 Cr-53 0 0
+23 5 2 Cr-54 0 0
+24 5 2 C-Nat 0 0
+25 5 2 Cu-63 0 0
+26 5 2 Cu-65 0 0 material group in group out nuclide mean std. dev.
+81 5 1 1 Fe-54 0 0
+82 5 1 1 Fe-56 0 0
+83 5 1 1 Fe-57 0 0
+84 5 1 1 Fe-58 0 0
+85 5 1 1 Ni-58 0 0
+86 5 1 1 Ni-60 0 0
+87 5 1 1 Ni-61 0 0
+88 5 1 1 Ni-62 0 0
+89 5 1 1 Ni-64 0 0
+90 5 1 1 Mn-55 0 0
+91 5 1 1 Mo-92 0 0
+92 5 1 1 Mo-94 0 0
+93 5 1 1 Mo-95 0 0
+94 5 1 1 Mo-96 0 0
+95 5 1 1 Mo-97 0 0
+96 5 1 1 Mo-98 0 0
+97 5 1 1 Mo-100 0 0
+98 5 1 1 Si-28 0 0
+99 5 1 1 Si-29 0 0
+100 5 1 1 Si-30 0 0
+101 5 1 1 Cr-50 0 0
+102 5 1 1 Cr-52 0 0
+103 5 1 1 Cr-53 0 0
+104 5 1 1 Cr-54 0 0
+105 5 1 1 C-Nat 0 0
+106 5 1 1 Cu-63 0 0
+107 5 1 1 Cu-65 0 0
+54 5 1 2 Fe-54 0 0
+55 5 1 2 Fe-56 0 0
+56 5 1 2 Fe-57 0 0
+57 5 1 2 Fe-58 0 0
+58 5 1 2 Ni-58 0 0
+59 5 1 2 Ni-60 0 0
+60 5 1 2 Ni-61 0 0
+61 5 1 2 Ni-62 0 0
+62 5 1 2 Ni-64 0 0
+63 5 1 2 Mn-55 0 0
+64 5 1 2 Mo-92 0 0
+65 5 1 2 Mo-94 0 0
+66 5 1 2 Mo-95 0 0
+67 5 1 2 Mo-96 0 0
+68 5 1 2 Mo-97 0 0
+69 5 1 2 Mo-98 0 0
+70 5 1 2 Mo-100 0 0
+71 5 1 2 Si-28 0 0
+72 5 1 2 Si-29 0 0
+73 5 1 2 Si-30 0 0
+74 5 1 2 Cr-50 0 0
+75 5 1 2 Cr-52 0 0
+76 5 1 2 Cr-53 0 0
+77 5 1 2 Cr-54 0 0
+78 5 1 2 C-Nat 0 0
+79 5 1 2 Cu-63 0 0
+80 5 1 2 Cu-65 0 0
+27 5 2 1 Fe-54 0 0
+28 5 2 1 Fe-56 0 0
+29 5 2 1 Fe-57 0 0
+30 5 2 1 Fe-58 0 0
+31 5 2 1 Ni-58 0 0
+32 5 2 1 Ni-60 0 0
+33 5 2 1 Ni-61 0 0
+34 5 2 1 Ni-62 0 0
+35 5 2 1 Ni-64 0 0
+36 5 2 1 Mn-55 0 0
+37 5 2 1 Mo-92 0 0
+38 5 2 1 Mo-94 0 0
+39 5 2 1 Mo-95 0 0
+40 5 2 1 Mo-96 0 0
+41 5 2 1 Mo-97 0 0
+42 5 2 1 Mo-98 0 0
+43 5 2 1 Mo-100 0 0
+44 5 2 1 Si-28 0 0
+45 5 2 1 Si-29 0 0
+46 5 2 1 Si-30 0 0
+47 5 2 1 Cr-50 0 0
+48 5 2 1 Cr-52 0 0
+49 5 2 1 Cr-53 0 0
+50 5 2 1 Cr-54 0 0
+51 5 2 1 C-Nat 0 0
+52 5 2 1 Cu-63 0 0
+53 5 2 1 Cu-65 0 0
+0 5 2 2 Fe-54 0 0
+1 5 2 2 Fe-56 0 0
+2 5 2 2 Fe-57 0 0
+3 5 2 2 Fe-58 0 0
+4 5 2 2 Ni-58 0 0
+5 5 2 2 Ni-60 0 0
+6 5 2 2 Ni-61 0 0
+7 5 2 2 Ni-62 0 0
+8 5 2 2 Ni-64 0 0
+9 5 2 2 Mn-55 0 0
+10 5 2 2 Mo-92 0 0
+11 5 2 2 Mo-94 0 0
+12 5 2 2 Mo-95 0 0
+13 5 2 2 Mo-96 0 0
+14 5 2 2 Mo-97 0 0
+15 5 2 2 Mo-98 0 0
+16 5 2 2 Mo-100 0 0
+17 5 2 2 Si-28 0 0
+18 5 2 2 Si-29 0 0
+19 5 2 2 Si-30 0 0
+20 5 2 2 Cr-50 0 0
+21 5 2 2 Cr-52 0 0
+22 5 2 2 Cr-53 0 0
+23 5 2 2 Cr-54 0 0
+24 5 2 2 C-Nat 0 0
+25 5 2 2 Cu-63 0 0
+26 5 2 2 Cu-65 0 0 material group out nuclide mean std. dev.
+27 5 1 Fe-54 0 0
+28 5 1 Fe-56 0 0
+29 5 1 Fe-57 0 0
+30 5 1 Fe-58 0 0
+31 5 1 Ni-58 0 0
+32 5 1 Ni-60 0 0
+33 5 1 Ni-61 0 0
+34 5 1 Ni-62 0 0
+35 5 1 Ni-64 0 0
+36 5 1 Mn-55 0 0
+37 5 1 Mo-92 0 0
+38 5 1 Mo-94 0 0
+39 5 1 Mo-95 0 0
+40 5 1 Mo-96 0 0
+41 5 1 Mo-97 0 0
+42 5 1 Mo-98 0 0
+43 5 1 Mo-100 0 0
+44 5 1 Si-28 0 0
+45 5 1 Si-29 0 0
+46 5 1 Si-30 0 0
+47 5 1 Cr-50 0 0
+48 5 1 Cr-52 0 0
+49 5 1 Cr-53 0 0
+50 5 1 Cr-54 0 0
+51 5 1 C-Nat 0 0
+52 5 1 Cu-63 0 0
+53 5 1 Cu-65 0 0
+0 5 2 Fe-54 0 0
+1 5 2 Fe-56 0 0
+2 5 2 Fe-57 0 0
+3 5 2 Fe-58 0 0
+4 5 2 Ni-58 0 0
+5 5 2 Ni-60 0 0
+6 5 2 Ni-61 0 0
+7 5 2 Ni-62 0 0
+8 5 2 Ni-64 0 0
+9 5 2 Mn-55 0 0
+10 5 2 Mo-92 0 0
+11 5 2 Mo-94 0 0
+12 5 2 Mo-95 0 0
+13 5 2 Mo-96 0 0
+14 5 2 Mo-97 0 0
+15 5 2 Mo-98 0 0
+16 5 2 Mo-100 0 0
+17 5 2 Si-28 0 0
+18 5 2 Si-29 0 0
+19 5 2 Si-30 0 0
+20 5 2 Cr-50 0 0
+21 5 2 Cr-52 0 0
+22 5 2 Cr-53 0 0
+23 5 2 Cr-54 0 0
+24 5 2 C-Nat 0 0
+25 5 2 Cu-63 0 0
+26 5 2 Cu-65 0 0 material group in nuclide mean std. dev.
+21 6 1 H-1 0 0
+22 6 1 O-16 0 0
+23 6 1 B-10 0 0
+24 6 1 B-11 0 0
+25 6 1 Fe-54 0 0
+26 6 1 Fe-56 0 0
+27 6 1 Fe-57 0 0
+28 6 1 Fe-58 0 0
+29 6 1 Ni-58 0 0
+30 6 1 Ni-60 0 0
+31 6 1 Ni-61 0 0
+32 6 1 Ni-62 0 0
+33 6 1 Ni-64 0 0
+34 6 1 Mn-55 0 0
+35 6 1 Si-28 0 0
+36 6 1 Si-29 0 0
+37 6 1 Si-30 0 0
+38 6 1 Cr-50 0 0
+39 6 1 Cr-52 0 0
+40 6 1 Cr-53 0 0
+41 6 1 Cr-54 0 0
+0 6 2 H-1 0 0
+1 6 2 O-16 0 0
+2 6 2 B-10 0 0
+3 6 2 B-11 0 0
+4 6 2 Fe-54 0 0
+5 6 2 Fe-56 0 0
+6 6 2 Fe-57 0 0
+7 6 2 Fe-58 0 0
+8 6 2 Ni-58 0 0
+9 6 2 Ni-60 0 0
+10 6 2 Ni-61 0 0
+11 6 2 Ni-62 0 0
+12 6 2 Ni-64 0 0
+13 6 2 Mn-55 0 0
+14 6 2 Si-28 0 0
+15 6 2 Si-29 0 0
+16 6 2 Si-30 0 0
+17 6 2 Cr-50 0 0
+18 6 2 Cr-52 0 0
+19 6 2 Cr-53 0 0
+20 6 2 Cr-54 0 0 material group in nuclide mean std. dev.
+21 6 1 H-1 0 0
+22 6 1 O-16 0 0
+23 6 1 B-10 0 0
+24 6 1 B-11 0 0
+25 6 1 Fe-54 0 0
+26 6 1 Fe-56 0 0
+27 6 1 Fe-57 0 0
+28 6 1 Fe-58 0 0
+29 6 1 Ni-58 0 0
+30 6 1 Ni-60 0 0
+31 6 1 Ni-61 0 0
+32 6 1 Ni-62 0 0
+33 6 1 Ni-64 0 0
+34 6 1 Mn-55 0 0
+35 6 1 Si-28 0 0
+36 6 1 Si-29 0 0
+37 6 1 Si-30 0 0
+38 6 1 Cr-50 0 0
+39 6 1 Cr-52 0 0
+40 6 1 Cr-53 0 0
+41 6 1 Cr-54 0 0
+0 6 2 H-1 0 0
+1 6 2 O-16 0 0
+2 6 2 B-10 0 0
+3 6 2 B-11 0 0
+4 6 2 Fe-54 0 0
+5 6 2 Fe-56 0 0
+6 6 2 Fe-57 0 0
+7 6 2 Fe-58 0 0
+8 6 2 Ni-58 0 0
+9 6 2 Ni-60 0 0
+10 6 2 Ni-61 0 0
+11 6 2 Ni-62 0 0
+12 6 2 Ni-64 0 0
+13 6 2 Mn-55 0 0
+14 6 2 Si-28 0 0
+15 6 2 Si-29 0 0
+16 6 2 Si-30 0 0
+17 6 2 Cr-50 0 0
+18 6 2 Cr-52 0 0
+19 6 2 Cr-53 0 0
+20 6 2 Cr-54 0 0 material group in group out nuclide mean std. dev.
+63 6 1 1 H-1 0 0
+64 6 1 1 O-16 0 0
+65 6 1 1 B-10 0 0
+66 6 1 1 B-11 0 0
+67 6 1 1 Fe-54 0 0
+68 6 1 1 Fe-56 0 0
+69 6 1 1 Fe-57 0 0
+70 6 1 1 Fe-58 0 0
+71 6 1 1 Ni-58 0 0
+72 6 1 1 Ni-60 0 0
+73 6 1 1 Ni-61 0 0
+74 6 1 1 Ni-62 0 0
+75 6 1 1 Ni-64 0 0
+76 6 1 1 Mn-55 0 0
+77 6 1 1 Si-28 0 0
+78 6 1 1 Si-29 0 0
+79 6 1 1 Si-30 0 0
+80 6 1 1 Cr-50 0 0
+81 6 1 1 Cr-52 0 0
+82 6 1 1 Cr-53 0 0
+83 6 1 1 Cr-54 0 0
+42 6 1 2 H-1 0 0
+43 6 1 2 O-16 0 0
+44 6 1 2 B-10 0 0
+45 6 1 2 B-11 0 0
+46 6 1 2 Fe-54 0 0
+47 6 1 2 Fe-56 0 0
+48 6 1 2 Fe-57 0 0
+49 6 1 2 Fe-58 0 0
+50 6 1 2 Ni-58 0 0
+51 6 1 2 Ni-60 0 0
+52 6 1 2 Ni-61 0 0
+53 6 1 2 Ni-62 0 0
+54 6 1 2 Ni-64 0 0
+55 6 1 2 Mn-55 0 0
+56 6 1 2 Si-28 0 0
+57 6 1 2 Si-29 0 0
+58 6 1 2 Si-30 0 0
+59 6 1 2 Cr-50 0 0
+60 6 1 2 Cr-52 0 0
+61 6 1 2 Cr-53 0 0
+62 6 1 2 Cr-54 0 0
+21 6 2 1 H-1 0 0
+22 6 2 1 O-16 0 0
+23 6 2 1 B-10 0 0
+24 6 2 1 B-11 0 0
+25 6 2 1 Fe-54 0 0
+26 6 2 1 Fe-56 0 0
+27 6 2 1 Fe-57 0 0
+28 6 2 1 Fe-58 0 0
+29 6 2 1 Ni-58 0 0
+30 6 2 1 Ni-60 0 0
+31 6 2 1 Ni-61 0 0
+32 6 2 1 Ni-62 0 0
+33 6 2 1 Ni-64 0 0
+34 6 2 1 Mn-55 0 0
+35 6 2 1 Si-28 0 0
+36 6 2 1 Si-29 0 0
+37 6 2 1 Si-30 0 0
+38 6 2 1 Cr-50 0 0
+39 6 2 1 Cr-52 0 0
+40 6 2 1 Cr-53 0 0
+41 6 2 1 Cr-54 0 0
+0 6 2 2 H-1 0 0
+1 6 2 2 O-16 0 0
+2 6 2 2 B-10 0 0
+3 6 2 2 B-11 0 0
+4 6 2 2 Fe-54 0 0
+5 6 2 2 Fe-56 0 0
+6 6 2 2 Fe-57 0 0
+7 6 2 2 Fe-58 0 0
+8 6 2 2 Ni-58 0 0
+9 6 2 2 Ni-60 0 0
+10 6 2 2 Ni-61 0 0
+11 6 2 2 Ni-62 0 0
+12 6 2 2 Ni-64 0 0
+13 6 2 2 Mn-55 0 0
+14 6 2 2 Si-28 0 0
+15 6 2 2 Si-29 0 0
+16 6 2 2 Si-30 0 0
+17 6 2 2 Cr-50 0 0
+18 6 2 2 Cr-52 0 0
+19 6 2 2 Cr-53 0 0
+20 6 2 2 Cr-54 0 0 material group out nuclide mean std. dev.
+21 6 1 H-1 0 0
+22 6 1 O-16 0 0
+23 6 1 B-10 0 0
+24 6 1 B-11 0 0
+25 6 1 Fe-54 0 0
+26 6 1 Fe-56 0 0
+27 6 1 Fe-57 0 0
+28 6 1 Fe-58 0 0
+29 6 1 Ni-58 0 0
+30 6 1 Ni-60 0 0
+31 6 1 Ni-61 0 0
+32 6 1 Ni-62 0 0
+33 6 1 Ni-64 0 0
+34 6 1 Mn-55 0 0
+35 6 1 Si-28 0 0
+36 6 1 Si-29 0 0
+37 6 1 Si-30 0 0
+38 6 1 Cr-50 0 0
+39 6 1 Cr-52 0 0
+40 6 1 Cr-53 0 0
+41 6 1 Cr-54 0 0
+0 6 2 H-1 0 0
+1 6 2 O-16 0 0
+2 6 2 B-10 0 0
+3 6 2 B-11 0 0
+4 6 2 Fe-54 0 0
+5 6 2 Fe-56 0 0
+6 6 2 Fe-57 0 0
+7 6 2 Fe-58 0 0
+8 6 2 Ni-58 0 0
+9 6 2 Ni-60 0 0
+10 6 2 Ni-61 0 0
+11 6 2 Ni-62 0 0
+12 6 2 Ni-64 0 0
+13 6 2 Mn-55 0 0
+14 6 2 Si-28 0 0
+15 6 2 Si-29 0 0
+16 6 2 Si-30 0 0
+17 6 2 Cr-50 0 0
+18 6 2 Cr-52 0 0
+19 6 2 Cr-53 0 0
+20 6 2 Cr-54 0 0 material group in nuclide mean std. dev.
+21 7 1 H-1 0 0
+22 7 1 O-16 0 0
+23 7 1 B-10 0 0
+24 7 1 B-11 0 0
+25 7 1 Fe-54 0 0
+26 7 1 Fe-56 0 0
+27 7 1 Fe-57 0 0
+28 7 1 Fe-58 0 0
+29 7 1 Ni-58 0 0
+30 7 1 Ni-60 0 0
+31 7 1 Ni-61 0 0
+32 7 1 Ni-62 0 0
+33 7 1 Ni-64 0 0
+34 7 1 Mn-55 0 0
+35 7 1 Si-28 0 0
+36 7 1 Si-29 0 0
+37 7 1 Si-30 0 0
+38 7 1 Cr-50 0 0
+39 7 1 Cr-52 0 0
+40 7 1 Cr-53 0 0
+41 7 1 Cr-54 0 0
+0 7 2 H-1 0 0
+1 7 2 O-16 0 0
+2 7 2 B-10 0 0
+3 7 2 B-11 0 0
+4 7 2 Fe-54 0 0
+5 7 2 Fe-56 0 0
+6 7 2 Fe-57 0 0
+7 7 2 Fe-58 0 0
+8 7 2 Ni-58 0 0
+9 7 2 Ni-60 0 0
+10 7 2 Ni-61 0 0
+11 7 2 Ni-62 0 0
+12 7 2 Ni-64 0 0
+13 7 2 Mn-55 0 0
+14 7 2 Si-28 0 0
+15 7 2 Si-29 0 0
+16 7 2 Si-30 0 0
+17 7 2 Cr-50 0 0
+18 7 2 Cr-52 0 0
+19 7 2 Cr-53 0 0
+20 7 2 Cr-54 0 0 material group in nuclide mean std. dev.
+21 7 1 H-1 0 0
+22 7 1 O-16 0 0
+23 7 1 B-10 0 0
+24 7 1 B-11 0 0
+25 7 1 Fe-54 0 0
+26 7 1 Fe-56 0 0
+27 7 1 Fe-57 0 0
+28 7 1 Fe-58 0 0
+29 7 1 Ni-58 0 0
+30 7 1 Ni-60 0 0
+31 7 1 Ni-61 0 0
+32 7 1 Ni-62 0 0
+33 7 1 Ni-64 0 0
+34 7 1 Mn-55 0 0
+35 7 1 Si-28 0 0
+36 7 1 Si-29 0 0
+37 7 1 Si-30 0 0
+38 7 1 Cr-50 0 0
+39 7 1 Cr-52 0 0
+40 7 1 Cr-53 0 0
+41 7 1 Cr-54 0 0
+0 7 2 H-1 0 0
+1 7 2 O-16 0 0
+2 7 2 B-10 0 0
+3 7 2 B-11 0 0
+4 7 2 Fe-54 0 0
+5 7 2 Fe-56 0 0
+6 7 2 Fe-57 0 0
+7 7 2 Fe-58 0 0
+8 7 2 Ni-58 0 0
+9 7 2 Ni-60 0 0
+10 7 2 Ni-61 0 0
+11 7 2 Ni-62 0 0
+12 7 2 Ni-64 0 0
+13 7 2 Mn-55 0 0
+14 7 2 Si-28 0 0
+15 7 2 Si-29 0 0
+16 7 2 Si-30 0 0
+17 7 2 Cr-50 0 0
+18 7 2 Cr-52 0 0
+19 7 2 Cr-53 0 0
+20 7 2 Cr-54 0 0 material group in group out nuclide mean std. dev.
+63 7 1 1 H-1 0 0
+64 7 1 1 O-16 0 0
+65 7 1 1 B-10 0 0
+66 7 1 1 B-11 0 0
+67 7 1 1 Fe-54 0 0
+68 7 1 1 Fe-56 0 0
+69 7 1 1 Fe-57 0 0
+70 7 1 1 Fe-58 0 0
+71 7 1 1 Ni-58 0 0
+72 7 1 1 Ni-60 0 0
+73 7 1 1 Ni-61 0 0
+74 7 1 1 Ni-62 0 0
+75 7 1 1 Ni-64 0 0
+76 7 1 1 Mn-55 0 0
+77 7 1 1 Si-28 0 0
+78 7 1 1 Si-29 0 0
+79 7 1 1 Si-30 0 0
+80 7 1 1 Cr-50 0 0
+81 7 1 1 Cr-52 0 0
+82 7 1 1 Cr-53 0 0
+83 7 1 1 Cr-54 0 0
+42 7 1 2 H-1 0 0
+43 7 1 2 O-16 0 0
+44 7 1 2 B-10 0 0
+45 7 1 2 B-11 0 0
+46 7 1 2 Fe-54 0 0
+47 7 1 2 Fe-56 0 0
+48 7 1 2 Fe-57 0 0
+49 7 1 2 Fe-58 0 0
+50 7 1 2 Ni-58 0 0
+51 7 1 2 Ni-60 0 0
+52 7 1 2 Ni-61 0 0
+53 7 1 2 Ni-62 0 0
+54 7 1 2 Ni-64 0 0
+55 7 1 2 Mn-55 0 0
+56 7 1 2 Si-28 0 0
+57 7 1 2 Si-29 0 0
+58 7 1 2 Si-30 0 0
+59 7 1 2 Cr-50 0 0
+60 7 1 2 Cr-52 0 0
+61 7 1 2 Cr-53 0 0
+62 7 1 2 Cr-54 0 0
+21 7 2 1 H-1 0 0
+22 7 2 1 O-16 0 0
+23 7 2 1 B-10 0 0
+24 7 2 1 B-11 0 0
+25 7 2 1 Fe-54 0 0
+26 7 2 1 Fe-56 0 0
+27 7 2 1 Fe-57 0 0
+28 7 2 1 Fe-58 0 0
+29 7 2 1 Ni-58 0 0
+30 7 2 1 Ni-60 0 0
+31 7 2 1 Ni-61 0 0
+32 7 2 1 Ni-62 0 0
+33 7 2 1 Ni-64 0 0
+34 7 2 1 Mn-55 0 0
+35 7 2 1 Si-28 0 0
+36 7 2 1 Si-29 0 0
+37 7 2 1 Si-30 0 0
+38 7 2 1 Cr-50 0 0
+39 7 2 1 Cr-52 0 0
+40 7 2 1 Cr-53 0 0
+41 7 2 1 Cr-54 0 0
+0 7 2 2 H-1 0 0
+1 7 2 2 O-16 0 0
+2 7 2 2 B-10 0 0
+3 7 2 2 B-11 0 0
+4 7 2 2 Fe-54 0 0
+5 7 2 2 Fe-56 0 0
+6 7 2 2 Fe-57 0 0
+7 7 2 2 Fe-58 0 0
+8 7 2 2 Ni-58 0 0
+9 7 2 2 Ni-60 0 0
+10 7 2 2 Ni-61 0 0
+11 7 2 2 Ni-62 0 0
+12 7 2 2 Ni-64 0 0
+13 7 2 2 Mn-55 0 0
+14 7 2 2 Si-28 0 0
+15 7 2 2 Si-29 0 0
+16 7 2 2 Si-30 0 0
+17 7 2 2 Cr-50 0 0
+18 7 2 2 Cr-52 0 0
+19 7 2 2 Cr-53 0 0
+20 7 2 2 Cr-54 0 0 material group out nuclide mean std. dev.
+21 7 1 H-1 0 0
+22 7 1 O-16 0 0
+23 7 1 B-10 0 0
+24 7 1 B-11 0 0
+25 7 1 Fe-54 0 0
+26 7 1 Fe-56 0 0
+27 7 1 Fe-57 0 0
+28 7 1 Fe-58 0 0
+29 7 1 Ni-58 0 0
+30 7 1 Ni-60 0 0
+31 7 1 Ni-61 0 0
+32 7 1 Ni-62 0 0
+33 7 1 Ni-64 0 0
+34 7 1 Mn-55 0 0
+35 7 1 Si-28 0 0
+36 7 1 Si-29 0 0
+37 7 1 Si-30 0 0
+38 7 1 Cr-50 0 0
+39 7 1 Cr-52 0 0
+40 7 1 Cr-53 0 0
+41 7 1 Cr-54 0 0
+0 7 2 H-1 0 0
+1 7 2 O-16 0 0
+2 7 2 B-10 0 0
+3 7 2 B-11 0 0
+4 7 2 Fe-54 0 0
+5 7 2 Fe-56 0 0
+6 7 2 Fe-57 0 0
+7 7 2 Fe-58 0 0
+8 7 2 Ni-58 0 0
+9 7 2 Ni-60 0 0
+10 7 2 Ni-61 0 0
+11 7 2 Ni-62 0 0
+12 7 2 Ni-64 0 0
+13 7 2 Mn-55 0 0
+14 7 2 Si-28 0 0
+15 7 2 Si-29 0 0
+16 7 2 Si-30 0 0
+17 7 2 Cr-50 0 0
+18 7 2 Cr-52 0 0
+19 7 2 Cr-53 0 0
+20 7 2 Cr-54 0 0 material group in nuclide mean std. dev.
+21 8 1 H-1 0 0
+22 8 1 O-16 0 0
+23 8 1 B-10 0 0
+24 8 1 B-11 0 0
+25 8 1 Fe-54 0 0
+26 8 1 Fe-56 0 0
+27 8 1 Fe-57 0 0
+28 8 1 Fe-58 0 0
+29 8 1 Ni-58 0 0
+30 8 1 Ni-60 0 0
+31 8 1 Ni-61 0 0
+32 8 1 Ni-62 0 0
+33 8 1 Ni-64 0 0
+34 8 1 Mn-55 0 0
+35 8 1 Si-28 0 0
+36 8 1 Si-29 0 0
+37 8 1 Si-30 0 0
+38 8 1 Cr-50 0 0
+39 8 1 Cr-52 0 0
+40 8 1 Cr-53 0 0
+41 8 1 Cr-54 0 0
+0 8 2 H-1 0 0
+1 8 2 O-16 0 0
+2 8 2 B-10 0 0
+3 8 2 B-11 0 0
+4 8 2 Fe-54 0 0
+5 8 2 Fe-56 0 0
+6 8 2 Fe-57 0 0
+7 8 2 Fe-58 0 0
+8 8 2 Ni-58 0 0
+9 8 2 Ni-60 0 0
+10 8 2 Ni-61 0 0
+11 8 2 Ni-62 0 0
+12 8 2 Ni-64 0 0
+13 8 2 Mn-55 0 0
+14 8 2 Si-28 0 0
+15 8 2 Si-29 0 0
+16 8 2 Si-30 0 0
+17 8 2 Cr-50 0 0
+18 8 2 Cr-52 0 0
+19 8 2 Cr-53 0 0
+20 8 2 Cr-54 0 0 material group in nuclide mean std. dev.
+21 8 1 H-1 0 0
+22 8 1 O-16 0 0
+23 8 1 B-10 0 0
+24 8 1 B-11 0 0
+25 8 1 Fe-54 0 0
+26 8 1 Fe-56 0 0
+27 8 1 Fe-57 0 0
+28 8 1 Fe-58 0 0
+29 8 1 Ni-58 0 0
+30 8 1 Ni-60 0 0
+31 8 1 Ni-61 0 0
+32 8 1 Ni-62 0 0
+33 8 1 Ni-64 0 0
+34 8 1 Mn-55 0 0
+35 8 1 Si-28 0 0
+36 8 1 Si-29 0 0
+37 8 1 Si-30 0 0
+38 8 1 Cr-50 0 0
+39 8 1 Cr-52 0 0
+40 8 1 Cr-53 0 0
+41 8 1 Cr-54 0 0
+0 8 2 H-1 0 0
+1 8 2 O-16 0 0
+2 8 2 B-10 0 0
+3 8 2 B-11 0 0
+4 8 2 Fe-54 0 0
+5 8 2 Fe-56 0 0
+6 8 2 Fe-57 0 0
+7 8 2 Fe-58 0 0
+8 8 2 Ni-58 0 0
+9 8 2 Ni-60 0 0
+10 8 2 Ni-61 0 0
+11 8 2 Ni-62 0 0
+12 8 2 Ni-64 0 0
+13 8 2 Mn-55 0 0
+14 8 2 Si-28 0 0
+15 8 2 Si-29 0 0
+16 8 2 Si-30 0 0
+17 8 2 Cr-50 0 0
+18 8 2 Cr-52 0 0
+19 8 2 Cr-53 0 0
+20 8 2 Cr-54 0 0 material group in group out nuclide mean std. dev.
+63 8 1 1 H-1 0 0
+64 8 1 1 O-16 0 0
+65 8 1 1 B-10 0 0
+66 8 1 1 B-11 0 0
+67 8 1 1 Fe-54 0 0
+68 8 1 1 Fe-56 0 0
+69 8 1 1 Fe-57 0 0
+70 8 1 1 Fe-58 0 0
+71 8 1 1 Ni-58 0 0
+72 8 1 1 Ni-60 0 0
+73 8 1 1 Ni-61 0 0
+74 8 1 1 Ni-62 0 0
+75 8 1 1 Ni-64 0 0
+76 8 1 1 Mn-55 0 0
+77 8 1 1 Si-28 0 0
+78 8 1 1 Si-29 0 0
+79 8 1 1 Si-30 0 0
+80 8 1 1 Cr-50 0 0
+81 8 1 1 Cr-52 0 0
+82 8 1 1 Cr-53 0 0
+83 8 1 1 Cr-54 0 0
+42 8 1 2 H-1 0 0
+43 8 1 2 O-16 0 0
+44 8 1 2 B-10 0 0
+45 8 1 2 B-11 0 0
+46 8 1 2 Fe-54 0 0
+47 8 1 2 Fe-56 0 0
+48 8 1 2 Fe-57 0 0
+49 8 1 2 Fe-58 0 0
+50 8 1 2 Ni-58 0 0
+51 8 1 2 Ni-60 0 0
+52 8 1 2 Ni-61 0 0
+53 8 1 2 Ni-62 0 0
+54 8 1 2 Ni-64 0 0
+55 8 1 2 Mn-55 0 0
+56 8 1 2 Si-28 0 0
+57 8 1 2 Si-29 0 0
+58 8 1 2 Si-30 0 0
+59 8 1 2 Cr-50 0 0
+60 8 1 2 Cr-52 0 0
+61 8 1 2 Cr-53 0 0
+62 8 1 2 Cr-54 0 0
+21 8 2 1 H-1 0 0
+22 8 2 1 O-16 0 0
+23 8 2 1 B-10 0 0
+24 8 2 1 B-11 0 0
+25 8 2 1 Fe-54 0 0
+26 8 2 1 Fe-56 0 0
+27 8 2 1 Fe-57 0 0
+28 8 2 1 Fe-58 0 0
+29 8 2 1 Ni-58 0 0
+30 8 2 1 Ni-60 0 0
+31 8 2 1 Ni-61 0 0
+32 8 2 1 Ni-62 0 0
+33 8 2 1 Ni-64 0 0
+34 8 2 1 Mn-55 0 0
+35 8 2 1 Si-28 0 0
+36 8 2 1 Si-29 0 0
+37 8 2 1 Si-30 0 0
+38 8 2 1 Cr-50 0 0
+39 8 2 1 Cr-52 0 0
+40 8 2 1 Cr-53 0 0
+41 8 2 1 Cr-54 0 0
+0 8 2 2 H-1 0 0
+1 8 2 2 O-16 0 0
+2 8 2 2 B-10 0 0
+3 8 2 2 B-11 0 0
+4 8 2 2 Fe-54 0 0
+5 8 2 2 Fe-56 0 0
+6 8 2 2 Fe-57 0 0
+7 8 2 2 Fe-58 0 0
+8 8 2 2 Ni-58 0 0
+9 8 2 2 Ni-60 0 0
+10 8 2 2 Ni-61 0 0
+11 8 2 2 Ni-62 0 0
+12 8 2 2 Ni-64 0 0
+13 8 2 2 Mn-55 0 0
+14 8 2 2 Si-28 0 0
+15 8 2 2 Si-29 0 0
+16 8 2 2 Si-30 0 0
+17 8 2 2 Cr-50 0 0
+18 8 2 2 Cr-52 0 0
+19 8 2 2 Cr-53 0 0
+20 8 2 2 Cr-54 0 0 material group out nuclide mean std. dev.
+21 8 1 H-1 0 0
+22 8 1 O-16 0 0
+23 8 1 B-10 0 0
+24 8 1 B-11 0 0
+25 8 1 Fe-54 0 0
+26 8 1 Fe-56 0 0
+27 8 1 Fe-57 0 0
+28 8 1 Fe-58 0 0
+29 8 1 Ni-58 0 0
+30 8 1 Ni-60 0 0
+31 8 1 Ni-61 0 0
+32 8 1 Ni-62 0 0
+33 8 1 Ni-64 0 0
+34 8 1 Mn-55 0 0
+35 8 1 Si-28 0 0
+36 8 1 Si-29 0 0
+37 8 1 Si-30 0 0
+38 8 1 Cr-50 0 0
+39 8 1 Cr-52 0 0
+40 8 1 Cr-53 0 0
+41 8 1 Cr-54 0 0
+0 8 2 H-1 0 0
+1 8 2 O-16 0 0
+2 8 2 B-10 0 0
+3 8 2 B-11 0 0
+4 8 2 Fe-54 0 0
+5 8 2 Fe-56 0 0
+6 8 2 Fe-57 0 0
+7 8 2 Fe-58 0 0
+8 8 2 Ni-58 0 0
+9 8 2 Ni-60 0 0
+10 8 2 Ni-61 0 0
+11 8 2 Ni-62 0 0
+12 8 2 Ni-64 0 0
+13 8 2 Mn-55 0 0
+14 8 2 Si-28 0 0
+15 8 2 Si-29 0 0
+16 8 2 Si-30 0 0
+17 8 2 Cr-50 0 0
+18 8 2 Cr-52 0 0
+19 8 2 Cr-53 0 0
+20 8 2 Cr-54 0 0 material group in nuclide mean std. dev.
+21 9 1 H-1 0.106160 0.179178
+22 9 1 O-16 0.272020 0.171699
+23 9 1 B-10 0.000000 0.000000
+24 9 1 B-11 0.000000 0.000000
+25 9 1 Fe-54 0.000000 0.000000
+26 9 1 Fe-56 0.000000 0.000000
+27 9 1 Fe-57 0.000000 0.000000
+28 9 1 Fe-58 0.000000 0.000000
+29 9 1 Ni-58 0.000000 0.000000
+30 9 1 Ni-60 0.000000 0.000000
+31 9 1 Ni-61 0.000000 0.000000
+32 9 1 Ni-62 0.000000 0.000000
+33 9 1 Ni-64 0.000000 0.000000
+34 9 1 Mn-55 0.085133 0.082479
+35 9 1 Si-28 0.000000 0.000000
+36 9 1 Si-29 0.000000 0.000000
+37 9 1 Si-30 0.000000 0.000000
+38 9 1 Cr-50 0.000000 0.000000
+39 9 1 Cr-52 0.000000 0.000000
+40 9 1 Cr-53 0.040723 0.079827
+41 9 1 Cr-54 0.000000 0.000000
+0 9 2 H-1 1.417955 2.158027
+1 9 2 O-16 0.000000 0.000000
+2 9 2 B-10 0.269141 0.380622
+3 9 2 B-11 0.000000 0.000000
+4 9 2 Fe-54 0.000000 0.000000
+5 9 2 Fe-56 0.000000 0.000000
+6 9 2 Fe-57 0.000000 0.000000
+7 9 2 Fe-58 0.000000 0.000000
+8 9 2 Ni-58 0.000000 0.000000
+9 9 2 Ni-60 0.000000 0.000000
+10 9 2 Ni-61 0.000000 0.000000
+11 9 2 Ni-62 0.000000 0.000000
+12 9 2 Ni-64 0.000000 0.000000
+13 9 2 Mn-55 0.000000 0.000000
+14 9 2 Si-28 0.000000 0.000000
+15 9 2 Si-29 0.000000 0.000000
+16 9 2 Si-30 0.000000 0.000000
+17 9 2 Cr-50 0.000000 0.000000
+18 9 2 Cr-52 0.000000 0.000000
+19 9 2 Cr-53 0.000000 0.000000
+20 9 2 Cr-54 0.000000 0.000000 material group in nuclide mean std. dev.
+21 9 1 H-1 0 0
+22 9 1 O-16 0 0
+23 9 1 B-10 0 0
+24 9 1 B-11 0 0
+25 9 1 Fe-54 0 0
+26 9 1 Fe-56 0 0
+27 9 1 Fe-57 0 0
+28 9 1 Fe-58 0 0
+29 9 1 Ni-58 0 0
+30 9 1 Ni-60 0 0
+31 9 1 Ni-61 0 0
+32 9 1 Ni-62 0 0
+33 9 1 Ni-64 0 0
+34 9 1 Mn-55 0 0
+35 9 1 Si-28 0 0
+36 9 1 Si-29 0 0
+37 9 1 Si-30 0 0
+38 9 1 Cr-50 0 0
+39 9 1 Cr-52 0 0
+40 9 1 Cr-53 0 0
+41 9 1 Cr-54 0 0
+0 9 2 H-1 0 0
+1 9 2 O-16 0 0
+2 9 2 B-10 0 0
+3 9 2 B-11 0 0
+4 9 2 Fe-54 0 0
+5 9 2 Fe-56 0 0
+6 9 2 Fe-57 0 0
+7 9 2 Fe-58 0 0
+8 9 2 Ni-58 0 0
+9 9 2 Ni-60 0 0
+10 9 2 Ni-61 0 0
+11 9 2 Ni-62 0 0
+12 9 2 Ni-64 0 0
+13 9 2 Mn-55 0 0
+14 9 2 Si-28 0 0
+15 9 2 Si-29 0 0
+16 9 2 Si-30 0 0
+17 9 2 Cr-50 0 0
+18 9 2 Cr-52 0 0
+19 9 2 Cr-53 0 0
+20 9 2 Cr-54 0 0 material group in group out nuclide mean std. dev.
+63 9 1 1 H-1 0.106160 0.179178
+64 9 1 1 O-16 0.272020 0.171699
+65 9 1 1 B-10 0.000000 0.000000
+66 9 1 1 B-11 0.000000 0.000000
+67 9 1 1 Fe-54 0.000000 0.000000
+68 9 1 1 Fe-56 0.000000 0.000000
+69 9 1 1 Fe-57 0.000000 0.000000
+70 9 1 1 Fe-58 0.000000 0.000000
+71 9 1 1 Ni-58 0.000000 0.000000
+72 9 1 1 Ni-60 0.000000 0.000000
+73 9 1 1 Ni-61 0.000000 0.000000
+74 9 1 1 Ni-62 0.000000 0.000000
+75 9 1 1 Ni-64 0.000000 0.000000
+76 9 1 1 Mn-55 0.085133 0.082479
+77 9 1 1 Si-28 0.000000 0.000000
+78 9 1 1 Si-29 0.000000 0.000000
+79 9 1 1 Si-30 0.000000 0.000000
+80 9 1 1 Cr-50 0.000000 0.000000
+81 9 1 1 Cr-52 0.000000 0.000000
+82 9 1 1 Cr-53 0.040723 0.079827
+83 9 1 1 Cr-54 0.000000 0.000000
+42 9 1 2 H-1 0.000000 0.000000
+43 9 1 2 O-16 0.000000 0.000000
+44 9 1 2 B-10 0.000000 0.000000
+45 9 1 2 B-11 0.000000 0.000000
+46 9 1 2 Fe-54 0.000000 0.000000
+47 9 1 2 Fe-56 0.000000 0.000000
+48 9 1 2 Fe-57 0.000000 0.000000
+49 9 1 2 Fe-58 0.000000 0.000000
+50 9 1 2 Ni-58 0.000000 0.000000
+51 9 1 2 Ni-60 0.000000 0.000000
+52 9 1 2 Ni-61 0.000000 0.000000
+53 9 1 2 Ni-62 0.000000 0.000000
+54 9 1 2 Ni-64 0.000000 0.000000
+55 9 1 2 Mn-55 0.000000 0.000000
+56 9 1 2 Si-28 0.000000 0.000000
+57 9 1 2 Si-29 0.000000 0.000000
+58 9 1 2 Si-30 0.000000 0.000000
+59 9 1 2 Cr-50 0.000000 0.000000
+60 9 1 2 Cr-52 0.000000 0.000000
+61 9 1 2 Cr-53 0.000000 0.000000
+62 9 1 2 Cr-54 0.000000 0.000000
+21 9 2 1 H-1 0.000000 0.000000
+22 9 2 1 O-16 0.000000 0.000000
+23 9 2 1 B-10 0.000000 0.000000
+24 9 2 1 B-11 0.000000 0.000000
+25 9 2 1 Fe-54 0.000000 0.000000
+26 9 2 1 Fe-56 0.000000 0.000000
+27 9 2 1 Fe-57 0.000000 0.000000
+28 9 2 1 Fe-58 0.000000 0.000000
+29 9 2 1 Ni-58 0.000000 0.000000
+30 9 2 1 Ni-60 0.000000 0.000000
+31 9 2 1 Ni-61 0.000000 0.000000
+32 9 2 1 Ni-62 0.000000 0.000000
+33 9 2 1 Ni-64 0.000000 0.000000
+34 9 2 1 Mn-55 0.000000 0.000000
+35 9 2 1 Si-28 0.000000 0.000000
+36 9 2 1 Si-29 0.000000 0.000000
+37 9 2 1 Si-30 0.000000 0.000000
+38 9 2 1 Cr-50 0.000000 0.000000
+39 9 2 1 Cr-52 0.000000 0.000000
+40 9 2 1 Cr-53 0.000000 0.000000
+41 9 2 1 Cr-54 0.000000 0.000000
+0 9 2 2 H-1 1.417955 2.158027
+1 9 2 2 O-16 0.000000 0.000000
+2 9 2 2 B-10 0.000000 0.000000
+3 9 2 2 B-11 0.000000 0.000000
+4 9 2 2 Fe-54 0.000000 0.000000
+5 9 2 2 Fe-56 0.000000 0.000000
+6 9 2 2 Fe-57 0.000000 0.000000
+7 9 2 2 Fe-58 0.000000 0.000000
+8 9 2 2 Ni-58 0.000000 0.000000
+9 9 2 2 Ni-60 0.000000 0.000000
+10 9 2 2 Ni-61 0.000000 0.000000
+11 9 2 2 Ni-62 0.000000 0.000000
+12 9 2 2 Ni-64 0.000000 0.000000
+13 9 2 2 Mn-55 0.000000 0.000000
+14 9 2 2 Si-28 0.000000 0.000000
+15 9 2 2 Si-29 0.000000 0.000000
+16 9 2 2 Si-30 0.000000 0.000000
+17 9 2 2 Cr-50 0.000000 0.000000
+18 9 2 2 Cr-52 0.000000 0.000000
+19 9 2 2 Cr-53 0.000000 0.000000
+20 9 2 2 Cr-54 0.000000 0.000000 material group out nuclide mean std. dev.
+21 9 1 H-1 0 0
+22 9 1 O-16 0 0
+23 9 1 B-10 0 0
+24 9 1 B-11 0 0
+25 9 1 Fe-54 0 0
+26 9 1 Fe-56 0 0
+27 9 1 Fe-57 0 0
+28 9 1 Fe-58 0 0
+29 9 1 Ni-58 0 0
+30 9 1 Ni-60 0 0
+31 9 1 Ni-61 0 0
+32 9 1 Ni-62 0 0
+33 9 1 Ni-64 0 0
+34 9 1 Mn-55 0 0
+35 9 1 Si-28 0 0
+36 9 1 Si-29 0 0
+37 9 1 Si-30 0 0
+38 9 1 Cr-50 0 0
+39 9 1 Cr-52 0 0
+40 9 1 Cr-53 0 0
+41 9 1 Cr-54 0 0
+0 9 2 H-1 0 0
+1 9 2 O-16 0 0
+2 9 2 B-10 0 0
+3 9 2 B-11 0 0
+4 9 2 Fe-54 0 0
+5 9 2 Fe-56 0 0
+6 9 2 Fe-57 0 0
+7 9 2 Fe-58 0 0
+8 9 2 Ni-58 0 0
+9 9 2 Ni-60 0 0
+10 9 2 Ni-61 0 0
+11 9 2 Ni-62 0 0
+12 9 2 Ni-64 0 0
+13 9 2 Mn-55 0 0
+14 9 2 Si-28 0 0
+15 9 2 Si-29 0 0
+16 9 2 Si-30 0 0
+17 9 2 Cr-50 0 0
+18 9 2 Cr-52 0 0
+19 9 2 Cr-53 0 0
+20 9 2 Cr-54 0 0 material group in nuclide mean std. dev.
+21 10 1 H-1 0 0
+22 10 1 O-16 0 0
+23 10 1 B-10 0 0
+24 10 1 B-11 0 0
+25 10 1 Fe-54 0 0
+26 10 1 Fe-56 0 0
+27 10 1 Fe-57 0 0
+28 10 1 Fe-58 0 0
+29 10 1 Ni-58 0 0
+30 10 1 Ni-60 0 0
+31 10 1 Ni-61 0 0
+32 10 1 Ni-62 0 0
+33 10 1 Ni-64 0 0
+34 10 1 Mn-55 0 0
+35 10 1 Si-28 0 0
+36 10 1 Si-29 0 0
+37 10 1 Si-30 0 0
+38 10 1 Cr-50 0 0
+39 10 1 Cr-52 0 0
+40 10 1 Cr-53 0 0
+41 10 1 Cr-54 0 0
+0 10 2 H-1 0 0
+1 10 2 O-16 0 0
+2 10 2 B-10 0 0
+3 10 2 B-11 0 0
+4 10 2 Fe-54 0 0
+5 10 2 Fe-56 0 0
+6 10 2 Fe-57 0 0
+7 10 2 Fe-58 0 0
+8 10 2 Ni-58 0 0
+9 10 2 Ni-60 0 0
+10 10 2 Ni-61 0 0
+11 10 2 Ni-62 0 0
+12 10 2 Ni-64 0 0
+13 10 2 Mn-55 0 0
+14 10 2 Si-28 0 0
+15 10 2 Si-29 0 0
+16 10 2 Si-30 0 0
+17 10 2 Cr-50 0 0
+18 10 2 Cr-52 0 0
+19 10 2 Cr-53 0 0
+20 10 2 Cr-54 0 0 material group in nuclide mean std. dev.
+21 10 1 H-1 0 0
+22 10 1 O-16 0 0
+23 10 1 B-10 0 0
+24 10 1 B-11 0 0
+25 10 1 Fe-54 0 0
+26 10 1 Fe-56 0 0
+27 10 1 Fe-57 0 0
+28 10 1 Fe-58 0 0
+29 10 1 Ni-58 0 0
+30 10 1 Ni-60 0 0
+31 10 1 Ni-61 0 0
+32 10 1 Ni-62 0 0
+33 10 1 Ni-64 0 0
+34 10 1 Mn-55 0 0
+35 10 1 Si-28 0 0
+36 10 1 Si-29 0 0
+37 10 1 Si-30 0 0
+38 10 1 Cr-50 0 0
+39 10 1 Cr-52 0 0
+40 10 1 Cr-53 0 0
+41 10 1 Cr-54 0 0
+0 10 2 H-1 0 0
+1 10 2 O-16 0 0
+2 10 2 B-10 0 0
+3 10 2 B-11 0 0
+4 10 2 Fe-54 0 0
+5 10 2 Fe-56 0 0
+6 10 2 Fe-57 0 0
+7 10 2 Fe-58 0 0
+8 10 2 Ni-58 0 0
+9 10 2 Ni-60 0 0
+10 10 2 Ni-61 0 0
+11 10 2 Ni-62 0 0
+12 10 2 Ni-64 0 0
+13 10 2 Mn-55 0 0
+14 10 2 Si-28 0 0
+15 10 2 Si-29 0 0
+16 10 2 Si-30 0 0
+17 10 2 Cr-50 0 0
+18 10 2 Cr-52 0 0
+19 10 2 Cr-53 0 0
+20 10 2 Cr-54 0 0 material group in group out nuclide mean std. dev.
+63 10 1 1 H-1 0 0
+64 10 1 1 O-16 0 0
+65 10 1 1 B-10 0 0
+66 10 1 1 B-11 0 0
+67 10 1 1 Fe-54 0 0
+68 10 1 1 Fe-56 0 0
+69 10 1 1 Fe-57 0 0
+70 10 1 1 Fe-58 0 0
+71 10 1 1 Ni-58 0 0
+72 10 1 1 Ni-60 0 0
+73 10 1 1 Ni-61 0 0
+74 10 1 1 Ni-62 0 0
+75 10 1 1 Ni-64 0 0
+76 10 1 1 Mn-55 0 0
+77 10 1 1 Si-28 0 0
+78 10 1 1 Si-29 0 0
+79 10 1 1 Si-30 0 0
+80 10 1 1 Cr-50 0 0
+81 10 1 1 Cr-52 0 0
+82 10 1 1 Cr-53 0 0
+83 10 1 1 Cr-54 0 0
+42 10 1 2 H-1 0 0
+43 10 1 2 O-16 0 0
+44 10 1 2 B-10 0 0
+45 10 1 2 B-11 0 0
+46 10 1 2 Fe-54 0 0
+47 10 1 2 Fe-56 0 0
+48 10 1 2 Fe-57 0 0
+49 10 1 2 Fe-58 0 0
+50 10 1 2 Ni-58 0 0
+51 10 1 2 Ni-60 0 0
+52 10 1 2 Ni-61 0 0
+53 10 1 2 Ni-62 0 0
+54 10 1 2 Ni-64 0 0
+55 10 1 2 Mn-55 0 0
+56 10 1 2 Si-28 0 0
+57 10 1 2 Si-29 0 0
+58 10 1 2 Si-30 0 0
+59 10 1 2 Cr-50 0 0
+60 10 1 2 Cr-52 0 0
+61 10 1 2 Cr-53 0 0
+62 10 1 2 Cr-54 0 0
+21 10 2 1 H-1 0 0
+22 10 2 1 O-16 0 0
+23 10 2 1 B-10 0 0
+24 10 2 1 B-11 0 0
+25 10 2 1 Fe-54 0 0
+26 10 2 1 Fe-56 0 0
+27 10 2 1 Fe-57 0 0
+28 10 2 1 Fe-58 0 0
+29 10 2 1 Ni-58 0 0
+30 10 2 1 Ni-60 0 0
+31 10 2 1 Ni-61 0 0
+32 10 2 1 Ni-62 0 0
+33 10 2 1 Ni-64 0 0
+34 10 2 1 Mn-55 0 0
+35 10 2 1 Si-28 0 0
+36 10 2 1 Si-29 0 0
+37 10 2 1 Si-30 0 0
+38 10 2 1 Cr-50 0 0
+39 10 2 1 Cr-52 0 0
+40 10 2 1 Cr-53 0 0
+41 10 2 1 Cr-54 0 0
+0 10 2 2 H-1 0 0
+1 10 2 2 O-16 0 0
+2 10 2 2 B-10 0 0
+3 10 2 2 B-11 0 0
+4 10 2 2 Fe-54 0 0
+5 10 2 2 Fe-56 0 0
+6 10 2 2 Fe-57 0 0
+7 10 2 2 Fe-58 0 0
+8 10 2 2 Ni-58 0 0
+9 10 2 2 Ni-60 0 0
+10 10 2 2 Ni-61 0 0
+11 10 2 2 Ni-62 0 0
+12 10 2 2 Ni-64 0 0
+13 10 2 2 Mn-55 0 0
+14 10 2 2 Si-28 0 0
+15 10 2 2 Si-29 0 0
+16 10 2 2 Si-30 0 0
+17 10 2 2 Cr-50 0 0
+18 10 2 2 Cr-52 0 0
+19 10 2 2 Cr-53 0 0
+20 10 2 2 Cr-54 0 0 material group out nuclide mean std. dev.
+21 10 1 H-1 0 0
+22 10 1 O-16 0 0
+23 10 1 B-10 0 0
+24 10 1 B-11 0 0
+25 10 1 Fe-54 0 0
+26 10 1 Fe-56 0 0
+27 10 1 Fe-57 0 0
+28 10 1 Fe-58 0 0
+29 10 1 Ni-58 0 0
+30 10 1 Ni-60 0 0
+31 10 1 Ni-61 0 0
+32 10 1 Ni-62 0 0
+33 10 1 Ni-64 0 0
+34 10 1 Mn-55 0 0
+35 10 1 Si-28 0 0
+36 10 1 Si-29 0 0
+37 10 1 Si-30 0 0
+38 10 1 Cr-50 0 0
+39 10 1 Cr-52 0 0
+40 10 1 Cr-53 0 0
+41 10 1 Cr-54 0 0
+0 10 2 H-1 0 0
+1 10 2 O-16 0 0
+2 10 2 B-10 0 0
+3 10 2 B-11 0 0
+4 10 2 Fe-54 0 0
+5 10 2 Fe-56 0 0
+6 10 2 Fe-57 0 0
+7 10 2 Fe-58 0 0
+8 10 2 Ni-58 0 0
+9 10 2 Ni-60 0 0
+10 10 2 Ni-61 0 0
+11 10 2 Ni-62 0 0
+12 10 2 Ni-64 0 0
+13 10 2 Mn-55 0 0
+14 10 2 Si-28 0 0
+15 10 2 Si-29 0 0
+16 10 2 Si-30 0 0
+17 10 2 Cr-50 0 0
+18 10 2 Cr-52 0 0
+19 10 2 Cr-53 0 0
+20 10 2 Cr-54 0 0 material group in nuclide mean std. dev.
+9 11 1 H-1 0.138558 0.260695
+10 11 1 O-16 0.042575 0.049271
+11 11 1 B-10 0.000000 0.000000
+12 11 1 B-11 0.000000 0.000000
+13 11 1 Zr-90 0.041034 0.049102
+14 11 1 Zr-91 0.027328 0.021092
+15 11 1 Zr-92 0.009788 0.009282
+16 11 1 Zr-94 0.043543 0.036697
+17 11 1 Zr-96 0.000000 0.000000
+0 11 2 H-1 0.824153 0.917955
+1 11 2 O-16 0.041986 0.060727
+2 11 2 B-10 0.048216 0.042726
+3 11 2 B-11 0.000000 0.000000
+4 11 2 Zr-90 0.048596 0.067712
+5 11 2 Zr-91 0.000000 0.000000
+6 11 2 Zr-92 0.000000 0.000000
+7 11 2 Zr-94 0.043195 0.041363
+8 11 2 Zr-96 0.000000 0.000000 material group in nuclide mean std. dev.
+9 11 1 H-1 0 0
+10 11 1 O-16 0 0
+11 11 1 B-10 0 0
+12 11 1 B-11 0 0
+13 11 1 Zr-90 0 0
+14 11 1 Zr-91 0 0
+15 11 1 Zr-92 0 0
+16 11 1 Zr-94 0 0
+17 11 1 Zr-96 0 0
+0 11 2 H-1 0 0
+1 11 2 O-16 0 0
+2 11 2 B-10 0 0
+3 11 2 B-11 0 0
+4 11 2 Zr-90 0 0
+5 11 2 Zr-91 0 0
+6 11 2 Zr-92 0 0
+7 11 2 Zr-94 0 0
+8 11 2 Zr-96 0 0 material group in group out nuclide mean std. dev.
+27 11 1 1 H-1 0.111411 0.247294
+28 11 1 1 O-16 0.042575 0.049271
+29 11 1 1 B-10 0.000000 0.000000
+30 11 1 1 B-11 0.000000 0.000000
+31 11 1 1 Zr-90 0.041034 0.049102
+32 11 1 1 Zr-91 0.027328 0.021092
+33 11 1 1 Zr-92 0.009788 0.009282
+34 11 1 1 Zr-94 0.043543 0.036697
+35 11 1 1 Zr-96 0.000000 0.000000
+18 11 1 2 H-1 0.027147 0.020009
+19 11 1 2 O-16 0.000000 0.000000
+20 11 1 2 B-10 0.000000 0.000000
+21 11 1 2 B-11 0.000000 0.000000
+22 11 1 2 Zr-90 0.000000 0.000000
+23 11 1 2 Zr-91 0.000000 0.000000
+24 11 1 2 Zr-92 0.000000 0.000000
+25 11 1 2 Zr-94 0.000000 0.000000
+26 11 1 2 Zr-96 0.000000 0.000000
+9 11 2 1 H-1 0.000000 0.000000
+10 11 2 1 O-16 0.000000 0.000000
+11 11 2 1 B-10 0.000000 0.000000
+12 11 2 1 B-11 0.000000 0.000000
+13 11 2 1 Zr-90 0.000000 0.000000
+14 11 2 1 Zr-91 0.000000 0.000000
+15 11 2 1 Zr-92 0.000000 0.000000
+16 11 2 1 Zr-94 0.000000 0.000000
+17 11 2 1 Zr-96 0.000000 0.000000
+0 11 2 2 H-1 0.824153 0.917955
+1 11 2 2 O-16 0.041986 0.060727
+2 11 2 2 B-10 0.000000 0.000000
+3 11 2 2 B-11 0.000000 0.000000
+4 11 2 2 Zr-90 0.048596 0.067712
+5 11 2 2 Zr-91 0.000000 0.000000
+6 11 2 2 Zr-92 0.000000 0.000000
+7 11 2 2 Zr-94 0.043195 0.041363
+8 11 2 2 Zr-96 0.000000 0.000000 material group out nuclide mean std. dev.
+9 11 1 H-1 0 0
+10 11 1 O-16 0 0
+11 11 1 B-10 0 0
+12 11 1 B-11 0 0
+13 11 1 Zr-90 0 0
+14 11 1 Zr-91 0 0
+15 11 1 Zr-92 0 0
+16 11 1 Zr-94 0 0
+17 11 1 Zr-96 0 0
+0 11 2 H-1 0 0
+1 11 2 O-16 0 0
+2 11 2 B-10 0 0
+3 11 2 B-11 0 0
+4 11 2 Zr-90 0 0
+5 11 2 Zr-91 0 0
+6 11 2 Zr-92 0 0
+7 11 2 Zr-94 0 0
+8 11 2 Zr-96 0 0 material group in nuclide mean std. dev.
+9 12 1 H-1 0.151924 0.200147
+10 12 1 O-16 0.039280 0.026086
+11 12 1 B-10 0.000000 0.000000
+12 12 1 B-11 0.000000 0.000000
+13 12 1 Zr-90 0.017578 0.022079
+14 12 1 Zr-91 0.039984 0.025285
+15 12 1 Zr-92 0.001172 0.006230
+16 12 1 Zr-94 0.001668 0.005966
+17 12 1 Zr-96 0.004328 0.005325
+0 12 2 H-1 0.942412 0.866849
+1 12 2 O-16 0.047438 0.048161
+2 12 2 B-10 0.041655 0.031202
+3 12 2 B-11 0.000000 0.000000
+4 12 2 Zr-90 0.021193 0.017456
+5 12 2 Zr-91 0.007901 0.009268
+6 12 2 Zr-92 0.009422 0.012802
+7 12 2 Zr-94 0.043324 0.027551
+8 12 2 Zr-96 0.000000 0.000000 material group in nuclide mean std. dev.
+9 12 1 H-1 0 0
+10 12 1 O-16 0 0
+11 12 1 B-10 0 0
+12 12 1 B-11 0 0
+13 12 1 Zr-90 0 0
+14 12 1 Zr-91 0 0
+15 12 1 Zr-92 0 0
+16 12 1 Zr-94 0 0
+17 12 1 Zr-96 0 0
+0 12 2 H-1 0 0
+1 12 2 O-16 0 0
+2 12 2 B-10 0 0
+3 12 2 B-11 0 0
+4 12 2 Zr-90 0 0
+5 12 2 Zr-91 0 0
+6 12 2 Zr-92 0 0
+7 12 2 Zr-94 0 0
+8 12 2 Zr-96 0 0 material group in group out nuclide mean std. dev.
+27 12 1 1 H-1 0.122301 0.187298
+28 12 1 1 O-16 0.039280 0.026086
+29 12 1 1 B-10 0.000000 0.000000
+30 12 1 1 B-11 0.000000 0.000000
+31 12 1 1 Zr-90 0.017578 0.022079
+32 12 1 1 Zr-91 0.039984 0.025285
+33 12 1 1 Zr-92 0.001172 0.006230
+34 12 1 1 Zr-94 0.001668 0.005966
+35 12 1 1 Zr-96 0.004328 0.005325
+18 12 1 2 H-1 0.029622 0.017760
+19 12 1 2 O-16 0.000000 0.000000
+20 12 1 2 B-10 0.000000 0.000000
+21 12 1 2 B-11 0.000000 0.000000
+22 12 1 2 Zr-90 0.000000 0.000000
+23 12 1 2 Zr-91 0.000000 0.000000
+24 12 1 2 Zr-92 0.000000 0.000000
+25 12 1 2 Zr-94 0.000000 0.000000
+26 12 1 2 Zr-96 0.000000 0.000000
+9 12 2 1 H-1 0.000000 0.000000
+10 12 2 1 O-16 0.000000 0.000000
+11 12 2 1 B-10 0.000000 0.000000
+12 12 2 1 B-11 0.000000 0.000000
+13 12 2 1 Zr-90 0.000000 0.000000
+14 12 2 1 Zr-91 0.000000 0.000000
+15 12 2 1 Zr-92 0.000000 0.000000
+16 12 2 1 Zr-94 0.000000 0.000000
+17 12 2 1 Zr-96 0.000000 0.000000
+0 12 2 2 H-1 0.942412 0.866849
+1 12 2 2 O-16 0.047438 0.048161
+2 12 2 2 B-10 0.000000 0.000000
+3 12 2 2 B-11 0.000000 0.000000
+4 12 2 2 Zr-90 0.021193 0.017456
+5 12 2 2 Zr-91 0.007901 0.009268
+6 12 2 2 Zr-92 0.009422 0.012802
+7 12 2 2 Zr-94 0.043324 0.027551
+8 12 2 2 Zr-96 0.000000 0.000000 material group out nuclide mean std. dev.
+9 12 1 H-1 0 0
+10 12 1 O-16 0 0
+11 12 1 B-10 0 0
+12 12 1 B-11 0 0
+13 12 1 Zr-90 0 0
+14 12 1 Zr-91 0 0
+15 12 1 Zr-92 0 0
+16 12 1 Zr-94 0 0
+17 12 1 Zr-96 0 0
+0 12 2 H-1 0 0
+1 12 2 O-16 0 0
+2 12 2 B-10 0 0
+3 12 2 B-11 0 0
+4 12 2 Zr-90 0 0
+5 12 2 Zr-91 0 0
+6 12 2 Zr-92 0 0
+7 12 2 Zr-94 0 0
+8 12 2 Zr-96 0 0
\ No newline at end of file
diff --git a/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py b/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py
new file mode 100644
index 000000000..173043cf0
--- /dev/null
+++ b/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+
+import os
+import sys
+import glob
+import hashlib
+sys.path.insert(0, os.pardir)
+from testing_harness import PyAPITestHarness
+import openmc
+import openmc.mgxs
+
+
+class MGXSTestHarness(PyAPITestHarness):
+ def _build_inputs(self):
+
+ # The openmc.mgxs module needs a summary.h5 file
+ self._input_set.settings.output = {'summary': True}
+
+ # Generate inputs using parent class routine
+ super(MGXSTestHarness, self)._build_inputs()
+
+ # Initialize a two-group structure
+ energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, 20.])
+
+ # Initialize MGXS Library for a few cross section types
+ self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry.geometry)
+ self.mgxs_lib.by_nuclide = True
+ self.mgxs_lib.mgxs_types = ['transport', 'nu-fission',
+ 'nu-scatter matrix', 'chi']
+ self.mgxs_lib.energy_groups = energy_groups
+ self.mgxs_lib.domain_type = 'material'
+ self.mgxs_lib.build_library()
+
+ # Initialize a tallies file
+ self._input_set.tallies = openmc.TalliesFile()
+ self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False)
+ self._input_set.tallies.export_to_xml()
+
+ def _get_results(self, hash_output=False):
+ """Digest info in the statepoint and return as a string."""
+
+ # Read the statepoint file.
+ statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0]
+ sp = openmc.StatePoint(statepoint)
+
+ # Read the summary file.
+ summary = glob.glob(os.path.join(os.getcwd(), 'summary.h5'))[0]
+ su = openmc.Summary(summary)
+ sp.link_with_summary(su)
+
+ # Load the MGXS library from the statepoint
+ self.mgxs_lib.load_from_statepoint(sp)
+
+ # Build a string from Pandas Dataframe for each MGXS
+ outstr = ''
+ for domain in self.mgxs_lib.domains:
+ for mgxs_type in self.mgxs_lib.mgxs_types:
+ mgxs = self.mgxs_lib.get_mgxs(domain, mgxs_type)
+ df = mgxs.get_pandas_dataframe()
+ outstr += df.to_string()
+
+ # Hash the results if necessary
+ if hash_output:
+ sha512 = hashlib.sha512()
+ sha512.update(outstr.encode('utf-8'))
+ outstr = sha512.hexdigest()
+
+ return outstr
+
+
+ def _cleanup(self):
+ super(MGXSTestHarness, self)._cleanup()
+ f = os.path.join(os.getcwd(), 'tallies.xml')
+ if os.path.exists(f): os.remove(f)
+
+
+if __name__ == '__main__':
+ harness = MGXSTestHarness('statepoint.10.*', True)
+ harness.main()
diff --git a/tests/testing_harness.py b/tests/testing_harness.py
index 828fc3a09..ed89f7694 100644
--- a/tests/testing_harness.py
+++ b/tests/testing_harness.py
@@ -339,6 +339,9 @@ class PyAPITestHarness(TestHarness):
"""Make sure the current inputs agree with the _true standard."""
compare = filecmp.cmp('inputs_test.dat', 'inputs_true.dat')
if not compare:
+ f = open('inputs_test.dat')
+ for line in f.readlines(): print(line)
+ f.close()
os.rename('inputs_test.dat', 'inputs_error.dat')
assert compare, 'Input files are broken.'
@@ -349,6 +352,7 @@ class PyAPITestHarness(TestHarness):
output.append(os.path.join(os.getcwd(), 'geometry.xml'))
output.append(os.path.join(os.getcwd(), 'settings.xml'))
output.append(os.path.join(os.getcwd(), 'inputs_test.dat'))
+ output.append(os.path.join(os.getcwd(), 'summary.h5'))
for f in output:
if os.path.exists(f):
os.remove(f)