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": [
2016-07-28 16:27:11 -05:00
"## 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-10-31 14:12:19 -05:00
"filename ='/home/romano/openmc/scripts/nndc_hdf5/Gd157.h5'\n",
2016-06-08 10:18:34 -05:00
"\n",
2016-07-28 16:27:11 -05:00
"# 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": [
2016-07-28 16:27:11 -05:00
"## 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": [
2016-07-28 16:27:11 -05:00
"<Reaction: MT=1 (n,total)>"
2016-06-08 10:18:34 -05:00
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
2016-07-28 16:27:11 -05:00
}
],
"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."
2016-07-28 16:27:11 -05:00
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-10-31 14:12:19 -05:00
"{'294K': <openmc.data.function.Sum at 0x7fc3263ca1d0>}"
2016-07-28 16:27:11 -05:00
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2016-09-23 06:43:29 -05:00
"total.xs"
2016-07-28 16:27:11 -05:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2016-10-31 14:12:19 -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 eV as the unit of energy."
2016-07-28 16:27:11 -05:00
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-09-23 06:43:29 -05:00
"142.6474702147809"
2016-07-28 16:27:11 -05:00
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2016-10-31 14:12:19 -05:00
"total.xs['294K'](1.0)"
2016-07-28 16:27:11 -05:00
]
},
{
"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."
2016-07-28 16:27:11 -05:00
]
},
{
"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])"
2016-07-28 16:27:11 -05:00
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2016-10-31 14:12:19 -05:00
"total.xs['294K']([1.0, 2.0, 3.0])"
2016-09-23 06:43:29 -05:00
]
},
{
"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."
2016-07-28 16:27:11 -05:00
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-10-31 14:12:19 -05:00
"{'294K': array([ 1.00000000e-05, 1.03250000e-05, 1.06500000e-05, ...,\n",
" 1.95000000e+07, 1.99000000e+07, 2.00000000e+07])}"
2016-07-28 16:27:11 -05:00
]
},
"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": [
2016-10-31 14:12:19 -05:00
"<matplotlib.text.Text at 0x7fc323c68748>"
2016-09-23 06:43:29 -05:00
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
2016-06-08 10:18:34 -05:00
},
{
"data": {
2016-10-31 14:12:19 -05:00
"image/png": "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\nQcrapGFtGpmla1fYtQv
2016-06-08 10:18:34 -05:00
"text/plain": [
2016-10-31 14:12:19 -05:00
"<matplotlib.figure.Figure at 0x7fc3263c25f8>"
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-10-31 14:12:19 -05:00
"plt.xlabel('Energy (eV)')\n",
2016-06-08 10:18:34 -05:00
"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": [
2016-07-28 16:27:11 -05:00
"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": [
2016-10-31 14:12:19 -05:00
"Threshold = 6400881.0 eV\n"
2016-06-08 10:18:34 -05:00
]
2016-07-28 16:27:11 -05:00
}
],
"source": [
"n2n = gd157[16]\n",
2016-10-31 14:12:19 -05:00
"print('Threshold = {} eV'.format(n2n.xs['294K'].x[0]))"
2016-07-28 16:27:11 -05:00
]
},
{
"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,
2016-07-28 16:27:11 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-10-31 14:12:19 -05:00
"{'294K': <openmc.data.function.Tabulated1D at 0x7fc3263ca4e0>}"
2016-07-28 16:27:11 -05:00
]
},
2016-09-23 06:43:29 -05:00
"execution_count": 11,
2016-07-28 16:27:11 -05:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n2n.xs"
]
},
{
"cell_type": "code",
2016-09-23 06:43:29 -05:00
"execution_count": 12,
2016-07-28 16:27:11 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-10-31 14:12:19 -05:00
"(6400881.0, 20000000.0)"
2016-07-28 16:27:11 -05:00
]
},
2016-09-23 06:43:29 -05:00
"execution_count": 12,
2016-07-28 16:27:11 -05:00
"metadata": {},
"output_type": "execute_result"
2016-06-08 10:18:34 -05:00
},
{
"data": {
2016-10-31 14:12:19 -05:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEPCAYAAABY9lNGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xnc1XP6x/HX1TYpiRhlmVCJsqdSMoNEMihtVKKI7Bqj\nMfOTdTAY2YVMmEpSQkZ2srVJiVQikp2UUEjq+v3xObdut3Pf97nv+3zP9yzv5+NxHp3le865Pt33\nua/z/SzXx9wdERGRkqrFHYCIiGQnJQgREUlKCUJERJJSghARkaSUIEREJCklCBERSSrSBGFm25vZ\n82a2wMzmm9k5pRx3s5m9a2bzzGzvKGMSEZHU1Ij49X8GznP3eWa2KTDHzJ5297eLDjCzLkBTd9/Z\nzPYD7gDaRRyXiIiUI9IzCHf/3N3nJa6vBhYB25U4rCswOnHMLKC+mTWMMi4RESlfxsYgzGxHYG9g\nVomHtgM+Knb7E36bREREJMMykiAS3UsPAucmziRERCTLRT0GgZnVICSHMe4+OckhnwB/KHZ7+8R9\nJV9HRaNERCrB3a0yz8vEGcTdwEJ3v6mUxx8FTgAws3bAKnf/ItmB7p61l+7du8ceg9qgNmTTJR/a\nkQ9tqIpIzyDMrAPQD5hvZq8DDvwfsAPg7j7S3R83syPMbAmwBhgYZUwiIpKaSBOEu08Dqqdw3FlR\nxiEiIhWnldRp0qJFi7hDqDK1ITvkQxsgP9qRD22oCiWINGnZsmXcIVSZ2pAd8qENkB/tyIc2VIUS\nhIiIJKUEISIiSSlBiIhIUkoQIiKSlBKEiJTpu+/g66/jjkLiEHmpDRHJXj/9BJ98Ah9+CB99tPHf\n4tfXroXq1WHbbWH//TdeWrSAavqKmdeUIETy2Lp14Y/8++9vvCxdCh98EO7/6ito1AgaN4Y//CH8\nu9tu0KXLxtsNGsCGDbBgAcyYAa+8AtdeC8uXQ7t2GxNG27aw2WZxt1jSSQlCJMetXAlLlvw6ARRd\n//RT2GYbaNIkXHbaCbp2hR13DAlgm22gRgp/BapXhz33DJfBg8N9X34ZEsaMGXD55TB3LjRtGpLF\nH/8Ia9eWW0RBspwShEgO+fJLmDPn15dVq2DnnTcmgdatoXfvkAwaN4ZataKJZeutQ7Lp2jXc/ukn\nmDcPpk+H++6Dl1/uyrvvwplnwnba4SUnKUGIZKkvvvhtMli9Glq1gn33heOOC109TZtmx1hArVqh\nm6ltWxgyBK6//mmWLTuaPfYIXVZDhkCbNnFHKRWhBCGSBTZsgDfegOefh/vv/yN/+xusWRMSwb77\nQt++MHx4OEOwSlX2z7xGjVZz3nlw2WVw993Qq1c4kxgyBI45JrWuLYmXfkQiMXCHd94JCeG55+CF\nF2DLLeGQQ6B9+2X85S9/YKedcicZlGXzzeG88+Ccc+DRR+GGG+D88+Hss2HQoPC4ZKcsODEVKQwf\nfQT//S+ccEIYIO7UCWbNCn348+bB4sUwYgS0b/9hTp0ppKpGDejeHV5+GSZNCmdMTZrAWWfBu+/G\nHZ0kozMIkYisWQNPPw1PPRXOElatgoMPDmcJF10EzZrlXxJIVevWMGZMmGU1YgR06ABnnAGXXFK4\n/yfZSAlCJI2++goeewweeSR0H7VtC0ccAaefDnvskR2Dydlk223hiitCd9Nhh4VV29ddpySRLZQg\nRKrogw9g8uSQFObODV1HPXvCPffAFlvEHV1uaNgQpk4Ns51OPz2cVSiZxk8JQqSC3GH+fHj44ZAU\nPv4Yjj46DMR26gSbbBJ3hLmpQQN45hk46igYMCDMfNJMp3gpR4ukaMECGDo0rDvo2hW++QZuugk+\n+wxGjQp/2JQcqmazzeCJJ8IakOOOC4vvJD5KECJl+PZbGDkS9tsv9JHXrBnOHN5/H66/Hv70J33L\nTbc6dcJ02PXroVs3+OGHuCMqXEoQIiW4h6mYAwaEUhVPPgkXXwzLlsFVV8Fee2kQNWq/+x1MmBDG\ncI44IgxeS+YpQYgkfP45XHMN7LornHoq7L57WJvw0EPw5z/rTCHTataE0aPDdODDDtOeFHFQgpCC\n9vPPoTuja9ewv8E774TZRwsXhtW+DRvGHWFhq159Yxdfx46hxLhkjr4TScH58MMwpXLq1LCIrUkT\nOPlkGDsW6tWLOzopySyU57j4YjjwwDDTSdVhM0MJQvLep59uTAhTp4b+7IMOCquaL7wwlMqW7GYG\n//wn1K0bJgY891zY00KipQQheefLL0Pxu6KE8OWXGxPCkCFhxzQNMuemv/99Y5J49llo3jzuiPKb\nEoTktHXrwvqE114LlylTjuC778KOZgcfHAab99pLq3LzydlnhyTRsSO8+GJYlyLRUIKQnLF+PSxa\ntDEZvPZaWNG8ww6h+Fvr1rDddjP5xz8O14yjPHfSSWERXadO8NJLoTqupJ8+RpK1li0L6xGKksG8\neaG4W1Ey6N0b9tnn1wPL48atVHIoEKedBt9/H6rjvvQSNGoUd0T5Rx8lySruYfzghhtgxowwdtCm\nDVx+edhqU5vLSHHnnRfKqh966MZNlyR9lCAkK/z4I4wfDzfeGLoOhgwJt+vUiTsyyXbDhoW9ujt3\nDrOb6tePO6L8oaE7idUXX8Cll4Ypiw88EFYyL1gQBpeVHCQVZnD11dCuXVjxvmZN3BHlDyUIicUb\nb8DAgaGsxeefh811nngifAvUFFSpKDO4+eawpqVbt3BGKlWnBCEZs359KGvRsWP4prfLLrBkCdxx\nB7RsGXd0kuuqVYP//CeMQ/TuHaZAS9UoQUhGvPJKqHV0xRVwyimwdGlY9KRBRUmn6tXDXtcAxx8f\nvpRI5SlBSKQ2bAjjCj17wvDhMGsW9OkTKnWKRKFmzVAqfOVKGDQo/A5K5ShBSGS++irssvboozB7\ndriu8QXJhNq1w3awS5aEldfucUeUm5QgJBLTpoV1C7vtFuana6WrZFrdujBlCrz6KlxwgZJEZWgd\nhKTVhg2hK+m668I+zUceGXdEUsg22yyUdD/ooLDi/qKL4o4otyhBSNqsWAEnnhj+nT07bNcpErcG\nDcIeEm3awP77h9Ickhp1MUlazJgRupR23TXUxVFykGzSsGGYTn3KKVpIVxFKEFIl7qFLqVs3uOWW\n0LWkGUqSjY44Ag44IGwSJalRF5NU2sqVMGBAKJcxa5Z2+JLsd8MNsMce0KsXdOgQdzTZT2cQUilz\n5oQupWbNQkluJQfJBVtuGUpynHyyynGkQglCKuzhh+Hww0PX0vXXQ61acUckkrqePcP068svjzuS\n7KcuJkmZexhjuOkmePJJ2HffuCMSqZzbboM99wzJolWruKPJXpGeQZjZKDP7wszeLOXxA81slZnN\nTVyGRRmPVN66dTB4MNx3H8ycqeQgua1Ro/Bl5+STVdSvLFF3Md0DdC7nmJfcvVXickXE8UglrFoV\nZoB8+mkYb9h++7gjEqm6/v1Dorj22rgjyV6RJgh3fwX4upzDVJ0niy1dGhYXtWwJkyf/ev9nkVxm\nBnfeGXYxXLgw7miyUzYMUrc3s3lmNsXMtCtAFpkxIySHM84I4w7Vq8cdkUh6NW4cBqtPOkmlwZOJ\ne5B6DtDY3b83sy7AI0Dz0g7u0aPHL9dbtGhByyzaZWbatGlxh1BlxdswY0ZjRo9uzeDBM2nQ4FPG\njYsxsArIt59DLsuVdtSrB998cwgDBnxMly6Lf/VYrrShuIULF7Jo0aK0vFasCcLdVxe7/oSZjTCz\nBu6+MtnxkyZNylxwldC3b9+4Q6iyPn36cuWVoUT3yy/DnnseFHdIFZYPP4d8aAPkTjvatYN27Rpy\n6aX70rTprx/LlTaUxqpQYz8TXUxGKeMMZtaw2PW2gJWWHCR669ZVY8CAMNYwc2aYBihSCJo1g3/8\nI9RqUlnwjaKe5joOmA40N7MPzWygmQ02s1MTh/Q0s7fM7HXgRuDYKOOR0q1YAVdffTCrV8OLL8I2\n28QdkUhmDRkSCvnddVf
2016-06-08 10:18:34 -05:00
"text/plain": [
2016-10-31 14:12:19 -05:00
"<matplotlib.figure.Figure at 0x7fc32631dc18>"
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-10-31 14:12:19 -05:00
"plt.xlabel('Energy (eV)')\n",
2016-06-08 10:18:34 -05:00
"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-10-31 14:12:19 -05:00
"[<openmc.data.correlated.CorrelatedAngleEnergy at 0x7fc326323eb8>]"
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-10-31 14:12:19 -05:00
"[<openmc.stats.univariate.Tabular at 0x7fc3263d9b00>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc3263dcb38>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc3263dccc0>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc3263dce10>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc326362048>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc3263622b0>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc3263625c0>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc326362940>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc326362d30>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc3263681d0>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc3263686a0>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc326368b70>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc32636f128>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc32636f6d8>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc32636fcf8>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc326376390>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc326376a58>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc32637c198>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc32637c898>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc32637cfd0>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc3263837b8>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc326383f98>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc3263897f0>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc32638f080>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc32638f908>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc326396208>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc326396a20>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc32639c320>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc32639cc18>,\n",
" <openmc.stats.univariate.Tabular at 0x7fc326323588>]"
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-10-31 14:12:19 -05:00
"image/png": "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\nP2X16tVMnz4dgICAABI
2016-06-08 10:18:34 -05:00
"text/plain": [
2016-10-31 14:12:19 -05:00
"<matplotlib.figure.Figure at 0x7fc3236f62e8>"
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",
2016-10-31 14:12:19 -05:00
" plt.semilogy(e_out_dist.x, e_out_dist.p, label='E={:.2f} MeV'.format(e_in/1e6))\n",
"plt.ylim(ymax=1e-6)\n",
2016-06-08 10:18:34 -05:00
"plt.legend()\n",
2016-10-31 14:12:19 -05:00
"plt.xlabel('Outgoing energy (eV)')\n",
"plt.ylabel('Probability/eV')\n",
2016-06-08 10:18:34 -05:00
"plt.show()"
]
},
2016-07-28 16:27:11 -05:00
{
"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,
2016-07-28 16:27:11 -05:00
"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,
2016-07-28 16:27:11 -05:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2016-10-31 14:12:19 -05:00
"{'294K': <openmc.data.function.Sum at 0x7fc3263b16a0>}"
2016-07-28 16:27:11 -05:00
]
},
2016-09-23 06:43:29 -05:00
"execution_count": 18,
2016-07-28 16:27:11 -05:00
"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-10-31 14:12:19 -05:00
"<matplotlib.text.Text at 0x7fc3234bba90>"
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-10-31 14:12:19 -05:00
"image/png": "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\n/WlC11m1ahVmz54tu57
2016-06-08 10:18:34 -05:00
"text/plain": [
2016-10-31 14:12:19 -05:00
"<matplotlib.figure.Figure at 0x7fc32374eac8>"
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",
2016-10-31 14:12:19 -05:00
"ax.set_xlim(1.0, 1.0e5)\n",
2016-06-08 10:18:34 -05:00
"ax.set_ylim(1e-1, 1e4)\n",
"ax.set_xscale('log')\n",
"ax.set_yscale('log')\n",
2016-10-31 14:12:19 -05:00
"ax.set_xlabel('Energy (eV)')\n",
2016-06-08 10:18:34 -05:00
"ax.set_ylabel('Cross section(b)')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2016-07-28 16:27:11 -05:00
"## Converting ACE to HDF5\n",
2016-06-08 10:18:34 -05:00
"\n",
2016-07-28 16:27:11 -05:00
"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
},
2016-07-28 16:27:11 -05:00
"outputs": [
{
"data": {
"text/plain": [
2016-09-23 06:43:29 -05:00
"<IncidentNeutron: Gd157>"
2016-07-28 16:27:11 -05:00
]
},
2016-09-23 06:43:29 -05:00
"execution_count": 20,
2016-07-28 16:27:11 -05:00
"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",
2016-07-28 16:27:11 -05:00
"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,
2016-07-28 16:27:11 -05:00
"metadata": {
2016-09-23 06:43:29 -05:00
"collapsed": false
2016-07-28 16:27:11 -05:00
},
2016-06-08 10:18:34 -05:00
"outputs": [],
"source": [
2016-07-28 16:27:11 -05:00
"gd157_ace.export_to_hdf5('gd157.h5', 'w')"
2016-06-08 10:18:34 -05:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2016-07-28 16:27:11 -05:00
"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": [
2016-07-28 16:27:11 -05:00
"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": [
2016-07-28 16:27:11 -05:00
"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": [
2016-07-28 16:27:11 -05:00
"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": [
2016-07-28 16:27:11 -05:00
"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": {
2016-07-28 16:27:11 -05:00
"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
}