diff --git a/examples/jupyter/cad-based-geometry.ipynb b/examples/jupyter/cad-based-geometry.ipynb new file mode 100644 index 0000000000..ac4bcf62de --- /dev/null +++ b/examples/jupyter/cad-based-geometry.ipynb @@ -0,0 +1,721 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this notebook we'll be exploring how to use CAD-based geometries in OpenMC via the [DagMC](https://svalinn.github.io/DAGMC/index.html) toolkit. The models we'll be using in this notebook have already been created using [Trelis](https://www.csimsoft.com/trelis) and faceted into a surface mesh represented as `.h5m` files in the [Mesh Oriented DatABase](https://press3.mcs.anl.gov/sigma/moab-library/) format. We'll be retrieving these files using the function below.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import urllib.request\n", + "\n", + "fuel_pin_url = 'https://tinyurl.com/y3ugwz6w' # 1.2 MB\n", + "teapot_url = 'https://tinyurl.com/y4mcmc3u' # 29 MB\n", + "\n", + "def download(url):\n", + " \"\"\"\n", + " Helper function for retrieving dagmc models\n", + " \"\"\"\n", + " u = urllib.request.urlopen(url)\n", + " \n", + " if u.status != 200:\n", + " raise RuntimeError(\"Failed to download file.\")\n", + " \n", + " # save file as dagmc.h5m\n", + " with open(\"dagmc.h5m\", 'wb') as f:\n", + " f.write(u.read())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook is intended to demonstrate how DagMC problems are run in OpenMC. For more information on how DagMC models are created, please refer to the [DagMC User's Guide](https://svalinn.github.io/DAGMC/usersguide/index.html).\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# CAD-Based Geometry in OpenMC using [DagMC](https://svalinn.github.io/DAGMC/)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "from IPython.display import Image\n", + "import openmc" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To start, we'll be using a simple U235 fuel pin surrounded by a water moderator, so let's create those materials." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + " # materials\n", + "u235 = openmc.Material(name=\"fuel\")\n", + "u235.add_nuclide('U235', 1.0, 'ao')\n", + "u235.set_density('g/cc', 11)\n", + "u235.id = 40\n", + "\n", + "water = openmc.Material(name=\"water\")\n", + "water.add_nuclide('H1', 2.0, 'ao')\n", + "water.add_nuclide('O16', 1.0, 'ao')\n", + "water.set_density('g/cc', 1.0)\n", + "water.add_s_alpha_beta('c_H_in_H2O')\n", + "water.id = 41\n", + "\n", + "mats = openmc.Materials([u235, water])\n", + "mats.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's get our DAGMC geometry. We'll be using prefabricated models in this notebook. For information on how to create your own DAGMC models, you can refer to the instructions [here](https://svalinn.github.io/DAGMC/usersguide/trelis_workflow.html)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's download the DAGMC model. These models come in the form of triangle surface meshes stored using the the Mesh Oriented datABase ([MOAB](https://press3.mcs.anl.gov/sigma/moab-library/)) in an HDF5 file with the extension `.h5m`. An example of a coarse triangle mesh looks like:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![DagMC Cylinder](./images/cylinder_mesh.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we'll need to grab some pre-made DagMC models." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "download(fuel_pin_url)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenMC expects that the model has the name \"dagmc.h5m\" so we'll name the file that and indicate to OpenMC that a DAGMC geometry is being used by setting the `settings.dagmc` attribute to `True`." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "settings = openmc.Settings()\n", + "settings.dagmc = True\n", + "settings.batches = 10\n", + "settings.inactive = 2\n", + "settings.particles = 5000\n", + "settings.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Unlike conventional geometries in OpenMC, we really have no way of knowing what our model looks like at this point. Thankfully DagMC geometries can be plotted just like any other OpenMC geometry to give us an idea of what we're now working with.\n", + "\n", + "Note that material assignments have already been applied to this model. Materials can be assigned either using ids or names of materials in the `materials.xml` file. It is recommended that material names are used for assignment for readability." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "p = openmc.Plot()\n", + "p.width = (25.0, 25.0)\n", + "p.pixels = (400, 400)\n", + "p.color_by = 'material'\n", + "p.colors = {u235: 'yellow', water: 'blue'}\n", + "openmc.plot_inline(p)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we've had a chance to examine the model a bit, we can finish applying our settings and add a source." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "settings.source = openmc.Source(space=openmc.stats.Box([-4., -4., -4.],\n", + " [ 4., 4., 4.]))\n", + "settings.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tallies work in the same way when using DAGMC geometries too. We'll add a tally on the fuel cell here." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "tally = openmc.Tally()\n", + "tally.scores = ['total']\n", + "tally.filters = [openmc.CellFilter(1)]\n", + "tallies = openmc.Tallies([tally])\n", + "tallies.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we're ready to run the simulation just like any other OpenMC run." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " %%%%%%%%%%%%%%%\n", + " %%%%%%%%%%%%%%%%%%%%%%%%\n", + " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", + " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", + " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", + " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", + " %%%%%%%%%%%%%%%%%%%%%%%%\n", + " %%%%%%%%%%%%%%%%%%%%%%%%\n", + " ############### %%%%%%%%%%%%%%%%%%%%%%%%\n", + " ################## %%%%%%%%%%%%%%%%%%%%%%%\n", + " ################### %%%%%%%%%%%%%%%%%%%%%%%\n", + " #################### %%%%%%%%%%%%%%%%%%%%%%\n", + " ##################### %%%%%%%%%%%%%%%%%%%%%\n", + " ###################### %%%%%%%%%%%%%%%%%%%%\n", + " ####################### %%%%%%%%%%%%%%%%%%\n", + " ####################### %%%%%%%%%%%%%%%%%\n", + " ###################### %%%%%%%%%%%%%%%%%\n", + " #################### %%%%%%%%%%%%%%%%%\n", + " ################# %%%%%%%%%%%%%%%%%\n", + " ############### %%%%%%%%%%%%%%%%\n", + " ############ %%%%%%%%%%%%%%%\n", + " ######## %%%%%%%%%%%%%%\n", + " %%%%%%%%%%%\n", + "\n", + " | The OpenMC Monte Carlo Code\n", + " Copyright | 2011-2019 MIT and OpenMC contributors\n", + " License | http://openmc.readthedocs.io/en/latest/license.html\n", + " Version | 0.11.0-dev\n", + " Git SHA1 | f29be35a2c7d44d411c5eb7d428e601e36f4d8a8\n", + " Date/Time | 2019-06-17 15:15:03\n", + " OpenMP Threads | 2\n", + "\n", + " Reading settings XML file...\n", + " Reading cross sections XML file...\n", + " Reading materials XML file...\n", + " Reading DAGMC geometry...\n", + "Loading file dagmc.h5m\n", + "Initializing the GeomQueryTool...\n", + "Using faceting tolerance: 0.0001\n", + "Building OBB Tree...\n", + " Reading U235 from /home/shriwise/opt/openmc/xs/nndc_hdf5/U235.h5\n", + " Reading H1 from /home/shriwise/opt/openmc/xs/nndc_hdf5/H1.h5\n", + " Reading O16 from /home/shriwise/opt/openmc/xs/nndc_hdf5/O16.h5\n", + " Reading c_H_in_H2O from /home/shriwise/opt/openmc/xs/nndc_hdf5/c_H_in_H2O.h5\n", + " Maximum neutron transport energy: 20000000.000000 eV for U235\n", + " Reading tallies XML file...\n", + " Writing summary.h5 file...\n", + " Initializing source particles...\n", + "\n", + " ====================> K EIGENVALUE SIMULATION <====================\n", + "\n", + " Bat./Gen. k Average k\n", + " ========= ======== ====================\n", + " 1/1 1.15789\n", + " 2/1 1.05169\n", + " 3/1 1.00736\n", + " 4/1 0.97863 0.99300 +/- 0.01436\n", + " 5/1 0.95316 0.97972 +/- 0.01566\n", + " 6/1 0.95079 0.97248 +/- 0.01322\n", + " 7/1 0.96879 0.97175 +/- 0.01027\n", + " 8/1 0.94253 0.96688 +/- 0.00970\n", + " 9/1 0.97406 0.96790 +/- 0.00826\n", + " 10/1 0.97362 0.96862 +/- 0.00719\n", + " Creating state point statepoint.10.h5...\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 1.9676e-01 seconds\n", + " Reading cross sections = 1.0400e-01 seconds\n", + " Total time in simulation = 1.5376e+00 seconds\n", + " Time in transport only = 1.5318e+00 seconds\n", + " Time in inactive batches = 2.9954e-01 seconds\n", + " Time in active batches = 1.2381e+00 seconds\n", + " Time synchronizing fission bank = 2.2472e-03 seconds\n", + " Sampling source sites = 2.0046e-03 seconds\n", + " SEND/RECV source sites = 2.3714e-04 seconds\n", + " Time accumulating tallies = 6.6150e-06 seconds\n", + " Total time for finalization = 1.5303e-04 seconds\n", + " Total time elapsed = 1.7636e+00 seconds\n", + " Calculation Rate (inactive) = 33384.8 particles/second\n", + " Calculation Rate (active) = 32307.9 particles/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 0.97020 +/- 0.00750\n", + " k-effective (Track-length) = 0.96862 +/- 0.00719\n", + " k-effective (Absorption) = 0.95742 +/- 0.00791\n", + " Combined k-effective = 0.96203 +/- 0.00898\n", + " Leakage Fraction = 0.57677 +/- 0.00317\n", + "\n" + ] + } + ], + "source": [ + "openmc.run()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## More Complicated Geometry" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Neat! But this pincell is something we could've done with CSG. Let's take a look at something more complex. We'll download a pre-built model of the [Utah teapot](https://en.wikipedia.org/wiki/Utah_teapot) and use it here." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "download(teapot_url)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Utah Teapot](./images/teapot.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our teapot is made out of iron, so we'll want to create that material and make sure it is in our `materials.xml` file." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "iron = openmc.Material(name=\"iron\")\n", + "iron.add_nuclide(\"Fe54\", 0.0564555822608)\n", + "iron.add_nuclide(\"Fe56\", 0.919015287728)\n", + "iron.add_nuclide(\"Fe57\", 0.0216036861685)\n", + "iron.add_nuclide(\"Fe58\", 0.00292544384231)\n", + "iron.set_density(\"g/cm3\", 7.874)\n", + "mats = openmc.Materials([iron, water])\n", + "mats.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To make sure we've updated the file correctly, let's make a plot of the teapot." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "p = openmc.Plot()\n", + "p.basis = 'xz'\n", + "p.origin = (0.0, 0.0, 0.0)\n", + "p.width = (30.0, 20.0)\n", + "p.pixels = (450, 300)\n", + "p.color_by = 'material'\n", + "p.colors = {iron: 'gray', water: 'blue'}\n", + "openmc.plot_inline(p)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we start to see some of the advantages CAD geometries provide. This parituclar file was pulled from the [GrabCAD](https://grabcad.com/library) and pushed through the DAGMC workflow without modification (other than the addition material assignments). It would take a considerable amount of time to create a model like this using CSG!" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAADICAAAAAAR9MBqAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQfjBhEPDxXa+LnPAAAFv0lEQVR42u3d0XKiQBBG4Zb4YPtmFk+evRAUFBWY/qW7c76LTbYqm0L3OAyIzOnXAH/d0RuAmggLEoQFCcKCBGFBgrAgQViQICxIEBYkCAsShAUJwoIEYUGCsCBBWJAgLEgQFiQICxKEBQnCggRhQYKwIEFYkCAsSBAWJAgLEoQFCcKCBGFB4tzfvr0cvS0o5Hz/tjfigpfz/K89bcHF8xyr73f8GmBuafJOWmi2fFRIWWh0+rXljphqocVpcnPbeV+UhQan+V2Tp21RFvZ7mGNdqAkuTs/3eb+NWkSG3RaOCukJ7ZZON1AWmi2ex6IstFoMi/OjaMX1WJBYfK/w6I1Cfm9GLGZa2G8hLAYstFu4Hmv4yoCFBkzeIfEUFgMWPDyGRVdw8RAWE3f4mIfFhQ1wMguLruBlGhZdwQ2XzUBiEhYTd/i5h8WOEI5uYdEVPI1h0RVcDWHRFXxdw6IrOOvM6Ar+OqMrCExPkNIV3HScGIVCx44QCj+n8Tu6gqPbHIuu4GkMi67gagiLruDrGhZdwVlnRlfw1xldQYBPQkOiY8CCQkdXUFi4HTfQjjkWJAgLEoQFCcKCBGFBgrAgQViQICxIEBYkCAsShAUJwoIEYUGCsCBBWJAgLEgQFiQICxKEBQnCggRhQYKwIEFYkPg5/Tt6E1BRx71todCZ9aQFd9eVKUgLzsZFmkgLru7rFZIWHJ3v3/bcKgtuzrO/0RacnH6fd4G0hWan38VVmmgLba539FuauNMWGoy3ilw+JiQu7DS5B+mL8w3EhR3mN7d9dS6LuLDR012TX54nJS5ssHQ77tfn4IkLK724z/u793eoC5+9WUDg7ZuH1IW33q9M8eGNaerCK5+XPPl41QN54dm6tXRWXFJDXpjasEjTqgu26Atmtnn1r7VXA9LXX7dnWbkN15oS2F+1e73CjVcyU9gf07gQ5uYL5Qnsj3BZYXXP5zAorDbHpXt3fcyHvoryXxOa4QsmXGx8e1/UVYl+FftNhRFXFfqwRqsDI64KvhfWzZrCiCu7A8IacU1OZQeGNXjTF23ldXxYZsZl9vUECcvM+PBZKZHCMuNTs2VEC8toq4aAYZlxK4n8goZltJVc3LDsRVuklULosMy4K1xWW9fSiXBv5QjbgA+Cj1gcIWbF6l+QyBkWO8PwYofFmzxpxQ4LaaUMiwErvtdHhf3x/33jnvDCZTXphD7dMOR04RZd+Zzbf0UALC4VToI51ucBy4z1FqOJPGJ9TuUy/bGeUSuQyGGtdLExLtKKI/LkfeWINf9h0oohcFgPx4SfiqGsUBJM3le6DEUxiQ8hTVgrBiLKCiR8WOtONgw/e/1CWQHEDavhBm6Udby4Ye1CWVGEP4+18pjw8V/VOjbstz8Dh/3WQfQRa+sDrxXUoL/94flLJb/1Jm5Yl9sfexTaGUreBZW/tRr4BOn1Cbh+2RBYtROltwIcH9CkKtXTFHOO1fJy2nJ+IgHBo/nKExQyLJdHXmL+LhhavvS6izvH2m38Hygwcsm7ushefSFHrCcVBp8d/Lt6yEq47TnC2macZWXfGd4rSJdVyV1hlQFO25VuJ3gV9HRD42urwikH767mWck3P2hYrfa9ERSJ9+mraVffeFpK7gpv8h4YOnfVf7urqmElHqrMzL+ryffqydWg4lHhRNIDQ9+uvj5amZUdsXIPWQW6qj5ipRyyXLs6Jqu6I1biIatEV3XDGqU7MFR19aVJ+6huWEmHLFlXX34c1edYOWdZ5hLCgVlVHrFyDlmOb0Yd2lXlsEaZZlmO23psV6XDSjlkeW365D3sQ56HymGN8gxZfjtC92tutiodVrYhq1BXtcMaJRmy/Dbz+K6Kh5VtyHLa6gBdFQ9rlGLIctsR3s+xHvjCKh5WziGrjeKj09sVD2uUYMjyGrBidFU+rDRDVrGuyoc1SjBk+T7Oo19R5cM6+gleyWnACtOV/QcPWfsa5qh78gAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOS0wNi0xN1QxNToxNToyMS0wNTowMJHDfC0AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTktMDYtMTdUMTU6MTU6MjEtMDU6MDDgnsSRAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "p.width = (18.0, 6.0)\n", + "p.basis = 'xz'\n", + "p.origin = (10.0, 0.0, 5.0)\n", + "p.pixels = (600, 200)\n", + "p.color_by = 'material'\n", + "openmc.plot_inline(p)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's brew some tea! ... using a very hot neutron source. We'll use some well-placed point sources distributed throughout the model." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "settings = openmc.Settings()\n", + "settings.dagmc = True\n", + "settings.batches = 10\n", + "settings.particles = 5000\n", + "settings.run_mode = \"fixed source\"\n", + "\n", + "src_locations = ((-4.0, 0.0, -2.0),\n", + " ( 4.0, 0.0, -2.0),\n", + " ( 4.0, 0.0, -6.0),\n", + " (-4.0, 0.0, -6.0),\n", + " (10.0, 0.0, -4.0),\n", + " (-8.0, 0.0, -4.0))\n", + "\n", + "# we'll use the same energy for each source\n", + "src_e = openmc.stats.Discrete(x=[12.0,], p=[1.0,])\n", + "\n", + "# create source for each location\n", + "sources = []\n", + "for loc in src_locations:\n", + " src_pnt = openmc.stats.Point(xyz=loc)\n", + " src = openmc.Source(space=src_pnt, energy=src_e)\n", + " sources.append(src)\n", + "\n", + "src_str = 1.0 / len(sources)\n", + "for source in sources:\n", + " source.strength = src_str\n", + "\n", + "settings.source = sources\n", + "settings.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "...and setup a couple mesh tallies. One for the kettle, and one for the water inside." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "mesh = openmc.RegularMesh()\n", + "mesh.dimension = (120, 1, 40)\n", + "mesh.lower_left = (-20.0, 0.0, -10.0)\n", + "mesh.upper_right = (20.0, 1.0, 4.0)\n", + "\n", + "mesh_filter = openmc.MeshFilter(mesh)\n", + "\n", + "pot_filter = openmc.CellFilter([1])\n", + "pot_tally = openmc.Tally()\n", + "pot_tally.filters = [mesh_filter, pot_filter]\n", + "pot_tally.scores = ['flux']\n", + "\n", + "water_filter = openmc.CellFilter([5])\n", + "water_tally = openmc.Tally()\n", + "water_tally.filters = [mesh_filter, water_filter]\n", + "water_tally.scores = ['flux']\n", + "\n", + "\n", + "tallies = openmc.Tallies([pot_tally, water_tally])\n", + "tallies.export_to_xml()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " %%%%%%%%%%%%%%%\n", + " %%%%%%%%%%%%%%%%%%%%%%%%\n", + " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", + " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", + " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", + " %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", + " %%%%%%%%%%%%%%%%%%%%%%%%\n", + " %%%%%%%%%%%%%%%%%%%%%%%%\n", + " ############### %%%%%%%%%%%%%%%%%%%%%%%%\n", + " ################## %%%%%%%%%%%%%%%%%%%%%%%\n", + " ################### %%%%%%%%%%%%%%%%%%%%%%%\n", + " #################### %%%%%%%%%%%%%%%%%%%%%%\n", + " ##################### %%%%%%%%%%%%%%%%%%%%%\n", + " ###################### %%%%%%%%%%%%%%%%%%%%\n", + " ####################### %%%%%%%%%%%%%%%%%%\n", + " ####################### %%%%%%%%%%%%%%%%%\n", + " ###################### %%%%%%%%%%%%%%%%%\n", + " #################### %%%%%%%%%%%%%%%%%\n", + " ################# %%%%%%%%%%%%%%%%%\n", + " ############### %%%%%%%%%%%%%%%%\n", + " ############ %%%%%%%%%%%%%%%\n", + " ######## %%%%%%%%%%%%%%\n", + " %%%%%%%%%%%\n", + "\n", + " | The OpenMC Monte Carlo Code\n", + " Copyright | 2011-2019 MIT and OpenMC contributors\n", + " License | http://openmc.readthedocs.io/en/latest/license.html\n", + " Version | 0.11.0-dev\n", + " Git SHA1 | f29be35a2c7d44d411c5eb7d428e601e36f4d8a8\n", + " Date/Time | 2019-06-17 15:15:21\n", + " OpenMP Threads | 2\n", + "\n", + " Reading settings XML file...\n", + " Reading cross sections XML file...\n", + " Reading materials XML file...\n", + " Reading DAGMC geometry...\n", + "Loading file dagmc.h5m\n", + "Initializing the GeomQueryTool...\n", + "Using faceting tolerance: 0.001\n", + "Building OBB Tree...\n", + " Reading Fe54 from /home/shriwise/opt/openmc/xs/nndc_hdf5/Fe54.h5\n", + " Reading Fe56 from /home/shriwise/opt/openmc/xs/nndc_hdf5/Fe56.h5\n", + " Reading Fe57 from /home/shriwise/opt/openmc/xs/nndc_hdf5/Fe57.h5\n", + " Reading Fe58 from /home/shriwise/opt/openmc/xs/nndc_hdf5/Fe58.h5\n", + " Reading H1 from /home/shriwise/opt/openmc/xs/nndc_hdf5/H1.h5\n", + " Reading O16 from /home/shriwise/opt/openmc/xs/nndc_hdf5/O16.h5\n", + " Reading c_H_in_H2O from /home/shriwise/opt/openmc/xs/nndc_hdf5/c_H_in_H2O.h5\n", + " Maximum neutron transport energy: 20000000.000000 eV for Fe58\n", + " Reading tallies XML file...\n", + " Writing summary.h5 file...\n", + " Initializing source particles...\n", + "\n", + " ===============> FIXED SOURCE TRANSPORT SIMULATION <===============\n", + "\n", + " Simulating batch 1\n", + " Simulating batch 2\n", + " Simulating batch 3\n", + " Simulating batch 4\n", + " Simulating batch 5\n", + " Simulating batch 6\n", + " Simulating batch 7\n", + " Simulating batch 8\n", + " Simulating batch 9\n", + " Simulating batch 10\n", + " Creating state point statepoint.10.h5...\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 3.9314e+00 seconds\n", + " Reading cross sections = 3.8964e-01 seconds\n", + " Total time in simulation = 1.2825e+01 seconds\n", + " Time in transport only = 1.1947e+01 seconds\n", + " Time in active batches = 1.2825e+01 seconds\n", + " Time accumulating tallies = 1.9546e-04 seconds\n", + " Total time for finalization = 1.7311e-02 seconds\n", + " Total time elapsed = 1.6859e+01 seconds\n", + " Calculation Rate (active) = 3898.57 particles/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " Leakage Fraction = 0.62594 +/- 0.00117\n", + "\n" + ] + } + ], + "source": [ + "openmc.run()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that the performance is significantly lower than our pincell model due to the increased complexity of the model, but it allows us to examine tally results like these:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "sp = openmc.StatePoint(\"statepoint.10.h5\")\n", + "\n", + "water_tally = sp.get_tally(scores=['flux'], id=water_tally.id)\n", + "water_flux = water_tally.mean\n", + "water_flux.shape = (40, 120)\n", + "water_flux = water_flux[::-1, :]\n", + "\n", + "pot_tally = sp.get_tally(scores=['flux'], id=pot_tally.id)\n", + "pot_flux = pot_tally.mean\n", + "pot_flux.shape = (40, 120)\n", + "pot_flux = pot_flux[::-1, :]\n", + "\n", + "del sp" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import pyplot as plt\n", + "fig = plt.figure(figsize=(18, 16))\n", + "\n", + "sub_plot1 = plt.subplot(121, title=\"Kettle Flux\")\n", + "sub_plot1.imshow(pot_flux)\n", + "\n", + "sub_plot2 = plt.subplot(122, title=\"Water Flux\")\n", + "sub_plot2.imshow(water_flux)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.6" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/jupyter/images/cylinder_mesh.png b/examples/jupyter/images/cylinder_mesh.png new file mode 100644 index 0000000000..cd9638060d Binary files /dev/null and b/examples/jupyter/images/cylinder_mesh.png differ diff --git a/examples/jupyter/images/teapot.jpg b/examples/jupyter/images/teapot.jpg new file mode 100644 index 0000000000..382e8838f7 Binary files /dev/null and b/examples/jupyter/images/teapot.jpg differ