Files
JuliaFEM.jl/notebooks/2015-06-25-elasticity-solver-example.ipynb
T

542 lines
14 KiB
Plaintext
Raw Normal View History

2015-06-25 00:47:03 +03:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
2015-11-25 10:09:07 +02:00
"# Solving elasticity problems using JuliaFEM\n",
2015-06-25 00:47:03 +03:00
"\n",
2015-07-28 22:27:41 +03:00
"Author(s): Jukka Aho\n",
"\n",
2015-11-25 10:09:07 +02:00
"**Abstract**: Solving elasticity equations using JuliaFEM.\n",
2015-10-23 01:11:45 +03:00
"\n",
2015-11-25 10:09:07 +02:00
"### Weak form\n",
2015-10-23 01:11:45 +03:00
"\n",
"Given function spaces\n",
"\\begin{align}\n",
"\\boldsymbol{\\mathcal{U}} & =\\left\\{ \\boldsymbol{u}\\in H^{1}\\left(\\Omega\\right)|\\boldsymbol{u}\\left(\\boldsymbol{X},t\\right)=\\hat{\\boldsymbol{u}}\\left(\\boldsymbol{X},t\\right)\\text{ on }\\Gamma_{\\mathrm{u}}\\right\\} ,\\\\\n",
"\\boldsymbol{\\mathcal{V}} & =\\left\\{ \\delta\\boldsymbol{u}\\in H^{1}\\left(\\Omega\\right)|\\delta\\boldsymbol{u}\\left(\\boldsymbol{X}\\right)=0\\text{ on }\\Gamma_{\\mathrm{u}}\\right\\} ,\n",
"\\end{align}\n",
"find $\\boldsymbol{u}\\in\\boldsymbol{\\mathcal{U}}$ such that\n",
"\\begin{equation}\n",
"\\delta\\mathcal{W}:=\\int_{\\Omega_{0}}\\rho_{0}\\ddot{\\boldsymbol{u}}\\cdot\\delta\\boldsymbol{u}\\,\\mathrm{d}V_{0}+\\int_{\\Omega_{0}}\\boldsymbol{S}:\\delta\\boldsymbol{E}\\,\\mathrm{d}V_{0}-\\int_{\\Omega_{0}}\\hat{\\boldsymbol{b}}_{0}\\cdot\\delta\\boldsymbol{u}\\,\\mathrm{d}V_{0}-\\int_{\\Gamma_{\\sigma}}\\hat{\\boldsymbol{t}}_{0}\\cdot\\delta\\boldsymbol{u}\\,\\mathrm{d}A_{0} =0 \\qquad\\forall\\delta\\boldsymbol{u}\\in\\boldsymbol{\\mathcal{V}}\n",
"\\end{equation}\n",
"\n",
"### Some formulas\n",
"\\begin{align}\n",
"J & =\\det\\left(F\\right)\\\\\n",
"I_{c} & =\\mbox{tr}\\left(C\\right)\\\\\n",
"\\mathbf{C} & =\\mathbf{F}^{\\mathrm{T}}\\mathbf{F}\\\\\n",
"\\mathbf{F} & =\\mathbf{I}+\\nabla\\mathbf{u}\\\\\n",
"\\mathbf{E} & =\\frac{1}{2}\\left(\\mathbf{F}^{\\mathrm{T}}\\mathbf{F}-\\mathbf{I}\\right)\n",
"\\end{align}\n",
"\n",
"### Potential energy\n",
"\n",
"\\begin{equation}\n",
"\\underset{u\\in\\boldsymbol{\\mathcal{U}}}{\\min}\\Pi\\left(\\mathbf{u}\\right)\n",
"\\end{equation}\n",
"\\begin{equation}\n",
"\\Pi\\left(\\mathbf{u}\\right)=\\int_{\\Omega}\\psi\\left(\\mathbf{u}\\right)-\\int_{\\Omega}\\hat{\\mathbf{b}}_{0}\\cdot\\mathbf{u}-\\int_{\\Gamma_{\\sigma}}\\hat{\\mathbf{t}}_{0}\\cdot\\mathbf{u}\\,\\mathrm{d}A_{0}\n",
"\\end{equation}\n",
"\n",
"### Material models\n",
"\n",
"https://en.wikipedia.org/wiki/Strain_energy_density_function\n",
"\n",
"Saint-Venant-Kirchhoff model https://en.wikipedia.org/wiki/Hyperelastic_material\n",
"\\begin{equation}\n",
"\\psi\\left(\\mathbf{E}\\right)=\\frac{\\lambda}{2}\\left[\\mbox{tr}\\left(\\mathbf{E}\\right)\\right]^{2}+\\mu\\mbox{tr}\\left(\\mathbf{E}^2\\right)\n",
"\\end{equation}\n",
"\n",
"neo-Hookean material https://en.wikipedia.org/wiki/Neo-Hookean_solid\n",
"\\begin{equation}\n",
"\\psi=\\frac{\\mu}{2}\\left(I_{c}-3\\right)-\\mu\\ln\\left(J\\right)+\\frac{\\lambda}{2}\\ln\\left(J\\right)^{2}\n",
2015-10-23 01:11:45 +03:00
"\\end{equation}"
2015-07-28 22:27:41 +03:00
]
},
2015-08-10 23:01:44 +03:00
{
2015-10-21 07:24:19 +03:00
"cell_type": "code",
2015-11-28 14:06:12 +02:00
"execution_count": 1,
2015-10-21 07:24:19 +03:00
"metadata": {
"collapsed": false
},
2015-11-25 10:09:07 +02:00
"outputs": [],
"source": [
"using JuliaFEM"
]
},
{
"cell_type": "code",
2015-11-28 14:06:12 +02:00
"execution_count": 2,
2015-11-25 10:09:07 +02:00
"metadata": {
"collapsed": false
},
2015-10-21 07:24:19 +03:00
"outputs": [
2015-11-25 10:09:07 +02:00
{
"name": "stderr",
"output_type": "stream",
"text": [
2015-11-28 14:06:12 +02:00
"INFO: Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\",\"ELSET\"]\n",
2015-11-25 10:09:07 +02:00
"INFO: Parsing elements\n",
2015-11-28 14:06:12 +02:00
"INFO: 31437 elements found\n",
"INFO: Creating ELSET PISTON\n"
2015-11-25 10:09:07 +02:00
]
},
2015-10-21 07:24:19 +03:00
{
"data": {
"text/plain": [
2015-11-28 14:06:12 +02:00
"Dict{Any,Any} with 3 entries:\n",
" \"nodes\" => Dict{Any,Any}(2843=>[-27.41338,-2.18093,-16.93988],4495=>[-14.0…\n",
" \"elements\" => Dict{Any,Any}(43367=>[4492,4602,4494,6450],35510=>[2796,2798,80…\n",
" \"elsets\" => Dict{Any,Any}(\"BC3\"=>[3975,3976,3977,3978,3979,3980,3981,3982,3…"
2015-10-21 07:24:19 +03:00
]
},
2015-11-28 14:06:12 +02:00
"execution_count": 2,
2015-10-21 07:24:19 +03:00
"metadata": {},
"output_type": "execute_result"
2015-11-25 10:09:07 +02:00
},
{
"name": "stderr",
"output_type": "stream",
"text": [
2015-11-28 14:06:12 +02:00
"INFO: Parsing elements\n",
"INFO: 5894 elements found\n",
"INFO: Creating element set BC1\n",
"INFO: Creating element set BC2\n",
"INFO: Creating element set BC3\n"
2015-11-25 10:09:07 +02:00
]
2015-10-21 07:24:19 +03:00
}
],
"source": [
2015-11-28 14:06:12 +02:00
"model = open(JuliaFEM.parse_abaqus, \"../geometry/piston/piston_8789_P1.inp\")\n",
2015-11-25 10:09:07 +02:00
"model"
2015-10-21 07:24:19 +03:00
]
},
{
"cell_type": "code",
2015-11-28 14:06:12 +02:00
"execution_count": 3,
2015-11-25 10:09:07 +02:00
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
2015-11-28 14:06:12 +02:00
"perm = Dict{Int64, Int64}()\n",
"for (i, nid) in enumerate(keys(model[\"nodes\"]))\n",
" perm[nid] = i\n",
2015-11-25 10:09:07 +02:00
"end"
2015-08-10 23:01:44 +03:00
]
},
2015-10-22 07:00:13 +03:00
{
2015-11-25 10:09:07 +02:00
"cell_type": "code",
2015-11-28 14:06:12 +02:00
"execution_count": 4,
2015-10-23 01:11:45 +03:00
"metadata": {
"collapsed": false
},
"outputs": [
{
2015-11-28 14:06:12 +02:00
"name": "stderr",
"output_type": "stream",
"text": [
"INFO: 37331 elements created.\n"
]
2015-10-23 01:11:45 +03:00
}
],
"source": [
2015-11-28 14:06:12 +02:00
"using JuliaFEM: Element, Tri3, Tet4\n",
"elements = Dict{Int64, Element}()\n",
"for (elid, node_ids) in model[\"elements\"]\n",
" connectivity = Int64[perm[nid] for nid in node_ids]\n",
" coords = Vector{Float64}[model[\"nodes\"][nid] for nid in node_ids]\n",
" if length(coords) == 3\n",
" element = Tri3(connectivity)\n",
" element[\"geometry\"] = coords\n",
" elements[elid] = element\n",
" elseif length(coords) == 4\n",
" element = Tet4(connectivity)\n",
" element[\"geometry\"] = coords\n",
" elements[elid] = element\n",
" else\n",
" warn(\"unknown element dim = $(length(connectivity))\")\n",
" end\n",
"end\n",
"info(\"$(length(elements)) elements created.\")"
2015-07-28 22:27:41 +03:00
]
},
{
"cell_type": "code",
2015-11-28 14:06:12 +02:00
"execution_count": 5,
2015-07-28 22:27:41 +03:00
"metadata": {
"collapsed": false
},
"outputs": [
2015-10-21 07:24:19 +03:00
{
"data": {
"text/plain": [
2015-11-28 14:06:12 +02:00
"37331"
2015-10-21 07:24:19 +03:00
]
},
2015-11-28 14:06:12 +02:00
"execution_count": 5,
2015-10-21 07:24:19 +03:00
"metadata": {},
"output_type": "execute_result"
2015-08-24 01:14:03 +03:00
}
],
"source": [
2015-11-28 14:06:12 +02:00
"31437+5894"
2015-08-22 20:55:24 +03:00
]
},
2015-07-28 22:27:41 +03:00
{
"cell_type": "code",
2015-11-28 14:06:12 +02:00
"execution_count": 6,
2015-07-28 22:27:41 +03:00
"metadata": {
2015-11-28 14:06:12 +02:00
"collapsed": true
2015-07-28 22:27:41 +03:00
},
2015-11-28 14:06:12 +02:00
"outputs": [],
2015-11-25 10:09:07 +02:00
"source": [
2015-11-28 14:06:12 +02:00
"using JuliaFEM: ElasticityProblem, DirichletProblem\n",
"\n",
"piston = ElasticityProblem()\n",
"for elid in model[\"elsets\"][\"PISTON\"]\n",
" elements[elid][\"youngs modulus\"] = 210.0e3\n",
" elements[elid][\"poissons ratio\"] = 0.3\n",
" push!(piston, elements[elid])\n",
"end"
2015-11-25 10:09:07 +02:00
]
},
{
"cell_type": "code",
2015-11-28 14:06:12 +02:00
"execution_count": 7,
2015-11-25 10:09:07 +02:00
"metadata": {
2015-11-28 14:06:12 +02:00
"collapsed": true
2015-11-25 10:09:07 +02:00
},
2015-11-28 14:06:12 +02:00
"outputs": [],
2015-11-25 10:09:07 +02:00
"source": [
2015-11-28 14:06:12 +02:00
"load = Vector{Float64}[[0.0, 0.0, -10.0], [0.0, 0.0, -10.0], [0.0, 0.0, -10.0]]\n",
"for elid in model[\"elsets\"][\"BC1\"]\n",
" elements[elid][\"displacement traction force\"] = load\n",
" push!(piston, elements[elid])\n",
"end"
2015-11-25 10:09:07 +02:00
]
},
{
"cell_type": "code",
2015-11-28 14:06:12 +02:00
"execution_count": 8,
2015-11-25 10:09:07 +02:00
"metadata": {
2015-11-28 14:06:12 +02:00
"collapsed": true
2015-11-25 10:09:07 +02:00
},
2015-11-28 14:06:12 +02:00
"outputs": [],
2015-10-22 21:11:14 +03:00
"source": [
2015-11-28 14:06:12 +02:00
"encastre = DirichletProblem(\"displacement\", 3)\n",
"for elid in model[\"elsets\"][\"BC2\"]\n",
" elements[elid][\"displacement\"] = 0.0\n",
" push!(encastre, elements[elid])\n",
"end"
2015-07-28 22:27:41 +03:00
]
},
2015-08-11 22:48:35 +03:00
{
2015-11-25 10:09:07 +02:00
"cell_type": "code",
2015-11-28 14:06:12 +02:00
"execution_count": 9,
2015-11-25 10:09:07 +02:00
"metadata": {
"collapsed": false
},
2015-11-28 14:06:12 +02:00
"outputs": [],
2015-08-11 22:48:35 +03:00
"source": [
2015-11-28 14:06:12 +02:00
"using JuliaFEM: DirectSolver\n",
"solver = DirectSolver()\n",
"push!(solver, piston)\n",
"push!(solver, encastre);"
2015-08-11 22:48:35 +03:00
]
},
{
"cell_type": "code",
2015-11-28 14:06:12 +02:00
"execution_count": 10,
2015-08-11 22:48:35 +03:00
"metadata": {
"collapsed": false
},
"outputs": [
2015-08-19 22:51:44 +03:00
{
2015-11-28 14:06:12 +02:00
"name": "stderr",
"output_type": "stream",
"text": [
"INFO: # of field problems: 1\n",
"INFO: # of boundary problems: 1\n",
"INFO: Starting iteration 1\n",
"INFO: # of dofs: 26367, # of interface dofs: 1350\n",
"INFO: solved. length of solution vector = 52734\n",
"INFO: timing info for non-linear iteration:\n",
"INFO: boundary assembly : 1.4367611408233643\n",
"INFO: field assembly : 17.380300998687744\n",
"INFO: create sparse matrices : 0.38140082359313965\n",
"INFO: solution of system : 3.159921169281006\n",
"INFO: update element data : 3.3958511352539062\n",
"INFO: non-linear iteration : 25.75425100326538\n",
"INFO: Starting iteration 2\n",
"INFO: # of dofs: 26367, # of interface dofs: 1350\n",
"INFO: solved. length of solution vector = 52734\n",
"INFO: timing info for non-linear iteration:\n",
"INFO: boundary assembly : 0.1028587818145752\n",
"INFO: field assembly : 15.321197032928467\n",
"INFO: create sparse matrices : 0.11679887771606445\n",
"INFO: solution of system : 2.1216089725494385\n",
"INFO: update element data : 3.484022855758667\n",
"INFO: non-linear iteration : 21.146512031555176\n",
"INFO: Starting iteration 3\n",
"INFO: # of dofs: 26367, # of interface dofs: 1350\n",
"INFO: solved. length of solution vector = 52734\n",
"INFO: timing info for non-linear iteration:\n",
"INFO: boundary assembly : 0.09190106391906738\n",
"INFO: field assembly : 14.772294044494629\n",
"INFO: create sparse matrices : 0.12086606025695801\n",
"INFO: solution of system : 2.260561943054199\n",
"INFO: update element data : 3.4714930057525635\n",
"INFO: non-linear iteration : 20.717132806777954\n",
"INFO: Starting iteration 4\n",
"INFO: # of dofs: 26367, # of interface dofs: 1350\n",
"INFO: solved. length of solution vector = 52734\n",
"INFO: timing info for non-linear iteration:\n",
"INFO: boundary assembly : 0.09454894065856934\n",
"INFO: field assembly : 15.800831079483032\n",
"INFO: create sparse matrices : 0.10474300384521484\n",
"INFO: solution of system : 2.3751449584960938\n",
"INFO: update element data : 3.471247911453247\n",
"INFO: non-linear iteration : 21.846541166305542\n",
"INFO: solver finished in 90.86189484596252 seconds.\n"
]
},
2015-08-19 22:51:44 +03:00
{
"data": {
"text/plain": [
2015-11-28 14:06:12 +02:00
"(4,true)"
2015-08-19 22:51:44 +03:00
]
},
2015-11-28 14:06:12 +02:00
"execution_count": 10,
2015-08-19 22:51:44 +03:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2015-11-28 14:06:12 +02:00
"solver(0.0)"
2015-08-22 20:55:24 +03:00
]
},
2015-06-25 23:11:57 +03:00
{
2015-08-11 22:48:35 +03:00
"cell_type": "markdown",
"metadata": {},
2015-06-25 23:11:57 +03:00
"source": [
2015-08-11 22:48:35 +03:00
"## Saving results to file"
2015-06-25 23:11:57 +03:00
]
},
{
2015-06-28 20:27:15 +03:00
"cell_type": "code",
2015-11-28 14:06:12 +02:00
"execution_count": 11,
2015-06-28 20:27:15 +03:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2015-08-11 22:48:35 +03:00
"<Grid Name=\"Grid\">\n",
" <Time Value=\"0\"/>\n",
"</Grid>\n"
2015-06-28 20:27:15 +03:00
]
},
2015-11-28 14:06:12 +02:00
"execution_count": 11,
2015-06-28 20:27:15 +03:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2015-08-22 20:55:24 +03:00
"xdoc, xmodel = JuliaFEM.xdmf_new_model()\n",
"temporal_collection = JuliaFEM.xdmf_new_temporal_collection(xmodel)\n",
"grid = JuliaFEM.xdmf_new_grid(temporal_collection; time=0)"
2015-08-11 22:48:35 +03:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Save geometry to xdmf file"
2015-06-28 20:27:15 +03:00
]
},
{
"cell_type": "code",
2015-11-28 14:06:12 +02:00
"execution_count": 12,
2015-06-28 20:27:15 +03:00
"metadata": {
"collapsed": false
},
"outputs": [
{
2015-08-11 22:48:35 +03:00
"name": "stderr",
"output_type": "stream",
"text": [
2015-11-28 14:06:12 +02:00
"INFO: number of nodes in model: 8789\n",
"INFO: Number of elements in model: 31437\n"
2015-08-11 22:48:35 +03:00
]
2015-06-28 20:27:15 +03:00
}
],
"source": [
2015-08-11 22:48:35 +03:00
"nnodes = length(model[\"nodes\"])\n",
2015-11-28 14:06:12 +02:00
"info(\"number of nodes in model: $nnodes\")\n",
"\n",
2015-08-11 22:48:35 +03:00
"X = zeros(3, nnodes)\n",
2015-11-28 14:06:12 +02:00
"for nid in keys(model[\"nodes\"])\n",
" X[:, perm[nid]] = model[\"nodes\"][nid]\n",
2015-08-11 22:48:35 +03:00
"end\n",
"\n",
2015-11-28 14:06:12 +02:00
"nelements = length(model[\"elsets\"][\"PISTON\"])\n",
"info(\"Number of elements in model: $nelements\")\n",
"elmap = zeros(Int64, 5, nelements)\n",
"#elmap[1,:] = 0x0026\n",
"elmap[1,:] = 0x6\n",
"for (i, elid) in enumerate(model[\"elsets\"][\"PISTON\"])\n",
" elmap[2:end,i] = Int64[perm[nid] for nid in model[\"elements\"][elid]]\n",
2015-08-11 22:48:35 +03:00
"end"
2015-06-28 20:27:15 +03:00
]
},
{
"cell_type": "code",
2015-11-28 14:06:12 +02:00
"execution_count": 13,
2015-06-28 20:27:15 +03:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2015-08-11 22:48:35 +03:00
"true"
2015-06-28 20:27:15 +03:00
]
},
2015-11-28 14:06:12 +02:00
"execution_count": 13,
2015-06-28 20:27:15 +03:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2015-08-22 20:55:24 +03:00
"JuliaFEM.xdmf_new_mesh(grid, X, elmap)"
2015-06-28 20:27:15 +03:00
]
},
{
"cell_type": "code",
2015-11-28 14:06:12 +02:00
"execution_count": 14,
2015-06-28 20:27:15 +03:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2015-11-28 14:06:12 +02:00
"988949"
2015-06-28 20:27:15 +03:00
]
},
2015-11-28 14:06:12 +02:00
"execution_count": 14,
2015-06-28 20:27:15 +03:00
"metadata": {},
"output_type": "execute_result"
}
],
2015-06-25 23:11:57 +03:00
"source": [
2015-11-28 14:06:12 +02:00
"JuliaFEM.xdmf_save_model(xdoc, \"/tmp/piston.xmf\")"
2015-08-11 22:48:35 +03:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Save nodal data to model"
2015-06-28 20:27:15 +03:00
]
},
{
"cell_type": "code",
2015-11-28 14:06:12 +02:00
"execution_count": 15,
2015-08-19 18:50:43 +03:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2015-11-28 14:06:12 +02:00
"(3,8789)"
2015-08-19 18:50:43 +03:00
]
},
2015-11-28 14:06:12 +02:00
"execution_count": 15,
2015-08-19 18:50:43 +03:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2015-11-28 14:06:12 +02:00
"using JuliaFEM: get_connectivity\n",
2015-08-22 20:55:24 +03:00
"\n",
2015-11-28 14:06:12 +02:00
"u = zeros(3, nnodes)\n",
2015-08-22 20:55:24 +03:00
"\n",
2015-11-28 14:06:12 +02:00
"for element in values(elements)\n",
" isa(element, Element{Tet4}) || continue\n",
" connectivity = get_connectivity(element)\n",
" field = element[\"displacement\"](0.0)\n",
" for (i, nid) in enumerate(connectivity)\n",
" u[:, nid] = field[i]\n",
2015-08-22 20:55:24 +03:00
" end\n",
"end\n",
2015-11-28 14:06:12 +02:00
"size(u)"
2015-08-27 08:18:20 +03:00
]
},
{
"cell_type": "code",
2015-11-28 14:06:12 +02:00
"execution_count": 16,
2015-08-27 08:18:20 +03:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2015-11-28 14:06:12 +02:00
"true"
2015-08-27 08:18:20 +03:00
]
},
2015-11-28 14:06:12 +02:00
"execution_count": 16,
2015-08-27 08:18:20 +03:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2015-11-28 14:06:12 +02:00
"JuliaFEM.xdmf_new_field(grid, \"Displacement\", \"nodes\", u)"
2015-08-27 08:18:20 +03:00
]
},
{
"cell_type": "code",
2015-11-28 14:06:12 +02:00
"execution_count": 17,
2015-08-27 08:18:20 +03:00
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
2015-11-28 14:06:12 +02:00
"1573751"
2015-08-27 08:18:20 +03:00
]
},
2015-11-28 14:06:12 +02:00
"execution_count": 17,
2015-08-27 08:18:20 +03:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2015-11-28 14:06:12 +02:00
"JuliaFEM.xdmf_save_model(xdoc, \"/tmp/piston.xmf\")"
2015-08-27 08:18:20 +03:00
]
2015-06-25 00:47:03 +03:00
}
],
"metadata": {
"kernelspec": {
2015-11-25 10:09:07 +02:00
"display_name": "Julia 0.4.1",
2015-06-25 00:47:03 +03:00
"language": "julia",
"name": "julia-0.4"
},
"language_info": {
2015-10-21 07:24:19 +03:00
"file_extension": ".jl",
"mimetype": "application/julia",
2015-06-25 00:47:03 +03:00
"name": "julia",
2015-11-25 10:09:07 +02:00
"version": "0.4.1"
2015-06-25 00:47:03 +03:00
}
},
"nbformat": 4,
"nbformat_minor": 0
}