OpenMC/docs/source/pythonapi/examples/MGXS-Part-II.ipynb
2015-11-29 21:39:03 -05:00

1972 lines
117 KiB
Text

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This IPython Notebook illustrates the use of the `openmc.mgxs` module to calculate multi-group cross sections for a heterogeneous fuel pin cell geometry. In particular, this Notebook illustrates the following features:\n",
"\n",
"* Creation of multi-group cross sections on a **heterogeneous geometry**\n",
"* Calculation of cross sections on a **nuclide-by-nuclide basis**\n",
"* Built-in features for **energy condensation** in downstream data processing\n",
"* The use of **PyNE for plot** continuous energy vs. multi-group cross sections\n",
"* **Validation** of multi-group cross sections with **OpenMOC**\n",
"\n",
"**Note:** 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 in its entirety, 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. In addition, this Notebook illustrates the use of Pandas DataFrames to containerize multi-group cross section data. We recommend using Pandas >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases."
]
},
{
"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",
"/usr/local/lib/python2.7/dist-packages/IPython/kernel/__main__.py:9: QAWarning: pyne.rxname is not yet QA compliant.\n",
"/usr/local/lib/python2.7/dist-packages/IPython/kernel/__main__.py:9: QAWarning: pyne.ace is not yet QA compliant.\n"
]
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"import openmc\n",
"import openmc.mgxs as mgxs\n",
"import openmoc\n",
"from openmoc.compatible import get_openmoc_geometry\n",
"import pyne.ace\n",
"\n",
"%matplotlib inline"
]
},
{
"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 Input Files"
]
},
{
"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 three distinct materials for water, clad and fuel."
]
},
{
"cell_type": "code",
"execution_count": 3,
"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": 4,
"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": 5,
"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": 6,
"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": 7,
"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": 8,
"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": [
"Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 190 active batches each with 10000 particles."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# OpenMC simulation parameters\n",
"batches = 50\n",
"inactive = 10\n",
"particles = 10000\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('fission', bounds)\n",
"\n",
"# Activate tally precision triggers\n",
"settings_file.trigger_active = True\n",
"settings_file.trigger_max_batches = settings_file.batches * 4\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 EnergyGroups 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 EnergyGroups object\n",
"coarse_groups = mgxs.EnergyGroups()\n",
"coarse_groups.group_edges = np.array([0., 0.625e-6, 20.])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we will instantiate a variety of `MGXS` objects needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we will define transport, nu-fission, nu-scatter and chi cross sections for each of the three cells in the fuel pin with the 8-group structure as our energy groups."
]
},
{
"cell_type": "code",
"execution_count": 11,
"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]['fission'] = mgxs.FissionXS(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": "markdown",
"metadata": {},
"source": [
"Next, we showcase the use of OpenMC's tally trigger feature in conjunction with the `openmc.mgxs` module. In particular, we will assign a tally trigger of 1E-2 on the standard deviation for each of the tallies used to compute multi-group cross sections."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Create a tally trigger for +/- 0.01 on each tally 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"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, we must loop over all cells to set the cross section domains to the various cells - fuel, clad and moderator - included in the geometry. 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": 13,
"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": 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: c4b14a5ef87f004528d35cbf33fef3ed15a386ca\n",
" Date/Time: 2015-11-29 21:22:25\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.22593 \n",
" 2/1 1.24245 \n",
" 3/1 1.24545 \n",
" 4/1 1.21868 \n",
" 5/1 1.22429 \n",
" 6/1 1.22607 \n",
" 7/1 1.21456 \n",
" 8/1 1.23816 \n",
" 9/1 1.25060 \n",
" 10/1 1.22806 \n",
" 11/1 1.19821 \n",
" 12/1 1.19897 1.19859 +/- 0.00038\n",
" 13/1 1.22119 1.20612 +/- 0.00754\n",
" 14/1 1.20701 1.20634 +/- 0.00533\n",
" 15/1 1.24784 1.21464 +/- 0.00927\n",
" 16/1 1.22413 1.21622 +/- 0.00773\n",
" 17/1 1.25050 1.22112 +/- 0.00817\n",
" 18/1 1.22006 1.22099 +/- 0.00707\n",
" 19/1 1.22813 1.22178 +/- 0.00629\n",
" 20/1 1.22791 1.22239 +/- 0.00566\n",
" 21/1 1.22729 1.22284 +/- 0.00514\n",
" 22/1 1.19867 1.22083 +/- 0.00510\n",
" 23/1 1.23796 1.22214 +/- 0.00488\n",
" 24/1 1.22412 1.22228 +/- 0.00452\n",
" 25/1 1.22638 1.22256 +/- 0.00421\n",
" 26/1 1.22181 1.22251 +/- 0.00394\n",
" 27/1 1.19055 1.22063 +/- 0.00415\n",
" 28/1 1.20683 1.21986 +/- 0.00399\n",
" 29/1 1.21689 1.21971 +/- 0.00378\n",
" 30/1 1.23670 1.22056 +/- 0.00368\n",
" 31/1 1.21396 1.22024 +/- 0.00352\n",
" 32/1 1.21389 1.21995 +/- 0.00337\n",
" 33/1 1.24649 1.22111 +/- 0.00342\n",
" 34/1 1.23204 1.22156 +/- 0.00330\n",
" 35/1 1.20768 1.22101 +/- 0.00322\n",
" 36/1 1.22271 1.22107 +/- 0.00309\n",
" 37/1 1.21796 1.22096 +/- 0.00298\n",
" 38/1 1.23842 1.22158 +/- 0.00293\n",
" 39/1 1.23080 1.22190 +/- 0.00285\n",
" 40/1 1.23572 1.22236 +/- 0.00279\n",
" 41/1 1.21691 1.22218 +/- 0.00271\n",
" 42/1 1.24616 1.22293 +/- 0.00272\n",
" 43/1 1.21903 1.22282 +/- 0.00264\n",
" 44/1 1.22967 1.22302 +/- 0.00257\n",
" 45/1 1.22053 1.22295 +/- 0.00250\n",
" 46/1 1.24087 1.22344 +/- 0.00248\n",
" 47/1 1.20251 1.22288 +/- 0.00248\n",
" 48/1 1.20331 1.22236 +/- 0.00246\n",
" 49/1 1.22724 1.22249 +/- 0.00240\n",
" 50/1 1.24798 1.22313 +/- 0.00243\n",
" Triggers unsatisfied, max unc./thresh. is 1.32110 for scatter-p1 in tally 10054\n",
" The estimated number of batches is 80\n",
" Creating state point statepoint.050.h5...\n",
" 51/1 1.22253 1.22311 +/- 0.00237\n",
" 52/1 1.24330 1.22359 +/- 0.00236\n",
" 53/1 1.23251 1.22380 +/- 0.00231\n",
" 54/1 1.21133 1.22352 +/- 0.00228\n",
" 55/1 1.24503 1.22399 +/- 0.00228\n",
" 56/1 1.22013 1.22391 +/- 0.00223\n",
" 57/1 1.23877 1.22423 +/- 0.00220\n",
" 58/1 1.23793 1.22451 +/- 0.00218\n",
" 59/1 1.21018 1.22422 +/- 0.00215\n",
" 60/1 1.22417 1.22422 +/- 0.00211\n",
" 61/1 1.23094 1.22435 +/- 0.00207\n",
" 62/1 1.23310 1.22452 +/- 0.00204\n",
" 63/1 1.22488 1.22453 +/- 0.00200\n",
" 64/1 1.22702 1.22457 +/- 0.00196\n",
" 65/1 1.18834 1.22391 +/- 0.00204\n",
" 66/1 1.23112 1.22404 +/- 0.00200\n",
" 67/1 1.21611 1.22390 +/- 0.00197\n",
" 68/1 1.22513 1.22392 +/- 0.00194\n",
" 69/1 1.21741 1.22381 +/- 0.00191\n",
" 70/1 1.22484 1.22383 +/- 0.00188\n",
" 71/1 1.19662 1.22338 +/- 0.00190\n",
" 72/1 1.23315 1.22354 +/- 0.00187\n",
" 73/1 1.22796 1.22361 +/- 0.00185\n",
" 74/1 1.21417 1.22346 +/- 0.00182\n",
" 75/1 1.21020 1.22326 +/- 0.00181\n",
" 76/1 1.23413 1.22343 +/- 0.00179\n",
" 77/1 1.22184 1.22340 +/- 0.00176\n",
" 78/1 1.20309 1.22310 +/- 0.00176\n",
" 79/1 1.23458 1.22327 +/- 0.00174\n",
" 80/1 1.20724 1.22304 +/- 0.00173\n",
" Triggers satisfied for batch 80\n",
" Creating state point statepoint.080.h5...\n",
"\n",
" ===========================================================================\n",
" ======================> SIMULATION FINISHED <======================\n",
" ===========================================================================\n",
"\n",
"\n",
" =======================> TIMING STATISTICS <=======================\n",
"\n",
" Total time for initialization = 4.1800E-01 seconds\n",
" Reading cross sections = 8.7000E-02 seconds\n",
" Total time in simulation = 2.3349E+02 seconds\n",
" Time in transport only = 2.3343E+02 seconds\n",
" Time in inactive batches = 1.4263E+01 seconds\n",
" Time in active batches = 2.1923E+02 seconds\n",
" Time synchronizing fission bank = 2.5000E-02 seconds\n",
" Sampling source sites = 2.1000E-02 seconds\n",
" SEND/RECV source sites = 4.0000E-03 seconds\n",
" Time accumulating tallies = 0.0000E+00 seconds\n",
" Total time for finalization = 9.0000E-03 seconds\n",
" Total time elapsed = 2.3396E+02 seconds\n",
" Calculation Rate (inactive) = 7011.15 neutrons/second\n",
" Calculation Rate (active) = 1824.61 neutrons/second\n",
"\n",
" ============================> RESULTS <============================\n",
"\n",
" k-effective (Collision) = 1.22327 +/- 0.00148\n",
" k-effective (Track-length) = 1.22304 +/- 0.00173\n",
" k-effective (Absorption) = 1.22407 +/- 0.00129\n",
" Combined k-effective = 1.22373 +/- 0.00113\n",
" Leakage Fraction = 0.00000 +/- 0.00000\n",
"\n"
]
},
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 14,
"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, mpi_procs=3)"
]
},
{
"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.080.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": true
},
"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. Next, we load the tallies from the statepoint into each object to compute the cross sections using tally arithmetic."
]
},
{
"cell_type": "code",
"execution_count": 17,
"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": [
"## Extracting and Storing MGXS Data"
]
},
{
"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": 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 =\t10000\n",
"\tNuclide =\tU-235\n",
"\tCross Sections [barns]:\n",
" Group 1 [0.821 - 20.0 MeV]:\t3.31e+00 +/- 1.88e-01%\n",
" Group 2 [0.00553 - 0.821 MeV]:\t3.97e+00 +/- 1.24e-01%\n",
" Group 3 [4e-06 - 0.00553 MeV]:\t5.50e+01 +/- 2.02e-01%\n",
" Group 4 [6.25e-07 - 4e-06 MeV]:\t8.83e+01 +/- 3.56e-01%\n",
" Group 5 [2.8e-07 - 6.25e-07 MeV]:\t2.90e+02 +/- 4.54e-01%\n",
" Group 6 [1.4e-07 - 2.8e-07 MeV]:\t4.49e+02 +/- 4.10e-01%\n",
" Group 7 [5.8e-08 - 1.4e-07 MeV]:\t6.87e+02 +/- 2.56e-01%\n",
" Group 8 [0.0 - 5.8e-08 MeV]:\t1.44e+03 +/- 2.82e-01%\n",
"\n",
"\tNuclide =\tU-238\n",
"\tCross Sections [barns]:\n",
" Group 1 [0.821 - 20.0 MeV]:\t1.06e+00 +/- 2.30e-01%\n",
" Group 2 [0.00553 - 0.821 MeV]:\t1.21e-03 +/- 2.25e-01%\n",
" Group 3 [4e-06 - 0.00553 MeV]:\t5.82e-04 +/- 3.09e+00%\n",
" Group 4 [6.25e-07 - 4e-06 MeV]:\t6.54e-06 +/- 3.27e-01%\n",
" Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.07e-05 +/- 4.39e-01%\n",
" Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.55e-05 +/- 4.12e-01%\n",
" Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.30e-05 +/- 2.57e-01%\n",
" Group 8 [0.0 - 5.8e-08 MeV]:\t4.24e-05 +/- 2.81e-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": 19,
"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.52e-02 +/- 2.19e-01%\n",
" Group 2 [0.00553 - 0.821 MeV]:\t1.51e-03 +/- 1.22e-01%\n",
" Group 3 [4e-06 - 0.00553 MeV]:\t2.06e-02 +/- 2.02e-01%\n",
" Group 4 [6.25e-07 - 4e-06 MeV]:\t3.31e-02 +/- 3.56e-01%\n",
" Group 5 [2.8e-07 - 6.25e-07 MeV]:\t1.09e-01 +/- 4.54e-01%\n",
" Group 6 [1.4e-07 - 2.8e-07 MeV]:\t1.69e-01 +/- 4.10e-01%\n",
" Group 7 [5.8e-08 - 1.4e-07 MeV]:\t2.58e-01 +/- 2.56e-01%\n",
" Group 8 [0.0 - 5.8e-08 MeV]:\t5.40e-01 +/- 2.82e-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": 20,
"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:1254: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>cell</th>\n",
" <th>group in</th>\n",
" <th>group out</th>\n",
" <th>nuclide</th>\n",
" <th>mean</th>\n",
" <th>std. dev.</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>126</th>\n",
" <td>10002</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>H-1</td>\n",
" <td>0.234022</td>\n",
" <td>0.003645</td>\n",
" </tr>\n",
" <tr>\n",
" <th>127</th>\n",
" <td>10002</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>O-16</td>\n",
" <td>1.560305</td>\n",
" <td>0.006280</td>\n",
" </tr>\n",
" <tr>\n",
" <th>124</th>\n",
" <td>10002</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>H-1</td>\n",
" <td>1.588025</td>\n",
" <td>0.002815</td>\n",
" </tr>\n",
" <tr>\n",
" <th>125</th>\n",
" <td>10002</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>O-16</td>\n",
" <td>0.285147</td>\n",
" <td>0.001392</td>\n",
" </tr>\n",
" <tr>\n",
" <th>122</th>\n",
" <td>10002</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>H-1</td>\n",
" <td>0.010776</td>\n",
" <td>0.000186</td>\n",
" </tr>\n",
" <tr>\n",
" <th>123</th>\n",
" <td>10002</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>O-16</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>120</th>\n",
" <td>10002</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>H-1</td>\n",
" <td>0.000023</td>\n",
" <td>0.000010</td>\n",
" </tr>\n",
" <tr>\n",
" <th>121</th>\n",
" <td>10002</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>O-16</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>118</th>\n",
" <td>10002</td>\n",
" <td>1</td>\n",
" <td>5</td>\n",
" <td>H-1</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>119</th>\n",
" <td>10002</td>\n",
" <td>1</td>\n",
" <td>5</td>\n",
" <td>O-16</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" cell group in group out nuclide mean std. dev.\n",
"126 10002 1 1 H-1 0.234022 0.003645\n",
"127 10002 1 1 O-16 1.560305 0.006280\n",
"124 10002 1 2 H-1 1.588025 0.002815\n",
"125 10002 1 2 O-16 0.285147 0.001392\n",
"122 10002 1 3 H-1 0.010776 0.000186\n",
"123 10002 1 3 O-16 0.000000 0.000000\n",
"120 10002 1 4 H-1 0.000023 0.000010\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": 20,
"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": [
"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": 21,
"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": 22,
"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.75e-01%\n",
" Group 2 [0.0 - 6.25e-07 MeV]:\t1.82e-01 +/- 1.89e-01%\n",
"\n",
"\tNuclide =\tU-238\n",
"\tCross Sections [cm^-1]:\n",
" Group 1 [6.25e-07 - 20.0 MeV]:\t2.17e-01 +/- 1.31e-01%\n",
" Group 2 [0.0 - 6.25e-07 MeV]:\t2.53e-01 +/- 2.08e-01%\n",
"\n",
"\tNuclide =\tO-16\n",
"\tCross Sections [cm^-1]:\n",
" Group 1 [6.25e-07 - 20.0 MeV]:\t1.45e-01 +/- 1.50e-01%\n",
" Group 2 [0.0 - 6.25e-07 MeV]:\t1.74e-01 +/- 2.66e-01%\n",
"\n",
"\n",
"\n"
]
}
],
"source": [
"condense_xs.print_xs()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>cell</th>\n",
" <th>group in</th>\n",
" <th>nuclide</th>\n",
" <th>mean</th>\n",
" <th>std. dev.</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>10000</td>\n",
" <td>1</td>\n",
" <td>U-235</td>\n",
" <td>20.828127</td>\n",
" <td>0.098842</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>10000</td>\n",
" <td>1</td>\n",
" <td>U-238</td>\n",
" <td>9.582295</td>\n",
" <td>0.012550</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>10000</td>\n",
" <td>1</td>\n",
" <td>O-16</td>\n",
" <td>3.157358</td>\n",
" <td>0.004725</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>10000</td>\n",
" <td>2</td>\n",
" <td>U-235</td>\n",
" <td>485.217649</td>\n",
" <td>0.916465</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>10000</td>\n",
" <td>2</td>\n",
" <td>U-238</td>\n",
" <td>11.176081</td>\n",
" <td>0.023196</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>10000</td>\n",
" <td>2</td>\n",
" <td>O-16</td>\n",
" <td>3.788167</td>\n",
" <td>0.010090</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" cell group in nuclide mean std. dev.\n",
"3 10000 1 U-235 20.828127 0.098842\n",
"4 10000 1 U-238 9.582295 0.012550\n",
"5 10000 1 O-16 3.157358 0.004725\n",
"0 10000 2 U-235 485.217649 0.916465\n",
"1 10000 2 U-238 11.176081 0.023196\n",
"2 10000 2 O-16 3.788167 0.010090"
]
},
"execution_count": 23,
"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": [
"Now, let's verify our cross sections using OpenMOC. First, we use OpenCG construct an equivalent OpenMOC geometry."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Create an OpenMOC Geometry from the OpenCG Geometry\n",
"openmoc_geometry = get_openmoc_geometry(su.opencg_geometry)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, we we can inject the multi-group cross sections into the equivalent fuel pin cell OpenMOC geometry."
]
},
{
"cell_type": "code",
"execution_count": 25,
"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": 26,
"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.574633\tres = 0.000E+00\n",
"[ NORMAL ] Iteration 1:\tk_eff = 0.679931\tres = 4.254E-01\n",
"[ NORMAL ] Iteration 2:\tk_eff = 0.660910\tres = 1.832E-01\n",
"[ NORMAL ] Iteration 3:\tk_eff = 0.658975\tres = 2.798E-02\n",
"[ NORMAL ] Iteration 4:\tk_eff = 0.642976\tres = 2.927E-03\n",
"[ NORMAL ] Iteration 5:\tk_eff = 0.625710\tres = 2.428E-02\n",
"[ NORMAL ] Iteration 6:\tk_eff = 0.606521\tres = 2.685E-02\n",
"[ NORMAL ] Iteration 7:\tk_eff = 0.587277\tres = 3.067E-02\n",
"[ NORMAL ] Iteration 8:\tk_eff = 0.568777\tres = 3.173E-02\n",
"[ NORMAL ] Iteration 9:\tk_eff = 0.551415\tres = 3.150E-02\n",
"[ NORMAL ] Iteration 10:\tk_eff = 0.535708\tres = 3.052E-02\n",
"[ NORMAL ] Iteration 11:\tk_eff = 0.521916\tres = 2.849E-02\n",
"[ NORMAL ] Iteration 12:\tk_eff = 0.510222\tres = 2.575E-02\n",
"[ NORMAL ] Iteration 13:\tk_eff = 0.500691\tres = 2.241E-02\n",
"[ NORMAL ] Iteration 14:\tk_eff = 0.493392\tres = 1.868E-02\n",
"[ NORMAL ] Iteration 15:\tk_eff = 0.488318\tres = 1.458E-02\n",
"[ NORMAL ] Iteration 16:\tk_eff = 0.485438\tres = 1.028E-02\n",
"[ NORMAL ] Iteration 17:\tk_eff = 0.484705\tres = 5.896E-03\n",
"[ NORMAL ] Iteration 18:\tk_eff = 0.486046\tres = 1.510E-03\n",
"[ NORMAL ] Iteration 19:\tk_eff = 0.489362\tres = 2.766E-03\n",
"[ NORMAL ] Iteration 20:\tk_eff = 0.494546\tres = 6.824E-03\n",
"[ NORMAL ] Iteration 21:\tk_eff = 0.501482\tres = 1.059E-02\n",
"[ NORMAL ] Iteration 22:\tk_eff = 0.510042\tres = 1.402E-02\n",
"[ NORMAL ] Iteration 23:\tk_eff = 0.520095\tres = 1.707E-02\n",
"[ NORMAL ] Iteration 24:\tk_eff = 0.531508\tres = 1.971E-02\n",
"[ NORMAL ] Iteration 25:\tk_eff = 0.544145\tres = 2.194E-02\n",
"[ NORMAL ] Iteration 26:\tk_eff = 0.557872\tres = 2.378E-02\n",
"[ NORMAL ] Iteration 27:\tk_eff = 0.572558\tres = 2.523E-02\n",
"[ NORMAL ] Iteration 28:\tk_eff = 0.588073\tres = 2.632E-02\n",
"[ NORMAL ] Iteration 29:\tk_eff = 0.604293\tres = 2.710E-02\n",
"[ NORMAL ] Iteration 30:\tk_eff = 0.621101\tres = 2.758E-02\n",
"[ NORMAL ] Iteration 31:\tk_eff = 0.638383\tres = 2.781E-02\n",
"[ NORMAL ] Iteration 32:\tk_eff = 0.656033\tres = 2.782E-02\n",
"[ NORMAL ] Iteration 33:\tk_eff = 0.673951\tres = 2.765E-02\n",
"[ NORMAL ] Iteration 34:\tk_eff = 0.692044\tres = 2.731E-02\n",
"[ NORMAL ] Iteration 35:\tk_eff = 0.710228\tres = 2.685E-02\n",
"[ NORMAL ] Iteration 36:\tk_eff = 0.728423\tres = 2.628E-02\n",
"[ NORMAL ] Iteration 37:\tk_eff = 0.746559\tres = 2.562E-02\n",
"[ NORMAL ] Iteration 38:\tk_eff = 0.764569\tres = 2.490E-02\n",
"[ NORMAL ] Iteration 39:\tk_eff = 0.782397\tres = 2.413E-02\n",
"[ NORMAL ] Iteration 40:\tk_eff = 0.799990\tres = 2.332E-02\n",
"[ NORMAL ] Iteration 41:\tk_eff = 0.817302\tres = 2.249E-02\n",
"[ NORMAL ] Iteration 42:\tk_eff = 0.834293\tres = 2.164E-02\n",
"[ NORMAL ] Iteration 43:\tk_eff = 0.850928\tres = 2.079E-02\n",
"[ NORMAL ] Iteration 44:\tk_eff = 0.867178\tres = 1.994E-02\n",
"[ NORMAL ] Iteration 45:\tk_eff = 0.883019\tres = 1.910E-02\n",
"[ NORMAL ] Iteration 46:\tk_eff = 0.898428\tres = 1.827E-02\n",
"[ NORMAL ] Iteration 47:\tk_eff = 0.913391\tres = 1.745E-02\n",
"[ NORMAL ] Iteration 48:\tk_eff = 0.927893\tres = 1.665E-02\n",
"[ NORMAL ] Iteration 49:\tk_eff = 0.941926\tres = 1.588E-02\n",
"[ NORMAL ] Iteration 50:\tk_eff = 0.955484\tres = 1.512E-02\n",
"[ NORMAL ] Iteration 51:\tk_eff = 0.968564\tres = 1.439E-02\n",
"[ NORMAL ] Iteration 52:\tk_eff = 0.981163\tres = 1.369E-02\n",
"[ NORMAL ] Iteration 53:\tk_eff = 0.993284\tres = 1.301E-02\n",
"[ NORMAL ] Iteration 54:\tk_eff = 1.004930\tres = 1.235E-02\n",
"[ NORMAL ] Iteration 55:\tk_eff = 1.016106\tres = 1.172E-02\n",
"[ NORMAL ] Iteration 56:\tk_eff = 1.026818\tres = 1.112E-02\n",
"[ NORMAL ] Iteration 57:\tk_eff = 1.037075\tres = 1.054E-02\n",
"[ NORMAL ] Iteration 58:\tk_eff = 1.046885\tres = 9.989E-03\n",
"[ NORMAL ] Iteration 59:\tk_eff = 1.056259\tres = 9.459E-03\n",
"[ NORMAL ] Iteration 60:\tk_eff = 1.065207\tres = 8.954E-03\n",
"[ NORMAL ] Iteration 61:\tk_eff = 1.073742\tres = 8.471E-03\n",
"[ NORMAL ] Iteration 62:\tk_eff = 1.081873\tres = 8.012E-03\n",
"[ NORMAL ] Iteration 63:\tk_eff = 1.089615\tres = 7.573E-03\n",
"[ NORMAL ] Iteration 64:\tk_eff = 1.096981\tres = 7.156E-03\n",
"[ NORMAL ] Iteration 65:\tk_eff = 1.103982\tres = 6.760E-03\n",
"[ NORMAL ] Iteration 66:\tk_eff = 1.110632\tres = 6.382E-03\n",
"[ NORMAL ] Iteration 67:\tk_eff = 1.116945\tres = 6.024E-03\n",
"[ NORMAL ] Iteration 68:\tk_eff = 1.122933\tres = 5.684E-03\n",
"[ NORMAL ] Iteration 69:\tk_eff = 1.128609\tres = 5.361E-03\n",
"[ NORMAL ] Iteration 70:\tk_eff = 1.133986\tres = 5.055E-03\n",
"[ NORMAL ] Iteration 71:\tk_eff = 1.139077\tres = 4.764E-03\n",
"[ NORMAL ] Iteration 72:\tk_eff = 1.143893\tres = 4.490E-03\n",
"[ NORMAL ] Iteration 73:\tk_eff = 1.148448\tres = 4.228E-03\n",
"[ NORMAL ] Iteration 74:\tk_eff = 1.152754\tres = 3.982E-03\n",
"[ NORMAL ] Iteration 75:\tk_eff = 1.156821\tres = 3.749E-03\n",
"[ NORMAL ] Iteration 76:\tk_eff = 1.160661\tres = 3.528E-03\n",
"[ NORMAL ] Iteration 77:\tk_eff = 1.164285\tres = 3.319E-03\n",
"[ NORMAL ] Iteration 78:\tk_eff = 1.167703\tres = 3.122E-03\n",
"[ NORMAL ] Iteration 79:\tk_eff = 1.170925\tres = 2.936E-03\n",
"[ NORMAL ] Iteration 80:\tk_eff = 1.173962\tres = 2.759E-03\n",
"[ NORMAL ] Iteration 81:\tk_eff = 1.176824\tres = 2.594E-03\n",
"[ NORMAL ] Iteration 82:\tk_eff = 1.179518\tres = 2.437E-03\n",
"[ NORMAL ] Iteration 83:\tk_eff = 1.182054\tres = 2.289E-03\n",
"[ NORMAL ] Iteration 84:\tk_eff = 1.184440\tres = 2.150E-03\n",
"[ NORMAL ] Iteration 85:\tk_eff = 1.186684\tres = 2.018E-03\n",
"[ NORMAL ] Iteration 86:\tk_eff = 1.188794\tres = 1.895E-03\n",
"[ NORMAL ] Iteration 87:\tk_eff = 1.190777\tres = 1.778E-03\n",
"[ NORMAL ] Iteration 88:\tk_eff = 1.192641\tres = 1.668E-03\n",
"[ NORMAL ] Iteration 89:\tk_eff = 1.194391\tres = 1.565E-03\n",
"[ NORMAL ] Iteration 90:\tk_eff = 1.196034\tres = 1.467E-03\n",
"[ NORMAL ] Iteration 91:\tk_eff = 1.197577\tres = 1.376E-03\n",
"[ NORMAL ] Iteration 92:\tk_eff = 1.199024\tres = 1.290E-03\n",
"[ NORMAL ] Iteration 93:\tk_eff = 1.200382\tres = 1.209E-03\n",
"[ NORMAL ] Iteration 94:\tk_eff = 1.201656\tres = 1.133E-03\n",
"[ NORMAL ] Iteration 95:\tk_eff = 1.202850\tres = 1.061E-03\n",
"[ NORMAL ] Iteration 96:\tk_eff = 1.203970\tres = 9.941E-04\n",
"[ NORMAL ] Iteration 97:\tk_eff = 1.205018\tres = 9.307E-04\n",
"[ NORMAL ] Iteration 98:\tk_eff = 1.206002\tres = 8.706E-04\n",
"[ NORMAL ] Iteration 99:\tk_eff = 1.206923\tres = 8.158E-04\n",
"[ NORMAL ] Iteration 100:\tk_eff = 1.207785\tres = 7.636E-04\n",
"[ NORMAL ] Iteration 101:\tk_eff = 1.208592\tres = 7.144E-04\n",
"[ NORMAL ] Iteration 102:\tk_eff = 1.209347\tres = 6.684E-04\n",
"[ NORMAL ] Iteration 103:\tk_eff = 1.210055\tres = 6.249E-04\n",
"[ NORMAL ] Iteration 104:\tk_eff = 1.210716\tres = 5.849E-04\n",
"[ NORMAL ] Iteration 105:\tk_eff = 1.211335\tres = 5.465E-04\n",
"[ NORMAL ] Iteration 106:\tk_eff = 1.211915\tres = 5.115E-04\n",
"[ NORMAL ] Iteration 107:\tk_eff = 1.212455\tres = 4.782E-04\n",
"[ NORMAL ] Iteration 108:\tk_eff = 1.212962\tres = 4.461E-04\n",
"[ NORMAL ] Iteration 109:\tk_eff = 1.213435\tres = 4.176E-04\n",
"[ NORMAL ] Iteration 110:\tk_eff = 1.213877\tres = 3.900E-04\n",
"[ NORMAL ] Iteration 111:\tk_eff = 1.214290\tres = 3.643E-04\n",
"[ NORMAL ] Iteration 112:\tk_eff = 1.214676\tres = 3.404E-04\n",
"[ NORMAL ] Iteration 113:\tk_eff = 1.215038\tres = 3.181E-04\n",
"[ NORMAL ] Iteration 114:\tk_eff = 1.215375\tres = 2.973E-04\n",
"[ NORMAL ] Iteration 115:\tk_eff = 1.215689\tres = 2.771E-04\n",
"[ NORMAL ] Iteration 116:\tk_eff = 1.215982\tres = 2.585E-04\n",
"[ NORMAL ] Iteration 117:\tk_eff = 1.216257\tres = 2.416E-04\n",
"[ NORMAL ] Iteration 118:\tk_eff = 1.216513\tres = 2.258E-04\n",
"[ NORMAL ] Iteration 119:\tk_eff = 1.216752\tres = 2.105E-04\n",
"[ NORMAL ] Iteration 120:\tk_eff = 1.216975\tres = 1.963E-04\n",
"[ NORMAL ] Iteration 121:\tk_eff = 1.217183\tres = 1.834E-04\n",
"[ NORMAL ] Iteration 122:\tk_eff = 1.217377\tres = 1.709E-04\n",
"[ NORMAL ] Iteration 123:\tk_eff = 1.217558\tres = 1.594E-04\n",
"[ NORMAL ] Iteration 124:\tk_eff = 1.217728\tres = 1.488E-04\n",
"[ NORMAL ] Iteration 125:\tk_eff = 1.217885\tres = 1.388E-04\n",
"[ NORMAL ] Iteration 126:\tk_eff = 1.218033\tres = 1.297E-04\n",
"[ NORMAL ] Iteration 127:\tk_eff = 1.218170\tres = 1.206E-04\n",
"[ NORMAL ] Iteration 128:\tk_eff = 1.218296\tres = 1.126E-04\n",
"[ NORMAL ] Iteration 129:\tk_eff = 1.218416\tres = 1.041E-04\n",
"[ NORMAL ] Iteration 130:\tk_eff = 1.218527\tres = 9.807E-05\n",
"[ NORMAL ] Iteration 131:\tk_eff = 1.218631\tres = 9.109E-05\n",
"[ NORMAL ] Iteration 132:\tk_eff = 1.218727\tres = 8.502E-05\n",
"[ NORMAL ] Iteration 133:\tk_eff = 1.218817\tres = 7.897E-05\n",
"[ NORMAL ] Iteration 134:\tk_eff = 1.218901\tres = 7.364E-05\n",
"[ NORMAL ] Iteration 135:\tk_eff = 1.218979\tres = 6.886E-05\n",
"[ NORMAL ] Iteration 136:\tk_eff = 1.219051\tres = 6.353E-05\n",
"[ NORMAL ] Iteration 137:\tk_eff = 1.219120\tres = 5.977E-05\n",
"[ NORMAL ] Iteration 138:\tk_eff = 1.219183\tres = 5.590E-05\n",
"[ NORMAL ] Iteration 139:\tk_eff = 1.219242\tres = 5.170E-05\n",
"[ NORMAL ] Iteration 140:\tk_eff = 1.219296\tres = 4.832E-05\n",
"[ NORMAL ] Iteration 141:\tk_eff = 1.219347\tres = 4.486E-05\n",
"[ NORMAL ] Iteration 142:\tk_eff = 1.219395\tres = 4.185E-05\n",
"[ NORMAL ] Iteration 143:\tk_eff = 1.219439\tres = 3.868E-05\n",
"[ NORMAL ] Iteration 144:\tk_eff = 1.219480\tres = 3.650E-05\n",
"[ NORMAL ] Iteration 145:\tk_eff = 1.219518\tres = 3.379E-05\n",
"[ NORMAL ] Iteration 146:\tk_eff = 1.219554\tres = 3.107E-05\n",
"[ NORMAL ] Iteration 147:\tk_eff = 1.219587\tres = 2.929E-05\n",
"[ NORMAL ] Iteration 148:\tk_eff = 1.219618\tres = 2.709E-05\n",
"[ NORMAL ] Iteration 149:\tk_eff = 1.219647\tres = 2.542E-05\n",
"[ NORMAL ] Iteration 150:\tk_eff = 1.219674\tres = 2.362E-05\n",
"[ NORMAL ] Iteration 151:\tk_eff = 1.219699\tres = 2.199E-05\n",
"[ NORMAL ] Iteration 152:\tk_eff = 1.219722\tres = 2.070E-05\n",
"[ NORMAL ] Iteration 153:\tk_eff = 1.219743\tres = 1.878E-05\n",
"[ NORMAL ] Iteration 154:\tk_eff = 1.219763\tres = 1.770E-05\n",
"[ NORMAL ] Iteration 155:\tk_eff = 1.219782\tres = 1.628E-05\n",
"[ NORMAL ] Iteration 156:\tk_eff = 1.219799\tres = 1.526E-05\n",
"[ NORMAL ] Iteration 157:\tk_eff = 1.219815\tres = 1.387E-05\n",
"[ NORMAL ] Iteration 158:\tk_eff = 1.219830\tres = 1.319E-05\n",
"[ NORMAL ] Iteration 159:\tk_eff = 1.219844\tres = 1.208E-05\n",
"[ NORMAL ] Iteration 160:\tk_eff = 1.219857\tres = 1.150E-05\n",
"[ NORMAL ] Iteration 161:\tk_eff = 1.219869\tres = 1.055E-05\n",
"[ NORMAL ] Iteration 162:\tk_eff = 1.219880\tres = 1.008E-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": 27,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"openmc keff = 1.223729\n",
"openmoc keff = 1.219880\n",
"bias [pcm]: -384.9\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": 28,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"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": 29,
"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.495594\tres = 0.000E+00\n",
"[ NORMAL ] Iteration 1:\tk_eff = 0.557313\tres = 5.044E-01\n",
"[ NORMAL ] Iteration 2:\tk_eff = 0.518115\tres = 1.245E-01\n",
"[ NORMAL ] Iteration 3:\tk_eff = 0.509017\tres = 7.033E-02\n",
"[ NORMAL ] Iteration 4:\tk_eff = 0.496280\tres = 1.756E-02\n",
"[ NORMAL ] Iteration 5:\tk_eff = 0.488358\tres = 2.502E-02\n",
"[ NORMAL ] Iteration 6:\tk_eff = 0.482660\tres = 1.596E-02\n",
"[ NORMAL ] Iteration 7:\tk_eff = 0.479524\tres = 1.167E-02\n",
"[ NORMAL ] Iteration 8:\tk_eff = 0.478569\tres = 6.497E-03\n",
"[ NORMAL ] Iteration 9:\tk_eff = 0.479591\tres = 1.992E-03\n",
"[ NORMAL ] Iteration 10:\tk_eff = 0.482389\tres = 2.136E-03\n",
"[ NORMAL ] Iteration 11:\tk_eff = 0.486774\tres = 5.834E-03\n",
"[ NORMAL ] Iteration 12:\tk_eff = 0.492576\tres = 9.091E-03\n",
"[ NORMAL ] Iteration 13:\tk_eff = 0.499632\tres = 1.192E-02\n",
"[ NORMAL ] Iteration 14:\tk_eff = 0.507800\tres = 1.433E-02\n",
"[ NORMAL ] Iteration 15:\tk_eff = 0.516944\tres = 1.635E-02\n",
"[ NORMAL ] Iteration 16:\tk_eff = 0.526943\tres = 1.801E-02\n",
"[ NORMAL ] Iteration 17:\tk_eff = 0.537682\tres = 1.934E-02\n",
"[ NORMAL ] Iteration 18:\tk_eff = 0.549061\tres = 2.038E-02\n",
"[ NORMAL ] Iteration 19:\tk_eff = 0.560985\tres = 2.116E-02\n",
"[ NORMAL ] Iteration 20:\tk_eff = 0.573368\tres = 2.172E-02\n",
"[ NORMAL ] Iteration 21:\tk_eff = 0.586133\tres = 2.207E-02\n",
"[ NORMAL ] Iteration 22:\tk_eff = 0.599208\tres = 2.226E-02\n",
"[ NORMAL ] Iteration 23:\tk_eff = 0.612528\tres = 2.231E-02\n",
"[ NORMAL ] Iteration 24:\tk_eff = 0.626036\tres = 2.223E-02\n",
"[ NORMAL ] Iteration 25:\tk_eff = 0.639676\tres = 2.205E-02\n",
"[ NORMAL ] Iteration 26:\tk_eff = 0.653403\tres = 2.179E-02\n",
"[ NORMAL ] Iteration 27:\tk_eff = 0.667171\tres = 2.146E-02\n",
"[ NORMAL ] Iteration 28:\tk_eff = 0.680942\tres = 2.107E-02\n",
"[ NORMAL ] Iteration 29:\tk_eff = 0.694682\tres = 2.064E-02\n",
"[ NORMAL ] Iteration 30:\tk_eff = 0.708357\tres = 2.018E-02\n",
"[ NORMAL ] Iteration 31:\tk_eff = 0.721941\tres = 1.969E-02\n",
"[ NORMAL ] Iteration 32:\tk_eff = 0.735408\tres = 1.918E-02\n",
"[ NORMAL ] Iteration 33:\tk_eff = 0.748735\tres = 1.865E-02\n",
"[ NORMAL ] Iteration 34:\tk_eff = 0.761905\tres = 1.812E-02\n",
"[ NORMAL ] Iteration 35:\tk_eff = 0.774898\tres = 1.759E-02\n",
"[ NORMAL ] Iteration 36:\tk_eff = 0.787701\tres = 1.705E-02\n",
"[ NORMAL ] Iteration 37:\tk_eff = 0.800300\tres = 1.652E-02\n",
"[ NORMAL ] Iteration 38:\tk_eff = 0.812684\tres = 1.599E-02\n",
"[ NORMAL ] Iteration 39:\tk_eff = 0.824845\tres = 1.548E-02\n",
"[ NORMAL ] Iteration 40:\tk_eff = 0.836773\tres = 1.496E-02\n",
"[ NORMAL ] Iteration 41:\tk_eff = 0.848463\tres = 1.446E-02\n",
"[ NORMAL ] Iteration 42:\tk_eff = 0.859909\tres = 1.397E-02\n",
"[ NORMAL ] Iteration 43:\tk_eff = 0.871106\tres = 1.349E-02\n",
"[ NORMAL ] Iteration 44:\tk_eff = 0.882052\tres = 1.302E-02\n",
"[ NORMAL ] Iteration 45:\tk_eff = 0.892746\tres = 1.257E-02\n",
"[ NORMAL ] Iteration 46:\tk_eff = 0.903184\tres = 1.212E-02\n",
"[ NORMAL ] Iteration 47:\tk_eff = 0.913368\tres = 1.169E-02\n",
"[ NORMAL ] Iteration 48:\tk_eff = 0.923297\tres = 1.128E-02\n",
"[ NORMAL ] Iteration 49:\tk_eff = 0.932973\tres = 1.087E-02\n",
"[ NORMAL ] Iteration 50:\tk_eff = 0.942395\tres = 1.048E-02\n",
"[ NORMAL ] Iteration 51:\tk_eff = 0.951568\tres = 1.010E-02\n",
"[ NORMAL ] Iteration 52:\tk_eff = 0.960491\tres = 9.733E-03\n",
"[ NORMAL ] Iteration 53:\tk_eff = 0.969169\tres = 9.378E-03\n",
"[ NORMAL ] Iteration 54:\tk_eff = 0.977605\tres = 9.035E-03\n",
"[ NORMAL ] Iteration 55:\tk_eff = 0.985801\tres = 8.704E-03\n",
"[ NORMAL ] Iteration 56:\tk_eff = 0.993762\tres = 8.384E-03\n",
"[ NORMAL ] Iteration 57:\tk_eff = 1.001492\tres = 8.075E-03\n",
"[ NORMAL ] Iteration 58:\tk_eff = 1.008993\tres = 7.778E-03\n",
"[ NORMAL ] Iteration 59:\tk_eff = 1.016272\tres = 7.490E-03\n",
"[ NORMAL ] Iteration 60:\tk_eff = 1.023330\tres = 7.214E-03\n",
"[ NORMAL ] Iteration 61:\tk_eff = 1.030175\tres = 6.945E-03\n",
"[ NORMAL ] Iteration 62:\tk_eff = 1.036810\tres = 6.689E-03\n",
"[ NORMAL ] Iteration 63:\tk_eff = 1.043239\tres = 6.441E-03\n",
"[ NORMAL ] Iteration 64:\tk_eff = 1.049467\tres = 6.200E-03\n",
"[ NORMAL ] Iteration 65:\tk_eff = 1.055499\tres = 5.970E-03\n",
"[ NORMAL ] Iteration 66:\tk_eff = 1.061339\tres = 5.748E-03\n",
"[ NORMAL ] Iteration 67:\tk_eff = 1.066994\tres = 5.533E-03\n",
"[ NORMAL ] Iteration 68:\tk_eff = 1.072466\tres = 5.328E-03\n",
"[ NORMAL ] Iteration 69:\tk_eff = 1.077761\tres = 5.128E-03\n",
"[ NORMAL ] Iteration 70:\tk_eff = 1.082883\tres = 4.937E-03\n",
"[ NORMAL ] Iteration 71:\tk_eff = 1.087837\tres = 4.753E-03\n",
"[ NORMAL ] Iteration 72:\tk_eff = 1.092628\tres = 4.575E-03\n",
"[ NORMAL ] Iteration 73:\tk_eff = 1.097261\tres = 4.404E-03\n",
"[ NORMAL ] Iteration 74:\tk_eff = 1.101738\tres = 4.240E-03\n",
"[ NORMAL ] Iteration 75:\tk_eff = 1.106067\tres = 4.080E-03\n",
"[ NORMAL ] Iteration 76:\tk_eff = 1.110248\tres = 3.929E-03\n",
"[ NORMAL ] Iteration 77:\tk_eff = 1.114289\tres = 3.781E-03\n",
"[ NORMAL ] Iteration 78:\tk_eff = 1.118192\tres = 3.639E-03\n",
"[ NORMAL ] Iteration 79:\tk_eff = 1.121963\tres = 3.502E-03\n",
"[ NORMAL ] Iteration 80:\tk_eff = 1.125604\tres = 3.372E-03\n",
"[ NORMAL ] Iteration 81:\tk_eff = 1.129120\tres = 3.245E-03\n",
"[ NORMAL ] Iteration 82:\tk_eff = 1.132515\tres = 3.124E-03\n",
"[ NORMAL ] Iteration 83:\tk_eff = 1.135791\tres = 3.006E-03\n",
"[ NORMAL ] Iteration 84:\tk_eff = 1.138955\tres = 2.893E-03\n",
"[ NORMAL ] Iteration 85:\tk_eff = 1.142009\tres = 2.786E-03\n",
"[ NORMAL ] Iteration 86:\tk_eff = 1.144955\tres = 2.681E-03\n",
"[ NORMAL ] Iteration 87:\tk_eff = 1.147798\tres = 2.580E-03\n",
"[ NORMAL ] Iteration 88:\tk_eff = 1.150540\tres = 2.483E-03\n",
"[ NORMAL ] Iteration 89:\tk_eff = 1.153187\tres = 2.389E-03\n",
"[ NORMAL ] Iteration 90:\tk_eff = 1.155740\tres = 2.300E-03\n",
"[ NORMAL ] Iteration 91:\tk_eff = 1.158202\tres = 2.214E-03\n",
"[ NORMAL ] Iteration 92:\tk_eff = 1.160576\tres = 2.130E-03\n",
"[ NORMAL ] Iteration 93:\tk_eff = 1.162866\tres = 2.050E-03\n",
"[ NORMAL ] Iteration 94:\tk_eff = 1.165075\tres = 1.973E-03\n",
"[ NORMAL ] Iteration 95:\tk_eff = 1.167203\tres = 1.899E-03\n",
"[ NORMAL ] Iteration 96:\tk_eff = 1.169257\tres = 1.827E-03\n",
"[ NORMAL ] Iteration 97:\tk_eff = 1.171236\tres = 1.759E-03\n",
"[ NORMAL ] Iteration 98:\tk_eff = 1.173143\tres = 1.693E-03\n",
"[ NORMAL ] Iteration 99:\tk_eff = 1.174982\tres = 1.629E-03\n",
"[ NORMAL ] Iteration 100:\tk_eff = 1.176754\tres = 1.568E-03\n",
"[ NORMAL ] Iteration 101:\tk_eff = 1.178463\tres = 1.508E-03\n",
"[ NORMAL ] Iteration 102:\tk_eff = 1.180109\tres = 1.452E-03\n",
"[ NORMAL ] Iteration 103:\tk_eff = 1.181695\tres = 1.397E-03\n",
"[ NORMAL ] Iteration 104:\tk_eff = 1.183225\tres = 1.344E-03\n",
"[ NORMAL ] Iteration 105:\tk_eff = 1.184698\tres = 1.294E-03\n",
"[ NORMAL ] Iteration 106:\tk_eff = 1.186116\tres = 1.245E-03\n",
"[ NORMAL ] Iteration 107:\tk_eff = 1.187483\tres = 1.198E-03\n",
"[ NORMAL ] Iteration 108:\tk_eff = 1.188801\tres = 1.152E-03\n",
"[ NORMAL ] Iteration 109:\tk_eff = 1.190070\tres = 1.110E-03\n",
"[ NORMAL ] Iteration 110:\tk_eff = 1.191292\tres = 1.067E-03\n",
"[ NORMAL ] Iteration 111:\tk_eff = 1.192470\tres = 1.026E-03\n",
"[ NORMAL ] Iteration 112:\tk_eff = 1.193603\tres = 9.889E-04\n",
"[ NORMAL ] Iteration 113:\tk_eff = 1.194696\tres = 9.502E-04\n",
"[ NORMAL ] Iteration 114:\tk_eff = 1.195748\tres = 9.155E-04\n",
"[ NORMAL ] Iteration 115:\tk_eff = 1.196760\tres = 8.807E-04\n",
"[ NORMAL ] Iteration 116:\tk_eff = 1.197736\tres = 8.464E-04\n",
"[ NORMAL ] Iteration 117:\tk_eff = 1.198675\tres = 8.155E-04\n",
"[ NORMAL ] Iteration 118:\tk_eff = 1.199580\tres = 7.844E-04\n",
"[ NORMAL ] Iteration 119:\tk_eff = 1.200452\tres = 7.551E-04\n",
"[ NORMAL ] Iteration 120:\tk_eff = 1.201290\tres = 7.262E-04\n",
"[ NORMAL ] Iteration 121:\tk_eff = 1.202098\tres = 6.981E-04\n",
"[ NORMAL ] Iteration 122:\tk_eff = 1.202876\tres = 6.728E-04\n",
"[ NORMAL ] Iteration 123:\tk_eff = 1.203624\tres = 6.471E-04\n",
"[ NORMAL ] Iteration 124:\tk_eff = 1.204346\tres = 6.219E-04\n",
"[ NORMAL ] Iteration 125:\tk_eff = 1.205039\tres = 5.993E-04\n",
"[ NORMAL ] Iteration 126:\tk_eff = 1.205708\tres = 5.756E-04\n",
"[ NORMAL ] Iteration 127:\tk_eff = 1.206351\tres = 5.551E-04\n",
"[ NORMAL ] Iteration 128:\tk_eff = 1.206970\tres = 5.328E-04\n",
"[ NORMAL ] Iteration 129:\tk_eff = 1.207566\tres = 5.132E-04\n",
"[ NORMAL ] Iteration 130:\tk_eff = 1.208140\tres = 4.943E-04\n",
"[ NORMAL ] Iteration 131:\tk_eff = 1.208691\tres = 4.749E-04\n",
"[ NORMAL ] Iteration 132:\tk_eff = 1.209223\tres = 4.564E-04\n",
"[ NORMAL ] Iteration 133:\tk_eff = 1.209734\tres = 4.396E-04\n",
"[ NORMAL ] Iteration 134:\tk_eff = 1.210228\tres = 4.231E-04\n",
"[ NORMAL ] Iteration 135:\tk_eff = 1.210702\tres = 4.076E-04\n",
"[ NORMAL ] Iteration 136:\tk_eff = 1.211158\tres = 3.916E-04\n",
"[ NORMAL ] Iteration 137:\tk_eff = 1.211597\tres = 3.767E-04\n",
"[ NORMAL ] Iteration 138:\tk_eff = 1.212019\tres = 3.628E-04\n",
"[ NORMAL ] Iteration 139:\tk_eff = 1.212425\tres = 3.484E-04\n",
"[ NORMAL ] Iteration 140:\tk_eff = 1.212817\tres = 3.350E-04\n",
"[ NORMAL ] Iteration 141:\tk_eff = 1.213193\tres = 3.227E-04\n",
"[ NORMAL ] Iteration 142:\tk_eff = 1.213556\tres = 3.106E-04\n",
"[ NORMAL ] Iteration 143:\tk_eff = 1.213904\tres = 2.989E-04\n",
"[ NORMAL ] Iteration 144:\tk_eff = 1.214240\tres = 2.869E-04\n",
"[ NORMAL ] Iteration 145:\tk_eff = 1.214563\tres = 2.770E-04\n",
"[ NORMAL ] Iteration 146:\tk_eff = 1.214874\tres = 2.659E-04\n",
"[ NORMAL ] Iteration 147:\tk_eff = 1.215172\tres = 2.557E-04\n",
"[ NORMAL ] Iteration 148:\tk_eff = 1.215459\tres = 2.457E-04\n",
"[ NORMAL ] Iteration 149:\tk_eff = 1.215737\tres = 2.361E-04\n",
"[ NORMAL ] Iteration 150:\tk_eff = 1.216003\tres = 2.281E-04\n",
"[ NORMAL ] Iteration 151:\tk_eff = 1.216260\tres = 2.194E-04\n",
"[ NORMAL ] Iteration 152:\tk_eff = 1.216507\tres = 2.109E-04\n",
"[ NORMAL ] Iteration 153:\tk_eff = 1.216744\tres = 2.028E-04\n",
"[ NORMAL ] Iteration 154:\tk_eff = 1.216972\tres = 1.950E-04\n",
"[ NORMAL ] Iteration 155:\tk_eff = 1.217193\tres = 1.876E-04\n",
"[ NORMAL ] Iteration 156:\tk_eff = 1.217403\tres = 1.809E-04\n",
"[ NORMAL ] Iteration 157:\tk_eff = 1.217607\tres = 1.733E-04\n",
"[ NORMAL ] Iteration 158:\tk_eff = 1.217802\tres = 1.673E-04\n",
"[ NORMAL ] Iteration 159:\tk_eff = 1.217990\tres = 1.603E-04\n",
"[ NORMAL ] Iteration 160:\tk_eff = 1.218171\tres = 1.544E-04\n",
"[ NORMAL ] Iteration 161:\tk_eff = 1.218346\tres = 1.486E-04\n",
"[ NORMAL ] Iteration 162:\tk_eff = 1.218513\tres = 1.429E-04\n",
"[ NORMAL ] Iteration 163:\tk_eff = 1.218674\tres = 1.376E-04\n",
"[ NORMAL ] Iteration 164:\tk_eff = 1.218829\tres = 1.322E-04\n",
"[ NORMAL ] Iteration 165:\tk_eff = 1.218979\tres = 1.274E-04\n",
"[ NORMAL ] Iteration 166:\tk_eff = 1.219123\tres = 1.225E-04\n",
"[ NORMAL ] Iteration 167:\tk_eff = 1.219261\tres = 1.181E-04\n",
"[ NORMAL ] Iteration 168:\tk_eff = 1.219394\tres = 1.132E-04\n",
"[ NORMAL ] Iteration 169:\tk_eff = 1.219522\tres = 1.090E-04\n",
"[ NORMAL ] Iteration 170:\tk_eff = 1.219645\tres = 1.049E-04\n",
"[ NORMAL ] Iteration 171:\tk_eff = 1.219763\tres = 1.008E-04\n",
"[ NORMAL ] Iteration 172:\tk_eff = 1.219877\tres = 9.716E-05\n",
"[ NORMAL ] Iteration 173:\tk_eff = 1.219986\tres = 9.353E-05\n",
"[ NORMAL ] Iteration 174:\tk_eff = 1.220091\tres = 8.948E-05\n",
"[ NORMAL ] Iteration 175:\tk_eff = 1.220192\tres = 8.598E-05\n",
"[ NORMAL ] Iteration 176:\tk_eff = 1.220290\tres = 8.274E-05\n",
"[ NORMAL ] Iteration 177:\tk_eff = 1.220384\tres = 7.979E-05\n",
"[ NORMAL ] Iteration 178:\tk_eff = 1.220474\tres = 7.672E-05\n",
"[ NORMAL ] Iteration 179:\tk_eff = 1.220561\tres = 7.406E-05\n",
"[ NORMAL ] Iteration 180:\tk_eff = 1.220644\tres = 7.136E-05\n",
"[ NORMAL ] Iteration 181:\tk_eff = 1.220725\tres = 6.812E-05\n",
"[ NORMAL ] Iteration 182:\tk_eff = 1.220802\tres = 6.605E-05\n",
"[ NORMAL ] Iteration 183:\tk_eff = 1.220877\tres = 6.346E-05\n",
"[ NORMAL ] Iteration 184:\tk_eff = 1.220948\tres = 6.086E-05\n",
"[ NORMAL ] Iteration 185:\tk_eff = 1.221016\tres = 5.825E-05\n",
"[ NORMAL ] Iteration 186:\tk_eff = 1.221083\tres = 5.620E-05\n",
"[ NORMAL ] Iteration 187:\tk_eff = 1.221146\tres = 5.433E-05\n",
"[ NORMAL ] Iteration 188:\tk_eff = 1.221208\tres = 5.215E-05\n",
"[ NORMAL ] Iteration 189:\tk_eff = 1.221267\tres = 5.031E-05\n",
"[ NORMAL ] Iteration 190:\tk_eff = 1.221323\tres = 4.820E-05\n",
"[ NORMAL ] Iteration 191:\tk_eff = 1.221377\tres = 4.623E-05\n",
"[ NORMAL ] Iteration 192:\tk_eff = 1.221430\tres = 4.449E-05\n",
"[ NORMAL ] Iteration 193:\tk_eff = 1.221480\tres = 4.287E-05\n",
"[ NORMAL ] Iteration 194:\tk_eff = 1.221529\tres = 4.123E-05\n",
"[ NORMAL ] Iteration 195:\tk_eff = 1.221575\tres = 3.993E-05\n",
"[ NORMAL ] Iteration 196:\tk_eff = 1.221620\tres = 3.779E-05\n",
"[ NORMAL ] Iteration 197:\tk_eff = 1.221663\tres = 3.667E-05\n",
"[ NORMAL ] Iteration 198:\tk_eff = 1.221705\tres = 3.541E-05\n",
"[ NORMAL ] Iteration 199:\tk_eff = 1.221744\tres = 3.378E-05\n",
"[ NORMAL ] Iteration 200:\tk_eff = 1.221782\tres = 3.233E-05\n",
"[ NORMAL ] Iteration 201:\tk_eff = 1.221820\tres = 3.127E-05\n",
"[ NORMAL ] Iteration 202:\tk_eff = 1.221855\tres = 3.033E-05\n",
"[ NORMAL ] Iteration 203:\tk_eff = 1.221889\tres = 2.911E-05\n",
"[ NORMAL ] Iteration 204:\tk_eff = 1.221922\tres = 2.775E-05\n",
"[ NORMAL ] Iteration 205:\tk_eff = 1.221954\tres = 2.682E-05\n",
"[ NORMAL ] Iteration 206:\tk_eff = 1.221984\tres = 2.580E-05\n",
"[ NORMAL ] Iteration 207:\tk_eff = 1.222013\tres = 2.467E-05\n",
"[ NORMAL ] Iteration 208:\tk_eff = 1.222041\tres = 2.365E-05\n",
"[ NORMAL ] Iteration 209:\tk_eff = 1.222068\tres = 2.298E-05\n",
"[ NORMAL ] Iteration 210:\tk_eff = 1.222094\tres = 2.216E-05\n",
"[ NORMAL ] Iteration 211:\tk_eff = 1.222119\tres = 2.115E-05\n",
"[ NORMAL ] Iteration 212:\tk_eff = 1.222143\tres = 2.038E-05\n",
"[ NORMAL ] Iteration 213:\tk_eff = 1.222166\tres = 1.954E-05\n",
"[ NORMAL ] Iteration 214:\tk_eff = 1.222188\tres = 1.879E-05\n",
"[ NORMAL ] Iteration 215:\tk_eff = 1.222209\tres = 1.810E-05\n",
"[ NORMAL ] Iteration 216:\tk_eff = 1.222230\tres = 1.741E-05\n",
"[ NORMAL ] Iteration 217:\tk_eff = 1.222250\tres = 1.694E-05\n",
"[ NORMAL ] Iteration 218:\tk_eff = 1.222269\tres = 1.617E-05\n",
"[ NORMAL ] Iteration 219:\tk_eff = 1.222287\tres = 1.574E-05\n",
"[ NORMAL ] Iteration 220:\tk_eff = 1.222305\tres = 1.497E-05\n",
"[ NORMAL ] Iteration 221:\tk_eff = 1.222322\tres = 1.452E-05\n",
"[ NORMAL ] Iteration 222:\tk_eff = 1.222338\tres = 1.381E-05\n",
"[ NORMAL ] Iteration 223:\tk_eff = 1.222354\tres = 1.330E-05\n",
"[ NORMAL ] Iteration 224:\tk_eff = 1.222369\tres = 1.285E-05\n",
"[ NORMAL ] Iteration 225:\tk_eff = 1.222383\tres = 1.230E-05\n",
"[ NORMAL ] Iteration 226:\tk_eff = 1.222397\tres = 1.170E-05\n",
"[ NORMAL ] Iteration 227:\tk_eff = 1.222410\tres = 1.124E-05\n",
"[ NORMAL ] Iteration 228:\tk_eff = 1.222423\tres = 1.095E-05\n",
"[ NORMAL ] Iteration 229:\tk_eff = 1.222436\tres = 1.047E-05\n",
"[ NORMAL ] Iteration 230:\tk_eff = 1.222448\tres = 1.009E-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": "code",
"execution_count": 30,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"openmc keff = 1.223729\n",
"openmoc keff = 1.222448\n",
"bias [pcm]: -128.1\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": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"## Visualizing MGXS Data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It is often insightful to generate visual depictions of multi-group cross sections. There are many different types of plots which may be useful for MGXS visualization, only a few of which will be shown here for inspiration.\n",
"\n",
"One particularly useful visualization is a comparison of the continuous energy and multi-group cross sections for a particular nuclide and reaction type. We illustrate one option for generating such plots with the use of the open source PyNE library to parse continuous energy multi-group cross sections from the cross section data library provided with OpenMC. First, we instantiate a `pyne.ace.Library` object for U-235 as follows."
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Instantiate a PyNE ACE continuous energy cross sections library\n",
"pyne_lib = pyne.ace.Library('../../../../data/nndc/293.6K/U_235_293.6K.ace')\n",
"pyne_lib.read('92235.71c')\n",
"\n",
"# Extract the U-235 data from the library\n",
"u235 = pyne_lib.tables['92235.71c']\n",
"\n",
"# Extract the continuous energy fission U-235 cross section data\n",
"fission = u235.reactions[18]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, we use matplotlib to plot the multi-group and continuous energy cross sections on a single plot."
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7fcc69853e90>"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fcc69b3bb90>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Create a loglog plot of the U-235 continuous energy fission cross section \n",
"plt.loglog(u235.energy, fission.sigma, color='b', linewidth=1)\n",
"\n",
"# Extract energy group bounds and MGXS values to plot\n",
"nufission = xs_library[fuel_cell.id]['fission']\n",
"energy_groups = nufission.energy_groups\n",
"x = energy_groups.group_edges\n",
"y = nufission.get_xs(nuclides=['U-235'], order_groups='decreasing', xs_type='micro')\n",
"\n",
"# Fix low energy bound to the value defined by the ACE library\n",
"x[0] = u235.energy[0]\n",
"\n",
"# Extend the mgxs values array for matplotlib's step plot\n",
"y = np.insert(y, 0, y[0])\n",
"\n",
"# Create a step plot for the MGXS\n",
"plt.plot(x, y, drawstyle='steps', color='r', linewidth=3)\n",
"\n",
"plt.title('U-235 Fission Cross Section')\n",
"plt.xlabel('Energy [MeV]')\n",
"plt.ylabel('Micro Fission XS')\n",
"plt.legend(['Continuous', 'Multi-Group'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Another useful illustration are scattering matrix sparsity structures. First, we extract Pandas DataFrames for the H-1 and O-16 scattering matrices."
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Construct a Pandas DataFrame for the microscopic nu-scattering matrix\n",
"nuscatter = xs_library[moderator_cell.id]['nu-scatter']\n",
"df = nuscatter.get_pandas_dataframe(xs_type='micro')\n",
"\n",
"# 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": 48,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fcc69ffe910>"
]
},
"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": "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
}