{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# PyNE Meshes\n",
"\n",
"PyNE also has a mesh interface that is used to represent any kind of mesh desired. This is a layer on top of [MOAB](https://trac.mcs.anl.gov/projects/ITAPS/wiki/MOAB) meshes which adds:\n",
"\n",
"1. PyNE materials to volume elements\n",
"2. A generic tagging interface.\n",
"\n",
"In the `pyne.mesh` module lives the `Mesh` class. This class houses an iMesh instance and contains methods for various mesh operations. The following attribute of a `Mesh` object are most important.\n",
"\n",
"* **mesh:** iMesh instance\n",
"\n",
"* **mats:** MaterialLibrary or dict or Materials or None, This is a mapping of volume element handles to Material objects.\n",
"\n",
"To do any visulaization or volumetric analysis of such meshes, we recomend the [yt project](http://yt-project.org/).\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from pyne.xs.channels import sigma_t\n",
"from pyne.material import Material, from_atom_frac\n",
"from pyne.mesh import Mesh, IMeshTag, MetadataTag, ComputedTag\n",
"from yt.config import ytcfg; ytcfg[\"yt\",\"suppressStreamLogging\"] = \"True\"\n",
"from yt.mods import *"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, let's create a 2D structured mesh, whose grid points in x & y are [Cantor dust](http://en.wikipedia.org/wiki/Cantor_set#Cantor_dust). Most of the mesh will have water as a coolant. Some volume elements will have fuel, though."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def cantor(n):\n",
" return [0.] + cant(0., 1., n) + [1.]\n",
"\n",
"def cant(x, y, n):\n",
" if n == 0:\n",
" return []\n",
" new_pts = [2.*x/3. + y/3., x/3. + 2.*y/3.]\n",
" return cant(x, new_pts[0], n-1) + new_pts + cant(new_pts[1], y, n-1)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"c5 = cantor(5)\n",
"coords = [c5, c5, [0.0, 1.0]]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We access volume elements (`ve`) on the mesh through a volume element index (`ve_idx`). This index is a unique integer `i` that gives a sort ordering to an otherwise unordered mesh. The volume element index is defined on the range from 0 (inclusive) to the number of volumes in the mesh (exclusive). You may access a volume element's material through the `mats` attribute and indexing with `i`."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"m = Mesh(structured_coords=coords, structured=True)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"fuel = from_atom_frac({'U235': 0.045, 'U238': 0.955, 'O16': 2.0}, density=10.7)\n",
"cool = from_atom_frac({'H1': 2.0, 'O16': 1.0}, density=1.0)\n",
"for i in range(len(m)):\n",
" m.mats[i] = cool\n",
"m.mats[len(m)/2] = fuel\n",
"m.mats[len(m)/4] = fuel\n",
"for i, c in enumerate(c5[:-1]):\n",
" m.mats[i*len(c5)] = fuel"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Tags"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`Tag`s - sometimes known as fields - are generic way of storing data on a mesh. Tags can be accessed as attributes on the mesh class itself. For example, the density tag may be grabbed via:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"m.density "
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 6,
"text": [
"MaterialPropertyTag(name='density', doc='the density [g/cc]')"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To get the value of the density, you have to provide the location by its index."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"m.density[42]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 7,
"text": [
"1.0"
]
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can also slice, mask, or fancy index tags:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print m.density[::100] # slice"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ 10.7 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n",
" 1. 1. 1. 1. 10.7 1. 1. 1. 1. 1. 1. 1.\n",
" 1. 1. 1. 1. 1. 1. 1. 1. 10.7 1. 1. 1.\n",
" 1. 1. 1. 1. ]\n"
]
}
],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print m.density[m.density[:] >= 10] # mask"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7\n",
" 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7\n",
" 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7\n",
" 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7\n",
" 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7 10.7\n",
" 10.7 10.7 10.7 10.7]\n"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print m.density[[10, 0, 11, 100]] # fancy index is fancy"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ 1. 10.7 1. 1. ]\n"
]
}
],
"prompt_number": 10
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To get a list of all current tag names, uses the `tags` dictionary on the mesh:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"m.tags.keys()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 11,
"text": [
"['sub_act',\n",
" 'sub_lan',\n",
" 'number_density',\n",
" 'density',\n",
" 'comp',\n",
" 'expand_elements',\n",
" 'to_atom_frac',\n",
" 'molecular_weight',\n",
" 'mass_density',\n",
" 'atoms_per_mol',\n",
" 'sub_tru',\n",
" 'mass',\n",
" 'attrs',\n",
" 'mult_by_mass',\n",
" 'sub_ma',\n",
" 've_idx',\n",
" 'sub_fp']"
]
}
],
"prompt_number": 11
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Analysis & Visulaization"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"PyNE meshes are supported by the [yt project](http://yt-project.org/). Use yt's plotting infrastructure to display tags on your mesh."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"pf = PyneMoabHex8StaticOutput(m)\n",
"s = SlicePlot(pf, 'z', 'density', origin='native')\n",
"s.display()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"
"
],
"metadata": {},
"output_type": "display_data",
"text": [
""
]
}
],
"prompt_number": 12
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Computed Tags"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Computed tags - also known as 'derived fields' - are a way of having a lazily evaluated 'virtual tag.' A computed tag is defined with a function, lambda, or any other callable object. The function must have the following interface:\n",
"\n",
"```python\n",
"def f(mesh, i):\n",
" \"\"\"mesh is a pyne.mesh.Mesh() object and i is the volume element index\n",
" to compute.\n",
" \"\"\"\n",
" # ... do some work ...\n",
" return anything_you_want\n",
"```\n",
"\n",
"Here is a somewhat silly example which squares the density. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"m.density2 = ComputedTag(lambda mesh, i: mesh.density[i]**2)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that the bounds on the color bar have changed."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"pf = PyneMoabHex8StaticOutput(m)\n",
"s = SlicePlot(pf, 'z', 'density2', origin='native')\n",
"s.display()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"
"
],
"metadata": {},
"output_type": "display_data",
"text": [
""
]
}
],
"prompt_number": 15
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here is a more serious example which uses PyNE's cross section tools to compute the one-group total cross section $\\sigma_t$ everywhere on the mesh."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"m.sigma_t = ComputedTag(lambda mesh, i: sigma_t(mesh.mats[i], group_struct=[10.0, 1e-6], phi_g=[1.0])[0])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 16
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"pf = PyneMoabHex8StaticOutput(m)\n",
"s = SlicePlot(pf, 'z', 'sigma_t', origin='native')\n",
"s.display()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"
"
],
"metadata": {},
"output_type": "display_data",
"text": [
""
]
}
],
"prompt_number": 17
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Yes, that was only one line of code."
]
}
],
"metadata": {}
}
]
}