├── .github
├── environment.yml
└── workflows
│ └── ci.yml
├── .gitignore
├── .test
├── clear_notebooks_test.py
├── download-xs.sh
├── notebook-fails
├── notebook-pass
└── test_notebooks.py
├── README.md
├── c5g7.h5
├── cad-based-geometry.ipynb
├── candu.ipynb
├── capi.ipynb
├── chain_simple.xml
├── depletion.ipynb
├── expansion-filters.ipynb
├── flux-spectrum.ipynb
├── gamma-detector.ipynb
├── hexagonal-lattice.ipynb
├── images
├── cs137_decay.png
├── cylinder_mesh.png
├── flux3d.png
├── manifold-cad.png
├── manifold_flux.png
├── mdgxs.png
├── mgxs.png
├── pin_mesh.png
├── teapot.jpg
├── umesh_flux.png
├── umesh_heating.png
└── umesh_w_assembly.png
├── mdgxs-part-i.ipynb
├── mdgxs-part-ii.ipynb
├── mg-mode-part-i.ipynb
├── mg-mode-part-ii.ipynb
├── mg-mode-part-iii.ipynb
├── mgxs-part-i.ipynb
├── mgxs-part-ii.ipynb
├── mgxs-part-iii.ipynb
├── nuclear-data-resonance-covariance.ipynb
├── nuclear-data.ipynb
├── pandas-dataframes.ipynb
├── pincell.ipynb
├── post-processing.ipynb
├── search.ipynb
├── shielded_room_weight_window.ipynb
├── tally-arithmetic.ipynb
├── tally-power-normalization.ipynb
├── triso.ipynb
├── unstructured-mesh-part-i.ipynb
└── unstructured-mesh-part-ii.ipynb
/.github/environment.yml:
--------------------------------------------------------------------------------
1 | name: jupyter-actions
2 | channels:
3 | - conda-forge
4 | dependencies:
5 | - jupyter=1.0
6 | - nbformat
7 | - nbconvert
8 | - numpy
9 | - seaborn
10 | - requests=2.24.0
11 | - pytest
12 | - vtk
13 | - pyevtk
14 | - swig==4.2.1
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: Test Notebooks
2 |
3 | on:
4 | # Allow this workflow to be run manually
5 | workflow_dispatch:
6 | # Run for pull requests
7 | pull_request:
8 | branches:
9 | - main
10 | - develop
11 | # Run every time a new commit is pushed
12 | push:
13 | branches:
14 | - main
15 | - develop
16 | # Run every week on Sunday at midnight
17 | schedule:
18 | - cron: "0 0 * * 1"
19 |
20 | jobs:
21 | # Set the job key
22 | test-notebooks:
23 | # Name the job
24 | name: Test Jupyter Notebooks
25 | # Set the type of machine to run on
26 | runs-on: ubuntu-latest
27 |
28 | steps:
29 | - name: Checkout code
30 | uses: actions/checkout@v2
31 |
32 |
33 | - name: Install conda environment
34 | uses: conda-incubator/setup-miniconda@v2
35 | with:
36 | activate-environment: jupyter-actions
37 | environment-file: .github/environment.yml
38 | python-version: "3.10"
39 |
40 | - name: Install OpenMC
41 | shell: bash -l {0}
42 | run: |
43 | conda install -n base conda-libmamba-solver
44 | conda config --set solver libmamba
45 | conda activate jupyter-actions
46 | conda install -c conda-forge openmc==0.15.0
47 |
48 | - name: Cache Cross Sections
49 | id: xs-cache
50 | uses: actions/cache@v3
51 | with:
52 | # use this cache as long as the download script doesn't change
53 | key: xs-cache-${{ hashfiles('.test/download-xs.sh') }}
54 | path: ~/endfb-vii.1-hdf5/*
55 |
56 | - name: Download OpenMC Cross Sections
57 | shell: bash -l {0}
58 | if: steps.xs-cache.outputs.cache-hit != 'true'
59 | run: |
60 | ./.test/download-xs.sh
61 |
62 | - name: Set Environment Variables
63 | shell: bash -l {0}
64 | run: |
65 | echo "OPENMC_CROSS_SECTIONS=$HOME/endfb-vii.1-hdf5/cross_sections.xml" >> $GITHUB_ENV
66 |
67 | - name: Install OpenMOC
68 | shell: bash -l {0}
69 | run: |
70 | conda init bash
71 | source ~/.bashrc
72 | conda activate jupyter-actions
73 | cd ~
74 | git clone https://github.com/mit-crpg/openmoc &&
75 | cd openmoc
76 | # OpenMOC has some custom commands that rely on setuptools/distutils
77 | python setup.py install
78 | # install twice to make sure openmoc.py is copied into the installation location
79 | python setup.py install
80 |
81 | - name: Execute all Notebooks
82 | shell: bash -l {0}
83 | run: |
84 | conda activate jupyter-actions
85 | pytest -v .test
86 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # IPython notebook checkpoints
2 | .ipynb_checkpoints
3 |
4 | # Jupyter notebooks
5 | *.xml
6 | *.h5
7 | *.h5m
8 | *.vtk
9 | *.png
10 | *.xls
11 | *.ace
12 | *.endf
13 | *.out
14 | mgxs/
15 | tracks/
16 | fission-rates/
17 | plots/
18 | *~
19 | *__pycache__*
--------------------------------------------------------------------------------
/.test/clear_notebooks_test.py:
--------------------------------------------------------------------------------
1 | import os
2 | import subprocess
3 |
4 | import nbformat
5 | from nbconvert.preprocessors import ExecutePreprocessor
6 | from nbconvert.preprocessors import CellExecutionError
7 | import pytest
8 |
9 | TEST_DIR = os.path.dirname(os.path.abspath(__file__))
10 |
11 |
12 | def process_notebook(notebook_filename, html_directory = 'notebook-html'):
13 | '''Checks if an IPython notebook runs without error from start to finish. If so,
14 | writes the notebook to HTML (with outputs) and overwrites the .ipynb file
15 | (without outputs).
16 | '''
17 | with open(notebook_filename) as f:
18 | nb = nbformat.read(f, as_version=4)
19 |
20 | ep = ExecutePreprocessor(timeout=600, kernel_name='python3')
21 |
22 | try:
23 | # Check that the notebook runs
24 | ep.preprocess(nb, {'metadata': {'path': ''}})
25 | except CellExecutionError:
26 | msg = f'Error executing the notebook {notebook_filename}.\n\n'
27 | msg += f'See notebook "{notebook_filename}" for the traceback.'
28 | print(msg)
29 | raise
30 |
31 | print(f"Successfully executed {notebook_filename}")
32 | return
33 |
34 |
35 | def test_process_notebook():
36 |
37 | with pytest.raises(CellExecutionError):
38 | process_notebook(os.path.join(TEST_DIR,'notebook-fails'))
39 |
40 | assert(process_notebook(os.path.join(TEST_DIR,'notebook-pass')) is None)
41 |
42 |
43 | if __name__ == '__main__':
44 | pytest.main()
45 |
--------------------------------------------------------------------------------
/.test/download-xs.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | set -ex
4 |
5 | cd $HOME
6 | wget https://anl.box.com/shared/static/9igk353zpy8fn9ttvtrqgzvw1vtejoz6.xz -O endf7b_xs.tar.xz
7 | tar xf endf7b_xs.tar.xz
8 |
--------------------------------------------------------------------------------
/.test/notebook-fails:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": null,
6 | "metadata": {
7 | "tags": [
8 | "save_html"
9 | ]
10 | },
11 | "outputs": [],
12 | "source": []
13 | },
14 | {
15 | "cell_type": "code",
16 | "execution_count": null,
17 | "metadata": {
18 | "execution": {
19 | "iopub.execute_input": "2020-09-25T12:29:32.718006Z",
20 | "iopub.status.busy": "2020-09-25T12:29:32.716176Z",
21 | "iopub.status.idle": "2020-09-25T12:29:32.838050Z",
22 | "shell.execute_reply": "2020-09-25T12:29:32.836977Z"
23 | }
24 | },
25 | "outputs": [],
26 | "source": [
27 | "1 + \"a\""
28 | ]
29 | }
30 | ],
31 | "metadata": {
32 | "celltoolbar": "Tags",
33 | "kernelspec": {
34 | "display_name": "Python 3",
35 | "language": "python",
36 | "name": "python3"
37 | },
38 | "language_info": {
39 | "codemirror_mode": {
40 | "name": "ipython",
41 | "version": 3
42 | },
43 | "file_extension": ".py",
44 | "mimetype": "text/x-python",
45 | "name": "python",
46 | "nbconvert_exporter": "python",
47 | "pygments_lexer": "ipython3",
48 | "version": "3.8.5"
49 | }
50 | },
51 | "nbformat": 4,
52 | "nbformat_minor": 4
53 | }
54 |
--------------------------------------------------------------------------------
/.test/notebook-pass:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {
6 | "tags": [
7 | "save_html"
8 | ]
9 | },
10 | "source": [
11 | "# Test notebook"
12 | ]
13 | },
14 | {
15 | "cell_type": "markdown",
16 | "metadata": {},
17 | "source": [
18 | "This notebook passes the test."
19 | ]
20 | },
21 | {
22 | "cell_type": "code",
23 | "execution_count": null,
24 | "metadata": {
25 | "execution": {
26 | "iopub.execute_input": "2020-09-25T17:55:34.624627Z",
27 | "iopub.status.busy": "2020-09-25T17:55:34.622763Z",
28 | "iopub.status.idle": "2020-09-25T17:55:34.631046Z",
29 | "shell.execute_reply": "2020-09-25T17:55:34.632276Z"
30 | }
31 | },
32 | "outputs": [],
33 | "source": [
34 | "1 + 2"
35 | ]
36 | },
37 | {
38 | "cell_type": "code",
39 | "execution_count": null,
40 | "metadata": {
41 | "execution": {
42 | "iopub.execute_input": "2020-09-25T17:55:34.640643Z",
43 | "iopub.status.busy": "2020-09-25T17:55:34.638873Z",
44 | "iopub.status.idle": "2020-09-25T17:55:34.644490Z",
45 | "shell.execute_reply": "2020-09-25T17:55:34.645412Z"
46 | }
47 | },
48 | "outputs": [],
49 | "source": [
50 | "1"
51 | ]
52 | },
53 | {
54 | "cell_type": "code",
55 | "execution_count": null,
56 | "metadata": {},
57 | "outputs": [],
58 | "source": []
59 | }
60 | ],
61 | "metadata": {
62 | "celltoolbar": "Tags",
63 | "kernelspec": {
64 | "display_name": "Python 3",
65 | "language": "python",
66 | "name": "python3"
67 | },
68 | "language_info": {
69 | "codemirror_mode": {
70 | "name": "ipython",
71 | "version": 3
72 | },
73 | "file_extension": ".py",
74 | "mimetype": "text/x-python",
75 | "name": "python",
76 | "nbconvert_exporter": "python",
77 | "pygments_lexer": "ipython3",
78 | "version": "3.8.5"
79 | }
80 | },
81 | "nbformat": 4,
82 | "nbformat_minor": 4
83 | }
84 |
--------------------------------------------------------------------------------
/.test/test_notebooks.py:
--------------------------------------------------------------------------------
1 | import os
2 | import subprocess
3 |
4 | import nbformat
5 | from nbconvert.preprocessors import ExecutePreprocessor
6 | from nbconvert.preprocessors import CellExecutionError
7 | import pytest
8 |
9 |
10 | TEST_DIR = os.path.dirname(os.path.abspath(__file__))
11 | PARENT_DIR = os.path.join(TEST_DIR, '..')
12 |
13 |
14 | def process_notebook(notebook_filename, html_directory='notebook-html'):
15 | '''Checks if an IPython notebook runs without error from start to finish. If so,
16 | writes the notebook to HTML (with outputs) and overwrites the .ipynb file
17 | (without outputs).
18 | '''
19 |
20 | with open(notebook_filename) as f:
21 | nb = nbformat.read(f, as_version=4)
22 |
23 | ep = ExecutePreprocessor(timeout=1200,
24 | kernel_name='python3')
25 |
26 | try:
27 | # Check that the notebook runs
28 | ep.preprocess(nb, {'metadata': {'path': ''}})
29 | except CellExecutionError:
30 | raise
31 |
32 | print(f"Successfully executed {notebook_filename}")
33 | return
34 |
35 |
36 | def find_notebooks():
37 | # Get all files included in the git repository
38 | git_files = (subprocess
39 | .check_output("git ls-tree --full-tree --name-only -r HEAD", shell=True)
40 | .decode('utf-8')
41 | .splitlines())
42 |
43 | # Get just the notebooks from the git files
44 | notebooks = [fn for fn in git_files if fn.endswith(".ipynb")]
45 | # remove the MGXS notebooks that use on OepnMOC for now
46 | return notebooks
47 |
48 |
49 | @pytest.mark.parametrize('notebook', find_notebooks())
50 | def test_all_notebooks(notebook, remove_fail_test=True):
51 | '''Runs `process_notebook` on all notebooks in the git repository.
52 | '''
53 |
54 | print("Testing", notebook)
55 | process_notebook(os.path.join(PARENT_DIR, notebook))
56 |
57 | # clean out files when test is complete
58 | subprocess.check_output("git clean -dxf", shell=True)
59 |
60 |
61 | if __name__ == '__main__':
62 | pytest.main()
63 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | OpenMC Notebooks
2 | ----------------
3 |
4 | This repository contains a set of example Jupyter notebooks demonstrating
5 | various capabilities in OpenMC from basic model building to advanced features
6 | such as depletion/activation, CAD geometry universes, etc.
7 |
8 | Notebook versioning
9 | -------------------
10 |
11 | Notebooks contained in the `main` branch of this repository can be expected to
12 | work with the latest release of OpenMC. Note, `main` **is not the default branch
13 | of this repository** and must be checked out after cloning the repo.
14 |
15 | Previous versions notebooks will be tagged with the corresponding OpenMC version
16 | with which they are expected to work. These tags can be used to checkout
17 | notebooks ensured to be compatible with the corresponding release of OpenMC.
18 |
19 | Continuous development of these notebooks occurs in the `develop` branch, the
20 | default branch of this repository. We ask that any updates or contributions to
21 | the repository occur based on this branch.
--------------------------------------------------------------------------------
/c5g7.h5:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openmc-dev/openmc-notebooks/bb39f2509d47d8f4c997cc320685ad06207fdcc9/c5g7.h5
--------------------------------------------------------------------------------
/capi.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Using the C/C++ API\n",
8 | "This notebook shows how to use the OpenMC C/C++ API through the openmc.lib module. This module is particularly useful for multiphysics coupling because it allows you to update the density of materials and the temperatures of cells in memory, without stopping the simulation.\n",
9 | "\n",
10 | "Warning: these bindings are still somewhat experimental and may be subject to change in future versions of OpenMC."
11 | ]
12 | },
13 | {
14 | "cell_type": "code",
15 | "execution_count": 1,
16 | "metadata": {},
17 | "outputs": [],
18 | "source": [
19 | "%matplotlib inline\n",
20 | "import openmc\n",
21 | "import openmc.lib"
22 | ]
23 | },
24 | {
25 | "cell_type": "markdown",
26 | "metadata": {},
27 | "source": [
28 | "Generate Input Files\n",
29 | "\n",
30 | "Let's start by creating a fuel rod geometry. We will make 10 zones in the z-direction which will allow us to make changes to each zone. Changes in temperature have to be made on the cell, so will make 10 cells in the axial direction. Changes in density have to be made on the material, so we will make 10 water materials. "
31 | ]
32 | },
33 | {
34 | "cell_type": "markdown",
35 | "metadata": {},
36 | "source": [
37 | "Materials: we will make a fuel, helium, zircaloy, and 10 water materials. "
38 | ]
39 | },
40 | {
41 | "cell_type": "code",
42 | "execution_count": 2,
43 | "metadata": {},
44 | "outputs": [],
45 | "source": [
46 | "material_list = []"
47 | ]
48 | },
49 | {
50 | "cell_type": "code",
51 | "execution_count": 3,
52 | "metadata": {},
53 | "outputs": [],
54 | "source": [
55 | "uo2 = openmc.Material(material_id=1, name='UO2 fuel at 2.4% wt enrichment')\n",
56 | "uo2.set_density('g/cm3', 10.29769)\n",
57 | "uo2.add_element('U', 1., enrichment=2.4)\n",
58 | "uo2.add_element('O', 2.)\n",
59 | "material_list.append(uo2)\n",
60 | "\n",
61 | "helium = openmc.Material(material_id=2, name='Helium for gap')\n",
62 | "helium.set_density('g/cm3', 0.001598)\n",
63 | "helium.add_element('He', 2.4044e-4)\n",
64 | "material_list.append(helium)\n",
65 | "\n",
66 | "zircaloy = openmc.Material(material_id=3, name='Zircaloy 4')\n",
67 | "zircaloy.set_density('g/cm3', 6.55)\n",
68 | "zircaloy.add_element('Sn', 0.014, 'wo')\n",
69 | "zircaloy.add_element('Fe', 0.00165, 'wo')\n",
70 | "zircaloy.add_element('Cr', 0.001, 'wo')\n",
71 | "zircaloy.add_element('Zr', 0.98335, 'wo')\n",
72 | "material_list.append(zircaloy)\n",
73 | "\n",
74 | "for i in range(4, 14):\n",
75 | " water = openmc.Material(material_id=i)\n",
76 | " water.set_density('g/cm3', 0.7)\n",
77 | " water.add_element('H', 2.0)\n",
78 | " water.add_element('O', 1.0)\n",
79 | " water.add_s_alpha_beta('c_H_in_H2O')\n",
80 | " material_list.append(water)\n",
81 | " \n",
82 | "materials_file = openmc.Materials(material_list)\n",
83 | "materials_file.export_to_xml()"
84 | ]
85 | },
86 | {
87 | "cell_type": "markdown",
88 | "metadata": {},
89 | "source": [
90 | "Cells: we will make a fuel cylinder, a gap cylinder, a cladding cylinder, and a water exterior. Each one will be broken into 10 cells which are the 10 axial zones. The z_list is the list of axial positions that delimit those 10 zones. To keep track of all the cells, we will create lists: fuel_list, gap_list, clad_list, and water_list. "
91 | ]
92 | },
93 | {
94 | "cell_type": "code",
95 | "execution_count": 4,
96 | "metadata": {},
97 | "outputs": [],
98 | "source": [
99 | "pitch = 1.25984\n",
100 | "fuel_or = openmc.ZCylinder(r=0.39218)\n",
101 | "clad_ir = openmc.ZCylinder(r=0.40005)\n",
102 | "clad_or = openmc.ZCylinder(r=0.4572)\n",
103 | "left = openmc.XPlane(x0=-pitch/2)\n",
104 | "right = openmc.XPlane(x0=pitch/2)\n",
105 | "back = openmc.YPlane(y0=-pitch/2)\n",
106 | "front = openmc.YPlane(y0=pitch/2)\n",
107 | "z = [0., 30., 60., 90., 120., 150., 180., 210., 240., 270., 300.]\n",
108 | "z_list = [openmc.ZPlane(z0=z_i) for z_i in z]"
109 | ]
110 | },
111 | {
112 | "cell_type": "code",
113 | "execution_count": 5,
114 | "metadata": {},
115 | "outputs": [],
116 | "source": [
117 | "left.boundary_type = 'reflective'\n",
118 | "right.boundary_type = 'reflective'\n",
119 | "front.boundary_type = 'reflective'\n",
120 | "back.boundary_type = 'reflective'\n",
121 | "z_list[0].boundary_type = 'vacuum'\n",
122 | "z_list[-1].boundary_type = 'vacuum'"
123 | ]
124 | },
125 | {
126 | "cell_type": "code",
127 | "execution_count": 6,
128 | "metadata": {},
129 | "outputs": [],
130 | "source": [
131 | "fuel_list = []\n",
132 | "gap_list = []\n",
133 | "clad_list = []\n",
134 | "water_list = []\n",
135 | "for i in range(1, 11):\n",
136 | " fuel_list.append(openmc.Cell(cell_id=i))\n",
137 | " gap_list.append(openmc.Cell(cell_id=i+10))\n",
138 | " clad_list.append(openmc.Cell(cell_id=i+20))\n",
139 | " water_list.append(openmc.Cell(cell_id=i+30))\n",
140 | " \n",
141 | "for j, fuels in enumerate(fuel_list):\n",
142 | " fuels.region = -fuel_or & +z_list[j] & -z_list[j+1]\n",
143 | " fuels.fill = uo2\n",
144 | " fuels.temperature = 800.\n",
145 | "\n",
146 | "for j, gaps in enumerate(gap_list):\n",
147 | " gaps.region = +fuel_or & -clad_ir & +z_list[j] & -z_list[j+1]\n",
148 | " gaps.fill = helium\n",
149 | " gaps.temperature = 700.\n",
150 | "\n",
151 | "for j, clads in enumerate(clad_list):\n",
152 | " clads.region = +clad_ir & -clad_or & +z_list[j] & -z_list[j+1]\n",
153 | " clads.fill = zircaloy\n",
154 | " clads.temperature = 600.\n",
155 | "\n",
156 | "for j, waters in enumerate(water_list):\n",
157 | " waters.region = +clad_or & +left & -right & +back & -front & +z_list[j] & -z_list[j+1]\n",
158 | " waters.fill = material_list[j+3]\n",
159 | " waters.temperature = 500."
160 | ]
161 | },
162 | {
163 | "cell_type": "code",
164 | "execution_count": 7,
165 | "metadata": {},
166 | "outputs": [],
167 | "source": [
168 | "root = openmc.Universe(name='root universe')\n",
169 | "root.add_cells(fuel_list)\n",
170 | "root.add_cells(gap_list)\n",
171 | "root.add_cells(clad_list)\n",
172 | "root.add_cells(water_list)\n",
173 | "geometry_file = openmc.Geometry(root)\n",
174 | "geometry_file.export_to_xml()"
175 | ]
176 | },
177 | {
178 | "cell_type": "markdown",
179 | "metadata": {},
180 | "source": [
181 | "If you are coupling this externally to a heat transfer solver, you will want to know the heat deposited by each fuel cell. So let's create a cell filter for the recoverable fission heat. "
182 | ]
183 | },
184 | {
185 | "cell_type": "code",
186 | "execution_count": 8,
187 | "metadata": {},
188 | "outputs": [],
189 | "source": [
190 | "cell_filter = openmc.CellFilter(fuel_list)\n",
191 | "t = openmc.Tally(tally_id=1)\n",
192 | "t.filters.append(cell_filter)\n",
193 | "t.scores = ['fission-q-recoverable']\n",
194 | "tallies = openmc.Tallies([t])\n",
195 | "tallies.export_to_xml()"
196 | ]
197 | },
198 | {
199 | "cell_type": "markdown",
200 | "metadata": {},
201 | "source": [
202 | "Let's plot our geometry to make sure it looks like we expect. Since we made new water materials in each axial cell, and we have centered the plot at 150, we should see one color for the water material in the bottom half and a different color for the water material in the top half. "
203 | ]
204 | },
205 | {
206 | "cell_type": "code",
207 | "execution_count": 9,
208 | "metadata": {},
209 | "outputs": [
210 | {
211 | "data": {
212 | "text/plain": [
213 | ""
214 | ]
215 | },
216 | "execution_count": 9,
217 | "metadata": {},
218 | "output_type": "execute_result"
219 | },
220 | {
221 | "data": {
222 | "image/png": "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\n",
223 | "text/plain": [
224 | ""
225 | ]
226 | },
227 | "metadata": {
228 | "needs_background": "light"
229 | },
230 | "output_type": "display_data"
231 | }
232 | ],
233 | "source": [
234 | "root.plot(basis='yz', width=[2, 10], color_by='material', origin=[0., 0., 150.], pixels=[400, 400])"
235 | ]
236 | },
237 | {
238 | "cell_type": "markdown",
239 | "metadata": {},
240 | "source": [
241 | "Settings: everything will be standard except for the temperature settings. Since we will be working with specified temperatures, you will need temperature dependent data. I typically use the endf data found here: https://openmc.org/official-data-libraries/\n",
242 | "Make sure your cross sections environment variable is pointing to temperature-dependent data before using the following settings."
243 | ]
244 | },
245 | {
246 | "cell_type": "code",
247 | "execution_count": 10,
248 | "metadata": {},
249 | "outputs": [],
250 | "source": [
251 | "lower_left = [-0.62992, -pitch/2, 0]\n",
252 | "upper_right = [+0.62992, +pitch/2, +300]\n",
253 | "uniform_dist = openmc.stats.Box(lower_left, upper_right, only_fissionable=True)\n",
254 | "\n",
255 | "settings_file = openmc.Settings()\n",
256 | "settings_file.batches = 100\n",
257 | "settings_file.inactive = 10\n",
258 | "settings_file.particles = 10000\n",
259 | "settings_file.temperature = {'multipole': True, 'method': 'interpolation', 'range': [290, 2500]}\n",
260 | "settings_file.source = openmc.source.IndependentSource(space=uniform_dist)\n",
261 | "settings_file.export_to_xml()"
262 | ]
263 | },
264 | {
265 | "cell_type": "markdown",
266 | "metadata": {},
267 | "source": [
268 | "To run a regular simulation, just use openmc.run(). \n",
269 | "However, we want to run a simulation that we can stop in the middle and update the material and cell properties. So we will use openmc.lib."
270 | ]
271 | },
272 | {
273 | "cell_type": "code",
274 | "execution_count": 11,
275 | "metadata": {},
276 | "outputs": [
277 | {
278 | "name": "stdout",
279 | "output_type": "stream",
280 | "text": [
281 | " %%%%%%%%%%%%%%%\n",
282 | " %%%%%%%%%%%%%%%%%%%%%%%%\n",
283 | " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n",
284 | " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n",
285 | " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n",
286 | " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n",
287 | " %%%%%%%%%%%%%%%%%%%%%%%%\n",
288 | " %%%%%%%%%%%%%%%%%%%%%%%%\n",
289 | " ############### %%%%%%%%%%%%%%%%%%%%%%%%\n",
290 | " ################## %%%%%%%%%%%%%%%%%%%%%%%\n",
291 | " ################### %%%%%%%%%%%%%%%%%%%%%%%\n",
292 | " #################### %%%%%%%%%%%%%%%%%%%%%%\n",
293 | " ##################### %%%%%%%%%%%%%%%%%%%%%\n",
294 | " ###################### %%%%%%%%%%%%%%%%%%%%\n",
295 | " ####################### %%%%%%%%%%%%%%%%%%\n",
296 | " ####################### %%%%%%%%%%%%%%%%%\n",
297 | " ###################### %%%%%%%%%%%%%%%%%\n",
298 | " #################### %%%%%%%%%%%%%%%%%\n",
299 | " ################# %%%%%%%%%%%%%%%%%\n",
300 | " ############### %%%%%%%%%%%%%%%%\n",
301 | " ############ %%%%%%%%%%%%%%%\n",
302 | " ######## %%%%%%%%%%%%%%\n",
303 | " %%%%%%%%%%%\n",
304 | "\n",
305 | " | The OpenMC Monte Carlo Code\n",
306 | " Copyright | 2011-2022 MIT, UChicago Argonne LLC, and contributors\n",
307 | " License | https://docs.openmc.org/en/latest/license.html\n",
308 | " Version | 0.13.1\n",
309 | " Git SHA1 | 33bc948f4b855c037975f16d16091fe4ecd12de3\n",
310 | " Date/Time | 2022-10-03 22:36:24\n",
311 | " OpenMP Threads | 2\n",
312 | "\n",
313 | " Reading settings XML file...\n",
314 | " Reading cross sections XML file...\n",
315 | " Reading materials XML file...\n",
316 | " Reading geometry XML file...\n",
317 | " Reading U234 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/U234.h5\n",
318 | " Reading U234 WMP data from\n",
319 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/092234.h5\n",
320 | " Reading U235 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/U235.h5\n",
321 | " Reading U235 WMP data from\n",
322 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/092235.h5\n",
323 | " Reading U238 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/U238.h5\n",
324 | " Reading U238 WMP data from\n",
325 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/092238.h5\n",
326 | " Reading U236 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/U236.h5\n",
327 | " Reading U236 WMP data from\n",
328 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/092236.h5\n",
329 | " Reading O16 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/O16.h5\n",
330 | " Reading O16 WMP data from\n",
331 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/008016.h5\n",
332 | " Reading O17 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/O17.h5\n",
333 | " Reading O17 WMP data from\n",
334 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/008017.h5\n",
335 | " Reading He3 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/He3.h5\n",
336 | " Reading He3 WMP data from\n",
337 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/002003.h5\n",
338 | " Reading He4 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/He4.h5\n",
339 | " Reading He4 WMP data from\n",
340 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/002004.h5\n",
341 | " Reading Sn112 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Sn112.h5\n",
342 | " Reading Sn112 WMP data from\n",
343 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/050112.h5\n",
344 | " Reading Sn114 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Sn114.h5\n",
345 | " Reading Sn114 WMP data from\n",
346 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/050114.h5\n",
347 | " Reading Sn115 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Sn115.h5\n",
348 | " Reading Sn115 WMP data from\n",
349 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/050115.h5\n",
350 | " Reading Sn116 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Sn116.h5\n",
351 | " Reading Sn116 WMP data from\n",
352 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/050116.h5\n",
353 | " Reading Sn117 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Sn117.h5\n",
354 | " Reading Sn117 WMP data from\n",
355 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/050117.h5\n",
356 | " Reading Sn118 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Sn118.h5\n",
357 | " Reading Sn118 WMP data from\n",
358 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/050118.h5\n",
359 | " Reading Sn119 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Sn119.h5\n",
360 | " Reading Sn119 WMP data from\n",
361 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/050119.h5\n",
362 | " Reading Sn120 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Sn120.h5\n",
363 | " Reading Sn120 WMP data from\n",
364 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/050120.h5\n",
365 | " Reading Sn122 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Sn122.h5\n",
366 | " Reading Sn122 WMP data from\n",
367 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/050122.h5\n",
368 | " Reading Sn124 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Sn124.h5\n",
369 | " Reading Sn124 WMP data from\n",
370 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/050124.h5\n",
371 | " Reading Fe54 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Fe54.h5\n",
372 | " Reading Fe54 WMP data from\n",
373 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/026054.h5\n",
374 | " Reading Fe56 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Fe56.h5\n",
375 | " Reading Fe56 WMP data from\n",
376 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/026056.h5\n",
377 | " Reading Fe57 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Fe57.h5\n",
378 | " Reading Fe57 WMP data from\n",
379 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/026057.h5\n",
380 | " Reading Fe58 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Fe58.h5\n",
381 | " Reading Fe58 WMP data from\n",
382 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/026058.h5\n",
383 | " Reading Cr50 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Cr50.h5\n",
384 | " Reading Cr50 WMP data from\n",
385 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/024050.h5\n",
386 | " Reading Cr52 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Cr52.h5\n",
387 | " Reading Cr52 WMP data from\n",
388 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/024052.h5\n",
389 | " Reading Cr53 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Cr53.h5\n",
390 | " Reading Cr53 WMP data from\n",
391 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/024053.h5\n",
392 | " Reading Cr54 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Cr54.h5\n",
393 | " Reading Cr54 WMP data from\n",
394 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/024054.h5\n",
395 | " Reading Zr90 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Zr90.h5\n",
396 | " Reading Zr90 WMP data from\n",
397 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/040090.h5\n",
398 | " Reading Zr91 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Zr91.h5\n",
399 | " Reading Zr91 WMP data from\n",
400 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/040091.h5\n",
401 | " Reading Zr92 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Zr92.h5\n",
402 | " Reading Zr92 WMP data from\n",
403 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/040092.h5\n",
404 | " Reading Zr94 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Zr94.h5\n",
405 | " Reading Zr94 WMP data from\n",
406 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/040094.h5\n",
407 | " Reading Zr96 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/Zr96.h5\n",
408 | " Reading Zr96 WMP data from\n",
409 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/040096.h5\n",
410 | " Reading H1 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/H1.h5\n",
411 | " Reading H1 WMP data from\n",
412 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/001001.h5\n",
413 | " Reading H2 from /home/pshriwise/data/xs/openmc/endfb71_hdf5/H2.h5\n",
414 | " Reading H2 WMP data from\n",
415 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/wmp/001002.h5\n",
416 | " Reading c_H_in_H2O from\n",
417 | " /home/pshriwise/data/xs/openmc/endfb71_hdf5/c_H_in_H2O.h5\n",
418 | " Minimum neutron data temperature: 250 K\n",
419 | " Maximum neutron data temperature: 2500 K\n",
420 | " Reading tallies XML file...\n",
421 | " Preparing distributed cell instances...\n",
422 | " Reading plot XML file...\n",
423 | " Writing summary.h5 file...\n",
424 | " Maximum neutron transport energy: 20000000 eV for U235\n",
425 | " Initializing source particles...\n",
426 | "\n",
427 | " ====================> K EIGENVALUE SIMULATION <====================\n",
428 | "\n"
429 | ]
430 | }
431 | ],
432 | "source": [
433 | "openmc.lib.init()\n",
434 | "openmc.lib.simulation_init()"
435 | ]
436 | },
437 | {
438 | "cell_type": "markdown",
439 | "metadata": {},
440 | "source": [
441 | "There are 10 inactive batches, so we need to run next_batch() at least 10 times before the tally is activated. "
442 | ]
443 | },
444 | {
445 | "cell_type": "code",
446 | "execution_count": 12,
447 | "metadata": {},
448 | "outputs": [
449 | {
450 | "name": "stdout",
451 | "output_type": "stream",
452 | "text": [
453 | " Bat./Gen. k Average k\n",
454 | " ========= ======== ====================\n",
455 | " 1/1 1.23436\n",
456 | " 2/1 1.26521\n",
457 | " 3/1 1.22463\n",
458 | " 4/1 1.27677\n",
459 | " 5/1 1.23851\n",
460 | " 6/1 1.28804\n",
461 | " 7/1 1.26625\n",
462 | " 8/1 1.28035\n",
463 | " 9/1 1.28143\n",
464 | " 10/1 1.25761\n",
465 | " 11/1 1.27147\n",
466 | " 12/1 1.27749 1.27448 +/- 0.00301\n",
467 | " 13/1 1.27870 1.27589 +/- 0.00224\n",
468 | " 14/1 1.26985 1.27438 +/- 0.00219\n"
469 | ]
470 | }
471 | ],
472 | "source": [
473 | "for _ in range(14):\n",
474 | " openmc.lib.next_batch()"
475 | ]
476 | },
477 | {
478 | "cell_type": "markdown",
479 | "metadata": {},
480 | "source": [
481 | "Let's take a look at the tally. There are 10 entries, one for each cell in the fuel."
482 | ]
483 | },
484 | {
485 | "cell_type": "code",
486 | "execution_count": 13,
487 | "metadata": {},
488 | "outputs": [
489 | {
490 | "name": "stdout",
491 | "output_type": "stream",
492 | "text": [
493 | "[[ 3931482.80669347]\n",
494 | " [ 9131299.17209842]\n",
495 | " [11481356.26853649]\n",
496 | " [12467135.97736016]\n",
497 | " [11306527.77160696]\n",
498 | " [12652743.75842057]\n",
499 | " [12641528.78488241]\n",
500 | " [11430393.02418431]\n",
501 | " [10539158.01402584]\n",
502 | " [ 4703235.03712948]]\n"
503 | ]
504 | }
505 | ],
506 | "source": [
507 | "t = openmc.lib.tallies[1]\n",
508 | "print(t.mean)"
509 | ]
510 | },
511 | {
512 | "cell_type": "markdown",
513 | "metadata": {},
514 | "source": [
515 | "Now, let's make some changes to the temperatures. For this, we need to identify each cell by its id. We can use get_temperature() to compare the temperatures of the cells before and after the change. "
516 | ]
517 | },
518 | {
519 | "cell_type": "code",
520 | "execution_count": 14,
521 | "metadata": {},
522 | "outputs": [
523 | {
524 | "name": "stdout",
525 | "output_type": "stream",
526 | "text": [
527 | "fuel temperature is: \n",
528 | "799.9999999999999\n",
529 | "gap temperature is: \n",
530 | "700.0\n",
531 | "clad temperature is: \n",
532 | "600.0\n",
533 | "water temperature is: \n",
534 | "500.00000000000006\n"
535 | ]
536 | }
537 | ],
538 | "source": [
539 | "print(\"fuel temperature is: \")\n",
540 | "print(openmc.lib.cells[5].get_temperature())\n",
541 | "print(\"gap temperature is: \")\n",
542 | "print(openmc.lib.cells[15].get_temperature())\n",
543 | "print(\"clad temperature is: \")\n",
544 | "print(openmc.lib.cells[25].get_temperature())\n",
545 | "print(\"water temperature is: \")\n",
546 | "print(openmc.lib.cells[35].get_temperature())"
547 | ]
548 | },
549 | {
550 | "cell_type": "code",
551 | "execution_count": 15,
552 | "metadata": {},
553 | "outputs": [],
554 | "source": [
555 | "for i in range(1, 11):\n",
556 | " temp = 900.0\n",
557 | " openmc.lib.cells[i].set_temperature(temp)"
558 | ]
559 | },
560 | {
561 | "cell_type": "code",
562 | "execution_count": 16,
563 | "metadata": {},
564 | "outputs": [
565 | {
566 | "name": "stdout",
567 | "output_type": "stream",
568 | "text": [
569 | "fuel temperature is: \n",
570 | "900.0\n"
571 | ]
572 | }
573 | ],
574 | "source": [
575 | "print(\"fuel temperature is: \")\n",
576 | "print(openmc.lib.cells[5].get_temperature())"
577 | ]
578 | },
579 | {
580 | "cell_type": "markdown",
581 | "metadata": {},
582 | "source": [
583 | "Let's make a similar change for the water density. Again, we need to identify each material by its id."
584 | ]
585 | },
586 | {
587 | "cell_type": "code",
588 | "execution_count": 17,
589 | "metadata": {},
590 | "outputs": [],
591 | "source": [
592 | "for i in range(4, 14):\n",
593 | " density = 0.65\n",
594 | " openmc.lib.materials[i].set_density(density, units='g/cm3')"
595 | ]
596 | },
597 | {
598 | "cell_type": "markdown",
599 | "metadata": {},
600 | "source": [
601 | "The new batches we run will use the new material and cell properties."
602 | ]
603 | },
604 | {
605 | "cell_type": "code",
606 | "execution_count": 18,
607 | "metadata": {},
608 | "outputs": [
609 | {
610 | "name": "stdout",
611 | "output_type": "stream",
612 | "text": [
613 | " 15/1 1.26681 1.27286 +/- 0.00227\n",
614 | " 16/1 1.22664 1.26516 +/- 0.00792\n",
615 | " 17/1 1.24385 1.26212 +/- 0.00736\n",
616 | " 18/1 1.25415 1.26112 +/- 0.00645\n",
617 | " 19/1 1.28509 1.26378 +/- 0.00628\n",
618 | " 20/1 1.26223 1.26363 +/- 0.00562\n",
619 | " 21/1 1.22983 1.26056 +/- 0.00594\n",
620 | " 22/1 1.25030 1.25970 +/- 0.00549\n",
621 | " 23/1 1.25071 1.25901 +/- 0.00510\n",
622 | " 24/1 1.25387 1.25864 +/- 0.00473\n",
623 | " 25/1 1.24512 1.25774 +/- 0.00450\n",
624 | " 26/1 1.27716 1.25895 +/- 0.00438\n",
625 | " 27/1 1.25292 1.25860 +/- 0.00413\n",
626 | " 28/1 1.27613 1.25957 +/- 0.00401\n"
627 | ]
628 | }
629 | ],
630 | "source": [
631 | "for _ in range(14):\n",
632 | " openmc.lib.next_batch()"
633 | ]
634 | },
635 | {
636 | "cell_type": "markdown",
637 | "metadata": {},
638 | "source": [
639 | "When you're ready to end the simulation, use the following:"
640 | ]
641 | },
642 | {
643 | "cell_type": "code",
644 | "execution_count": 19,
645 | "metadata": {},
646 | "outputs": [
647 | {
648 | "name": "stdout",
649 | "output_type": "stream",
650 | "text": [
651 | "\n",
652 | " =======================> TIMING STATISTICS <=======================\n",
653 | "\n",
654 | " Total time for initialization = 2.9988e+01 seconds\n",
655 | " Reading cross sections = 2.9972e+01 seconds\n",
656 | " Total time in simulation = 1.3853e+02 seconds\n",
657 | " Time in transport only = 1.3841e+02 seconds\n",
658 | " Time in inactive batches = 4.4211e+01 seconds\n",
659 | " Time in active batches = 9.4319e+01 seconds\n",
660 | " Time synchronizing fission bank = 2.2818e-02 seconds\n",
661 | " Sampling source sites = 2.1518e-02 seconds\n",
662 | " SEND/RECV source sites = 1.2778e-03 seconds\n",
663 | " Time accumulating tallies = 1.2354e-04 seconds\n",
664 | " Time writing statepoints = 0.0000e+00 seconds\n",
665 | " Total time for finalization = 2.0531e-04 seconds\n",
666 | " Total time elapsed = 2.9988e+01 seconds\n",
667 | " Calculation Rate (inactive) = 2261.88 particles/second\n",
668 | " Calculation Rate (active) = 1908.41 particles/second\n",
669 | "\n",
670 | " ============================> RESULTS <============================\n",
671 | "\n",
672 | " k-effective (Collision) = 1.26047 +/- 0.00360\n",
673 | " k-effective (Track-length) = 1.25957 +/- 0.00401\n",
674 | " k-effective (Absorption) = 1.26095 +/- 0.00280\n",
675 | " Combined k-effective = 1.26075 +/- 0.00292\n",
676 | " Leakage Fraction = 0.00915 +/- 0.00032\n",
677 | "\n"
678 | ]
679 | }
680 | ],
681 | "source": [
682 | "openmc.lib.simulation_finalize()\n",
683 | "openmc.lib.finalize()"
684 | ]
685 | }
686 | ],
687 | "metadata": {
688 | "kernelspec": {
689 | "display_name": "Python 3 (ipykernel)",
690 | "language": "python",
691 | "name": "python3"
692 | },
693 | "language_info": {
694 | "codemirror_mode": {
695 | "name": "ipython",
696 | "version": 3
697 | },
698 | "file_extension": ".py",
699 | "mimetype": "text/x-python",
700 | "name": "python",
701 | "nbconvert_exporter": "python",
702 | "pygments_lexer": "ipython3",
703 | "version": "3.9.1"
704 | }
705 | },
706 | "nbformat": 4,
707 | "nbformat_minor": 4
708 | }
709 |
--------------------------------------------------------------------------------
/chain_simple.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | 283500.0 4.235177914969822e-15
30 |
31 |
32 | 513971.0 892130.0 1175630.0 6.915023250821416e-10 4.235177914969822e-15 3.870076370575872e-11
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | 4470.0 31817.0 32194.0 36304.0 36378.0 37255.0 661657.0 4.372683136122041e-05 9.525884763557368e-05 0.00017377297596020668 1.6633087848867745e-05 3.2112650589648466e-05 1.0158463048637348e-05 0.004069614128287558
52 |
53 |
54 | 3670.0 26400.0 624216.4 655668.2 660364.2 661404.0 661636.9 0.0003537897992698539 3.7210487357645964e-05 0.00037210482830822686 6.708752100247119e-05 1.4350025269251869e-05 3.08729347663194e-06 4.6173597451093537e-07
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | 2.53000e-02
64 |
65 | Gd157 Gd156 I135 Xe135 Xe136 Cs135
66 | 1.093250e-04 2.087260e-04 2.780820e-02 6.759540e-03 2.392300e-02 4.356330e-05
67 |
68 |
69 |
70 |
71 |
72 |
73 | 2.53000e-02
74 |
75 | Gd157 Gd156 I135 Xe135 Xe136 Cs135
76 | 6.142710e-5 1.483250e-04 0.0292737 0.002566345 0.0219242 4.9097e-6
77 |
78 |
79 |
80 |
81 |
82 |
83 | 2.53000e-02
84 |
85 | Gd157 Gd156 I135 Xe135 Xe136 Cs135
86 | 4.141120e-04 7.605360e-04 0.0135457 0.00026864 0.0024432 3.7100E-07
87 |
88 |
89 |
90 |
91 |
--------------------------------------------------------------------------------
/flux-spectrum.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Tally a Flux Spectrum\n",
8 | "\n",
9 | "In this example, we will demonstrate how to get the neutron flux as a function of energy (commonly called a flux spectrum). We will use a pre-built module from the `openmc.examples` package."
10 | ]
11 | },
12 | {
13 | "cell_type": "code",
14 | "execution_count": 1,
15 | "metadata": {},
16 | "outputs": [],
17 | "source": [
18 | "%matplotlib inline\n",
19 | "import openmc.examples\n",
20 | "import numpy as np\n",
21 | "import matplotlib.pyplot as plt"
22 | ]
23 | },
24 | {
25 | "cell_type": "markdown",
26 | "metadata": {},
27 | "source": [
28 | "First, we'll generate a pin-cell model:"
29 | ]
30 | },
31 | {
32 | "cell_type": "code",
33 | "execution_count": 2,
34 | "metadata": {},
35 | "outputs": [],
36 | "source": [
37 | "model = openmc.examples.pwr_pin_cell()"
38 | ]
39 | },
40 | {
41 | "cell_type": "markdown",
42 | "metadata": {},
43 | "source": [
44 | "By default, the model has no tallies."
45 | ]
46 | },
47 | {
48 | "cell_type": "code",
49 | "execution_count": 3,
50 | "metadata": {
51 | "tags": []
52 | },
53 | "outputs": [
54 | {
55 | "data": {
56 | "text/plain": [
57 | "[]"
58 | ]
59 | },
60 | "execution_count": 3,
61 | "metadata": {},
62 | "output_type": "execute_result"
63 | }
64 | ],
65 | "source": [
66 | "model.tallies"
67 | ]
68 | },
69 | {
70 | "cell_type": "markdown",
71 | "metadata": {},
72 | "source": [
73 | "To get the flux spectrum, we just need to create a flux tally with an energy filter. We can take advantage of numpy to get an energy filter specifying equal-lethargy bins. Let's create an energy filter with 500 energy bins."
74 | ]
75 | },
76 | {
77 | "cell_type": "code",
78 | "execution_count": 4,
79 | "metadata": {},
80 | "outputs": [],
81 | "source": [
82 | "# Create equal-lethargy energies to put in filter\n",
83 | "energies = np.logspace(np.log10(1e-5), np.log10(20.0e6), 501)\n",
84 | "e_filter = openmc.EnergyFilter(energies)\n",
85 | "\n",
86 | "# Create tally with energy filter\n",
87 | "tally = openmc.Tally()\n",
88 | "tally.filters = [e_filter]\n",
89 | "tally.scores = ['flux']\n",
90 | "\n",
91 | "# Set model tallies\n",
92 | "model.tallies = [tally]"
93 | ]
94 | },
95 | {
96 | "cell_type": "markdown",
97 | "metadata": {},
98 | "source": [
99 | "OpenMC also has a set of predefined energy group structures that you can take advantage of. Let's see what's available:"
100 | ]
101 | },
102 | {
103 | "cell_type": "code",
104 | "execution_count": 5,
105 | "metadata": {},
106 | "outputs": [
107 | {
108 | "data": {
109 | "text/plain": [
110 | "dict_keys(['CASMO-2', 'CASMO-4', 'CASMO-8', 'CASMO-16', 'CASMO-25', 'CASMO-40', 'VITAMIN-J-42', 'SCALE-44', 'CASMO-70', 'XMAS-172', 'VITAMIN-J-175', 'TRIPOLI-315', 'SHEM-361', 'CCFE-709', 'UKAEA-1102', 'ECCO-1968'])"
111 | ]
112 | },
113 | "execution_count": 5,
114 | "metadata": {},
115 | "output_type": "execute_result"
116 | }
117 | ],
118 | "source": [
119 | "openmc.mgxs.GROUP_STRUCTURES.keys()"
120 | ]
121 | },
122 | {
123 | "cell_type": "markdown",
124 | "metadata": {},
125 | "source": [
126 | "Let's also add a flux spectrum tally using the SHEM-361 group structure."
127 | ]
128 | },
129 | {
130 | "cell_type": "code",
131 | "execution_count": 6,
132 | "metadata": {},
133 | "outputs": [],
134 | "source": [
135 | "# Create energy filter using SHEM-361 group structure\n",
136 | "energies_shem = openmc.mgxs.GROUP_STRUCTURES['SHEM-361']\n",
137 | "shem_filter = openmc.EnergyFilter(openmc.mgxs.GROUP_STRUCTURES['SHEM-361'])\n",
138 | "\n",
139 | "tally_shem = openmc.Tally()\n",
140 | "tally_shem.filters = [shem_filter]\n",
141 | "tally_shem.scores = ['flux']\n",
142 | "\n",
143 | "model.tallies.append(tally_shem)"
144 | ]
145 | },
146 | {
147 | "cell_type": "markdown",
148 | "metadata": {},
149 | "source": [
150 | "Now let's run the model (making sure to set the number of particles/batches slightly higher than the default values)."
151 | ]
152 | },
153 | {
154 | "cell_type": "code",
155 | "execution_count": 7,
156 | "metadata": {},
157 | "outputs": [],
158 | "source": [
159 | "model.settings.particles = 10000\n",
160 | "model.settings.batches = 50\n",
161 | "sp_path = model.run(output=False)"
162 | ]
163 | },
164 | {
165 | "cell_type": "markdown",
166 | "metadata": {},
167 | "source": [
168 | "Great, the simulation is done. To get our results, we need to load data from the statepoint file. We can get the corresponding tallies from the statepoint file and get the mean values for each energy bin by using the `mean` attribute on the tallies."
169 | ]
170 | },
171 | {
172 | "cell_type": "code",
173 | "execution_count": 8,
174 | "metadata": {},
175 | "outputs": [],
176 | "source": [
177 | "with openmc.StatePoint(sp_path) as sp:\n",
178 | " t = sp.tallies[tally.id]\n",
179 | " flux500_mean = t.mean.ravel()\n",
180 | " flux500_unc = t.std_dev.ravel()\n",
181 | " \n",
182 | " t_shem = sp.tallies[tally_shem.id]\n",
183 | " flux_shem_mean = t_shem.mean.ravel()\n",
184 | " flux_shem_unc = t_shem.std_dev.ravel()"
185 | ]
186 | },
187 | {
188 | "cell_type": "markdown",
189 | "metadata": {},
190 | "source": [
191 | "Now we can use matplotlib to plot the flux versus the energy. Note that we divide by the energy bin width so that integrating the curve makes sense. This appropriately highlights the fact that most of the spectrum is thermal."
192 | ]
193 | },
194 | {
195 | "cell_type": "code",
196 | "execution_count": 9,
197 | "metadata": {},
198 | "outputs": [
199 | {
200 | "data": {
201 | "text/plain": [
202 | ""
203 | ]
204 | },
205 | "execution_count": 9,
206 | "metadata": {},
207 | "output_type": "execute_result"
208 | },
209 | {
210 | "data": {
211 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEKCAYAAAAMzhLIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAun0lEQVR4nO3deXyV9Zn//9cFyI4EiKbKIkHREhpEiT2IS8PYqnWjTAsIOlqkUju1/bVFZ2g7KoOt0unX2mH0a8UFtQ4o6FgUsNZhzKgskWjVmPBFViGURllLlLBevz/O4iEkJyfJOTlL3s/HIw/O/cl97vv6hCRXPvdnM3dHRESkIe1SHYCIiKQ3JQoREYlJiUJERGJSohARkZiUKEREJCYlChERialDqgNIhtzcXB84cGCqw2jQp59+Srdu3VIdRotkQx1A9Ugn2VAHyOx6vP322zvc/aS65VmZKAYOHEhZWVmqw2hQSUkJxcXFqQ6jRbKhDqB6pJNsqANkdj3M7KP6yvXoSUREYlKiEBGRmJQoREQkpqzsoxCRzHfo0CGqqqqora1NdShN0rNnT9asWZPqMGLq3Lkz/fr144QTTojrfCUKEUlLVVVV9OjRg4EDB2JmqQ4nbvv27aNHjx6pDqNB7s7OnTupqqoiPz8/rvfo0ZOIpKXa2lr69OmTUUkiE5gZffr0aVJLTYlCWsX1j5Zy/aOlqQ5DMoySRHI09euqR0+SeGVzqV7xNDtqDkSKbq09DEDFPZ9/yy3vMpruo25mUmBAq4coEo+BAwfSo0cP2rdvT4cOHSLzs3bt2sWECRPYvHkzAwcOZMGCBfTq1Qt35/bbb+e///u/6dq1K0888QTnnntuimvRckoUkhClC++j+7oXABh6sJw8YNPRIfToXP+32NCD5Qw9WM6qJa9SsawDud07kTfqeiia3IpRizTutddeIzc395iyWbNmcckllzB9+nRmzZrFrFmz+NWvfsXLL7/Mhg0bWLduHaWlpXzve9+jtLR5LenDhw/ToUN6/IpOjygkI80r3cKid7cB8ONtC+lvH7G10+lUdCxsvLUQanX0qDnAvtrD9D+wgeoVT5OnRCEZYNGiRZSUlABw4403UlxczK9+9SsWLVrExIkTMTNGjhzJnj172L59O6eccsox77/77rt5+umnOemkk+jfvz8jRozgtttuo7i4mOHDh/Pmm28yceJEhg8fzm233cbhw4c577zzeOihh+jUqVNk9Ync3FzKysq47bbbKCkpYcaMGWzYsIH169ezY8cO/umf/ombb765xfVVopAmm1e6hY+Xv8TIA8u5rZ3RtWN7BrbfQk2vAob+cBkAQxu7SNFk8oomkxe6HkvGM3JXGaUL7yMwblqyqyAZ5l9fqqDyL39L6DULTj2Ru66O/Z1qZlx66aWYGd/97neZOnUqANXV1ZFf/l/4wheorq4GYNu2bfTr1y/y/n79+rFt27ZjEsXq1at5/vnnee+99zh06BDnnnsuI0aMiHz+4MGDlJWVUVtby+DBg1m2bBlnnnkmN9xwAw899BA/+tGPYsb8/vvvs2rVKj799FPOOeccrrzySk499dQmfW3qUme2xKV04X1U3HMh5b+4kEFLxvOjQ48yst0aunZsz9BTetJtwDnBR0fNMCkwACscB0CgYiYV91xI6cL7Ehm+SLO8+eabvPPOO7z88ss8+OCDvP7668edY2ZN6hxevnw5Y8aMoXPnzvTo0YOrr776mM9PmDABgLVr15Kfn8+ZZ54JBFsu9d2/rjFjxtClSxdyc3MZPXo0b731VtyxNUQtColL93Uv0P/ABir9NABWHR3CoiOjKPz6jxiagM7owLhplEbfp3wh8waMU0e3ADT6l3+y9O3bF4CTTz6ZsWPH8tZbb3HxxReTl5cXeaS0fft2Tj755Mj5VVVVkfdXVVVFrhGveFae7dChA0ePHgU4bphr3aSViJFjalFI3Cr9NO7vez8br1zA3T3uYmv+hIT+Ig+Mm8bQn73J/j4FFNhHDFoyXi0LSZlPP/2Uffv2RV7/6U9/4ktf+hIA11xzDU8++SQATz75JGPGjImUz58/H3dn1apV9OzZ87j+iQsuuICXXnqJ2tpaampqWLx4cb33P+uss9i8eTPr168H4Pe//z1f+cpXgOBorLfffhuA559//pj3LVq0iNraWnbu3ElJSQnnnXdei78WalFIvcJzHp7+ToB5pVsYVHuYHp078Ox3zwfg1P0bKS4OJOXeeaOup3rF04zcVQYVMykF9VtIq6uurmbs2LFAcATSpEmTuPzyywGYPn0648eP57HHHuO0005jwYIFAFxxxRX84Q9/4IwzzqBr167MnTv3uOued955XHPNNQwbNoy8vDwKCwvp2bPnced17tyZuXPnMm7c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\n",
212 | "text/plain": [
213 | ""
214 | ]
215 | },
216 | "metadata": {
217 | "needs_background": "light"
218 | },
219 | "output_type": "display_data"
220 | }
221 | ],
222 | "source": [
223 | "fig, ax = plt.subplots()\n",
224 | "ax.step(energies[:-1], flux500_mean/np.diff(energies), where='post', label='500 group')\n",
225 | "ax.step(energies_shem[:-1], flux_shem_mean/np.diff(energies_shem), where='post', label='SHEM-361')\n",
226 | "ax.set_xscale('log')\n",
227 | "ax.set_yscale('log')\n",
228 | "ax.set_xlabel('Energy [eV]')\n",
229 | "ax.set_ylabel('Flux [n-cm/eV-src]')\n",
230 | "ax.grid()\n",
231 | "ax.legend()"
232 | ]
233 | },
234 | {
235 | "cell_type": "markdown",
236 | "metadata": {},
237 | "source": [
238 | "If we don't divide by the energy bin width, we obtain a plot where the different curves aren't directly comparable."
239 | ]
240 | },
241 | {
242 | "cell_type": "code",
243 | "execution_count": 10,
244 | "metadata": {},
245 | "outputs": [
246 | {
247 | "data": {
248 | "text/plain": [
249 | ""
250 | ]
251 | },
252 | "execution_count": 10,
253 | "metadata": {},
254 | "output_type": "execute_result"
255 | },
256 | {
257 | "data": {
258 | "image/png": "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k9i5cye33nqrxieUhKiiUJQmMmDAAJYvXx73tcLCQt54442Y/SLCfffdl/LaP/vZz7jjjjvYv38/J510UiiYXV5eHnFcWVkZH3zwQcz5EydOZO3atXGvPWrUKB577LG4rymKG1UUipLDXHfddaxcuZLa2lquuOIKLcpTsoIqCkXJYWbPnp2R695xxx0Zua7SNtFgtqIoipIUVRSKoihKUlRRKIqiKElRRaEoiqIkRRWFojQDd999NyNGjGDUqFEcc8wxLFq0iLKysohOshs3bgwV4pWXl9OjRw+OOeaY0M/rr78O2Kmz3/72t0Pn+Xw+Dj30UM4999y4977mmms44YQTGDVqFBdeeCF79+4Nvfbkk08yfPhwRowYwbRp4fXBzjzzTHr27JnwmoriRrOeFKWJvP/++8ybN4+lS5fSoUMHdu7cSV1dXcrzJk6cGLfaukuXLqxYsYIDBw7QqVMnXnvttaTtPf785z8jInTr1o2f/OQn3Hvvvdx8882sW7eOe+65h3fffZeCggJ27NgROud//ud/2L9/Pw8++GDjBq20K9SiUNonmytgwR+xPqts8qU+//xzevXqRYcOHQDo1atXk6uczz77bF588UUA5syZwyWXxF0DDIDu3bsDYIzhwIEDoZ5NDz30EN/73vcoKLBblDh9pgBOPfVUunXr1iQZlfaDKgql/bG5Ah49H968m85PXWRvN4HJkyezefNmBg8ezI033sjbb78deu3SSy8NuZbOPvvsiPMWLFgQ4Xr65JNPQq9dfPHFzJ07l9raWj788EOOO+64pDJ897vfpU+fPqxevZrvf//7AKxdu5a1a9dy4oknMmHCBF5++eUmjVNpv6iiUNofGxeAvw6MH/z19nYT6Nq1K5WVlcyYMYNDDz2Uiy66iJkzZwIwa9Ysli1bxrJly5g/P3L134kTJ4ZeW7ZsGUcddVTotVGjRrFx40bmzJkTo2Dicf/99/PZZ58xbNgwnnjiCcCObaxbt47y8nLmzJnDd77zHXbt2tWksSrtE1UUSvujZCJ48kE84Mmzt5uIx+OhrKyMX//619x7770xnVobw/nnn8/PfvazGLfTGWecwTHHHMO1114bI8PFF18cundRURHnn38+eXl59O/fn8GDB7Nu3bomy6W0PzSYHUVlVY2uVNfW6TcerngBNi5g/2GldOk3vkmXW7NmDZZl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\n",
259 | "text/plain": [
260 | ""
261 | ]
262 | },
263 | "metadata": {
264 | "needs_background": "light"
265 | },
266 | "output_type": "display_data"
267 | }
268 | ],
269 | "source": [
270 | "fig, ax = plt.subplots()\n",
271 | "ax.loglog(energies[:-1], flux500_mean, '.', color='C0', label='500 group')\n",
272 | "ax.loglog(energies_shem[:-1], flux_shem_mean, '.', color='C1', label='SHEM-361')\n",
273 | "ax.set_xlabel('Energy [eV]')\n",
274 | "ax.set_ylabel('Flux [n-cm/src]')\n",
275 | "ax.grid()\n",
276 | "ax.legend()"
277 | ]
278 | }
279 | ],
280 | "metadata": {
281 | "kernelspec": {
282 | "display_name": "Python 3 (ipykernel)",
283 | "language": "python",
284 | "name": "python3"
285 | },
286 | "language_info": {
287 | "codemirror_mode": {
288 | "name": "ipython",
289 | "version": 3
290 | },
291 | "file_extension": ".py",
292 | "mimetype": "text/x-python",
293 | "name": "python",
294 | "nbconvert_exporter": "python",
295 | "pygments_lexer": "ipython3",
296 | "version": "3.9.1"
297 | }
298 | },
299 | "nbformat": 4,
300 | "nbformat_minor": 4
301 | }
302 |
--------------------------------------------------------------------------------
/hexagonal-lattice.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Modeling Hexagonal Lattices\n",
8 | "In this example, we will create a hexagonal lattice and show how the orientation can be changed via the cell rotation property. Let's first just set up some materials and universes that we will use to fill the lattice."
9 | ]
10 | },
11 | {
12 | "cell_type": "code",
13 | "execution_count": 1,
14 | "metadata": {},
15 | "outputs": [],
16 | "source": [
17 | "%matplotlib inline\n",
18 | "import openmc"
19 | ]
20 | },
21 | {
22 | "cell_type": "code",
23 | "execution_count": 2,
24 | "metadata": {},
25 | "outputs": [],
26 | "source": [
27 | "fuel = openmc.Material(name='fuel')\n",
28 | "fuel.add_nuclide('U235', 1.0)\n",
29 | "fuel.set_density('g/cm3', 10.0)\n",
30 | "\n",
31 | "fuel2 = openmc.Material(name='fuel2')\n",
32 | "fuel2.add_nuclide('U238', 1.0)\n",
33 | "fuel2.set_density('g/cm3', 10.0)\n",
34 | "\n",
35 | "water = openmc.Material(name='water')\n",
36 | "water.add_nuclide('H1', 2.0)\n",
37 | "water.add_nuclide('O16', 1.0)\n",
38 | "water.set_density('g/cm3', 1.0)\n",
39 | "\n",
40 | "materials = openmc.Materials((fuel, fuel2, water))\n",
41 | "materials.export_to_xml()"
42 | ]
43 | },
44 | {
45 | "cell_type": "markdown",
46 | "metadata": {},
47 | "source": [
48 | "With our three materials, we will set up two universes that represent pin-cells: one with a small pin and one with a big pin. Since we will be using these universes in a lattice, it's always a good idea to have an \"outer\" universe as well that is applied outside the defined lattice."
49 | ]
50 | },
51 | {
52 | "cell_type": "code",
53 | "execution_count": 3,
54 | "metadata": {},
55 | "outputs": [],
56 | "source": [
57 | "r_pin = openmc.ZCylinder(r=0.25)\n",
58 | "fuel_cell = openmc.Cell(fill=fuel, region=-r_pin)\n",
59 | "water_cell = openmc.Cell(fill=water, region=+r_pin)\n",
60 | "pin_universe = openmc.Universe(cells=(fuel_cell, water_cell))\n",
61 | "\n",
62 | "r_big_pin = openmc.ZCylinder(r=0.5)\n",
63 | "fuel2_cell = openmc.Cell(fill=fuel2, region=-r_big_pin)\n",
64 | "water2_cell = openmc.Cell(fill=water, region=+r_big_pin)\n",
65 | "big_pin_universe = openmc.Universe(cells=(fuel2_cell, water2_cell))\n",
66 | "\n",
67 | "all_water_cell = openmc.Cell(fill=water)\n",
68 | "outer_universe = openmc.Universe(cells=(all_water_cell,))"
69 | ]
70 | },
71 | {
72 | "cell_type": "markdown",
73 | "metadata": {},
74 | "source": [
75 | "Now let's create a hexagonal lattice using the `HexLattice` class:"
76 | ]
77 | },
78 | {
79 | "cell_type": "code",
80 | "execution_count": 4,
81 | "metadata": {},
82 | "outputs": [],
83 | "source": [
84 | "lattice = openmc.HexLattice()"
85 | ]
86 | },
87 | {
88 | "cell_type": "markdown",
89 | "metadata": {},
90 | "source": [
91 | "We need to set the `center` of the lattice, the `pitch`, an `outer` universe (which is applied to all lattice elements outside of those that are defined), and a list of `universes`. Let's start with the easy ones first. Note that for a 2D lattice, we only need to specify a single number for the pitch."
92 | ]
93 | },
94 | {
95 | "cell_type": "code",
96 | "execution_count": 5,
97 | "metadata": {},
98 | "outputs": [],
99 | "source": [
100 | "lattice.center = (0., 0.)\n",
101 | "lattice.pitch = (1.25,)\n",
102 | "lattice.outer = outer_universe"
103 | ]
104 | },
105 | {
106 | "cell_type": "markdown",
107 | "metadata": {},
108 | "source": [
109 | "Now we need to set the `universes` property on our lattice. It needs to be set to a list of lists of Universes, where each list of Universes corresponds to a ring of the lattice. The rings are ordered from outermost to innermost, and within each ring the indexing starts at the \"top\". To help visualize the proper indices, we can use the `show_indices()` helper method."
110 | ]
111 | },
112 | {
113 | "cell_type": "code",
114 | "execution_count": 6,
115 | "metadata": {},
116 | "outputs": [
117 | {
118 | "name": "stdout",
119 | "output_type": "stream",
120 | "text": [
121 | " (0, 0)\n",
122 | " (0,17) (0, 1)\n",
123 | " (0,16) (1, 0) (0, 2)\n",
124 | "(0,15) (1,11) (1, 1) (0, 3)\n",
125 | " (1,10) (2, 0) (1, 2)\n",
126 | "(0,14) (2, 5) (2, 1) (0, 4)\n",
127 | " (1, 9) (3, 0) (1, 3)\n",
128 | "(0,13) (2, 4) (2, 2) (0, 5)\n",
129 | " (1, 8) (2, 3) (1, 4)\n",
130 | "(0,12) (1, 7) (1, 5) (0, 6)\n",
131 | " (0,11) (1, 6) (0, 7)\n",
132 | " (0,10) (0, 8)\n",
133 | " (0, 9)\n"
134 | ]
135 | }
136 | ],
137 | "source": [
138 | "print(lattice.show_indices(num_rings=4))"
139 | ]
140 | },
141 | {
142 | "cell_type": "markdown",
143 | "metadata": {},
144 | "source": [
145 | "Let's set up a lattice where the first element in each ring is the big pin universe and all other elements are regular pin universes. \n",
146 | "\n",
147 | "From the diagram above, we see that the outer ring has 18 elements, the first ring has 12, and the second ring has 6 elements. The innermost ring of any hexagonal lattice will have only a single element. \n",
148 | "\n",
149 | "We build these rings through 'list concatenation' as follows: "
150 | ]
151 | },
152 | {
153 | "cell_type": "code",
154 | "execution_count": 7,
155 | "metadata": {},
156 | "outputs": [],
157 | "source": [
158 | "outer_ring = [big_pin_universe] + [pin_universe]*17 # Adds up to 18\n",
159 | "\n",
160 | "ring_1 = [big_pin_universe] + [pin_universe]*11 # Adds up to 12\n",
161 | "\n",
162 | "ring_2 = [big_pin_universe] + [pin_universe]*5 # Adds up to 6\n",
163 | "\n",
164 | "inner_ring = [big_pin_universe]"
165 | ]
166 | },
167 | {
168 | "cell_type": "markdown",
169 | "metadata": {},
170 | "source": [
171 | "We can now assign the rings (and the universes they contain) to our lattice. "
172 | ]
173 | },
174 | {
175 | "cell_type": "code",
176 | "execution_count": 8,
177 | "metadata": {},
178 | "outputs": [
179 | {
180 | "name": "stdout",
181 | "output_type": "stream",
182 | "text": [
183 | "HexLattice\n",
184 | "\tID =\t4\n",
185 | "\tName =\t\n",
186 | "\tOrientation =\ty\n",
187 | "\t# Rings =\t4\n",
188 | "\t# Axial =\tNone\n",
189 | "\tCenter =\t(0.0, 0.0)\n",
190 | "\tPitch =\t(1.25,)\n",
191 | "\tOuter =\t3\n",
192 | "\tUniverses \n",
193 | " 2\n",
194 | " 1 1\n",
195 | " 1 2 1\n",
196 | "1 1 1 1\n",
197 | " 1 2 1\n",
198 | "1 1 1 1\n",
199 | " 1 2 1\n",
200 | "1 1 1 1\n",
201 | " 1 1 1\n",
202 | "1 1 1 1\n",
203 | " 1 1 1\n",
204 | " 1 1\n",
205 | " 1\n"
206 | ]
207 | }
208 | ],
209 | "source": [
210 | "lattice.universes = [outer_ring, \n",
211 | " ring_1, \n",
212 | " ring_2,\n",
213 | " inner_ring]\n",
214 | "print(lattice)"
215 | ]
216 | },
217 | {
218 | "cell_type": "markdown",
219 | "metadata": {},
220 | "source": [
221 | "Now let's put our lattice inside a circular cell that will serve as the top-level cell for our geometry."
222 | ]
223 | },
224 | {
225 | "cell_type": "code",
226 | "execution_count": 9,
227 | "metadata": {},
228 | "outputs": [],
229 | "source": [
230 | "outer_surface = openmc.ZCylinder(r=5.0, boundary_type='vacuum')\n",
231 | "main_cell = openmc.Cell(fill=lattice, region=-outer_surface)\n",
232 | "geometry = openmc.Geometry([main_cell])\n",
233 | "geometry.export_to_xml()"
234 | ]
235 | },
236 | {
237 | "cell_type": "markdown",
238 | "metadata": {},
239 | "source": [
240 | "Now let's create a plot to see what our geometry looks like."
241 | ]
242 | },
243 | {
244 | "cell_type": "code",
245 | "execution_count": 10,
246 | "metadata": {},
247 | "outputs": [
248 | {
249 | "data": {
250 | "image/png": "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\n",
251 | "text/plain": [
252 | ""
253 | ]
254 | },
255 | "execution_count": 10,
256 | "metadata": {},
257 | "output_type": "execute_result"
258 | }
259 | ],
260 | "source": [
261 | "plot = openmc.Plot.from_geometry(geometry)\n",
262 | "plot.color_by = 'material'\n",
263 | "plot.colors = colors = {\n",
264 | " water: 'blue',\n",
265 | " fuel: 'olive',\n",
266 | " fuel2: 'yellow'\n",
267 | "}\n",
268 | "plot.to_ipython_image()"
269 | ]
270 | },
271 | {
272 | "cell_type": "markdown",
273 | "metadata": {},
274 | "source": [
275 | "At this point, if we wanted to simulate the model, we would need to create an instance of `openmc.Settings`, export it to XML, and run."
276 | ]
277 | },
278 | {
279 | "cell_type": "markdown",
280 | "metadata": {},
281 | "source": [
282 | "## Lattice orientation\n",
283 | "\n",
284 | "Now let's say we want our hexagonal lattice orientated such that two sides of the lattice are parallel to the x-axis. This can be achieved by two means: either we can rotate the cell that contains the lattice, or we can can change the `HexLattice.orientation` attribute. By default, the `orientation` is set to \"y\", indicating that two sides of the lattice are parallel to the y-axis, but we can also change it to \"x\" to make them parallel to the x-axis."
285 | ]
286 | },
287 | {
288 | "cell_type": "code",
289 | "execution_count": 11,
290 | "metadata": {},
291 | "outputs": [
292 | {
293 | "data": {
294 | "image/png": "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\n",
295 | "text/plain": [
296 | ""
297 | ]
298 | },
299 | "execution_count": 11,
300 | "metadata": {},
301 | "output_type": "execute_result"
302 | }
303 | ],
304 | "source": [
305 | "# Change the orientation of the lattice and re-export the geometry\n",
306 | "lattice.orientation = 'x'\n",
307 | "geometry.export_to_xml()\n",
308 | "\n",
309 | "# Run OpenMC in plotting mode\n",
310 | "plot.to_ipython_image()"
311 | ]
312 | },
313 | {
314 | "cell_type": "markdown",
315 | "metadata": {},
316 | "source": [
317 | "When we change the orientation to 'x', you can see that the first universe in each ring starts to the right along the x-axis. As before, the universes are defined in a clockwise fashion around each ring. To see the proper indices for a hexagonal lattice in this orientation, we can again call `show_indices` but pass an extra orientation argument:"
318 | ]
319 | },
320 | {
321 | "cell_type": "code",
322 | "execution_count": 12,
323 | "metadata": {},
324 | "outputs": [
325 | {
326 | "name": "stdout",
327 | "output_type": "stream",
328 | "text": [
329 | " (0,12) (0,13) (0,14) (0,15)\n",
330 | "\n",
331 | " (0,11) (1, 8) (1, 9) (1,10) (0,16)\n",
332 | "\n",
333 | " (0,10) (1, 7) (2, 4) (2, 5) (1,11) (0,17)\n",
334 | "\n",
335 | "(0, 9) (1, 6) (2, 3) (3, 0) (2, 0) (1, 0) (0, 0)\n",
336 | "\n",
337 | " (0, 8) (1, 5) (2, 2) (2, 1) (1, 1) (0, 1)\n",
338 | "\n",
339 | " (0, 7) (1, 4) (1, 3) (1, 2) (0, 2)\n",
340 | "\n",
341 | " (0, 6) (0, 5) (0, 4) (0, 3)\n"
342 | ]
343 | }
344 | ],
345 | "source": [
346 | "print(lattice.show_indices(4, orientation='x'))"
347 | ]
348 | },
349 | {
350 | "cell_type": "markdown",
351 | "metadata": {},
352 | "source": [
353 | "## Hexagonal prisms\n",
354 | "\n",
355 | "OpenMC also contains a convenience function that can create a hexagonal prism representing the interior region of six surfaces defining a hexagon. This can be useful as a bounding surface of a hexagonal lattice. For example, if we wanted the outer boundary of our geometry to be hexagonal, we could change the `region` of the main cell:"
356 | ]
357 | },
358 | {
359 | "cell_type": "code",
360 | "execution_count": 13,
361 | "metadata": {},
362 | "outputs": [
363 | {
364 | "data": {
365 | "image/png": "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\n",
366 | "text/plain": [
367 | ""
368 | ]
369 | },
370 | "execution_count": 13,
371 | "metadata": {},
372 | "output_type": "execute_result"
373 | }
374 | ],
375 | "source": [
376 | "main_cell.region = -openmc.model.HexagonalPrism(\n",
377 | " edge_length=4*lattice.pitch[0],\n",
378 | " orientation='x',\n",
379 | " boundary_type='vacuum'\n",
380 | ")\n",
381 | "geometry.export_to_xml()\n",
382 | "\n",
383 | "# Run OpenMC in plotting mode\n",
384 | "plot.color_by = 'cell'\n",
385 | "plot.to_ipython_image()"
386 | ]
387 | }
388 | ],
389 | "metadata": {
390 | "anaconda-cloud": {},
391 | "kernelspec": {
392 | "display_name": "Python 3 (ipykernel)",
393 | "language": "python",
394 | "name": "python3"
395 | },
396 | "language_info": {
397 | "codemirror_mode": {
398 | "name": "ipython",
399 | "version": 3
400 | },
401 | "file_extension": ".py",
402 | "mimetype": "text/x-python",
403 | "name": "python",
404 | "nbconvert_exporter": "python",
405 | "pygments_lexer": "ipython3",
406 | "version": "3.9.1"
407 | }
408 | },
409 | "nbformat": 4,
410 | "nbformat_minor": 4
411 | }
412 |
--------------------------------------------------------------------------------
/images/cs137_decay.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openmc-dev/openmc-notebooks/bb39f2509d47d8f4c997cc320685ad06207fdcc9/images/cs137_decay.png
--------------------------------------------------------------------------------
/images/cylinder_mesh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openmc-dev/openmc-notebooks/bb39f2509d47d8f4c997cc320685ad06207fdcc9/images/cylinder_mesh.png
--------------------------------------------------------------------------------
/images/flux3d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openmc-dev/openmc-notebooks/bb39f2509d47d8f4c997cc320685ad06207fdcc9/images/flux3d.png
--------------------------------------------------------------------------------
/images/manifold-cad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openmc-dev/openmc-notebooks/bb39f2509d47d8f4c997cc320685ad06207fdcc9/images/manifold-cad.png
--------------------------------------------------------------------------------
/images/manifold_flux.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openmc-dev/openmc-notebooks/bb39f2509d47d8f4c997cc320685ad06207fdcc9/images/manifold_flux.png
--------------------------------------------------------------------------------
/images/mdgxs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openmc-dev/openmc-notebooks/bb39f2509d47d8f4c997cc320685ad06207fdcc9/images/mdgxs.png
--------------------------------------------------------------------------------
/images/mgxs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openmc-dev/openmc-notebooks/bb39f2509d47d8f4c997cc320685ad06207fdcc9/images/mgxs.png
--------------------------------------------------------------------------------
/images/pin_mesh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openmc-dev/openmc-notebooks/bb39f2509d47d8f4c997cc320685ad06207fdcc9/images/pin_mesh.png
--------------------------------------------------------------------------------
/images/teapot.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openmc-dev/openmc-notebooks/bb39f2509d47d8f4c997cc320685ad06207fdcc9/images/teapot.jpg
--------------------------------------------------------------------------------
/images/umesh_flux.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openmc-dev/openmc-notebooks/bb39f2509d47d8f4c997cc320685ad06207fdcc9/images/umesh_flux.png
--------------------------------------------------------------------------------
/images/umesh_heating.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openmc-dev/openmc-notebooks/bb39f2509d47d8f4c997cc320685ad06207fdcc9/images/umesh_heating.png
--------------------------------------------------------------------------------
/images/umesh_w_assembly.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openmc-dev/openmc-notebooks/bb39f2509d47d8f4c997cc320685ad06207fdcc9/images/umesh_w_assembly.png
--------------------------------------------------------------------------------
/search.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Criticality Search\n",
8 | "This notebook illustrates the usage of the OpenMC Python API's generic eigenvalue search capability. In this Notebook, we will do a critical boron concentration search of a typical PWR pin cell.\n",
9 | "\n",
10 | "To use the search functionality, we must create a function which creates our model according to the input parameter we wish to search for (in this case, the boron concentration). \n",
11 | "\n",
12 | "This notebook will first create that function, and then, run the search."
13 | ]
14 | },
15 | {
16 | "cell_type": "code",
17 | "execution_count": 1,
18 | "metadata": {},
19 | "outputs": [],
20 | "source": [
21 | "# Initialize third-party libraries and the OpenMC Python API\n",
22 | "import matplotlib.pyplot as plt\n",
23 | "import numpy as np\n",
24 | "\n",
25 | "import openmc\n",
26 | "import openmc.model\n",
27 | "\n",
28 | "%matplotlib inline"
29 | ]
30 | },
31 | {
32 | "cell_type": "markdown",
33 | "metadata": {},
34 | "source": [
35 | "## Create Parametrized Model\n",
36 | "\n",
37 | "To perform the search we will use the `openmc.search_for_keff` function. This function requires a different function be defined which creates an parametrized model to analyze. This model is required to be stored in an `openmc.model.Model` object. The first parameter of this function will be modified during the search process for our critical eigenvalue.\n",
38 | "\n",
39 | "Our model will be a pin-cell from the [Multi-Group Mode Part II](mg-mode-part-ii.ipynb) assembly, except this time the entire model building process will be contained within a function, and the Boron concentration will be parametrized."
40 | ]
41 | },
42 | {
43 | "cell_type": "code",
44 | "execution_count": 2,
45 | "metadata": {},
46 | "outputs": [],
47 | "source": [
48 | "# Create the model. `ppm_Boron` will be the parametric variable.\n",
49 | "\n",
50 | "def build_model(ppm_Boron):\n",
51 | " \n",
52 | " # Create the pin materials\n",
53 | " fuel = openmc.Material(name='1.6% Fuel')\n",
54 | " fuel.set_density('g/cm3', 10.31341)\n",
55 | " fuel.add_element('U', 1., enrichment=1.6)\n",
56 | " fuel.add_element('O', 2.)\n",
57 | "\n",
58 | " zircaloy = openmc.Material(name='Zircaloy')\n",
59 | " zircaloy.set_density('g/cm3', 6.55)\n",
60 | " zircaloy.add_element('Zr', 1.)\n",
61 | "\n",
62 | " water = openmc.Material(name='Borated Water')\n",
63 | " water.set_density('g/cm3', 0.741)\n",
64 | " water.add_element('H', 2.)\n",
65 | " water.add_element('O', 1.)\n",
66 | "\n",
67 | " # Include the amount of boron in the water based on the ppm,\n",
68 | " # neglecting the other constituents of boric acid\n",
69 | " water.add_element('B', ppm_Boron * 1e-6)\n",
70 | " \n",
71 | " # Instantiate a Materials object\n",
72 | " materials = openmc.Materials([fuel, zircaloy, water])\n",
73 | " \n",
74 | " # Create cylinders for the fuel and clad\n",
75 | " fuel_outer_radius = openmc.ZCylinder(r=0.39218)\n",
76 | " clad_outer_radius = openmc.ZCylinder(r=0.45720)\n",
77 | "\n",
78 | " # Create boundary planes to surround the geometry\n",
79 | " min_x = openmc.XPlane(x0=-0.63, boundary_type='reflective')\n",
80 | " max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective')\n",
81 | " min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective')\n",
82 | " max_y = openmc.YPlane(y0=+0.63, boundary_type='reflective')\n",
83 | "\n",
84 | " # Create fuel Cell\n",
85 | " fuel_cell = openmc.Cell(name='1.6% Fuel')\n",
86 | " fuel_cell.fill = fuel\n",
87 | " fuel_cell.region = -fuel_outer_radius\n",
88 | "\n",
89 | " # Create a clad Cell\n",
90 | " clad_cell = openmc.Cell(name='1.6% Clad')\n",
91 | " clad_cell.fill = zircaloy\n",
92 | " clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n",
93 | "\n",
94 | " # Create a moderator Cell\n",
95 | " moderator_cell = openmc.Cell(name='1.6% Moderator')\n",
96 | " moderator_cell.fill = water\n",
97 | " moderator_cell.region = +clad_outer_radius & (+min_x & -max_x & +min_y & -max_y)\n",
98 | "\n",
99 | " # Create root Universe\n",
100 | " root_universe = openmc.Universe(name='root universe')\n",
101 | " root_universe.add_cells([fuel_cell, clad_cell, moderator_cell])\n",
102 | "\n",
103 | " # Create Geometry and set root universe\n",
104 | " geometry = openmc.Geometry(root_universe)\n",
105 | " \n",
106 | " # Instantiate a Settings object\n",
107 | " settings = openmc.Settings()\n",
108 | " \n",
109 | " # Set simulation parameters\n",
110 | " settings.batches = 300\n",
111 | " settings.inactive = 20\n",
112 | " settings.particles = 1000\n",
113 | " \n",
114 | " # Create an initial uniform spatial source distribution over fissionable zones\n",
115 | " bounds = [-0.63, -0.63, -10, 0.63, 0.63, 10.]\n",
116 | " uniform_dist = openmc.stats.Box(bounds[:3], bounds[3:], only_fissionable=True)\n",
117 | " settings.source = openmc.source.IndependentSource(space=uniform_dist)\n",
118 | " \n",
119 | " # We dont need a tallies file so dont waste the disk input/output time\n",
120 | " settings.output = {'tallies': False}\n",
121 | " \n",
122 | " model = openmc.model.Model(geometry, materials, settings)\n",
123 | " \n",
124 | " return model"
125 | ]
126 | },
127 | {
128 | "cell_type": "markdown",
129 | "metadata": {},
130 | "source": [
131 | "## Search for the Critical Boron Concentration\n",
132 | "\n",
133 | "To perform the search we imply call the `openmc.search_for_keff` function and pass in the relvant arguments. For our purposes we will be passing in the model building function (`build_model` defined above), a bracketed range for the expected critical Boron concentration (1,000 to 2,500 ppm), the tolerance, and the method we wish to use. \n",
134 | "\n",
135 | "Instead of the bracketed range we could have used a single initial guess, but have elected not to in this example. Finally, due to the high noise inherent in using as few histories as are used in this example, our tolerance on the final keff value will be rather large (1.e-2) and the default 'bisection' method will be used for the search."
136 | ]
137 | },
138 | {
139 | "cell_type": "code",
140 | "execution_count": 3,
141 | "metadata": {},
142 | "outputs": [
143 | {
144 | "name": "stdout",
145 | "output_type": "stream",
146 | "text": [
147 | "Iteration: 1; Guess of 1.00e+03 produced a keff of 1.08971 +/- 0.00163\n",
148 | "Iteration: 2; Guess of 2.50e+03 produced a keff of 0.95309 +/- 0.00154\n",
149 | "Iteration: 3; Guess of 1.75e+03 produced a keff of 1.01511 +/- 0.00156\n",
150 | "Iteration: 4; Guess of 2.12e+03 produced a keff of 0.98400 +/- 0.00172\n",
151 | "Iteration: 5; Guess of 1.94e+03 produced a keff of 0.99913 +/- 0.00174\n",
152 | "Iteration: 6; Guess of 1.84e+03 produced a keff of 1.00690 +/- 0.00169\n",
153 | "Iteration: 7; Guess of 1.89e+03 produced a keff of 1.00394 +/- 0.00162\n",
154 | "Iteration: 8; Guess of 1.91e+03 produced a keff of 1.00241 +/- 0.00170\n",
155 | "Iteration: 9; Guess of 1.93e+03 produced a keff of 1.00204 +/- 0.00154\n",
156 | "Critical Boron Concentration: 1926 ppm\n"
157 | ]
158 | }
159 | ],
160 | "source": [
161 | "# Perform the search\n",
162 | "crit_ppm, guesses, keffs = openmc.search_for_keff(build_model, bracket=[1000., 2500.],\n",
163 | " tol=1e-2, print_iterations=True, \n",
164 | " run_args={'output': False})\n",
165 | "\n",
166 | "print('Critical Boron Concentration: {:4.0f} ppm'.format(crit_ppm))"
167 | ]
168 | },
169 | {
170 | "cell_type": "markdown",
171 | "metadata": {},
172 | "source": [
173 | "Finally, the `openmc.search_for_keff` function also provided us with `List`s of the guesses and corresponding keff values generated during the search process with OpenMC. Let's use that information to make a quick plot of the value of keff versus the boron concentration."
174 | ]
175 | },
176 | {
177 | "cell_type": "code",
178 | "execution_count": 4,
179 | "metadata": {},
180 | "outputs": [
181 | {
182 | "data": {
183 | "image/png": "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\n",
184 | "text/plain": [
185 | ""
186 | ]
187 | },
188 | "metadata": {
189 | "needs_background": "light"
190 | },
191 | "output_type": "display_data"
192 | }
193 | ],
194 | "source": [
195 | "plt.figure(figsize=(8, 4.5))\n",
196 | "plt.title('Eigenvalue versus Boron Concentration')\n",
197 | "# Create a scatter plot using the mean value of keff\n",
198 | "plt.scatter(guesses, [keffs[i].nominal_value for i in range(len(keffs))])\n",
199 | "plt.xlabel('Boron Concentration [ppm]')\n",
200 | "plt.ylabel('Eigenvalue')\n",
201 | "plt.show()"
202 | ]
203 | },
204 | {
205 | "cell_type": "markdown",
206 | "metadata": {},
207 | "source": [
208 | "We see a nearly linear reactivity coefficient for the boron concentration, exactly as one would expect for a pure 1/v absorber at small concentrations."
209 | ]
210 | }
211 | ],
212 | "metadata": {
213 | "kernelspec": {
214 | "display_name": "Python 3 (ipykernel)",
215 | "language": "python",
216 | "name": "python3"
217 | },
218 | "language_info": {
219 | "codemirror_mode": {
220 | "name": "ipython",
221 | "version": 3
222 | },
223 | "file_extension": ".py",
224 | "mimetype": "text/x-python",
225 | "name": "python",
226 | "nbconvert_exporter": "python",
227 | "pygments_lexer": "ipython3",
228 | "version": "3.9.1"
229 | }
230 | },
231 | "nbformat": 4,
232 | "nbformat_minor": 4
233 | }
234 |
--------------------------------------------------------------------------------
/tally-power-normalization.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "1c9efafb",
6 | "metadata": {},
7 | "source": [
8 | "# Tally Power Normalization\n",
9 | "\n",
10 | "In this notebook, we demonstrate how to normalize tally values in OpenMC assuming you have a reactor operating at a known power. We'll begin by creating a very simple \"reactor\" model consisting of a sphere of U235 surrounded by water."
11 | ]
12 | },
13 | {
14 | "cell_type": "code",
15 | "execution_count": 1,
16 | "id": "aa112441",
17 | "metadata": {},
18 | "outputs": [],
19 | "source": [
20 | "import openmc"
21 | ]
22 | },
23 | {
24 | "cell_type": "code",
25 | "execution_count": 2,
26 | "id": "d3e05e9d",
27 | "metadata": {},
28 | "outputs": [],
29 | "source": [
30 | "u235 = openmc.Material()\n",
31 | "u235.add_nuclide('U235', 1.0)\n",
32 | "u235.set_density('g/cm3', 10.0)\n",
33 | "\n",
34 | "water = openmc.Material()\n",
35 | "water.add_components({'H': 2.0, 'O': 1.0})\n",
36 | "water.add_s_alpha_beta('c_H_in_H2O')\n",
37 | "\n",
38 | "fuel_sph = openmc.Sphere(r=6.5)\n",
39 | "outer_sph = openmc.Sphere(r=15.0, boundary_type='vacuum')\n",
40 | "\n",
41 | "fuel = openmc.Cell(fill=u235, region=-fuel_sph)\n",
42 | "moderator = openmc.Cell(fill=water, region=+fuel_sph & -outer_sph)\n",
43 | "geometry = openmc.Geometry([fuel, moderator])\n",
44 | "model = openmc.Model(geometry=geometry)\n",
45 | "\n",
46 | "model.settings.batches = 100\n",
47 | "model.settings.inactive = 10\n",
48 | "model.settings.particles = 1000\n",
49 | "model.settings.source = openmc.IndependentSource(space=openmc.stats.Point())"
50 | ]
51 | },
52 | {
53 | "cell_type": "markdown",
54 | "id": "4346c07d",
55 | "metadata": {},
56 | "source": [
57 | "Let's run OpenMC to see what we get for $k_\\text{eff}$:"
58 | ]
59 | },
60 | {
61 | "cell_type": "code",
62 | "execution_count": 3,
63 | "id": "e3669be6",
64 | "metadata": {},
65 | "outputs": [
66 | {
67 | "name": "stdout",
68 | "output_type": "stream",
69 | "text": [
70 | "k-effective = 0.9943+/-0.0030\n"
71 | ]
72 | }
73 | ],
74 | "source": [
75 | "sp_path = model.run(output=False)\n",
76 | "with openmc.StatePoint(sp_path) as sp:\n",
77 | " keff = sp.keff\n",
78 | "print(f'k-effective = {keff}')"
79 | ]
80 | },
81 | {
82 | "cell_type": "markdown",
83 | "id": "a48ca59a",
84 | "metadata": {},
85 | "source": [
86 | "Now let's say we want to know the fission reaction rate in \\[fissions/sec\\] in the fuel. We'll create a tally for this using the \"fission\" score:"
87 | ]
88 | },
89 | {
90 | "cell_type": "code",
91 | "execution_count": 4,
92 | "id": "72905d10",
93 | "metadata": {},
94 | "outputs": [],
95 | "source": [
96 | "fission_tally = openmc.Tally()\n",
97 | "fission_tally.filters = [openmc.CellFilter([fuel])]\n",
98 | "fission_tally.scores = ['fission']\n",
99 | "model.tallies = [fission_tally]"
100 | ]
101 | },
102 | {
103 | "cell_type": "markdown",
104 | "id": "6f5817ae",
105 | "metadata": {},
106 | "source": [
107 | "We then run OpenMC and get the result from the statepoint:"
108 | ]
109 | },
110 | {
111 | "cell_type": "code",
112 | "execution_count": 5,
113 | "id": "149b4d65",
114 | "metadata": {},
115 | "outputs": [
116 | {
117 | "name": "stdout",
118 | "output_type": "stream",
119 | "text": [
120 | "Fission rate = 0.3955335940378975 [reactions/source]\n"
121 | ]
122 | }
123 | ],
124 | "source": [
125 | "sp_path = model.run(output=False)\n",
126 | "with openmc.StatePoint(sp_path) as sp:\n",
127 | " tally = sp.tallies[fission_tally.id]\n",
128 | " fission_rate = tally.mean.ravel()[0]\n",
129 | " \n",
130 | "print(f'Fission rate = {fission_rate} [reactions/source]')"
131 | ]
132 | },
133 | {
134 | "cell_type": "markdown",
135 | "id": "cc37fdde",
136 | "metadata": {},
137 | "source": [
138 | "So, the number we get here is not quite what we wanted—it's the fission reaction rate *per source particle*. We want the reaction rate *per second*. In order to determine that, we need to figure out the source rate, i.e., the number of source particles emitted per second. The method for doing this is described in the OpenMC [user's guide](https://docs.openmc.org/en/stable/usersguide/tallies.html#normalization-of-tally-results) but here we'll give a practical demonstration.\n",
139 | "\n",
140 | "We need two things in order to determine our desired normalization factor in units of \\[source/sec\\]. First, we need to know the power in \\[W\\] or \\[J/sec\\]. This is not something OpenMC or any other neutronics code will provide for you—that is something you have to provide as a user. In addition to the power, we need the observed heating rate from the simulation in \\[J/source\\]. To get that, we can add another tally for the heating rate. We'll use the `fission-q-recoverable` score but there are some pitfalls as to which score you choose (see further discussion below)."
141 | ]
142 | },
143 | {
144 | "cell_type": "code",
145 | "execution_count": 6,
146 | "id": "48bd4b14",
147 | "metadata": {},
148 | "outputs": [],
149 | "source": [
150 | "heating_tally = openmc.Tally()\n",
151 | "heating_tally.scores = ['fission-q-recoverable']\n",
152 | "model.tallies = [fission_tally, heating_tally]"
153 | ]
154 | },
155 | {
156 | "cell_type": "code",
157 | "execution_count": 7,
158 | "id": "4c804fc7",
159 | "metadata": {},
160 | "outputs": [
161 | {
162 | "name": "stdout",
163 | "output_type": "stream",
164 | "text": [
165 | "Heating rate = 76235017.82874997 [eV/source]\n"
166 | ]
167 | }
168 | ],
169 | "source": [
170 | "sp_path = model.run(output=False)\n",
171 | "with openmc.StatePoint(sp_path) as sp:\n",
172 | " tally = sp.tallies[heating_tally.id]\n",
173 | " heating_rate_ev = tally.mean.ravel()[0]\n",
174 | " \n",
175 | "print(f'Heating rate = {heating_rate_ev} [eV/source]')"
176 | ]
177 | },
178 | {
179 | "cell_type": "markdown",
180 | "id": "310229cd",
181 | "metadata": {},
182 | "source": [
183 | "The OpenMC tally gives us units of \\[eV/source\\] and we need to convert this to \\[J/source\\]:"
184 | ]
185 | },
186 | {
187 | "cell_type": "code",
188 | "execution_count": 8,
189 | "id": "e684b4c9",
190 | "metadata": {},
191 | "outputs": [
192 | {
193 | "name": "stdout",
194 | "output_type": "stream",
195 | "text": [
196 | "Heating rate = 1.2214222086486662e-11 [J/source]\n"
197 | ]
198 | }
199 | ],
200 | "source": [
201 | "joule_per_ev = 1.60218e-19\n",
202 | "heating_rate = heating_rate_ev * joule_per_ev\n",
203 | "print(f'Heating rate = {heating_rate} [J/source]')"
204 | ]
205 | },
206 | {
207 | "cell_type": "markdown",
208 | "id": "1e9c1002",
209 | "metadata": {},
210 | "source": [
211 | "At this point, let's assume that our spherical reactor has a power of 30 kW. That is:"
212 | ]
213 | },
214 | {
215 | "cell_type": "code",
216 | "execution_count": 9,
217 | "id": "a7f4ae45",
218 | "metadata": {},
219 | "outputs": [],
220 | "source": [
221 | "power = 30e3 # [J/s]"
222 | ]
223 | },
224 | {
225 | "cell_type": "markdown",
226 | "id": "03d1211b",
227 | "metadata": {},
228 | "source": [
229 | "The tally normalization factor is simply the power in \\[J/s\\] divided by the heating rate in \\[J/source\\]:"
230 | ]
231 | },
232 | {
233 | "cell_type": "code",
234 | "execution_count": 10,
235 | "id": "ef03e05b",
236 | "metadata": {},
237 | "outputs": [],
238 | "source": [
239 | "source_per_sec = power / heating_rate"
240 | ]
241 | },
242 | {
243 | "cell_type": "markdown",
244 | "id": "f6989d40",
245 | "metadata": {},
246 | "source": [
247 | "Whenever we want our tallied quantities in units of \"per sec\" rather than \"per source neutron\", all we have to do is multiply by the normalization factor. For example, our fission rate would be:"
248 | ]
249 | },
250 | {
251 | "cell_type": "code",
252 | "execution_count": 11,
253 | "id": "218ad621",
254 | "metadata": {},
255 | "outputs": [
256 | {
257 | "name": "stdout",
258 | "output_type": "stream",
259 | "text": [
260 | "Fission rate = 9.715e+14 [reactions/sec]\n"
261 | ]
262 | }
263 | ],
264 | "source": [
265 | "fission_rate_sec = fission_rate * source_per_sec\n",
266 | "print(f'Fission rate = {fission_rate_sec:.3e} [reactions/sec]')"
267 | ]
268 | },
269 | {
270 | "cell_type": "markdown",
271 | "id": "19dd5d6c",
272 | "metadata": {},
273 | "source": [
274 | "As a quick sanity check, we can multiply by 200 MeV/reaction to see how much heating we'd expect from this many fission reactions:"
275 | ]
276 | },
277 | {
278 | "cell_type": "code",
279 | "execution_count": 12,
280 | "id": "a6f5943a",
281 | "metadata": {},
282 | "outputs": [
283 | {
284 | "name": "stdout",
285 | "output_type": "stream",
286 | "text": [
287 | "Expected power = 31130.1 [W]\n"
288 | ]
289 | }
290 | ],
291 | "source": [
292 | "expected_power = fission_rate_sec * 200e6 * joule_per_ev\n",
293 | "print(f'Expected power = {expected_power:.1f} [W]')"
294 | ]
295 | },
296 | {
297 | "cell_type": "markdown",
298 | "id": "f3364440",
299 | "metadata": {},
300 | "source": [
301 | "The value is fairly close to the expected 30 kW but not quite exact since we used a crude estimate of 200 MeV/reaction. The actual amount of heat being deposited per reaction can be determined by dividing the heating rate by the fission rate."
302 | ]
303 | },
304 | {
305 | "cell_type": "code",
306 | "execution_count": 13,
307 | "id": "19fbe062",
308 | "metadata": {},
309 | "outputs": [
310 | {
311 | "name": "stdout",
312 | "output_type": "stream",
313 | "text": [
314 | "Heat per reaction = 192.7 [MeV]\n"
315 | ]
316 | }
317 | ],
318 | "source": [
319 | "mev_per_reaction = heating_rate_ev / fission_rate * 1e-6\n",
320 | "print(f'Heat per reaction = {mev_per_reaction:.1f} [MeV]')"
321 | ]
322 | },
323 | {
324 | "cell_type": "markdown",
325 | "id": "d7b63bb5",
326 | "metadata": {},
327 | "source": [
328 | "How much heat you observe will depend on which [score](https://docs.openmc.org/en/stable/usersguide/tallies.html#scores) you choose to estimate the heating. OpenMC has a variety of scores that allow you to tally heating that differ in subtle ways, so you should exercise some caution when picking a score. A few notes about the available scores:\n",
329 | "\n",
330 | "- `\"heating\"` — This score gives you the heating from *all* reactions, not just fission, so it gives you a way of accounting for heat from (n,$\\gamma$) reactions. It will also include photon energy deposition but only if you are running a coupled neutron–photon calculation; for a neutron-only calculation, you should use the `\"heating-local\"` score to account for photon energy deposition.\n",
331 | "- `\"heating-local\"` — This score is the same as `\"heating\"` except that it assumes photon energy is deposited locally and thus can be used in a neutron-only calculation. This score requires special cross section data (MT=901) that is not present in all data libraries, particularly those that were converted straight from ACE files. The \"official\" data libraries from https://openmc.org do have the necessary data included.\n",
332 | "- `\"fission-q-recoverable\"` — This score represents the recoverable energy release from fission, which is basically the total fission energy release less neutrinos. Do note that it does not account for heating from non-fission reactions.\n",
333 | "- `\"kappa-fission\"` — This older score is basically equivalent to `\"fission-q-recoverable\"` but does not include an energy-dependence on the incident neutron energy."
334 | ]
335 | },
336 | {
337 | "cell_type": "code",
338 | "execution_count": null,
339 | "id": "35f457bf",
340 | "metadata": {},
341 | "outputs": [],
342 | "source": []
343 | }
344 | ],
345 | "metadata": {
346 | "kernelspec": {
347 | "display_name": "Python 3 (ipykernel)",
348 | "language": "python",
349 | "name": "python3"
350 | },
351 | "language_info": {
352 | "codemirror_mode": {
353 | "name": "ipython",
354 | "version": 3
355 | },
356 | "file_extension": ".py",
357 | "mimetype": "text/x-python",
358 | "name": "python",
359 | "nbconvert_exporter": "python",
360 | "pygments_lexer": "ipython3",
361 | "version": "3.10.6"
362 | }
363 | },
364 | "nbformat": 4,
365 | "nbformat_minor": 5
366 | }
367 |
--------------------------------------------------------------------------------
/triso.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "attachments": {},
5 | "cell_type": "markdown",
6 | "metadata": {},
7 | "source": [
8 | "# Modeling TRISO Particles\n",
9 | "OpenMC includes a few convenience functions for generationing TRISO particle locations and placing them in a lattice. To be clear, this capability is not a stochastic geometry capability like that included in MCNP. It's also important to note that OpenMC does not use delta tracking, which would normally speed up calculations in geometries with tons of surfaces and cells. However, the computational burden can be eased by placing TRISO particles in a lattice."
10 | ]
11 | },
12 | {
13 | "cell_type": "code",
14 | "execution_count": 1,
15 | "metadata": {},
16 | "outputs": [],
17 | "source": [
18 | "%matplotlib inline\n",
19 | "from math import pi\n",
20 | "import numpy as np\n",
21 | "import matplotlib.pyplot as plt\n",
22 | "import openmc\n",
23 | "import openmc.model"
24 | ]
25 | },
26 | {
27 | "attachments": {},
28 | "cell_type": "markdown",
29 | "metadata": {},
30 | "source": [
31 | "Let's first start by creating materials that will be used in our TRISO particles and the background material."
32 | ]
33 | },
34 | {
35 | "cell_type": "code",
36 | "execution_count": 2,
37 | "metadata": {},
38 | "outputs": [],
39 | "source": [
40 | "fuel = openmc.Material(name='Fuel')\n",
41 | "fuel.set_density('g/cm3', 10.5)\n",
42 | "fuel.add_nuclide('U235', 4.6716e-02)\n",
43 | "fuel.add_nuclide('U238', 2.8697e-01)\n",
44 | "fuel.add_nuclide('O16', 5.0000e-01)\n",
45 | "fuel.add_element('C', 1.6667e-01)\n",
46 | "\n",
47 | "buff = openmc.Material(name='Buffer')\n",
48 | "buff.set_density('g/cm3', 1.0)\n",
49 | "buff.add_element('C', 1.0)\n",
50 | "buff.add_s_alpha_beta('c_Graphite')\n",
51 | "\n",
52 | "PyC1 = openmc.Material(name='PyC1')\n",
53 | "PyC1.set_density('g/cm3', 1.9)\n",
54 | "PyC1.add_element('C', 1.0)\n",
55 | "PyC1.add_s_alpha_beta('c_Graphite')\n",
56 | "\n",
57 | "PyC2 = openmc.Material(name='PyC2')\n",
58 | "PyC2.set_density('g/cm3', 1.87)\n",
59 | "PyC2.add_element('C', 1.0)\n",
60 | "PyC2.add_s_alpha_beta('c_Graphite')\n",
61 | "\n",
62 | "SiC = openmc.Material(name='SiC')\n",
63 | "SiC.set_density('g/cm3', 3.2)\n",
64 | "SiC.add_element('C', 0.5)\n",
65 | "SiC.add_element('Si', 0.5)\n",
66 | "\n",
67 | "graphite = openmc.Material()\n",
68 | "graphite.set_density('g/cm3', 1.1995)\n",
69 | "graphite.add_element('C', 1.0)\n",
70 | "graphite.add_s_alpha_beta('c_Graphite')"
71 | ]
72 | },
73 | {
74 | "attachments": {},
75 | "cell_type": "markdown",
76 | "metadata": {},
77 | "source": [
78 | "To actually create individual TRISO particles, we first need to create a universe that will be used within each particle. The reason we use the same universe for each TRISO particle is to reduce the total number of cells/surfaces needed which can substantially improve performance over using unique cells/surfaces in each."
79 | ]
80 | },
81 | {
82 | "cell_type": "code",
83 | "execution_count": 3,
84 | "metadata": {},
85 | "outputs": [],
86 | "source": [
87 | "# Create TRISO universe\n",
88 | "spheres = [openmc.Sphere(r=1e-4*r)\n",
89 | " for r in [215., 315., 350., 385.]]\n",
90 | "cells = [openmc.Cell(fill=fuel, region=-spheres[0]),\n",
91 | " openmc.Cell(fill=buff, region=+spheres[0] & -spheres[1]),\n",
92 | " openmc.Cell(fill=PyC1, region=+spheres[1] & -spheres[2]),\n",
93 | " openmc.Cell(fill=SiC, region=+spheres[2] & -spheres[3]),\n",
94 | " openmc.Cell(fill=PyC2, region=+spheres[3])]\n",
95 | "triso_univ = openmc.Universe(cells=cells)"
96 | ]
97 | },
98 | {
99 | "attachments": {},
100 | "cell_type": "markdown",
101 | "metadata": {},
102 | "source": [
103 | "Next, we need a region to pack the TRISO particles in. We will use a 1 cm x 1 cm x 1 cm box centered at the origin."
104 | ]
105 | },
106 | {
107 | "cell_type": "code",
108 | "execution_count": 4,
109 | "metadata": {},
110 | "outputs": [],
111 | "source": [
112 | "min_x = openmc.XPlane(x0=-0.5, boundary_type='reflective')\n",
113 | "max_x = openmc.XPlane(x0=0.5, boundary_type='reflective')\n",
114 | "min_y = openmc.YPlane(y0=-0.5, boundary_type='reflective')\n",
115 | "max_y = openmc.YPlane(y0=0.5, boundary_type='reflective')\n",
116 | "min_z = openmc.ZPlane(z0=-0.5, boundary_type='reflective')\n",
117 | "max_z = openmc.ZPlane(z0=0.5, boundary_type='reflective')\n",
118 | "region = +min_x & -max_x & +min_y & -max_y & +min_z & -max_z"
119 | ]
120 | },
121 | {
122 | "attachments": {},
123 | "cell_type": "markdown",
124 | "metadata": {},
125 | "source": [
126 | "Now we need to select locations for the TRISO particles using `openmc.model.pack_spheres`. In this example, we will select locations, at random, within the above box with a packing fraction of 30%. A seed has been included so that the randomly generated sphere locations will remain the same, even if the script is rerun. The user is not strictly required to use a seed or the exact same seed used here, but it is a best practice to include one for repeatability. Note that `pack_spheres` can handle up to the theoretical maximum of 60% (it will just be slow)."
127 | ]
128 | },
129 | {
130 | "cell_type": "code",
131 | "execution_count": 5,
132 | "metadata": {},
133 | "outputs": [],
134 | "source": [
135 | "outer_radius = 425.*1e-4\n",
136 | "centers = openmc.model.pack_spheres(radius=outer_radius, region=region, pf=0.3, seed=124848351)"
137 | ]
138 | },
139 | {
140 | "attachments": {},
141 | "cell_type": "markdown",
142 | "metadata": {},
143 | "source": [
144 | "Now that we have the locations of the TRISO particles determined and a universe that can be used for each particle, we can create the TRISO particles."
145 | ]
146 | },
147 | {
148 | "cell_type": "code",
149 | "execution_count": 6,
150 | "metadata": {},
151 | "outputs": [],
152 | "source": [
153 | "trisos = [openmc.model.TRISO(outer_radius, triso_univ, center) for center in centers]"
154 | ]
155 | },
156 | {
157 | "attachments": {},
158 | "cell_type": "markdown",
159 | "metadata": {},
160 | "source": [
161 | "Each TRISO object actually **is** a Cell, in fact; we can look at the properties of the TRISO just as we would a cell:"
162 | ]
163 | },
164 | {
165 | "cell_type": "code",
166 | "execution_count": 7,
167 | "metadata": {},
168 | "outputs": [
169 | {
170 | "name": "stdout",
171 | "output_type": "stream",
172 | "text": [
173 | "Cell\n",
174 | "\tID =\t6\n",
175 | "\tName =\t\n",
176 | "\tFill =\t1\n",
177 | "\tRegion =\t-11\n",
178 | "\tRotation =\tNone\n",
179 | "\tTranslation =\t[-0.4557226 -0.00821291 -0.29390205]\n",
180 | "\tVolume =\tNone\n",
181 | "\n"
182 | ]
183 | }
184 | ],
185 | "source": [
186 | "print(trisos[0])"
187 | ]
188 | },
189 | {
190 | "attachments": {},
191 | "cell_type": "markdown",
192 | "metadata": {},
193 | "source": [
194 | "Let's confirm that all our TRISO particles are within the box."
195 | ]
196 | },
197 | {
198 | "cell_type": "code",
199 | "execution_count": 8,
200 | "metadata": {},
201 | "outputs": [
202 | {
203 | "name": "stdout",
204 | "output_type": "stream",
205 | "text": [
206 | "[-0.45748859 -0.45742868 -0.45747 ]\n",
207 | "[0.45582441 0.45746362 0.4562236 ]\n"
208 | ]
209 | }
210 | ],
211 | "source": [
212 | "centers = np.vstack([triso.center for triso in trisos])\n",
213 | "print(centers.min(axis=0))\n",
214 | "print(centers.max(axis=0))"
215 | ]
216 | },
217 | {
218 | "attachments": {},
219 | "cell_type": "markdown",
220 | "metadata": {},
221 | "source": [
222 | "We can also look at what the actual packing fraction turned out to be:"
223 | ]
224 | },
225 | {
226 | "cell_type": "code",
227 | "execution_count": 9,
228 | "metadata": {},
229 | "outputs": [
230 | {
231 | "data": {
232 | "text/plain": [
233 | "0.2996893513959326"
234 | ]
235 | },
236 | "execution_count": 9,
237 | "metadata": {},
238 | "output_type": "execute_result"
239 | }
240 | ],
241 | "source": [
242 | "len(trisos)*4/3*pi*outer_radius**3"
243 | ]
244 | },
245 | {
246 | "attachments": {},
247 | "cell_type": "markdown",
248 | "metadata": {},
249 | "source": [
250 | "Now that we have our TRISO particles created, we need to place them in a lattice to provide optimal tracking performance in OpenMC. We can use the box we created above to place the lattice in. Actually creating a lattice containing TRISO particles can be done with the `model.create_triso_lattice()` function. This function requires that we give it a list of TRISO particles, the lower-left coordinates of the lattice, the pitch of each lattice cell, the overall shape of the lattice (number of cells in each direction), and a background material."
251 | ]
252 | },
253 | {
254 | "cell_type": "code",
255 | "execution_count": 10,
256 | "metadata": {},
257 | "outputs": [],
258 | "source": [
259 | "box = openmc.Cell(region=region)\n",
260 | "lower_left, upper_right = box.region.bounding_box\n",
261 | "shape = (3, 3, 3)\n",
262 | "pitch = (upper_right - lower_left)/shape\n",
263 | "lattice = openmc.model.create_triso_lattice(\n",
264 | " trisos, lower_left, pitch, shape, graphite)"
265 | ]
266 | },
267 | {
268 | "attachments": {},
269 | "cell_type": "markdown",
270 | "metadata": {},
271 | "source": [
272 | "Now we can set the fill of our box cell to be the lattice:"
273 | ]
274 | },
275 | {
276 | "cell_type": "code",
277 | "execution_count": 11,
278 | "metadata": {},
279 | "outputs": [],
280 | "source": [
281 | "box.fill = lattice"
282 | ]
283 | },
284 | {
285 | "attachments": {},
286 | "cell_type": "markdown",
287 | "metadata": {},
288 | "source": [
289 | "Finally, let's take a look at our geometry by putting the box in a universe and plotting it. We're going to use the Fortran-side plotter since it's much faster."
290 | ]
291 | },
292 | {
293 | "cell_type": "code",
294 | "execution_count": 12,
295 | "metadata": {},
296 | "outputs": [
297 | {
298 | "data": {
299 | "image/png": "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",
300 | "text/plain": [
301 | ""
302 | ]
303 | },
304 | "execution_count": 12,
305 | "metadata": {},
306 | "output_type": "execute_result"
307 | }
308 | ],
309 | "source": [
310 | "universe = openmc.Universe(cells=[box])\n",
311 | "\n",
312 | "geometry = openmc.Geometry(universe)\n",
313 | "geometry.export_to_xml()\n",
314 | "\n",
315 | "materials = list(geometry.get_all_materials().values())\n",
316 | "openmc.Materials(materials).export_to_xml()\n",
317 | "\n",
318 | "settings = openmc.Settings()\n",
319 | "settings.run_mode = 'plot'\n",
320 | "settings.export_to_xml()\n",
321 | "\n",
322 | "plot = openmc.Plot.from_geometry(geometry)\n",
323 | "plot.to_ipython_image()"
324 | ]
325 | },
326 | {
327 | "attachments": {},
328 | "cell_type": "markdown",
329 | "metadata": {},
330 | "source": [
331 | "If we plot the universe by material rather than by cell, we can see that the entire background is just graphite."
332 | ]
333 | },
334 | {
335 | "cell_type": "code",
336 | "execution_count": 13,
337 | "metadata": {},
338 | "outputs": [
339 | {
340 | "data": {
341 | "image/png": "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",
342 | "text/plain": [
343 | ""
344 | ]
345 | },
346 | "execution_count": 13,
347 | "metadata": {},
348 | "output_type": "execute_result"
349 | }
350 | ],
351 | "source": [
352 | "plot.color_by = 'material'\n",
353 | "plot.colors = {graphite: 'gray'}\n",
354 | "plot.to_ipython_image()"
355 | ]
356 | }
357 | ],
358 | "metadata": {
359 | "anaconda-cloud": {},
360 | "kernelspec": {
361 | "display_name": "Python 3 (ipykernel)",
362 | "language": "python",
363 | "name": "python3"
364 | },
365 | "language_info": {
366 | "codemirror_mode": {
367 | "name": "ipython",
368 | "version": 3
369 | },
370 | "file_extension": ".py",
371 | "mimetype": "text/x-python",
372 | "name": "python",
373 | "nbconvert_exporter": "python",
374 | "pygments_lexer": "ipython3",
375 | "version": "3.10.5"
376 | }
377 | },
378 | "nbformat": 4,
379 | "nbformat_minor": 4
380 | }
381 |
--------------------------------------------------------------------------------