OpenMC/docs/source/pythonapi/examples/nuclear-data.ipynb

899 lines
121 KiB
Text
Raw Normal View History

2016-06-08 10:18:34 -05:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this notebook, we will go through the salient features of the `openmc.data` package in the Python API. This package enables inspection, analysis, and conversion of nuclear data from ACE files. Most importantly, the package provides a mean to generate HDF5 nuclear data libraries that are used by the transport solver."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import os\n",
"from pprint import pprint\n",
"\n",
"import h5py\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.cm\n",
"from matplotlib.patches import Rectangle\n",
"\n",
"import openmc.data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Importing from HDF5"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The `openmc.data` module can read OpenMC's HDF5-formatted data into Python objects. The easiest way to do this is with the `openmc.data.IncidentNeutron.from_hdf5(...)` factory method. Replace the `filename` variable below with a valid path to an HDF5 data file on your computer."
2016-06-08 10:18:34 -05:00
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-09-23 06:43:29 -05:00
"<IncidentNeutron: Gd157>"
2016-06-08 10:18:34 -05:00
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Get filename for Gd-157\n",
2016-09-23 06:43:29 -05:00
"filename ='/home/romano/openmc/data/nndc_hdf5/Gd157.h5'\n",
2016-06-08 10:18:34 -05:00
"\n",
"# Load HDF5 data into object\n",
"gd157 = openmc.data.IncidentNeutron.from_hdf5(filename)\n",
2016-06-08 10:18:34 -05:00
"gd157"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cross sections"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"From Python, it's easy to explore (and modify) the nuclear data. Let's start off by reading the total cross section. Reactions are indexed using their \"MT\" number -- a unique identifier for each reaction defined by the ENDF-6 format. The MT number for the total cross section is 1."
2016-06-08 10:18:34 -05:00
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<Reaction: MT=1 (n,total)>"
2016-06-08 10:18:34 -05:00
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"total = gd157[1]\n",
"total"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2016-09-23 06:43:29 -05:00
"Cross sections for each reaction can be stored at multiple temperatures. To see what temperatures are available, we can look at the reaction's `xs` attribute."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-09-23 06:43:29 -05:00
"{'294K': <openmc.data.function.Sum at 0x7f878c931860>}"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2016-09-23 06:43:29 -05:00
"total.xs"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2016-09-23 06:43:29 -05:00
"To find the cross section at a particular energy, 1 eV for example, simply get the cross section at the appropriate temperature and then call it as a function. Note that our nuclear data uses MeV as the unit of energy."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-09-23 06:43:29 -05:00
"142.6474702147809"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2016-09-23 06:43:29 -05:00
"total.xs['294K'](1e-6)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2016-09-23 06:43:29 -05:00
"The `xs` attribute can also be called on an array of energies."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-09-23 06:43:29 -05:00
"array([ 142.64747021, 38.65417611, 175.40019668])"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2016-09-23 06:43:29 -05:00
"total.xs['294K']([1e-6, 2e-6, 3e-6])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A quick way to plot cross sections is to use the `energy` attribute of `IncidentNeutron`. This gives an array of all the energy values used in cross section interpolation for each temperature present."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-09-23 06:43:29 -05:00
"{'294K': array([ 1.00000000e-11, 1.03250000e-11, 1.06500000e-11, ...,\n",
" 1.95000000e+01, 1.99000000e+01, 2.00000000e+01])}"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
2016-09-23 06:43:29 -05:00
}
],
"source": [
"gd157.energy"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x7f878a1cff28>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
2016-06-08 10:18:34 -05:00
},
{
"data": {
2016-09-23 06:43:29 -05:00
"image/png": "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\nGNaGkVm6doU9e+Ctt8I
2016-06-08 10:18:34 -05:00
"text/plain": [
2016-09-23 06:43:29 -05:00
"<matplotlib.figure.Figure at 0x7f878c9314e0>"
2016-06-08 10:18:34 -05:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2016-09-23 06:43:29 -05:00
"energies = gd157.energy['294K']\n",
"total_xs = total.xs['294K'](energies)\n",
"plt.loglog(energies, total_xs)\n",
2016-06-08 10:18:34 -05:00
"plt.xlabel('Energy (MeV)')\n",
"plt.ylabel('Cross section (b)')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Reaction Data\n",
"\n",
"Most of the interesting data for an `IncidentNeutron` instance is contained within the `reactions` attribute, which is a dictionary mapping MT values to `Reaction` objects."
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 9,
2016-06-08 10:18:34 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2016-07-25 06:33:37 -05:00
"[<Reaction: MT=2 (n,elastic)>,\n",
" <Reaction: MT=16 (n,2n)>,\n",
" <Reaction: MT=17 (n,3n)>,\n",
" <Reaction: MT=22 (n,na)>,\n",
" <Reaction: MT=24 (n,2na)>,\n",
" <Reaction: MT=28 (n,np)>,\n",
" <Reaction: MT=41 (n,2np)>,\n",
" <Reaction: MT=51 (n,n1)>,\n",
" <Reaction: MT=52 (n,n2)>,\n",
" <Reaction: MT=53 (n,n3)>]\n"
2016-06-08 10:18:34 -05:00
]
}
],
"source": [
"pprint(list(gd157.reactions.values())[:10])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's suppose we want to look more closely at the (n,2n) reaction. This reaction has an energy threshold"
2016-06-08 10:18:34 -05:00
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 10,
2016-06-08 10:18:34 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Threshold = 6.400881 MeV\n"
]
}
],
"source": [
"n2n = gd157[16]\n",
2016-09-23 06:43:29 -05:00
"print('Threshold = {} MeV'.format(n2n.xs['294K'].x[0]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The (n,2n) cross section, like all basic cross sections, is represented by the `Tabulated1D` class. The energy and cross section values in the table can be directly accessed with the `x` and `y` attributes. Using the `x` and `y` has the nice benefit of automatically acounting for reaction thresholds."
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-09-23 06:43:29 -05:00
"{'294K': <openmc.data.function.Tabulated1D at 0x7f878c931cc0>}"
]
},
2016-09-23 06:43:29 -05:00
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n2n.xs"
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(6.400881, 20.0)"
]
},
2016-09-23 06:43:29 -05:00
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
2016-06-08 10:18:34 -05:00
},
{
"data": {
2016-09-23 06:43:29 -05:00
"image/png": "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\nbRd3RCJVa9CgUGDv3nv
2016-06-08 10:18:34 -05:00
"text/plain": [
2016-09-23 06:43:29 -05:00
"<matplotlib.figure.Figure at 0x7f8789b33dd8>"
2016-06-08 10:18:34 -05:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2016-09-23 06:43:29 -05:00
"xs = n2n.xs['294K']\n",
"plt.plot(xs.x, xs.y)\n",
2016-06-08 10:18:34 -05:00
"plt.xlabel('Energy (MeV)')\n",
"plt.ylabel('Cross section (b)')\n",
2016-09-23 06:43:29 -05:00
"plt.xlim((xs.x[0], xs.x[-1]))"
2016-06-08 10:18:34 -05:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To get information on the energy and angle distribution of the neutrons emitted in the reaction, we need to look at the `products` attribute."
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 13,
2016-06-08 10:18:34 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-09-23 06:43:29 -05:00
"[<Product: neutron, emission=prompt, yield=polynomial>,\n",
2016-06-08 10:18:34 -05:00
" <Product: photon, emission=prompt, yield=tabulated>]"
]
},
2016-09-23 06:43:29 -05:00
"execution_count": 13,
2016-06-08 10:18:34 -05:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n2n.products"
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 14,
2016-06-08 10:18:34 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-09-23 06:43:29 -05:00
"[<openmc.data.correlated.CorrelatedAngleEnergy at 0x7f878c8916a0>]"
2016-06-08 10:18:34 -05:00
]
},
2016-09-23 06:43:29 -05:00
"execution_count": 14,
2016-06-08 10:18:34 -05:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"neutron = n2n.products[0]\n",
"neutron.distribution"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We see that the neutrons emitted have a correlated angle-energy distribution. Let's look at the `energy_out` attribute to see what the outgoing energy distributions are."
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 15,
2016-06-08 10:18:34 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-09-23 06:43:29 -05:00
"[<openmc.stats.univariate.Tabular at 0x7f878c8c92b0>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8c93c8>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8c9470>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8c95c0>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8c97b8>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8c9a20>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8c9d30>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8d00f0>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8d04e0>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8d0940>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8d0e10>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8d6320>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8d6898>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8d6e48>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8dd4a8>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8ddb00>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8e3208>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8e3908>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8ea048>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8ea7b8>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8eaf60>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8f1780>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8f1f98>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8f7828>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8fd0f0>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c8fd9b0>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c884208>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c884ac8>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c88a400>,\n",
" <openmc.stats.univariate.Tabular at 0x7f878c88ad30>]"
2016-06-08 10:18:34 -05:00
]
},
2016-09-23 06:43:29 -05:00
"execution_count": 15,
2016-06-08 10:18:34 -05:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dist = neutron.distribution[0]\n",
"dist.energy_out"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we see we have a tabulated outgoing energy distribution for each incoming energy. Note that the same probability distribution classes that we could use to create a source definition are also used within the `openmc.data` package. Let's plot every fifth distribution to get an idea of what they look like."
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 16,
2016-06-08 10:18:34 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
2016-09-23 06:43:29 -05:00
"image/png": "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\nCsVtNPWS1GpgRPkEIYQ
2016-06-08 10:18:34 -05:00
"text/plain": [
2016-09-23 06:43:29 -05:00
"<matplotlib.figure.Figure at 0x7f8789ab78d0>"
2016-06-08 10:18:34 -05:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"for e_in, e_out_dist in zip(dist.energy[::5], dist.energy_out[::5]):\n",
" plt.semilogy(e_out_dist.x, e_out_dist.p, label='E={:.2f} MeV'.format(e_in))\n",
"plt.ylim(ymax=10)\n",
"plt.legend()\n",
"plt.xlabel('Outgoing energy (MeV)')\n",
"plt.ylabel('Probability/MeV')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There is also `summed_reactions` attribute for cross sections (like total) which are built from summing up other cross sections."
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[<Reaction: MT=101 (n,disappear)>,\n",
" <Reaction: MT=27 (n,absorption)>,\n",
" <Reaction: MT=4 (n,level)>,\n",
" <Reaction: MT=3>,\n",
" <Reaction: MT=1 (n,total)>]\n"
]
}
],
"source": [
"pprint(list(gd157.summed_reactions.values()))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that the cross sections for these reactions are represented by the `Sum` class rather than `Tabulated1D`. They do not support the `x` and `y` attributes."
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-09-23 06:43:29 -05:00
"{'294K': <openmc.data.function.Sum at 0x7f878c931828>}"
]
},
2016-09-23 06:43:29 -05:00
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gd157[27].xs"
]
},
2016-06-08 10:18:34 -05:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Unresolved resonance probability tables\n",
"\n",
"We can also look at unresolved resonance probability tables which are stored in a `ProbabilityTables` object. In the following example, we'll create a plot showing what the total cross section probability tables look like as a function of incoming energy."
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 19,
2016-06-08 10:18:34 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-09-23 06:43:29 -05:00
"<matplotlib.text.Text at 0x7f8789a93d68>"
2016-06-08 10:18:34 -05:00
]
},
2016-09-23 06:43:29 -05:00
"execution_count": 19,
2016-06-08 10:18:34 -05:00
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
2016-09-23 06:43:29 -05:00
"image/png": "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\n/WlC11m1ahVmz54tu57
2016-06-08 10:18:34 -05:00
"text/plain": [
2016-09-23 06:43:29 -05:00
"<matplotlib.figure.Figure at 0x7f878a19d710>"
2016-06-08 10:18:34 -05:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure()\n",
"ax = fig.add_subplot(111)\n",
"cm = matplotlib.cm.Spectral_r\n",
"\n",
"# Determine size of probability tables\n",
2016-09-23 06:43:29 -05:00
"urr = gd157.urr['294K']\n",
2016-06-08 10:18:34 -05:00
"n_energy = urr.table.shape[0]\n",
"n_band = urr.table.shape[2]\n",
"\n",
"for i in range(n_energy):\n",
" # Get bounds on energy\n",
" if i > 0:\n",
" e_left = urr.energy[i] - 0.5*(urr.energy[i] - urr.energy[i-1])\n",
" else:\n",
" e_left = urr.energy[i] - 0.5*(urr.energy[i+1] - urr.energy[i])\n",
"\n",
" if i < n_energy - 1:\n",
" e_right = urr.energy[i] + 0.5*(urr.energy[i+1] - urr.energy[i])\n",
" else:\n",
" e_right = urr.energy[i] + 0.5*(urr.energy[i] - urr.energy[i-1])\n",
" \n",
" for j in range(n_band):\n",
" # Determine maximum probability for a single band\n",
" max_prob = np.diff(urr.table[i,0,:]).max()\n",
" \n",
" # Determine bottom of band\n",
" if j > 0:\n",
" xs_bottom = urr.table[i,1,j] - 0.5*(urr.table[i,1,j] - urr.table[i,1,j-1])\n",
" value = (urr.table[i,0,j] - urr.table[i,0,j-1])/max_prob\n",
" else:\n",
" xs_bottom = urr.table[i,1,j] - 0.5*(urr.table[i,1,j+1] - urr.table[i,1,j])\n",
" value = urr.table[i,0,j]/max_prob\n",
"\n",
" # Determine top of band\n",
" if j < n_band - 1:\n",
" xs_top = urr.table[i,1,j] + 0.5*(urr.table[i,1,j+1] - urr.table[i,1,j])\n",
" else:\n",
" xs_top = urr.table[i,1,j] + 0.5*(urr.table[i,1,j] - urr.table[i,1,j-1])\n",
" \n",
" # Draw rectangle with appropriate color\n",
" ax.add_patch(Rectangle((e_left, xs_bottom), e_right - e_left, xs_top - xs_bottom,\n",
" color=cm(value)))\n",
"\n",
"# Overlay total cross section\n",
2016-09-23 06:43:29 -05:00
"ax.plot(gd157.energy['294K'], total.xs['294K'](gd157.energy['294K']), 'k')\n",
2016-06-08 10:18:34 -05:00
"\n",
"# Make plot pretty and labeled\n",
"ax.set_xlim(1e-6, 1e-1)\n",
"ax.set_ylim(1e-1, 1e4)\n",
"ax.set_xscale('log')\n",
"ax.set_yscale('log')\n",
"ax.set_xlabel('Energy (MeV)')\n",
"ax.set_ylabel('Cross section(b)')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Converting ACE to HDF5\n",
2016-06-08 10:18:34 -05:00
"\n",
"The `openmc.data` package can also read ACE files and output HDF5 files. ACE files can be read with the `openmc.data.IncidentNeutron.from_ace(...)` factory method."
2016-06-08 10:18:34 -05:00
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 20,
2016-06-08 10:18:34 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-09-23 06:43:29 -05:00
"<IncidentNeutron: Gd157>"
]
},
2016-09-23 06:43:29 -05:00
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2016-09-23 06:43:29 -05:00
"filename = '/opt/data/ace/nndc/293.6K/Gd_157_293.6K.ace'\n",
"gd157_ace = openmc.data.IncidentNeutron.from_ace(filename)\n",
"gd157_ace"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can store this formerly ACE data as HDF5 with the `export_to_hdf5()` method."
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 21,
"metadata": {
2016-09-23 06:43:29 -05:00
"collapsed": false
},
2016-06-08 10:18:34 -05:00
"outputs": [],
"source": [
"gd157_ace.export_to_hdf5('gd157.h5', 'w')"
2016-06-08 10:18:34 -05:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"With few exceptions, the HDF5 file encodes the same data as the ACE file."
2016-06-08 10:18:34 -05:00
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 22,
2016-06-08 10:18:34 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])"
2016-06-08 10:18:34 -05:00
]
},
2016-09-23 06:43:29 -05:00
"execution_count": 22,
2016-06-08 10:18:34 -05:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gd157_reconstructed = openmc.data.IncidentNeutron.from_hdf5('gd157.h5')\n",
2016-09-23 06:43:29 -05:00
"gd157_ace[16].xs['294K'].y - gd157_reconstructed[16].xs['294K'].y"
2016-06-08 10:18:34 -05:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And one of the best parts of using HDF5 is that it is a widely used format with lots of third-party support. You can use `h5py`, for example, to inspect the data."
2016-06-08 10:18:34 -05:00
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 23,
2016-06-08 10:18:34 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2016-07-25 06:33:37 -05:00
"reaction_002, (n,elastic)\n",
"reaction_016, (n,2n)\n",
"reaction_017, (n,3n)\n",
"reaction_022, (n,na)\n",
"reaction_024, (n,2na)\n",
"reaction_028, (n,np)\n",
"reaction_041, (n,2np)\n",
"reaction_051, (n,n1)\n",
"reaction_052, (n,n2)\n",
"reaction_053, (n,n3)\n"
2016-06-08 10:18:34 -05:00
]
}
],
"source": [
"h5file = h5py.File('gd157.h5', 'r')\n",
2016-09-23 06:43:29 -05:00
"main_group = h5file['Gd157/reactions']\n",
2016-07-25 06:33:37 -05:00
"for name, obj in sorted(list(main_group.items()))[:10]:\n",
" if 'reaction_' in name:\n",
" print('{}, {}'.format(name, obj.attrs['label'].decode()))"
2016-06-08 10:18:34 -05:00
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 24,
2016-06-08 10:18:34 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2016-09-23 06:43:29 -05:00
"[<HDF5 group \"/Gd157/reactions/reaction_016/product_0\" (2 members)>,\n",
" <HDF5 group \"/Gd157/reactions/reaction_016/294K\" (1 members)>,\n",
" <HDF5 group \"/Gd157/reactions/reaction_016/product_1\" (2 members)>]\n"
2016-06-08 10:18:34 -05:00
]
}
],
"source": [
2016-07-25 06:33:37 -05:00
"n2n_group = main_group['reaction_016']\n",
2016-06-08 10:18:34 -05:00
"pprint(list(n2n_group.values()))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So we see that the hierarchy of data within the HDF5 mirrors the hierarchy of Python objects that we manipulated before."
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 25,
2016-06-08 10:18:34 -05:00
"metadata": {
"collapsed": false,
"scrolled": true
2016-06-08 10:18:34 -05:00
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0.00000000e+00, 3.02679600e-13, 1.29110100e-02,\n",
" 6.51111000e-02, 3.92627000e-01, 5.75226800e-01,\n",
" 6.96960000e-01, 7.39937800e-01, 9.63545000e-01,\n",
" 1.14213000e+00, 1.30802000e+00, 1.46350000e+00,\n",
" 1.55760000e+00, 1.64055000e+00, 1.68896000e+00,\n",
" 1.71140000e+00, 1.73945000e+00, 1.78207000e+00,\n",
" 1.81665000e+00, 1.84528000e+00, 1.86540900e+00,\n",
" 1.86724000e+00, 1.88155800e+00, 1.88156000e+00,\n",
" 1.88180000e+00, 1.89447000e+00, 1.86957000e+00,\n",
" 1.82120000e+00, 1.71600000e+00, 1.60054000e+00,\n",
" 1.43162000e+00, 1.28346000e+00, 1.10166000e+00,\n",
" 1.06530000e+00, 9.30730000e-01, 8.02980000e-01,\n",
" 7.77740000e-01])"
]
},
2016-09-23 06:43:29 -05:00
"execution_count": 25,
2016-06-08 10:18:34 -05:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2016-09-23 06:43:29 -05:00
"n2n_group['294K/xs'].value"
2016-06-08 10:18:34 -05:00
]
}
],
"metadata": {
"kernelspec": {
2016-09-23 06:43:29 -05:00
"display_name": "Python 3",
2016-06-08 10:18:34 -05:00
"language": "python",
2016-09-23 06:43:29 -05:00
"name": "python3"
2016-06-08 10:18:34 -05:00
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
2016-09-23 06:43:29 -05:00
"version": 3
2016-06-08 10:18:34 -05:00
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
2016-09-23 06:43:29 -05:00
"pygments_lexer": "ipython3",
"version": "3.5.2"
2016-06-08 10:18:34 -05:00
}
},
"nbformat": 4,
"nbformat_minor": 0
}