Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/tkphd/pfhub-bm6-cahn-hilliard-poisson

PFHub Benchmark 6: Cahn-Hilliard-Poisson
https://github.com/tkphd/pfhub-bm6-cahn-hilliard-poisson

Last synced: about 2 months ago
JSON representation

PFHub Benchmark 6: Cahn-Hilliard-Poisson

Awesome Lists containing this project

README

        

{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"# PFHub Benchmark 6 v2\n",
"\n",
"This repository implements the [Cahn-Hilliard-Poisson Benchmark v2][chpb]\n",
"from [PFHub][pfhb] using [MMSP][mmsp] with a [convex splitting][cnvx] formulation.\n",
"\n",
"While legible on GitHub, this notebook is best viewed on [nbviewer.ipython.org][ipnb].\n",
"\n",
"\n",
"[chpb]: https://pages.nist.gov/pfhub/benchmarks/benchmark6-hackathon.ipynb/\n",
"[cnvx]: https://doi.org/10.1557/PROC-529-39\n",
"[ipnb]: http://nbviewer.jupyter.org/github/tkphd/pfhub-bm6-cahn-hilliard-poisson/blob/master/README.ipynb\n",
"[mmsp]: https://github.com/mesoscale/mmsp\n",
"[pfhb]: https://pages.nist.gov/pfhub"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"## Equations of Motion\n",
"\n",
"The EOMs are provided as follows:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"application/javascript": [
"MathJax.Hub.Config({\n",
" TeX: { equationNumbers: { autoNumber: \"AMS\" } }\n",
"});"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%javascript\n",
"MathJax.Hub.Config({\n",
" TeX: { equationNumbers: { autoNumber: \"AMS\" } }\n",
"});"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"text/latex": [
"\\begin{align}\n",
"\\frac{\\partial c}{\\partial t} &= M'(c)\\nabla c\\nabla\\mu + M(c)\\nabla^2\\mu\\\\\n",
"\\mu &= 4wc^3 - 6w(c_{\\alpha} + c_{\\beta})c^2 + 2w(c_{\\alpha}^2 + 4c_{\\alpha}c_{\\beta} + c_{\\beta}^2)c - 2wc_{\\alpha}c_{\\beta}(c_{\\alpha} + c_{\\beta}) - \\kappa\\nabla^2c + k\\Phi_{\\mathrm{tot}}\\\\\n",
"\\nabla^2\\Phi_{\\mathrm{tot}} &= \\frac{-k}{\\epsilon}(c - c_0)\n",
"\\end{align}\n",
"where $M(c) = \\frac{M_0}{1+c^2}$ and $M'(c) = \\frac{-2M_0c}{(1+c^2)^2}$."
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"\\begin{align}\n",
"\\frac{\\partial c}{\\partial t} &= M'(c)\\nabla c\\nabla\\mu + M(c)\\nabla^2\\mu\\\\\n",
"\\mu &= 4wc^3 - 6w(c_{\\alpha} + c_{\\beta})c^2 + 2w(c_{\\alpha}^2 + 4c_{\\alpha}c_{\\beta} + c_{\\beta}^2)c - 2wc_{\\alpha}c_{\\beta}(c_{\\alpha} + c_{\\beta}) - \\kappa\\nabla^2c + k\\Phi_{\\mathrm{tot}}\\\\\n",
"\\nabla^2\\Phi_{\\mathrm{tot}} &= \\frac{-k}{\\epsilon}(c - c_0)\n",
"\\end{align}\n",
"where $M(c) = \\frac{M_0}{1+c^2}$ and $M'(c) = \\frac{-2M_0c}{(1+c^2)^2}$."
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"## Discretizations\n",
"\n",
"Equations (1)--(3) are discretized as follows, using the subscript $n$ to indicate the current timestep and $n+1$ indicating the next timestep."
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"### Composition"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"text/latex": [
"\n",
"Linearizing Equation (1):\n",
"\n",
"\\begin{equation}\n",
"c_{n+1} = c_n + \\Delta t\\left[\\frac{-2M_0\\nabla c_n\\cdot\\nabla\\mu_n}{(1+c_n^2)^2}\\right]c_{n+1}\n",
" + \\Delta t M(c_n)\\nabla^2\\mu_{n+1}\\\\\n",
"\\end{equation}\n",
"\n",
"Grouping update terms ($n+1$) on the left,\n",
"\n",
"\\begin{equation}\n",
"\\left[1 + \\frac{2M_0\\Delta t\\nabla c_n\\cdot\\nabla\\mu_n}{(1+c_n^2)^2}\\right]c_{n+1} - \\Delta t M(c_n)\\nabla^2\\mu_{n+1} = c_n\n",
"\\end{equation}\n",
"\n",
"The 2-D discrete Laplacian operator ($\\nabla^2$) can be separated into on-diagonal and off-diagonal terms, assuming $\\Delta x = \\Delta y = h$:\n",
" \n",
"\\begin{equation}\n",
"\\nabla^2\\eta = \\frac{\\eta_{i+1,j} + \\eta_{i-1,j}}{h^2} + \\frac{\\eta_{i,j+1} + \\eta_{i,j-1}}{h^2} - \\frac{4\\eta_{i,j}}{h^2} = \\nabla^2_{\\LARGE\\circ}\\eta_n - \\frac{4}{h^2}\\eta_{n+1}\n",
"\\end{equation}\n",
"\n",
"In the implementation, $\\nabla^2_{\\circ}$ is referred to as the \"fringe Laplacian,\"\n",
"as it takes values from the fringe of the stencil around the central value (but not the central value itself)."
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"\n",
"Linearizing Equation (1):\n",
"\n",
"\\begin{equation}\n",
"c_{n+1} = c_n + \\Delta t\\left[\\frac{-2M_0\\nabla c_n\\cdot\\nabla\\mu_n}{(1+c_n^2)^2}\\right]c_{n+1}\n",
" + \\Delta t M(c_n)\\nabla^2\\mu_{n+1}\\\\\n",
"\\end{equation}\n",
"\n",
"Grouping update terms ($n+1$) on the left,\n",
"\n",
"\\begin{equation}\n",
"\\left[1 + \\frac{2M_0\\Delta t\\nabla c_n\\cdot\\nabla\\mu_n}{(1+c_n^2)^2}\\right]c_{n+1} - \\Delta t M(c_n)\\nabla^2\\mu_{n+1} = c_n\n",
"\\end{equation}\n",
"\n",
"The 2-D discrete Laplacian operator ($\\nabla^2$) can be separated into on-diagonal and off-diagonal terms, assuming $\\Delta x = \\Delta y = h$:\n",
" \n",
"\\begin{equation}\n",
"\\nabla^2\\eta = \\frac{\\eta_{i+1,j} + \\eta_{i-1,j}}{h^2} + \\frac{\\eta_{i,j+1} + \\eta_{i,j-1}}{h^2} - \\frac{4\\eta_{i,j}}{h^2} = \\nabla^2_{\\LARGE\\circ}\\eta_n - \\frac{4}{h^2}\\eta_{n+1}\n",
"\\end{equation}\n",
"\n",
"In the implementation, $\\nabla^2_{\\circ}$ is referred to as the \"fringe Laplacian,\"\n",
"as it takes values from the fringe of the stencil around the central value (but not the central value itself)."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"text/latex": [
"\n",
"Substituting Eqn. (6) into Eqn. (5), and letting $\\xi = \\frac{4}{h^2}$, we arrive at the convex splitting discretization of Eqn. (1):\n",
"\n",
"\\begin{equation}\n",
"\\left[1 + \\frac{2M_0\\Delta t\\nabla c_n\\cdot\\nabla\\mu_n}{(1+c_n^2)^2}\\right]c_{n+1} \n",
" + \\Delta t \\xi M(c_n)\\mu_{n+1} = c_n + \\Delta t M(c_n)\\nabla^2_{\\LARGE\\circ}\\mu_n.\n",
"\\end{equation}"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"\n",
"Substituting Eqn. (6) into Eqn. (5), and letting $\\xi = \\frac{4}{h^2}$, we arrive at the convex splitting discretization of Eqn. (1):\n",
"\n",
"\\begin{equation}\n",
"\\left[1 + \\frac{2M_0\\Delta t\\nabla c_n\\cdot\\nabla\\mu_n}{(1+c_n^2)^2}\\right]c_{n+1} \n",
" + \\Delta t \\xi M(c_n)\\mu_{n+1} = c_n + \\Delta t M(c_n)\\nabla^2_{\\LARGE\\circ}\\mu_n.\n",
"\\end{equation}"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"### Chemical Potential"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"text/latex": [
"\n",
"Eqn. (2) is derived from a free energy expression with both convex and non-convex terms.\n",
"To first order, let us assume that terms in Eqn. (2) with odd powers derive from convex\n",
"(contractive) terms, and those with even powers derive from non-convex (expansive) terms.\n",
"Then the convex terms are evaluated at $n+1$, and the rest at $n$.\n",
"\n",
"\\begin{equation}\n",
"\\mu = \\underbrace{2w\\left(2c^2 + (c_{\\alpha}^2 + 4c_{\\alpha}c_{\\beta} + c_{\\beta}^2)\\right)c}_{\\mathrm{contractive}} \n",
" + \\underbrace{2w\\left(-3(c_{\\alpha} + c_{\\beta})c^2 - c_{\\alpha}c_{\\beta}(c_{\\alpha} + c_{\\beta})\\right)}_{\\mathrm{expansive}}\n",
" - \\kappa\\nabla^2c + k\\Phi + k\\Phi_{\\mathrm{ext}}\n",
"\\end{equation}"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"\n",
"Eqn. (2) is derived from a free energy expression with both convex and non-convex terms.\n",
"To first order, let us assume that terms in Eqn. (2) with odd powers derive from convex\n",
"(contractive) terms, and those with even powers derive from non-convex (expansive) terms.\n",
"Then the convex terms are evaluated at $n+1$, and the rest at $n$.\n",
"\n",
"\\begin{equation}\n",
"\\mu = \\underbrace{2w\\left(2c^2 + (c_{\\alpha}^2 + 4c_{\\alpha}c_{\\beta} + c_{\\beta}^2)\\right)c}_{\\mathrm{contractive}} \n",
" + \\underbrace{2w\\left(-3(c_{\\alpha} + c_{\\beta})c^2 - c_{\\alpha}c_{\\beta}(c_{\\alpha} + c_{\\beta})\\right)}_{\\mathrm{expansive}}\n",
" - \\kappa\\nabla^2c + k\\Phi + k\\Phi_{\\mathrm{ext}}\n",
"\\end{equation}"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"text/latex": [
"\n",
"Eqn. (8) can then be linearized and regrouped:\n",
"\n",
"\\begin{align}\n",
"f_{\\mathrm{con}}(c) &= 2w\\left(2c^2 + (c_{\\alpha}^2 + 4c_{\\alpha}c_{\\beta} + c_{\\beta}^2)\\right)\\\\\n",
"f_{\\mathrm{exp}}(c) &= 2w\\left(-3(c_{\\alpha} + c_{\\beta})c^2 - c_{\\alpha}c_{\\beta}(c_{\\alpha} + c_{\\beta})\\right)\n",
"\\end{align}\n",
"\n",
"\\begin{equation}\n",
"-\\left[f_{\\mathrm{con}}(c_n) + \\kappa\\xi\\right]c_{n+1} + \\mu_{n+1} - k\\Phi_{n+1} = f_{\\mathrm{exp}}(c_n) -\\kappa\\nabla^2_{\\LARGE\\circ}c_n + k\\Phi_{\\mathrm{ext}}\n",
"\\end{equation}"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"\n",
"Eqn. (8) can then be linearized and regrouped:\n",
"\n",
"\\begin{align}\n",
"f_{\\mathrm{con}}(c) &= 2w\\left(2c^2 + (c_{\\alpha}^2 + 4c_{\\alpha}c_{\\beta} + c_{\\beta}^2)\\right)\\\\\n",
"f_{\\mathrm{exp}}(c) &= 2w\\left(-3(c_{\\alpha} + c_{\\beta})c^2 - c_{\\alpha}c_{\\beta}(c_{\\alpha} + c_{\\beta})\\right)\n",
"\\end{align}\n",
"\n",
"\\begin{equation}\n",
"-\\left[f_{\\mathrm{con}}(c_n) + \\kappa\\xi\\right]c_{n+1} + \\mu_{n+1} - k\\Phi_{n+1} = f_{\\mathrm{exp}}(c_n) -\\kappa\\nabla^2_{\\LARGE\\circ}c_n + k\\Phi_{\\mathrm{ext}}\n",
"\\end{equation}\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true,
"deletable": true,
"editable": true
},
"source": [
"### Electrostatic Potential"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"text/latex": [
"\n",
"Discretizing Eqn. (3) is relatively straightforward, since $\\nabla^2\\Phi_{\\mathrm{ext}}\\equiv 0$:\n",
"\n",
"\\begin{align}\n",
"\\nabla^2\\Phi_{\\mathrm{tot}} &= \\frac{-k}{\\epsilon}(c - c_0)\\\\\n",
"\\nabla^2\\Phi_{n+1} &= -\\frac{kc}{\\epsilon} + \\frac{kc_0}{\\epsilon}\\\\\n",
"-\\xi\\Phi_{n+1} + \\frac{k}{\\epsilon}c_{n+1} &= \\frac{kc_0}{\\epsilon} - \\nabla^2_{\\LARGE\\circ}\\Phi_{n}\n",
"\\end{align}"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"\n",
"Discretizing Eqn. (3) is relatively straightforward, since $\\nabla^2\\Phi_{\\mathrm{ext}}\\equiv 0$:\n",
"\n",
"\\begin{align}\n",
"\\nabla^2\\Phi_{\\mathrm{tot}} &= \\frac{-k}{\\epsilon}(c - c_0)\\\\\n",
"\\nabla^2\\Phi_{n+1} &= -\\frac{kc}{\\epsilon} + \\frac{kc_0}{\\epsilon}\\\\\n",
"-\\xi\\Phi_{n+1} + \\frac{k}{\\epsilon}c_{n+1} &= \\frac{kc_0}{\\epsilon} - \\nabla^2_{\\LARGE\\circ}\\Phi_{n}\n",
"\\end{align}"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"## Matrix Form"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"text/latex": [
"\n",
"Equations (7), (11), and (14) form the system of equations to solve. In matrix form, this becomes\n",
"\n",
"\\begin{equation}\n",
"\\left[\\begin{array}\\\\\n",
"1 + M'(c_n)\\Delta t \\nabla c_n\\cdot\\nabla\\mu_n & M(c_n)\\xi\\Delta t & 0\\\\\n",
"-\\left[f_{\\mathrm{con}}(c_n) + \\kappa\\xi\\right] & 1 & -k\\\\\n",
"\\frac{k}{\\epsilon} & 0 & -\\xi\\\\\n",
" \\end{array}\\right] \\left[\\begin{array}\\\\\n",
"c_{n+1}\\\\ \\mu_{n+1}\\\\ \\Phi_{n+1}\\end{array}\\right] = \\left[\\begin{array}\\\\\n",
"c_n + M(c_n)\\Delta t \\nabla^2_{\\LARGE\\circ}\\mu_n\\\\\n",
"f_{\\mathrm{exp}}(c_n) - \\kappa\\nabla^2_{\\LARGE\\circ}c_n + k\\Phi_{\\mathrm{ext}}\\\\\n",
"\\frac{kc_0}{\\epsilon} - \\nabla^2_{\\LARGE\\circ}\\Phi_n\\\\\n",
"\\end{array}\\right]\n",
" \n",
"\\end{equation}"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"\n",
"Equations (7), (11), and (14) form the system of equations to solve. In matrix form, this becomes\n",
"\n",
"\\begin{equation}\n",
"\\left[\\begin{array}\\\\\n",
"1 + M'(c_n)\\Delta t \\nabla c_n\\cdot\\nabla\\mu_n & M(c_n)\\xi\\Delta t & 0\\\\\n",
"-\\left[f_{\\mathrm{con}}(c_n) + \\kappa\\xi\\right] & 1 & -k\\\\\n",
"\\frac{k}{\\epsilon} & 0 & -\\xi\\\\\n",
" \\end{array}\\right] \\left[\\begin{array}\\\\\n",
"c_{n+1}\\\\ \\mu_{n+1}\\\\ \\Phi_{n+1}\\end{array}\\right] = \\left[\\begin{array}\\\\\n",
"c_n + M(c_n)\\Delta t \\nabla^2_{\\LARGE\\circ}\\mu_n\\\\\n",
"f_{\\mathrm{exp}}(c_n) - \\kappa\\nabla^2_{\\LARGE\\circ}c_n + k\\Phi_{\\mathrm{ext}}\\\\\n",
"\\frac{kc_0}{\\epsilon} - \\nabla^2_{\\LARGE\\circ}\\Phi_n\\\\\n",
"\\end{array}\\right]\n",
" \n",
"\\end{equation}"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true,
"deletable": true,
"editable": true
},
"source": [
"Eqn. (15) is vulnerable to [Cramer's rule][crmr].\n",
"\n",
"\n",
"[crmr]: https://en.wikipedia.org/wiki/Cramer%27s_rule#Explicit_formulas_for_small_systems"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"text/latex": [
"\n",
"\\begin{align}\n",
"\\mathrm{det}(A) &= (a_{11}a_{22}a_{33} - 0) + (a_{12}a_{23}a_{31} - a_{12}a_{21}a_{33}) + (0 - 0)\\\\\n",
" &= a_{33}(a_{11}a_{22} - a_{12}a_{21}) + a_{12}a_{23}a_{31}.\\\\\n",
"\\mathrm{det}(A_1) &= (b_{1}a_{22}a_{33} - 0) + (a_{12}a_{23}b_{3} - a_{12}b_{2}a_{33}) + (0 - 0)\\\\\n",
" &= a_{33}(b_{1}a_{22} - a_{12}b_{2}) + a_{12}a_{23}b_{3}.\\\\\n",
"\\mathrm{det}(A_2) &= (a_{11}b_{2}a_{33} - a_{11}a_{23}b_{3}) + (b_{1}a_{23}a_{31} - b_{1}a_{21}a_{33}) + (0 - 0)\\\\\n",
" &= a_{33}(a_{11}b_{2} - b_{1}a_{21}) + a_{23}(b_{1}a_{31} - a_{11}b_{3}).\\\\\n",
"\\mathrm{det}(A_3) &= (a_{11}a_{22}b_{3} - 0) + (a_{12}b_{2}a_{31} - a_{12}a_{21}b_{3}) + (0 - b_{1}a_{22}a_{31})\\\\\n",
" &= a_{22}(a_{11}b_{3} - b_{1}a_{31}) + a_{21}(b_{2}a_{31} - a_{21}b_{3}).\\\\\n",
"c_{n+1} &= \\frac{\\mathrm{det}(A_1)}{\\mathrm{det}(A)}\\\\\n",
"\\mu_{n+1} &= \\frac{\\mathrm{det}(A_2)}{\\mathrm{det}(A)}\\\\\n",
"\\Phi_{n+1} &= \\frac{\\mathrm{det}(A_3)}{\\mathrm{det}(A)}\\\\\n",
"\\end{align}"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"\n",
"\\begin{align}\n",
"\\mathrm{det}(A) &= (a_{11}a_{22}a_{33} - 0) + (a_{12}a_{23}a_{31} - a_{12}a_{21}a_{33}) + (0 - 0)\\\\\n",
" &= a_{33}(a_{11}a_{22} - a_{12}a_{21}) + a_{12}a_{23}a_{31}.\\\\\n",
"\\mathrm{det}(A_1) &= (b_{1}a_{22}a_{33} - 0) + (a_{12}a_{23}b_{3} - a_{12}b_{2}a_{33}) + (0 - 0)\\\\\n",
" &= a_{33}(b_{1}a_{22} - a_{12}b_{2}) + a_{12}a_{23}b_{3}.\\\\\n",
"\\mathrm{det}(A_2) &= (a_{11}b_{2}a_{33} - a_{11}a_{23}b_{3}) + (b_{1}a_{23}a_{31} - b_{1}a_{21}a_{33}) + (0 - 0)\\\\\n",
" &= a_{33}(a_{11}b_{2} - b_{1}a_{21}) + a_{23}(b_{1}a_{31} - a_{11}b_{3}).\\\\\n",
"\\mathrm{det}(A_3) &= (a_{11}a_{22}b_{3} - 0) + (a_{12}b_{2}a_{31} - a_{12}a_{21}b_{3}) + (0 - b_{1}a_{22}a_{31})\\\\\n",
" &= a_{22}(a_{11}b_{3} - b_{1}a_{31}) + a_{21}(b_{2}a_{31} - a_{21}b_{3}).\\\\\n",
"c_{n+1} &= \\frac{\\mathrm{det}(A_1)}{\\mathrm{det}(A)}\\\\\n",
"\\mu_{n+1} &= \\frac{\\mathrm{det}(A_2)}{\\mathrm{det}(A)}\\\\\n",
"\\Phi_{n+1} &= \\frac{\\mathrm{det}(A_3)}{\\mathrm{det}(A)}\\\\\n",
"\\end{align}"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true,
"deletable": true,
"editable": true
},
"outputs": [],
"source": []
}
],
"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.5.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}