From fe302d51fdc3a2e147c20693da657067f3f204e6 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 29 Jul 2015 13:50:32 +0300 Subject: [PATCH 01/26] jebou --- docs/links.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/links.md b/docs/links.md index b3b9613..06b175e 100644 --- a/docs/links.md +++ b/docs/links.md @@ -22,4 +22,6 @@ Integration - http://arxiv.org/pdf/1411.1341.pdf Hierarchial shape functions -- https://www.math.vt.edu/people/adjerids/research/papers/basis.pdf \ No newline at end of file +- https://www.math.vt.edu/people/adjerids/research/papers/basis.pdf + +- edited by Ari \ No newline at end of file From f080d9e2b96b8c3d05ead19be339fa479173baab Mon Sep 17 00:00:00 2001 From: arilaakk Date: Wed, 29 Jul 2015 15:42:38 +0300 Subject: [PATCH 02/26] Added basic contributing steps --- CONTRIBUTING.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 4d66797..97eb5f3 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -9,6 +9,21 @@ For now, read https://github.com/JuliaLang/julia/blob/master/CONTRIBUTING.md +How to contribute +----------------- +Here are the basic steps for contributing to JuliaFEM: +1) Create an account or sign in to GitHub +2) Install Git to your computer +3) Fork Julia to your repository (https://github.com/JuliaLang/julia) +4) Build Julia (v0.4+) to your computer +5) Fork JuliaFEM to your repository +6) Use Pkg.add() or git clone to access JuliaFEM +7) Make your contribution to the project +8) Add all updated files to the staging area: git add . +9) Commit the files to your repository and add a description message: +git commit -m "your_message_here" +10) At your repository, create a pull request + Developing ---------- ```bash From bd3ab3dc965234b6cc1aed534301c96c61b5d5de Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Sat, 1 Aug 2015 16:09:56 +0300 Subject: [PATCH 03/26] added timeout for notebook building --- docs/build_notebooks.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build_notebooks.jl b/docs/build_notebooks.jl index 9efc4c0..8bedb31 100644 --- a/docs/build_notebooks.jl +++ b/docs/build_notebooks.jl @@ -55,7 +55,7 @@ function run_notebooks() # port = 34211+k # we're having some weird port issue with zmq # k += 1 try - run(`runipy -o tutorials/$ipynb --kernel=julia-0.4`) + run(`timeout 180 runipy -o tutorials/$ipynb --kernel=julia-0.4`) status = 0 catch println("did not work") From 6aa70b7cad4cffc3329c9da8d1ce141f0a180fc6 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Sat, 1 Aug 2015 20:54:25 +0300 Subject: [PATCH 04/26] updated notebook --- ...2015-06-25-elasticity-solver-example.ipynb | 552 +++++++++--------- 1 file changed, 267 insertions(+), 285 deletions(-) diff --git a/notebooks/2015-06-25-elasticity-solver-example.ipynb b/notebooks/2015-06-25-elasticity-solver-example.ipynb index baccd33..c50297c 100644 --- a/notebooks/2015-06-25-elasticity-solver-example.ipynb +++ b/notebooks/2015-06-25-elasticity-solver-example.ipynb @@ -191,16 +191,16 @@ "name": "stderr", "output_type": "stream", "text": [ - "29-Jul 23:12:24:DEBUG:root:Converged in 6 iterations.\n", - "29-Jul 23:12:24:DEBUG:root:solution vector: \n", + "01-Aug 14:05:35:DEBUG:root:Converged in 6 iterations.\n", + "01-Aug 14:05:36:DEBUG:root:solution vector: \n", " [0.0 -0.39914506095474317 -0.07228582695592449 0.0\n", " 0.0 -2.1779892317073504 -2.222244754401764 0.0]\n", - "29-Jul 23:12:24:DEBUG:root:norm of u: 3.1292483947150043\n", - "29-Jul 23:12:25:DEBUG:root:Converged in 6 iterations.\n", - "29-Jul 23:12:25:DEBUG:root:solution vector: \n", + "01-Aug 14:05:36:DEBUG:root:norm of u: 3.1292483947150043\n", + "01-Aug 14:05:37:DEBUG:root:Converged in 6 iterations.\n", + "01-Aug 14:05:37:DEBUG:root:solution vector: \n", " [0.0 0.7433248532717793 1.0485210147234858 0.0\n", " 0.0 -2.085766534304891 -1.9606633242166027 0.0]\n", - "29-Jul 23:12:25:DEBUG:root:norm of u: 3.129248394715006\n" + "01-Aug 14:05:37:DEBUG:root:norm of u: 3.129248394715006\n" ] }, { @@ -352,7 +352,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 8, "metadata": { "collapsed": false }, @@ -363,7 +363,7 @@ "get_shape_functions (generic function with 1 method)" ] }, - "execution_count": 19, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -400,7 +400,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 9, "metadata": { "collapsed": false }, @@ -411,7 +411,7 @@ "get_integration_scheme (generic function with 2 methods)" ] }, - "execution_count": 20, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -431,7 +431,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 10, "metadata": { "collapsed": false }, @@ -442,7 +442,7 @@ "assemble_element! (generic function with 2 methods)" ] }, - "execution_count": 48, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -494,7 +494,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 11, "metadata": { "collapsed": false }, @@ -510,58 +510,53 @@ "name": "stderr", "output_type": "stream", "text": [ - "30-Jul 00:08:18:DEBUG:root:Creating nodes\n", - "30-Jul 00:08:18:DEBUG:root:Creating elements\n", - "30-Jul 00:08:18:DEBUG:root:Starting iteration 1\n", - "30-Jul 00:08:18:DEBUG:root:Assembling\n", - "30-Jul 00:08:18:DEBUG:root:Solving\n", - "30-Jul 00:08:18:DEBUG:root:Solution norm = 3.0814821107320176\n", - "30-Jul 00:08:18:DEBUG:root:Starting iteration 2\n", - "30-Jul 00:08:18:DEBUG:root:Assembling\n", - "30-Jul 00:08:18:DEBUG:root:Solving\n", - "30-Jul 00:08:18:DEBUG:root:Solution norm = 0.32007464366194766\n", - "30-Jul 00:08:18:DEBUG:root:Starting iteration 3\n", - "30-Jul 00:08:18:DEBUG:root:Assembling\n", - "30-Jul 00:08:18:DEBUG:root:Solving\n", - "30-Jul 00:08:18:DEBUG:root:Solution norm = 0.040279810888447135\n", - "30-Jul 00:08:18:DEBUG:root:Starting iteration 4\n", - "30-Jul 00:08:18:DEBUG:root:Assembling\n", - "30-Jul 00:08:18:DEBUG:root:Solving\n", - "30-Jul 00:08:18:DEBUG:root:Solution norm = 0.000925649536063315\n", - "30-Jul 00:08:18:DEBUG:root:Starting iteration 5\n", - "30-Jul 00:08:18:DEBUG:root:Assembling\n", - "30-Jul 00:08:18:DEBUG:root:Solving\n", - "30-Jul 00:08:18:DEBUG:root:Solution norm = 1.5582555024825817e-7\n", - "30-Jul 00:08:18:DEBUG:root:Starting iteration 6\n", - "30-Jul 00:08:18:DEBUG:root:Assembling\n", - "30-Jul 00:08:18:DEBUG:root:Solving\n", - "30-Jul 00:08:18:DEBUG:root:Solution norm = 1.0317166868587156e-14\n", - "30-Jul 00:08:18:DEBUG:root:Converged in 6 iterations.\n", - "30-Jul 00:08:18:DEBUG:root:Displacement of element = \n", + "01-Aug 14:07:09:DEBUG:root:Creating nodes\n", + "01-Aug 14:07:09:DEBUG:root:Creating elements\n", + "01-Aug 14:07:09:DEBUG:root:Starting iteration 1\n", + "01-Aug 14:07:09:DEBUG:root:Assembling\n", + "01-Aug 14:07:10:DEBUG:root:Solution norm = 3.090022136728999\n", + "01-Aug 14:07:10:DEBUG:root:Starting iteration 2\n", + "01-Aug 14:07:10:DEBUG:root:Assembling\n", + "01-Aug 14:07:10:DEBUG:root:Solution norm = 0.3212131602153504\n", + "01-Aug 14:07:10:DEBUG:root:Starting iteration 3\n", + "01-Aug 14:07:10:DEBUG:root:Assembling\n", + "01-Aug 14:07:10:DEBUG:root:Solution norm = 0.040431781940005365\n", + "01-Aug 14:07:10:DEBUG:root:Starting iteration 4\n", + "01-Aug 14:07:10:DEBUG:root:Assembling\n", + "01-Aug 14:07:10:DEBUG:root:Solution norm = 0.0009291101052064257\n", + "01-Aug 14:07:10:DEBUG:root:Starting iteration 5\n", + "01-Aug 14:07:10:DEBUG:root:Assembling\n", + "01-Aug 14:07:10:DEBUG:root:Solution norm = 1.5638899025378415e-7\n", + "01-Aug 14:07:10:DEBUG:root:Starting iteration 6\n", + "01-Aug 14:07:10:DEBUG:root:Assembling\n", + "01-Aug 14:07:10:DEBUG:root:Solution norm = 1.0355045356935844e-14\n", + "01-Aug 14:07:10:DEBUG:root:Converged in 6 iterations.\n", + "01-Aug 14:07:10:DEBUG:root:Displacement of element = \n", "[-0.39914506095474334 -0.07228582695592464 0.0 0.0\n", " -2.1779892317073504 -2.222244754401764 0.0 0.0]\n" ] }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 fact verified.\n" + ] + }, { "data": { "text/plain": [ "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 49, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1 fact verified.\n" - ] } ], "source": [ "facts(\"one element assembly\") do\n", + " # Create model\n", " Logging.debug(\"Creating nodes\")\n", " n1 = Node(1, Int64[])\n", " n2 = Node(2, Int64[])\n", @@ -569,32 +564,35 @@ " n4 = Node(4, Int64[])\n", " nodes = [n1.id, n2.id, n3.id, n4.id]\n", " coordinates = [10.0 0.0; 10.0 1.0; 0.0 1.0; 0.0 0.0]'\n", - " attributes = Dict(\n", - " \"Young\" => 90, \"Poisson\" => 0.25,\n", - " \"displacement\" => zeros(2, 4),\n", - " \"displacement nodal force\" => zeros(2, 4),\n", - " \"displacement tangent stiffness\" => zeros(8, 8))\n", + " attributes = Dict(\"Young\" => 90, \"Poisson\" => 0.25)\n", " Logging.debug(\"Creating elements\")\n", " el = Element(1, nodes, coordinates, attributes)\n", + "\n", + " # Initialize elements ready for solution\n", + " el.attributes[\"displacement\"] = zeros(2, 4)\n", + " el.attributes[\"displacement nodal force\"] = zeros(2, 4)\n", + " el.attributes[\"displacement tangent stiffness\"] = zeros(8, 8)\n", + "\n", " for i=1:10\n", " Logging.debug(\"Starting iteration $i\")\n", " ass = Assembly(Int64[], Int64[], Float64[], Int64[], Float64[], Dict{Int64,Array{Int64,1}}())\n", " ass.gdofs[el.id] = [1, 2, 3, 4, 5, 6, 7, 8]\n", " Logging.debug(\"Assembling\")\n", " assemble_element!(ass, el)\n", - " Logging.debug(\"Solving\")\n", - " du = zeros(2, 4) # must be determined from ass\n", + "\n", + " # Boundary conditions\n", " F = [0 0; 0 -2; 0 0; 0 0]'\n", + " F = reshape(F, prod(size(F)))\n", " free_dofs = [1, 2, 3, 4]\n", "\n", " # solution\n", " K = sparse(ass.I, ass.J, ass.A)\n", " R = full(sparsevec(ass.i, ass.b))\n", - " R = reshape(R, (2, round(Int, length(R)/2)))\n", - " du[free_dofs] = K[free_dofs, free_dofs] \\ -(R - F)[free_dofs]\n", + " R = R - F\n", + " du = zeros(8) # must be determined from ass\n", + " du[free_dofs] = K[free_dofs, free_dofs] \\ -R[free_dofs]\n", "\n", " Logging.debug(\"Solution norm = $(norm(du))\")\n", - " #Logging.debug(\"Solution increment = \\n$du\")\n", "\n", " # update solution back to elements\n", " eldu = du[ass.gdofs[el.id]]\n", @@ -615,269 +613,253 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Seems to be working. But we still need to handle boundary conditions more \"cleverly\" and generalize assembly to several elements (which is not problem)." + "Seems to be working. But we still need to handle boundary conditions more \"cleverly\" and generalize assembly to several elements (which is not problem).\n", + "\n", + "First of all, essential boundary conditions are nothing more than equality constraints saying that value for some degree of freedom is fixed. Elimination is just a special case when this value equals to zero. There is couple of different strategies to handle essential boundary conditions. One option is to force them using Lagrange multipliers which can also be used to create all kind of kinematic constraints also. (For example, contact can be considered as a kinematic constraint.) Another option is to manipulate matrix such a way that constraint is satisfied.\n", + "\n", + "Because we are now going \"bottom-up\", we develop something extremely simple that however deals with the problem:" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 12, "metadata": { "collapsed": false }, + "outputs": [], + "source": [ + "type BC\n", + " dofs :: Array{Int64, 1}\n", + " values :: Array{Float64, 1}\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "collapsed": false, + "scrolled": false + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Converged\n" + "solve one element problem\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "01-Aug 20:51:27:DEBUG:root:Creating nodes\n", + "01-Aug 20:51:27:DEBUG:root:Creating elements\n", + "01-Aug 20:51:27:DEBUG:root:Problem size = 8\n", + "01-Aug 20:51:27:DEBUG:root:Starting iteration 1\n", + "01-Aug 20:51:27:DEBUG:root:Assembling\n", + "01-Aug 20:51:27:DEBUG:root:Adding Dirichlet boundary conditions\n", + "01-Aug 20:51:27:DEBUG:root:dof 5 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 6 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 7 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 8 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "01-Aug 20:51:27:DEBUG:root:Adding Neumann boundary conditions\n", + "01-Aug 20:51:27:DEBUG:root:Solving system of equations. Total size = 12\n", + "01-Aug 20:51:27:DEBUG:root:Solution norm = 3.0900221367289444\n", + "01-Aug 20:51:27:DEBUG:root:Starting iteration 2\n", + "01-Aug 20:51:27:DEBUG:root:Assembling\n", + "01-Aug 20:51:27:DEBUG:root:Adding Dirichlet boundary conditions\n", + "01-Aug 20:51:27:DEBUG:root:dof 5 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 6 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 7 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 8 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "01-Aug 20:51:27:DEBUG:root:Adding Neumann boundary conditions\n", + "01-Aug 20:51:27:DEBUG:root:Solving system of equations. Total size = 12\n", + "01-Aug 20:51:27:DEBUG:root:Solution norm = 0.32121316021534363\n", + "01-Aug 20:51:27:DEBUG:root:Starting iteration 3\n", + "01-Aug 20:51:27:DEBUG:root:Assembling\n", + "01-Aug 20:51:27:DEBUG:root:Adding Dirichlet boundary conditions\n", + "01-Aug 20:51:27:DEBUG:root:dof 5 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 6 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 7 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 8 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "01-Aug 20:51:27:DEBUG:root:Adding Neumann boundary conditions\n", + "01-Aug 20:51:27:DEBUG:root:Solving system of equations. Total size = 12\n", + "01-Aug 20:51:27:DEBUG:root:Solution norm = 0.04043178194002483\n", + "01-Aug 20:51:27:DEBUG:root:Starting iteration 4\n", + "01-Aug 20:51:27:DEBUG:root:Assembling\n", + "01-Aug 20:51:27:DEBUG:root:Adding Dirichlet boundary conditions\n", + "01-Aug 20:51:27:DEBUG:root:dof 5 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 6 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 7 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 8 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "01-Aug 20:51:27:DEBUG:root:Adding Neumann boundary conditions\n", + "01-Aug 20:51:27:DEBUG:root:Solving system of equations. Total size = 12\n", + "01-Aug 20:51:27:DEBUG:root:Solution norm = 0.0009291101052060104\n", + "01-Aug 20:51:27:DEBUG:root:Starting iteration 5\n", + "01-Aug 20:51:27:DEBUG:root:Assembling\n", + "01-Aug 20:51:27:DEBUG:root:Adding Dirichlet boundary conditions\n", + "01-Aug 20:51:27:DEBUG:root:dof 5 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 6 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 7 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 8 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "01-Aug 20:51:27:DEBUG:root:Adding Neumann boundary conditions\n", + "01-Aug 20:51:27:DEBUG:root:Solving system of equations. Total size = 12\n", + "01-Aug 20:51:27:DEBUG:root:Solution norm = 1.563889898905983e-7\n", + "01-Aug 20:51:27:DEBUG:root:Starting iteration 6\n", + "01-Aug 20:51:27:DEBUG:root:Assembling\n", + "01-Aug 20:51:27:DEBUG:root:Adding Dirichlet boundary conditions\n", + "01-Aug 20:51:27:DEBUG:root:dof 5 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 6 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 7 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:dof 8 => 0.0\n", + "01-Aug 20:51:27:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "01-Aug 20:51:27:DEBUG:root:Adding Neumann boundary conditions\n", + "01-Aug 20:51:27:DEBUG:root:Solving system of equations. Total size = 12\n", + "01-Aug 20:51:27:DEBUG:root:Solution norm = 1.2782462771683917e-14\n", + "01-Aug 20:51:27:DEBUG:root:Converged in 4 iterations.\n", + "01-Aug 20:51:27:DEBUG:root:Displacement of element = \n", + "[-0.3991450609547439 -0.07228582695592495 0.0 0.0\n", + " -2.1779892317073513 -2.2222447544017654 0.0 0.0]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 fact verified.\n" ] }, { "data": { "text/plain": [ - "2x4 Array{Float64,2}:\n", - " 0.0 -0.399145 -0.0722858 0.0\n", - " 0.0 -2.17799 -2.22224 0.0" + "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 2, + "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "#(X, u, du, elmap, nodalloads, dirichletbc,\n", - "# la, mu, N, dNdξ, ipoints, iweights) = one_elem_fixture()\n", - "function solve_one_element()\n", + "function solve!(elements, neumann_bcs, dirichlet_bcs; dofs=2, max_iterations=10)\n", "\n", - " # create nodes separately ...\n", + " # Initialize elements ready for solution\n", + " for el in elements\n", + " el.attributes[\"displacement\"] = zeros(2, 4)\n", + " el.attributes[\"displacement nodal force\"] = zeros(2, 4)\n", + " el.attributes[\"displacement tangent stiffness\"] = zeros(8, 8)\n", + " end\n", "\n", - " # .. or create somewhat simpler syntax\n", - " # nodes = Dict(1 => [0.0, 0.0], 2 => [10.0, 0.0], 3 => [10.0, 1.0], 4 => [0.0, 1.0])\n", - " # add_nodes(m, \"NALL\", nodes)\n", + " # Assign global dofs for elements\n", + " gdofs = Dict{Int64,Array{Int64,1}}()\n", + " pdim = 1\n", + " for el in elements\n", + " edofs = length(el.nodes)*dofs-1\n", + " gdofs[el.id] = pdim:pdim+edofs\n", + " pdim += edofs\n", + " end\n", + " Logging.debug(\"Problem size = $pdim\")\n", "\n", - " # create element (hard way)\n", - " e = new_element()\n", - " set_element_id(1)\n", - " set_node_ids(e, [1, 2, 3, 4])\n", + " ass = Assembly(Int64[], Int64[], Float64[], Int64[], Float64[], gdofs)\n", "\n", - " # we can set function spaces and integration schema for element-wise ...\n", - " set_function_space(e, \"Lagrange(1)\") # use linear Lagrange function space to approximate unknown field\n", - " set_integration_schema(e, \"FPG4\") # use four integration points\n", - " # or for model as a \"default value\"\n", - " # set_function_space(m, \"Lagrange\", 1)\n", - " # set_integration_schema(m, \"FPG4\")\n", - "\n", - " # set necessary material parameters\n", - " E = 90\n", - " nu = 0.25\n", - " mu = E/(2*(1+nu))\n", - " la = E*nu/((1+nu)*(1-2*nu))\n", - " la = 2*la*mu/(la + 2*mu)\n", - "\n", - " # we can add attribute for each element node ...\n", - " #add_attribute(e, \"lambda\", [la, la, la, la])\n", - " #add_attribute(e, \"mu\", [mu, mu, mu, mu])\n", - " # or just one for each element ...\n", - " add_attribute(e, \"lambda\", lambda)\n", - " add_attribute(e, \"mu\", mu)\n", - " # .. or just for model as a default value\n", - " # add_attribute(m, \"lambda\", lambda)\n", - " # add_attribute(m, \"mu\", mu)\n", - " # note that we don't assign attributes to nodes here so we can describe discontinous fields\n", - " # in attributes\n", - "\n", - " # or we can use convenient syntax\n", - " # e = new_element(element_id=1, node_ids=[1, 2, 3, 4], function_space=\"Lagrange(1)\",\n", - " # integration_schema=\"FPG4\", attributes=Dict(\"lambda\" => lambda, \"mu\" => mu))\n", - "\n", - " elements = [e]\n", - " add_elements(m, \"EALL\", elements)\n", - "\n", - " # boundary conditions are always assignet to sets\n", - "\n", - " # element boundary conditions\n", - " \n", - " # add load for element surface S1 in normal-tangential coordinate system\n", - " # add_attribute(e, \"displacement S1 normal load\", 1)\n", - " # add load for element surface S1 from -1 to -2\n", - " # add_attribute(e, \"displacement S1 load\", [-1, -2])\n", - "\n", - " # nodal boundary conditions\n", - " # add neumann boundary condition to node 3, in y direction\n", - " add_attribute(n3, \"displacement 2 load\", -2)\n", - " # add dirichlet boundary condition to nodes 1 and 2 (encastre)\n", - " add_attribute(n1, \"displacement\", [0.0, 0.0])\n", - " # or\n", - " # add_attribute(n1, \"displacement 1\", 0.0)\n", - " # add_attribute(n1, \"displacement 2\", 0.0)\n", - " add_attribute(n2, \"displacement\", [0.0, 0.0])\n", - " # or, for example, add dirichlet boundary conditions in directions 1 and 3 for node\n", - " #add_attribute(n2, \"displacement 1,3\", [0.0, 1.0])\n", - " # or fix all dofs of a nodes in nodeset \"SUPPORT\"\n", - " # support_bc = add_nodeset(m, \"SUPPORT\", [n1, n2])\n", - " # add_attribute(support_bc, \"displacement\", 0)\n", - "\n", - "\n", - "\n", - " # Everything is very general so far. Datamodel is well defined and in this point\n", - " # we can save or load it to disk\n", - "\n", - " # save_model(m, \"mymodel\") # save model to xml/h5 (Xdmf)\n", - " # m = load_model(\"mymodel\") # load model from file\n", - "\n", - " \n", - " # END OF MODEL DEFINITON\n", - " \n", - " # Now we kick in elasticity iterations and solve displacement\n", - " # field but of course it could be something else too\n", - "\n", - "\n", - " # m1, m2 = make_domain_decomposition(parts=2, keep_in_one_domain=[\"CONTACT_BOUNDARY\"])\n", - "\n", - "\n", - " \n", - " # In newton iteration, there might be situations where we just want to update RHS\n", - " # like in radiation problems, it makes no sense to update stiffness matrix in that\n", - " # case. For this reason local element matrix and force vector can be updated both\n", - " # or just one of them. This time we don't have anything nonlinear in RHS so we can\n", - " # calculate it outside of iteration loop\n", - " p = new_problem(\"displacement\")\n", - " \n", - " RHS = zeros(length(nodes)*dofs)\n", - " \n", - " for i=1:10\n", + " for i=1:max_iterations\n", + " Logging.debug(\"Starting iteration $i\")\n", + " ass.I = []\n", + " ass.J = []\n", + " ass.A = []\n", + " ass.i = []\n", + " ass.b = []\n", " \n", - " solve_elasticity_increment!(X, u, du, elmap, nodalloads, dirichletbc,\n", - " la, mu, N, dNdξ, ipoints, iweights)\n", - " u += du\n", - " if norm(du) < 1.0e-9\n", - " println(\"Converged\")\n", + " Logging.debug(\"Assembling\")\n", + " for el in elements\n", + " assemble_element!(ass, el)\n", + " end\n", + "\n", + " Logging.debug(\"Adding Dirichlet boundary conditions\")\n", + " # Dirichlet boundary conditions\n", + " i = 1\n", + " for bc in dirichlet_bcs\n", + " for (dof, val) in zip(bc.dofs, bc.values)\n", + " Logging.debug(\"dof $dof => $val\")\n", + " push!(ass.I, dof)\n", + " push!(ass.J, pdim+i)\n", + " push!(ass.A, 1)\n", + " push!(ass.I, pdim+i)\n", + " push!(ass.J, dof)\n", + " push!(ass.A, 1)\n", + " push!(ass.i, pdim+i)\n", + " push!(ass.b, 0)\n", + " i += 1\n", + " end\n", + " end\n", + " i -= 1\n", + " Logging.debug(\"Added $i Lagrange multipliers to model\")\n", + "\n", + " Logging.debug(\"Adding Neumann boundary conditions\")\n", + " F = zeros(pdim+i)\n", + " # Neumann boundary conditions\n", + " for bc in neumann_bcs\n", + " for (dof, val) in zip(bc.dofs, bc.values)\n", + " F[dof] += val\n", + " end\n", + " end\n", + "\n", + " Logging.debug(\"Solving system of equations. Total size = $(pdim+i)\")\n", + " # solution\n", + " K = sparse(ass.I, ass.J, ass.A)\n", + " R = full(sparsevec(ass.i, ass.b))\n", + " R = R - F\n", + " #println(full(K))\n", + " #println(R)\n", + "\n", + " du = K \\ -R\n", + "\n", + " solnorm = norm(du[1:pdim])\n", + " Logging.debug(\"Solution norm = $solnorm\")\n", + "\n", + " # update solution back to elements\n", + " for el in elements\n", + " eldu = du[ass.gdofs[el.id]]\n", + " eldu = reshape(eldu, (2, round(Int, length(eldu)/2)))\n", + " el.attributes[\"displacement\"] += eldu\n", + " end\n", + " if solnorm < 1.0e-9\n", + " Logging.debug(\"Converged in $i iterations.\")\n", " break\n", " end\n", " end\n", - " return u\n", + "\n", "end\n", "\n", - "u" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "\"\"\"\n", - "#### Parameters\n", - "X : Array{Float64, 2}\n", - " \n", - "\"\"\"\n", - "function solve_elasticity_increment!(X, u, du, elmap, nodalloads,\n", - " dirichletbc, lambda, mu, N, dNdchi, ipoints,\n", - " iweights)\n", - " if length(size(elmap)) == 1\n", - " # quick hack for just one element\n", - " elmap = elmap''\n", - " end\n", - " nelnodes, nelements = size(elmap)\n", - " dim, nnodes = size(u)\n", - " dofs = dim*nelnodes\n", - "\n", - " Imat = Int64[]\n", - " Jmat = Int64[]\n", - " Vmat = Float64[]\n", - " Ivec = Int64[]\n", - " Vvec = Float64[]\n", - "\n", - " # FIXME: different number of nodes/element\n", - " R = zeros(dim, nelnodes)\n", - " Kt = zeros(dofs, dofs)\n", - "\n", - " # this can be parallelized\n", - " for i in 1:nelements\n", - " eldofs = elmap[:,i]\n", - " calc_local_matrices!(X[:, eldofs], u[:, eldofs], R, Kt, N, dNdchi,\n", - " lambda[eldofs], mu[eldofs], ipoints, iweights)\n", - " assemble!(Kt, eldofs, Imat, Jmat, Vmat)\n", - " assemble!(R, eldofs, Ivec, Vvec)\n", - " end\n", - "\n", - " # add additional neumann boundary conditions to force vector\n", - " for (i, nodal_load) in enumerate(nodalloads)\n", - " if nodal_load == 0\n", - " continue\n", - " end\n", - " push!(Ivec, i)\n", - " push!(Vvec, -nodal_load)\n", - " end\n", - "\n", - " # Create sparse matrix and vector\n", - " A = sparse(Imat, Jmat, Vmat)\n", - " b = sparsevec(Ivec, Vvec)\n", - "\n", - " # Remove dirichlet boundary conditions\n", - " free_dofs = find(isnan(dirichletbc))\n", - " #Imat, Jmat, Vmat = eliminate_boundary_conditions(dirichletbc, Imat, Jmat, Vmat)\n", - " b = b[free_dofs]\n", - " A = A[free_dofs, free_dofs]\n", - "\n", - " # solution\n", - " du[free_dofs] = lufact(A) \\ -full(b)\n", - "end\n", - "\n", - "function one_elem_fixture()\n", - " X = [0.0 0.0; 10.0 0.0; 10.0 1.0; 0.0 1.0]'\n", - " elmap = [1; 2; 3; 4]\n", - " nodalloads = [0 0; 0 0; 0 -2; 0 0]'\n", - " dirichletbc = [0 0; NaN NaN; NaN NaN; 0 0]'\n", - "\n", - " E = 90\n", - " nu = 0.25\n", - " mu = E/(2*(1+nu))\n", - " la = E*nu/((1+nu)*(1-2*nu))\n", - " la = 2*la*mu/(la + 2*mu)\n", - "\n", - " la = la*ones(1, 4)\n", - " mu = mu*ones(1, 4)\n", - " u = zeros(2, 4)\n", - " du = zeros(2, 4)\n", - "\n", - " N(xi) = [\n", - " (1-xi[1])*(1-xi[2])/4\n", - " (1+xi[1])*(1-xi[2])/4\n", - " (1+xi[1])*(1+xi[2])/4\n", - " (1-xi[1])*(1+xi[2])/4\n", - " ]\n", - "\n", - " dNdξ(ξ) = [-(1-ξ[2])/4.0 -(1-ξ[1])/4.0\n", - " (1-ξ[2])/4.0 -(1+ξ[1])/4.0\n", - " (1+ξ[2])/4.0 (1+ξ[1])/4.0\n", - " -(1+ξ[2])/4.0 (1-ξ[1])/4.0]\n", - "\n", - " ipoints = 1/sqrt(3)*[-1 -1; 1 -1; 1 1; -1 1]\n", - " iweights = [1 1 1 1]\n", - "\n", - " return (X, u, du, elmap, nodalloads, dirichletbc,\n", - " la, mu, N, dNdξ, ipoints, iweights)\n", + "facts(\"solve one element problem\") do\n", + " # Create model\n", + " Logging.debug(\"Creating nodes\")\n", + " n1 = Node(1, Int64[])\n", + " n2 = Node(2, Int64[])\n", + " n3 = Node(3, Int64[])\n", + " n4 = Node(4, Int64[])\n", + " nodes = [n1.id, n2.id, n3.id, n4.id]\n", + " coordinates = [10.0 0.0; 10.0 1.0; 0.0 1.0; 0.0 0.0]'\n", + " attributes = Dict(\"Young\" => 90, \"Poisson\" => 0.25)\n", + " Logging.debug(\"Creating elements\")\n", + " el = Element(1, nodes, coordinates, attributes)\n", + " elements = [el]\n", + " # Boundary conditions\n", + " bc1 = BC([4], [-2.0]) # force boundary condition, third dof -2\n", + " bc2 = BC([5, 6, 7, 8], [0.0, 0.0, 0.0, 0.0]) # dirichlet bc, set dx=dy=0 on support\n", + " solve!(elements, [bc1], [bc2]; max_iterations=7)\n", + " disp = elements[1].attributes[\"displacement\"]\n", + " Logging.debug(\"Displacement of element = \\n$disp\")\n", + " @fact norm(disp) => roughly(3.1292483947150043)\n", "end" ] }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "u3d = [u; 0 0 0 0] # extend to 3d vector field\n", - "X3d = [X; 0 0 0 0]\n", - "elmap2 = [0x5; elmap]'';" - ] - }, { "cell_type": "code", "execution_count": 4, From 4b83df754c9bbc049c93fbd043e2ebf53c171c4a Mon Sep 17 00:00:00 2001 From: arilaakk Date: Mon, 3 Aug 2015 15:14:37 +0300 Subject: [PATCH 05/26] Updated the contributing instructions, added styling --- CONTRIBUTING.rst | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 97eb5f3..06b45de 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -12,17 +12,31 @@ https://github.com/JuliaLang/julia/blob/master/CONTRIBUTING.md How to contribute ----------------- Here are the basic steps for contributing to JuliaFEM: -1) Create an account or sign in to GitHub -2) Install Git to your computer -3) Fork Julia to your repository (https://github.com/JuliaLang/julia) -4) Build Julia (v0.4+) to your computer -5) Fork JuliaFEM to your repository -6) Use Pkg.add() or git clone to access JuliaFEM -7) Make your contribution to the project -8) Add all updated files to the staging area: git add . -9) Commit the files to your repository and add a description message: -git commit -m "your_message_here" -10) At your repository, create a pull request + +1) Create an account or sign in to `GitHub `_. + +2) Go to `Git home page `_ and download the Git installer. Run the installer to get Git on your computer. It is a version control system used by GitHub. To learn its basics, go through this `Git tutorial `_. + +3) Install Julia (v0.4+) to your computer. At `Julia readme +`_ you'll find complete instructions for installing it for your platform. + +4) Go to the `JuliaFEM GitHub page `_. At the top-right corner, press the ``Fork``-button to fork your own copy of JuliaFEM to your repository. + +5) Clone JuliaFEM from your repository to your computer. Navigate to the folder you want to clone it to, and type the following command (inserting your GitHub username to its place): +``git clone https://github.com/your_github_username/JuliaFEM.jl.git`` + +6) You can now navigate to JuliaFEM in the folder you chose at step 5. There you'll find the same contents as you see in your GitHub JuliaFEM repository. Now, locate the file you want to modify, open it with your desired text editor, make the changes and save the new version. If you type ``git status``, you'll see that the files you've created or modified are listed under ``untracked files``. + +7) Add the files you want to update to the staging area by typing ``git add ...``. If you type ``git status``, you'll see that the files added to the staging area are listed under ``Changes to be committed``. This process also supports wildcard symbols. If you want to add all the files to the staging area, just type ``git add .``. If you want to remove a file from the staging area, type ``git reset ``. + +8) To store the staged files, commit the files to your repository and add a description message by typing ``git commit -m "your_message_here"``. The message should describe the changes that were made. + +9) When you are happy with the commits and want to update them to your repository, type ``git push origin master``. + +10) Go to your GitHub JuliaFEM repository. You'll notice that the commit you have made and pushed is now visible above the JuliaFEM file branch. If you click the ``latest commit`` link, you can see the changes made to the file. Finally, click ``Pull request`` to create a pull request of the commits you've made, so that other contributors can review it. + +11) If other contributors ask you to make changes to your pull request, just repeat steps 6-9. Your commits will be updated to your original pull request. Do this until everyone is satisfied and your pull request can be merged to the master branch. + Developing ---------- From b5784b168dfc01babf4841be387d67a2f20c4bf2 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Sat, 8 Aug 2015 21:21:23 +0300 Subject: [PATCH 06/26] Update elasticity_solver.jl --- src/elasticity_solver.jl | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/elasticity_solver.jl b/src/elasticity_solver.jl index 47245f0..1283260 100644 --- a/src/elasticity_solver.jl +++ b/src/elasticity_solver.jl @@ -12,6 +12,37 @@ VERSION < v"0.4-" && using Docile # directly if needed or using general interface combining data model and # solver. +""" +This is dummy function. Testing doctests and documentation. + +Parameters +---------- +x : Array{Float64, 1} + +Returns +------- +Array{float64, 1} + x + 1 + +Notes +----- +This is dummy function + +Raises +------ +Exception + if things are not going right + +Examples +-------- +>>> a = [1.0, 2.0, 3.0] +>>> dummy(a) +[2.0, 3.0, 4.0] +""" +function dummy(a) + return a+1 +end + """ Interpolate field variable using basis functions f for point ip. From 5e1badabe1aca587bf0ec327b145ffd712a99e80 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Sun, 9 Aug 2015 22:06:59 +0300 Subject: [PATCH 07/26] Update elasticity_solver.jl --- src/elasticity_solver.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/elasticity_solver.jl b/src/elasticity_solver.jl index 1283260..5386d2e 100644 --- a/src/elasticity_solver.jl +++ b/src/elasticity_solver.jl @@ -40,6 +40,7 @@ Examples [2.0, 3.0, 4.0] """ function dummy(a) + # not doing anything useful. return a+1 end From 1aa1ccb4c13164255d8f52ab802fe56e13126357 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Mon, 10 Aug 2015 23:01:44 +0300 Subject: [PATCH 08/26] still wondering, does not converge --- .gitignore | 1 + ...2015-06-25-elasticity-solver-example.ipynb | 1484 ++++++++++++----- 2 files changed, 1110 insertions(+), 375 deletions(-) diff --git a/.gitignore b/.gitignore index d918ec5..6ad4124 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *~ .DS_Store .ipynb_checkpoints +docs/build/html diff --git a/notebooks/2015-06-25-elasticity-solver-example.ipynb b/notebooks/2015-06-25-elasticity-solver-example.ipynb index c50297c..c999049 100644 --- a/notebooks/2015-06-25-elasticity-solver-example.ipynb +++ b/notebooks/2015-06-25-elasticity-solver-example.ipynb @@ -11,6 +11,15 @@ "**Abstract**: A workflow to solve typical elasticity problem. This document also tries to give some quidelines how to develop JuliaFEM." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Bottom-up design\n", + "\n", + "We go piece by piece starting from something simple and going up to more complicated programming model." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -58,7 +67,7 @@ "\n", "*Design principle 5*: we use 4 space indentation like in Python.\n", "\n", - "First we write some elementary functions to calculate stiffness matrix. Our development direction is \"bottom-up\" to interface." + "First we write some elementary functions to calculate stiffness matrix." ] }, { @@ -191,16 +200,16 @@ "name": "stderr", "output_type": "stream", "text": [ - "01-Aug 14:05:35:DEBUG:root:Converged in 6 iterations.\n", - "01-Aug 14:05:36:DEBUG:root:solution vector: \n", + "10-Aug 19:18:44:DEBUG:root:Converged in 6 iterations.\n", + "10-Aug 19:18:45:DEBUG:root:solution vector: \n", " [0.0 -0.39914506095474317 -0.07228582695592449 0.0\n", " 0.0 -2.1779892317073504 -2.222244754401764 0.0]\n", - "01-Aug 14:05:36:DEBUG:root:norm of u: 3.1292483947150043\n", - "01-Aug 14:05:37:DEBUG:root:Converged in 6 iterations.\n", - "01-Aug 14:05:37:DEBUG:root:solution vector: \n", + "10-Aug 19:18:45:DEBUG:root:norm of u: 3.1292483947150043\n", + "10-Aug 19:18:45:DEBUG:root:Converged in 6 iterations.\n", + "10-Aug 19:18:45:DEBUG:root:solution vector: \n", " [0.0 0.7433248532717793 1.0485210147234858 0.0\n", " 0.0 -2.085766534304891 -1.9606633242166027 0.0]\n", - "01-Aug 14:05:37:DEBUG:root:norm of u: 3.129248394715006\n" + "10-Aug 19:18:45:DEBUG:root:norm of u: 3.129248394715006\n" ] }, { @@ -301,16 +310,16 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [], "source": [ - "type Node\n", - " id :: Int\n", - " elements :: Array{Int64, 1}\n", - "end" + "#type Node\n", + "# id :: Int\n", + "# #elements :: Array{Int64, 1}\n", + "#end" ] }, { @@ -323,7 +332,7 @@ "source": [ "type Element\n", " id :: Int\n", - " nodes :: Array{Int64, 1}\n", + " node_ids :: Array{Int64, 1}\n", " coordinates :: Array{Float64, 2}\n", " attributes :: Dict{ASCIIString, Any}\n", "end" @@ -352,7 +361,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 56, "metadata": { "collapsed": false }, @@ -360,10 +369,10 @@ { "data": { "text/plain": [ - "get_shape_functions (generic function with 1 method)" + "get_integration_scheme (generic function with 2 methods)" ] }, - "execution_count": 8, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" } @@ -382,6 +391,7 @@ "\"\"\"\n", "function get_shape_functions(el::Element)\n", " ndim, nnodes = size(el.coordinates)\n", + " #Logging.debug(\"ndim = $ndim, nnodes=$nnodes\")\n", " if (nnodes == 4) & (ndim == 2)\n", " basis(xi) = [\n", " (1-xi[1])*(1-xi[2])/4\n", @@ -393,45 +403,56 @@ " (1+xi[2])/4.0 (1+xi[1])/4.0\n", " -(1+xi[2])/4.0 (1-xi[1])/4.0]\n", " return basis, dbasis\n", + " elseif (nnodes == 10) & (ndim == 3)\n", + " basis(xi) = [(xi[1] + xi[2] + xi[3] - 1)*(2*xi[1] + 2*xi[2] + 2*xi[3] - 1)\n", + " -xi[1]*(-2*xi[1] + 1)\n", + " -xi[2]*(-2*xi[2] + 1)\n", + " -xi[3]*(-2*xi[3] + 1)\n", + " 4*xi[1]*(-xi[1] - xi[2] - xi[3] + 1)\n", + " 4*xi[1]*xi[2]\n", + " 4*xi[2]*(-xi[1] - xi[2] - xi[3] + 1)\n", + " 4*xi[1]*xi[3]\n", + " 4*xi[2]*xi[3]\n", + " 4*xi[3]*(-xi[1] - xi[2] - xi[3] + 1)]\n", + "\n", + " dbasis(xi) = [\n", + " 4*xi[1] + 4*xi[2] + 4*xi[3] - 3 4*xi[1] + 4*xi[2] + 4*xi[3] - 3 4*xi[1] + 4*xi[2] + 4*xi[3] - 3\n", + " 4*xi[1] - 1 0 0\n", + " 0 4*xi[2] - 1 0\n", + " 0 0 4*xi[3] - 1\n", + " -8*xi[1] - 4*xi[2] - 4*xi[3] + 4 -4*xi[1] -4*xi[1]\n", + " 4*xi[2] 4*xi[1] 0\n", + " -4*xi[2] -4*xi[1] - 8*xi[2] - 4*xi[3] + 4 -4*xi[2]\n", + " 4*xi[3] 0 4*xi[1]\n", + " 0 4*xi[3] 4*xi[2]\n", + " -4*xi[3] -4*xi[3] -4*xi[1] - 4*xi[2] - 8*xi[3] + 4]\n", + " return basis, dbasis\n", " end\n", - " throw(\"Unknown function space\")\n", - "end" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "get_integration_scheme (generic function with 2 methods)" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ + " throw(\"Unknown function space, ndim=$ndim, nnodes=$nnodes\")\n", + "end\n", + "\n", "\"\"\"\n", "\"\"\"\n", "function get_integration_scheme(el::Element, order=2)\n", " ndim, nnodes = size(el.coordinates)\n", - " if (nnodes == 4) & (order == 2)\n", + " if (nnodes == 4) & (order == 2) & (ndim == 2)\n", " ipoints = 1/sqrt(3)*[-1 -1; 1 -1; 1 1; -1 1]\n", " iweights = [1, 1, 1, 1]\n", " return ipoints, iweights\n", + " elseif (nnodes == 10) & (order == 2) & (ndim == 3) # c3d10\n", + " # from code aster documentation\n", + " a = 1/20*(5-sqrt(5))\n", + " b = 1/20*(5+3*sqrt(5))\n", + " ipoints = [a a a; a a b; a b a; b a a]\n", + " iweights = 1/24*[1 1 1 1]\n", + " return ipoints, iweights\n", " end\n", "end" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 79, "metadata": { "collapsed": false }, @@ -442,7 +463,7 @@ "assemble_element! (generic function with 2 methods)" ] }, - "execution_count": 10, + "execution_count": 79, "metadata": {}, "output_type": "execute_result" } @@ -464,6 +485,7 @@ " K = el.attributes[\"displacement tangent stiffness\"]\n", "\n", " gdofs = ass.gdofs[el.id]\n", + " Logging.debug(\"Assemble element to gdofs $gdofs\")\n", " basis, dbasis = get_shape_functions(el)\n", " ipoints, iweights = get_integration_scheme(el, io)\n", " calc_local_matrices!(X, u, R, K, basis, dbasis, la, mu, ipoints, iweights)\n", @@ -494,7 +516,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 58, "metadata": { "collapsed": false }, @@ -510,63 +532,65 @@ "name": "stderr", "output_type": "stream", "text": [ - "01-Aug 14:07:09:DEBUG:root:Creating nodes\n", - "01-Aug 14:07:09:DEBUG:root:Creating elements\n", - "01-Aug 14:07:09:DEBUG:root:Starting iteration 1\n", - "01-Aug 14:07:09:DEBUG:root:Assembling\n", - "01-Aug 14:07:10:DEBUG:root:Solution norm = 3.090022136728999\n", - "01-Aug 14:07:10:DEBUG:root:Starting iteration 2\n", - "01-Aug 14:07:10:DEBUG:root:Assembling\n", - "01-Aug 14:07:10:DEBUG:root:Solution norm = 0.3212131602153504\n", - "01-Aug 14:07:10:DEBUG:root:Starting iteration 3\n", - "01-Aug 14:07:10:DEBUG:root:Assembling\n", - "01-Aug 14:07:10:DEBUG:root:Solution norm = 0.040431781940005365\n", - "01-Aug 14:07:10:DEBUG:root:Starting iteration 4\n", - "01-Aug 14:07:10:DEBUG:root:Assembling\n", - "01-Aug 14:07:10:DEBUG:root:Solution norm = 0.0009291101052064257\n", - "01-Aug 14:07:10:DEBUG:root:Starting iteration 5\n", - "01-Aug 14:07:10:DEBUG:root:Assembling\n", - "01-Aug 14:07:10:DEBUG:root:Solution norm = 1.5638899025378415e-7\n", - "01-Aug 14:07:10:DEBUG:root:Starting iteration 6\n", - "01-Aug 14:07:10:DEBUG:root:Assembling\n", - "01-Aug 14:07:10:DEBUG:root:Solution norm = 1.0355045356935844e-14\n", - "01-Aug 14:07:10:DEBUG:root:Converged in 6 iterations.\n", - "01-Aug 14:07:10:DEBUG:root:Displacement of element = \n", + "10-Aug 21:03:06:DEBUG:root:Adding nodes to array\n", + "10-Aug 21:03:06:DEBUG:root:Creating elements\n", + "10-Aug 21:03:06:DEBUG:root:Starting iteration 1\n", + "10-Aug 21:03:06:DEBUG:root:Assembling\n", + "10-Aug 21:03:06:DEBUG:root:Solution norm = 3.090022136728999\n", + "10-Aug 21:03:06:DEBUG:root:Starting iteration 2\n", + "10-Aug 21:03:06:DEBUG:root:Assembling\n", + "10-Aug 21:03:06:DEBUG:root:Solution norm = 0.3212131602153504\n", + "10-Aug 21:03:06:DEBUG:root:Starting iteration 3\n", + "10-Aug 21:03:06:DEBUG:root:Assembling\n", + "10-Aug 21:03:06:DEBUG:root:Solution norm = 0.040431781940005365\n", + "10-Aug 21:03:06:DEBUG:root:Starting iteration 4\n", + "10-Aug 21:03:06:DEBUG:root:Assembling\n", + "10-Aug 21:03:06:DEBUG:root:Solution norm = 0.0009291101052064257\n", + "10-Aug 21:03:06:DEBUG:root:Starting iteration 5\n", + "10-Aug 21:03:06:DEBUG:root:Assembling\n", + "10-Aug 21:03:06:DEBUG:root:Solution norm = 1.5638899025378415e-7\n", + "10-Aug 21:03:06:DEBUG:root:Starting iteration 6\n", + "10-Aug 21:03:06:DEBUG:root:Assembling\n", + "10-Aug 21:03:06:DEBUG:root:Solution norm = 1.0355045356935844e-14\n", + "10-Aug 21:03:06:DEBUG:root:Converged in 6 iterations.\n", + "10-Aug 21:03:06:DEBUG:root:Displacement of element = \n", "[-0.39914506095474334 -0.07228582695592464 0.0 0.0\n", " -2.1779892317073504 -2.222244754401764 0.0 0.0]\n" ] }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1 fact verified.\n" - ] - }, { "data": { "text/plain": [ "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 11, + "execution_count": 58, "metadata": {}, "output_type": "execute_result" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 fact verified.\n" + ] } ], "source": [ "facts(\"one element assembly\") do\n", " # Create model\n", - " Logging.debug(\"Creating nodes\")\n", - " n1 = Node(1, Int64[])\n", - " n2 = Node(2, Int64[])\n", - " n3 = Node(3, Int64[])\n", - " n4 = Node(4, Int64[])\n", - " nodes = [n1.id, n2.id, n3.id, n4.id]\n", + " #Logging.debug(\"Creating nodes\")\n", + " #n1 = Node(1)\n", + " #n2 = Node(2)\n", + " #n3 = Node(3)\n", + " #n4 = Node(4)\n", + " Logging.debug(\"Adding nodes to array\")\n", + " #nodes = [n1.id, n2.id, n3.id, n4.id]\n", + " node_ids = [1, 2, 3, 4]\n", " coordinates = [10.0 0.0; 10.0 1.0; 0.0 1.0; 0.0 0.0]'\n", " attributes = Dict(\"Young\" => 90, \"Poisson\" => 0.25)\n", " Logging.debug(\"Creating elements\")\n", - " el = Element(1, nodes, coordinates, attributes)\n", + " el = Element(1, node_ids, coordinates, attributes)\n", "\n", " # Initialize elements ready for solution\n", " el.attributes[\"displacement\"] = zeros(2, 4)\n", @@ -622,7 +646,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": { "collapsed": false }, @@ -636,7 +660,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 82, "metadata": { "collapsed": false, "scrolled": false @@ -653,86 +677,704 @@ "name": "stderr", "output_type": "stream", "text": [ - "01-Aug 20:51:27:DEBUG:root:Creating nodes\n", - "01-Aug 20:51:27:DEBUG:root:Creating elements\n", - "01-Aug 20:51:27:DEBUG:root:Problem size = 8\n", - "01-Aug 20:51:27:DEBUG:root:Starting iteration 1\n", - "01-Aug 20:51:27:DEBUG:root:Assembling\n", - "01-Aug 20:51:27:DEBUG:root:Adding Dirichlet boundary conditions\n", - "01-Aug 20:51:27:DEBUG:root:dof 5 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 6 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 7 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 8 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "01-Aug 20:51:27:DEBUG:root:Adding Neumann boundary conditions\n", - "01-Aug 20:51:27:DEBUG:root:Solving system of equations. Total size = 12\n", - "01-Aug 20:51:27:DEBUG:root:Solution norm = 3.0900221367289444\n", - "01-Aug 20:51:27:DEBUG:root:Starting iteration 2\n", - "01-Aug 20:51:27:DEBUG:root:Assembling\n", - "01-Aug 20:51:27:DEBUG:root:Adding Dirichlet boundary conditions\n", - "01-Aug 20:51:27:DEBUG:root:dof 5 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 6 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 7 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 8 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "01-Aug 20:51:27:DEBUG:root:Adding Neumann boundary conditions\n", - "01-Aug 20:51:27:DEBUG:root:Solving system of equations. Total size = 12\n", - "01-Aug 20:51:27:DEBUG:root:Solution norm = 0.32121316021534363\n", - "01-Aug 20:51:27:DEBUG:root:Starting iteration 3\n", - "01-Aug 20:51:27:DEBUG:root:Assembling\n", - "01-Aug 20:51:27:DEBUG:root:Adding Dirichlet boundary conditions\n", - "01-Aug 20:51:27:DEBUG:root:dof 5 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 6 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 7 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 8 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "01-Aug 20:51:27:DEBUG:root:Adding Neumann boundary conditions\n", - "01-Aug 20:51:27:DEBUG:root:Solving system of equations. Total size = 12\n", - "01-Aug 20:51:27:DEBUG:root:Solution norm = 0.04043178194002483\n", - "01-Aug 20:51:27:DEBUG:root:Starting iteration 4\n", - "01-Aug 20:51:27:DEBUG:root:Assembling\n", - "01-Aug 20:51:27:DEBUG:root:Adding Dirichlet boundary conditions\n", - "01-Aug 20:51:27:DEBUG:root:dof 5 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 6 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 7 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 8 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "01-Aug 20:51:27:DEBUG:root:Adding Neumann boundary conditions\n", - "01-Aug 20:51:27:DEBUG:root:Solving system of equations. Total size = 12\n", - "01-Aug 20:51:27:DEBUG:root:Solution norm = 0.0009291101052060104\n", - "01-Aug 20:51:27:DEBUG:root:Starting iteration 5\n", - "01-Aug 20:51:27:DEBUG:root:Assembling\n", - "01-Aug 20:51:27:DEBUG:root:Adding Dirichlet boundary conditions\n", - "01-Aug 20:51:27:DEBUG:root:dof 5 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 6 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 7 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 8 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "01-Aug 20:51:27:DEBUG:root:Adding Neumann boundary conditions\n", - "01-Aug 20:51:27:DEBUG:root:Solving system of equations. Total size = 12\n", - "01-Aug 20:51:27:DEBUG:root:Solution norm = 1.563889898905983e-7\n", - "01-Aug 20:51:27:DEBUG:root:Starting iteration 6\n", - "01-Aug 20:51:27:DEBUG:root:Assembling\n", - "01-Aug 20:51:27:DEBUG:root:Adding Dirichlet boundary conditions\n", - "01-Aug 20:51:27:DEBUG:root:dof 5 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 6 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 7 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:dof 8 => 0.0\n", - "01-Aug 20:51:27:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "01-Aug 20:51:27:DEBUG:root:Adding Neumann boundary conditions\n", - "01-Aug 20:51:27:DEBUG:root:Solving system of equations. Total size = 12\n", - "01-Aug 20:51:27:DEBUG:root:Solution norm = 1.2782462771683917e-14\n", - "01-Aug 20:51:27:DEBUG:root:Converged in 4 iterations.\n", - "01-Aug 20:51:27:DEBUG:root:Displacement of element = \n", - "[-0.3991450609547439 -0.07228582695592495 0.0 0.0\n", - " -2.1779892317073513 -2.2222447544017654 0.0 0.0]\n" + "10-Aug 22:55:49:DEBUG:root:Creating nodes\n", + "10-Aug 22:55:49:DEBUG:root:Creating elements\n", + "10-Aug 22:55:49:INFO:root:create_ldof2gdofmap: dofs per node: 2\n", + "10-Aug 22:55:49:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],1=>[1,2])\n", + "10-Aug 22:55:50:INFO:root:solve!: dofs per node: 2\n", + "10-Aug 22:55:50:DEBUG:root:Problem size = 8\n", + "10-Aug 22:55:50:DEBUG:root:Starting iteration 1\n", + "10-Aug 22:55:50:DEBUG:root:Assembling\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "1 fact verified.\n" + "Element stiffness matrix\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:dof 5 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 6 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 12\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:Solution norm = 3.0900221367289444\n", + "10-Aug 22:55:50:DEBUG:root:Starting iteration 2\n", + "10-Aug 22:55:50:DEBUG:root:Assembling\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", + "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:dof 5 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 6 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 12\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:Solution norm = 0.32121316021534363\n", + "10-Aug 22:55:50:DEBUG:root:Starting iteration 3\n", + "10-Aug 22:55:50:DEBUG:root:Assembling\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", + "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:dof 5 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 6 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 12\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:Solution norm = 0.04043178194002483\n", + "10-Aug 22:55:50:DEBUG:root:Starting iteration 4\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 123.2 -15.0 -118.4 -03.0 -61.6 15.0 56.8 03.0\n", + " -15.0 321.2 03.0 -319.4 15.0 -160.6 -03.0 158.8\n", + " -118.4 03.0 123.2 15.0 56.8 -03.0 -61.6 -15.0\n", + " -03.0 -319.4 15.0 321.2 03.0 158.8 -15.0 -160.6\n", + " -61.6 15.0 56.8 03.0 123.2 -15.0 -118.4 -03.0\n", + " 15.0 -160.6 -03.0 158.8 -15.0 321.2 03.0 -319.4\n", + " 56.8 -03.0 -61.6 -15.0 -118.4 03.0 123.2 15.0\n", + " 03.0 158.8 -15.0 -160.6 -03.0 -319.4 15.0 321.2\n", + "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", + " 123.2 -15.0 -118.4 -03.0 -61.6 15.0 56.8 03.0 0.0 0.0 0.0 0.0\n", + " -15.0 321.2 03.0 -319.4 15.0 -160.6 -03.0 158.8 0.0 0.0 0.0 0.0\n", + " -118.4 03.0 123.2 15.0 56.8 -03.0 -61.6 -15.0 0.0 0.0 0.0 0.0\n", + " -03.0 -319.4 15.0 321.2 03.0 158.8 -15.0 -160.6 0.0 0.0 0.0 0.0\n", + " -61.6 15.0 56.8 03.0 123.2 -15.0 -118.4 -03.0 1.0 0.0 0.0 0.0\n", + " 15.0 -160.6 -03.0 158.8 -15.0 321.2 03.0 -319.4 0.0 1.0 0.0 0.0\n", + " 56.8 -03.0 -61.6 -15.0 -118.4 03.0 123.2 15.0 0.0 0.0 1.0 0.0\n", + " 03.0 158.8 -15.0 -160.6 -03.0 -319.4 15.0 321.2 0.0 0.0 0.0 1.0\n", + " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", + "Array(Float64,(1,12)) 1x12 Array{Float64,2}:\n", + " 0.0 0.0 0.0 02.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 147.61 36.88 -149.16 -55.03 -66.97 1.91 68.52 16.24\n", + " 36.88 343.08 -48.76 -334.42 1.81 -174.07 10.06 165.4 \n", + " -149.16 -48.76 160.72 65.4 63.17 10.41 -74.73 -27.06\n", + " -55.03 -334.42 65.4 330.06 16.65 163.39 -27.02 -159.04\n", + " -66.97 1.81 63.17 16.65 128.11 -15.44 -124.3 -3.03\n", + " 1.91 -174.07 10.41 163.39 -15.44 338.21 3.11 -327.53\n", + " 68.52 10.06 -74.73 -27.02 -124.3 3.11 130.51 13.85\n", + " 16.24 165.4 -27.06 -159.04 -3.03 -327.53 13.85 321.16\n", + "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", + " 147.6 36.9 -149.2 -55.0 -67.0 1.9 68.5 16.2 0.0 0.0 0.0 0.0\n", + " 36.9 343.1 -48.8 -334.4 1.8 -174.1 10.1 165.4 0.0 0.0 0.0 0.0\n", + " -149.2 -48.8 160.7 65.4 63.2 10.4 -74.7 -27.1 0.0 0.0 0.0 0.0\n", + " -55.0 -334.4 65.4 330.1 16.7 163.4 -27.0 -159.0 0.0 0.0 0.0 0.0\n", + " -67.0 1.8 63.2 16.7 128.1 -15.4 -124.3 -03.0 1.0 0.0 0.0 0.0\n", + " 1.9 -174.1 10.4 163.4 -15.4 338.2 3.1 -327.5 0.0 1.0 0.0 0.0\n", + " 68.5 10.1 -74.7 -27.0 -124.3 3.1 130.5 13.8 0.0 0.0 1.0 0.0\n", + " 16.2 165.4 -27.1 -159.0 -03.0 -327.5 13.8 321.2 0.0 0.0 0.0 1.0\n", + " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", + "Array(Float64,(1,12)) 1x12 Array{Float64,2}:\n", + " -2.3 -15.7 05.0 15.2 -20.2 12.2 17.5 -9.6 0.0 0.0 0.0 0.0\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 131.01 35.45 -132.72 -52.73 -60.29 1.77 62.0 15.51\n", + " 35.45 313.79 -46.75 -305.49 1.71 -163.9 9.58 155.6 \n", + " -132.72 -46.75 143.74 62.55 56.75 10.12 -67.77 -25.93\n", + " -52.73 -305.49 62.55 301.12 16.11 153.51 -25.93 -149.13\n", + " -60.29 1.71 56.75 16.11 117.72 -14.75 -114.18 -3.07\n", + " 1.77 -163.9 10.12 153.51 -14.75 327.07 2.86 -316.69\n", + " 62.0 9.58 -67.77 -25.93 -114.18 2.86 119.94 13.49\n", + " 15.51 155.6 -25.93 -149.13 -3.07 -316.69 13.49 310.22\n", + "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", + " 131.0 35.4 -132.7 -52.7 -60.3 1.8 62.0 15.5 0.0 0.0 0.0 0.0\n", + " 35.4 313.8 -46.7 -305.5 1.7 -163.9 9.6 155.6 0.0 0.0 0.0 0.0\n", + " -132.7 -46.7 143.7 62.6 56.7 10.1 -67.8 -25.9 0.0 0.0 0.0 0.0\n", + " -52.7 -305.5 62.6 301.1 16.1 153.5 -25.9 -149.1 0.0 0.0 0.0 0.0\n", + " -60.3 1.7 56.7 16.1 117.7 -14.8 -114.2 -3.1 1.0 0.0 0.0 0.0\n", + " 1.8 -163.9 10.1 153.5 -14.8 327.1 2.9 -316.7 0.0 1.0 0.0 0.0\n", + " 62.0 9.6 -67.8 -25.9 -114.2 2.9 119.9 13.5 0.0 0.0 1.0 0.0\n", + " 15.5 155.6 -25.9 -149.1 -3.1 -316.7 13.5 310.2 0.0 0.0 0.0 1.0\n", + " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", + "Array(Float64,(1,12)) 1x12 Array{Float64,2}:\n", + " -0.0 -0.6 0.1 0.6 -19.7 3.2 19.6 -1.1 0.0 0.0 0.0 0.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "10-Aug 22:55:50:DEBUG:root:Assembling\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", + "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:dof 5 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 6 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 12\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:Solution norm = 0.0009291101052060104\n", + "10-Aug 22:55:50:DEBUG:root:Starting iteration 5\n", + "10-Aug 22:55:50:DEBUG:root:Assembling\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", + "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:dof 5 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 6 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 12\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:Solution norm = 1.563889898905983e-7\n", + "10-Aug 22:55:50:DEBUG:root:Starting iteration 6\n", + "10-Aug 22:55:50:DEBUG:root:Assembling\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", + "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:dof 5 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 6 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 12\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:Solution norm = 1.2782462771683917e-14\n", + "10-Aug 22:55:50:DEBUG:root:Converged in 6 iterations.\n", + "10-Aug 22:55:50:DEBUG:root:Displacement of element = \n", + "[-0.3991450609547439 -0.07228582695592495 0.0 0.0\n", + " -2.1779892317073513 -2.2222447544017654 0.0 0.0]\n", + "10-Aug 22:55:50:DEBUG:root:Creating elements\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 130.66 36.04 -132.46 -53.26 -60.05 1.58 61.86 15.64\n", + " 36.04 312.24 -47.29 -303.89 1.52 -163.43 9.73 155.09\n", + " -132.46 -47.29 143.55 63.02 56.54 10.29 -67.63 -26.02\n", + " -53.26 -303.89 63.02 299.46 16.27 152.96 -26.02 -148.53\n", + " -60.05 1.52 56.54 16.27 117.21 -14.68 -113.7 -3.11\n", + " 1.58 -163.43 10.29 152.96 -14.68 326.61 2.81 -316.14\n", + " 61.86 9.73 -67.63 -26.02 -113.7 2.81 119.47 13.49\n", + " 15.64 155.09 -26.02 -148.53 -3.11 -316.14 13.49 309.58\n", + "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", + " 130.7 36.0 -132.5 -53.3 -60.1 1.6 61.9 15.6 0.0 0.0 0.0 0.0\n", + " 36.0 312.2 -47.3 -303.9 1.5 -163.4 9.7 155.1 0.0 0.0 0.0 0.0\n", + " -132.5 -47.3 143.5 63.0 56.5 10.3 -67.6 -26.0 0.0 0.0 0.0 0.0\n", + " -53.3 -303.9 63.0 299.5 16.3 153.0 -26.0 -148.5 0.0 0.0 0.0 0.0\n", + " -60.1 1.5 56.5 16.3 117.2 -14.7 -113.7 -3.1 1.0 0.0 0.0 0.0\n", + " 1.6 -163.4 10.3 153.0 -14.7 326.6 2.8 -316.1 0.0 1.0 0.0 0.0\n", + " 61.9 9.7 -67.6 -26.0 -113.7 2.8 119.5 13.5 0.0 0.0 1.0 0.0\n", + " 15.6 155.1 -26.0 -148.5 -3.1 -316.1 13.5 309.6 0.0 0.0 0.0 1.0\n", + " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", + "Array(Float64,(1,12)) 1x12 Array{Float64,2}:\n", + " 0.0 -0.0 -0.0 0.0 -19.9 2.8 19.9 -0.8 0.0 0.0 0.0 0.0\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 130.66 36.06 -132.47 -53.28 -60.05 1.57 61.86 15.64\n", + " 36.06 312.22 -47.3 -303.88 1.51 -163.43 9.73 155.08\n", + " -132.47 -47.3 143.56 63.03 56.54 10.29 -67.63 -26.02\n", + " -53.28 -303.88 63.03 299.44 16.27 152.96 -26.02 -148.52\n", + " -60.05 1.51 56.54 16.27 117.21 -14.67 -113.69 -3.11\n", + " 1.57 -163.43 10.29 152.96 -14.67 326.61 2.81 -316.14\n", + " 61.86 9.73 -67.63 -26.02 -113.69 2.81 119.46 13.49\n", + " 15.64 155.08 -26.02 -148.52 -3.11 -316.14 13.49 309.58\n", + "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", + " 130.7 36.1 -132.5 -53.3 -60.1 1.6 61.9 15.6 0.0 0.0 0.0 0.0\n", + " 36.1 312.2 -47.3 -303.9 1.5 -163.4 9.7 155.1 0.0 0.0 0.0 0.0\n", + " -132.5 -47.3 143.6 63.0 56.5 10.3 -67.6 -26.0 0.0 0.0 0.0 0.0\n", + " -53.3 -303.9 63.0 299.4 16.3 153.0 -26.0 -148.5 0.0 0.0 0.0 0.0\n", + " -60.1 1.5 56.5 16.3 117.2 -14.7 -113.7 -3.1 1.0 0.0 0.0 0.0\n", + " 1.6 -163.4 10.3 153.0 -14.7 326.6 2.8 -316.1 0.0 1.0 0.0 0.0\n", + " 61.9 9.7 -67.6 -26.0 -113.7 2.8 119.5 13.5 0.0 0.0 1.0 0.0\n", + " 15.6 155.1 -26.0 -148.5 -3.1 -316.1 13.5 309.6 0.0 0.0 0.0 1.0\n", + " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", + "Array(Float64,(1,12)) 1x12 Array{Float64,2}:\n", + " 0.0 -0.0 0.0 0.0 -19.9 2.8 19.9 -0.8 0.0 0.0 0.0 0.0\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 130.66 36.06 -132.47 -53.28 -60.05 1.57 61.86 15.64\n", + " 36.06 312.22 -47.3 -303.88 1.51 -163.43 9.73 155.08\n", + " -132.47 -47.3 143.56 63.03 56.54 10.29 -67.63 -26.02\n", + " -53.28 -303.88 63.03 299.44 16.27 152.96 -26.02 -148.52\n", + " -60.05 1.51 56.54 16.27 117.21 -14.67 -113.69 -3.11\n", + " 1.57 -163.43 10.29 152.96 -14.67 326.61 2.81 -316.14\n", + " 61.86 9.73 -67.63 -26.02 -113.69 2.81 119.46 13.49\n", + " 15.64 155.08 -26.02 -148.52 -3.11 -316.14 13.49 309.58\n", + "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", + " 130.7 36.1 -132.5 -53.3 -60.1 1.6 61.9 15.6 0.0 0.0 0.0 0.0\n", + " 36.1 312.2 -47.3 -303.9 1.5 -163.4 9.7 155.1 0.0 0.0 0.0 0.0\n", + " -132.5 -47.3 143.6 63.0 56.5 10.3 -67.6 -26.0 0.0 0.0 0.0 0.0\n", + " -53.3 -303.9 63.0 299.4 16.3 153.0 -26.0 -148.5 0.0 0.0 0.0 0.0\n", + " -60.1 1.5 56.5 16.3 117.2 -14.7 -113.7 -3.1 1.0 0.0 0.0 0.0\n", + " 1.6 -163.4 10.3 153.0 -14.7 326.6 2.8 -316.1 0.0 1.0 0.0 0.0\n", + " 61.9 9.7 -67.6 -26.0 -113.7 2.8 119.5 13.5 0.0 0.0 1.0 0.0\n", + " 15.6 155.1 -26.0 -148.5 -3.1 -316.1 13.5 309.6 0.0 0.0 0.0 1.0\n", + " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", + "Array(Float64,(1,12)) 1x12 Array{Float64,2}:\n", + " 0.0 -0.0 -0.0 0.0 -19.9 2.8 19.9 -0.8 0.0 0.0 0.0 0.0\n", + "1 fact verified.\n", + "solve two element problem\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "10-Aug 22:55:50:INFO:root:create_ldof2gdofmap: dofs per node: 2\n", + "10-Aug 22:55:50:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],5=>[9,10],6=>[11,12],1=>[1,2])\n", + "10-Aug 22:55:50:INFO:root:solve!: dofs per node: 2\n", + "10-Aug 22:55:50:DEBUG:root:Problem size = 12\n", + "10-Aug 22:55:50:DEBUG:root:Starting iteration 1\n", + "10-Aug 22:55:50:DEBUG:root:Assembling\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", + "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:dof 1 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 2 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 16\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:Solution norm = 12.031677381267034\n", + "10-Aug 22:55:50:DEBUG:root:Starting iteration 2\n", + "10-Aug 22:55:50:DEBUG:root:Assembling\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", + "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:dof 1 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 2 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 16\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:Solution norm = 8.151050361276255\n", + "10-Aug 22:55:50:DEBUG:root:Starting iteration 3\n", + "10-Aug 22:55:50:DEBUG:root:Assembling\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 66.4 15.0 23.6 -03.0 -33.2 -15.0 -56.8 03.0\n", + " 15.0 162.4 03.0 77.6 -15.0 -81.2 -03.0 -158.8\n", + " 23.6 03.0 66.4 -15.0 -56.8 -03.0 -33.2 15.0\n", + " -03.0 77.6 -15.0 162.4 03.0 -158.8 15.0 -81.2\n", + " -33.2 -15.0 -56.8 03.0 66.4 15.0 23.6 -03.0\n", + " -15.0 -81.2 -03.0 -158.8 15.0 162.4 03.0 77.6\n", + " -56.8 -03.0 -33.2 15.0 23.6 03.0 66.4 -15.0\n", + " 03.0 -158.8 15.0 -81.2 -03.0 77.6 -15.0 162.4\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 66.4 15.0 23.6 -03.0 -33.2 -15.0 -56.8 03.0\n", + " 15.0 162.4 03.0 77.6 -15.0 -81.2 -03.0 -158.8\n", + " 23.6 03.0 66.4 -15.0 -56.8 -03.0 -33.2 15.0\n", + " -03.0 77.6 -15.0 162.4 03.0 -158.8 15.0 -81.2\n", + " -33.2 -15.0 -56.8 03.0 66.4 15.0 23.6 -03.0\n", + " -15.0 -81.2 -03.0 -158.8 15.0 162.4 03.0 77.6\n", + " -56.8 -03.0 -33.2 15.0 23.6 03.0 66.4 -15.0\n", + " 03.0 -158.8 15.0 -81.2 -03.0 77.6 -15.0 162.4\n", + "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", + " 66.4 15.0 23.6 -03.0 0.0 0.0 -56.8 03.0 -33.2 -15.0 0.0 0.0 1.0 0.0 0.0 0.0\n", + " 15.0 162.4 03.0 77.6 0.0 0.0 -03.0 -158.8 -15.0 -81.2 0.0 0.0 0.0 1.0 0.0 0.0\n", + " 23.6 03.0 132.8 0.0 23.6 -03.0 -33.2 15.0 -113.6 0.0 -33.2 -15.0 0.0 0.0 0.0 0.0\n", + " -03.0 77.6 0.0 324.8 03.0 77.6 15.0 -81.2 0.0 -317.6 -15.0 -81.2 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 23.6 03.0 66.4 -15.0 0.0 0.0 -33.2 15.0 -56.8 -03.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -03.0 77.6 -15.0 162.4 0.0 0.0 15.0 -81.2 03.0 -158.8 0.0 0.0 0.0 0.0\n", + " -56.8 -03.0 -33.2 15.0 0.0 0.0 66.4 -15.0 23.6 03.0 0.0 0.0 0.0 0.0 1.0 0.0\n", + " 03.0 -158.8 15.0 -81.2 0.0 0.0 -15.0 162.4 -03.0 77.6 0.0 0.0 0.0 0.0 0.0 1.0\n", + " -33.2 -15.0 -113.6 0.0 -33.2 15.0 23.6 -03.0 132.8 0.0 23.6 03.0 0.0 0.0 0.0 0.0\n", + " -15.0 -81.2 0.0 -317.6 15.0 -81.2 03.0 77.6 0.0 324.8 -03.0 77.6 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -33.2 -15.0 -56.8 03.0 0.0 0.0 23.6 -03.0 66.4 15.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -15.0 -81.2 -03.0 -158.8 0.0 0.0 03.0 77.6 15.0 162.4 0.0 0.0 0.0 0.0\n", + " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 02.0 0.0 0.0 0.0 0.0\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 520.78 72.26 330.9 62.7 -397.04 -45.87 -454.64 -89.09\n", + " 72.26 461.85 83.07 254.3 -47.57 -243.98 -107.75 -472.18\n", + " 330.9 83.07 874.92 211.87 -895.33 -206.2 -310.49 -88.74\n", + " 62.7 254.3 211.87 708.11 -183.65 -617.73 -90.92 -344.68\n", + " -397.04 -47.57 -895.33 -183.65 983.14 157.73 309.22 73.49\n", + " -45.87 -243.98 -206.2 -617.73 157.73 615.62 94.34 246.08\n", + " -454.64 -107.75 -310.49 -90.92 309.22 94.34 455.91 104.34\n", + " -89.09 -472.18 -88.74 -344.68 73.49 246.08 104.34 570.77\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 520.78 72.26 330.9 62.7 -397.04 -45.87 -454.64 -89.09\n", + " 72.26 461.85 83.07 254.3 -47.57 -243.98 -107.75 -472.18\n", + " 330.9 83.07 874.92 211.87 -895.33 -206.2 -310.49 -88.74\n", + " 62.7 254.3 211.87 708.11 -183.65 -617.73 -90.92 -344.68\n", + " -397.04 -47.57 -895.33 -183.65 983.14 157.73 309.22 73.49\n", + " -45.87 -243.98 -206.2 -617.73 157.73 615.62 94.34 246.08\n", + " -454.64 -107.75 -310.49 -90.92 309.22 94.34 455.91 104.34\n", + " -89.09 -472.18 -88.74 -344.68 73.49 246.08 104.34 570.77\n", + "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", + " 520.8 72.3 330.9 62.7 0.0 0.0 -454.6 -89.1 -397.0 -45.9 0.0 0.0 1.0 0.0 0.0 0.0\n", + " 72.3 461.9 83.1 254.3 0.0 0.0 -107.8 -472.2 -47.6 -244.0 0.0 0.0 0.0 1.0 0.0 0.0\n", + " 330.9 83.1 1395.7 284.1 330.9 62.7 -310.5 -88.7 -1350.0 -295.3 -397.0 -45.9 0.0 0.0 0.0 0.0\n", + " 62.7 254.3 284.1 1170.0 83.1 254.3 -90.9 -344.7 -291.4 -1089.9 -47.6 -244.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 330.9 83.1 874.9 211.9 0.0 0.0 -310.5 -88.7 -895.3 -206.2 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 62.7 254.3 211.9 708.1 0.0 0.0 -90.9 -344.7 -183.7 -617.7 0.0 0.0 0.0 0.0\n", + " -454.6 -107.8 -310.5 -90.9 0.0 0.0 455.9 104.3 309.2 94.3 0.0 0.0 0.0 0.0 1.0 0.0\n", + " -89.1 -472.2 -88.7 -344.7 0.0 0.0 104.3 570.8 73.5 246.1 0.0 0.0 0.0 0.0 0.0 1.0\n", + " -397.0 -47.6 -1350.0 -291.4 -310.5 -90.9 309.2 73.5 1439.1 262.1 309.2 94.3 0.0 0.0 0.0 0.0\n", + " -45.9 -244.0 -295.3 -1089.9 -88.7 -344.7 94.3 246.1 262.1 1186.4 73.5 246.1 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -397.0 -47.6 -895.3 -183.7 0.0 0.0 309.2 73.5 983.1 157.7 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -45.9 -244.0 -206.2 -617.7 0.0 0.0 94.3 246.1 157.7 615.6 0.0 0.0 0.0 0.0\n", + " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", + " -453.5 -212.6 -1168.0 -759.0 -714.5 -546.4 300.0 466.2 1168.0 759.0 868.1 294.8 0.0 0.0 0.0 0.0\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 43.42 28.69 48.59 17.79 -57.52 -15.59 -34.48 -30.89\n", + " 28.69 51.46 22.52 33.82 -15.89 -22.99 -35.32 -62.29\n", + " 48.59 22.52 142.25 54.77 -152.3 -53.31 -38.54 -23.98\n", + " 17.79 33.82 54.77 88.5 -48.04 -72.78 -24.51 -49.53\n", + " -57.52 -15.89 -152.3 -48.04 168.56 42.6 41.26 21.33\n", + " -15.59 -22.99 -53.31 -72.78 42.6 67.46 26.29 28.32\n", + " -34.48 -35.32 -38.54 -24.51 41.26 26.29 31.77 33.54\n", + " -30.89 -62.29 -23.98 -49.53 21.33 28.32 33.54 83.5 \n", + "Element stiffness matrix\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:dof 1 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 2 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 16\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:Solution norm = 3.886954756970209\n", + "10-Aug 22:55:50:DEBUG:root:Starting iteration 4\n", + "10-Aug 22:55:50:DEBUG:root:Assembling\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", + "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:dof 1 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 2 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 16\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:Solution norm = 2.9651628976855293\n", + "10-Aug 22:55:50:DEBUG:root:Starting iteration 5\n", + "10-Aug 22:55:50:DEBUG:root:Assembling\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", + "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:dof 1 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 2 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 16\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 43.42 28.69 48.59 17.79 -57.52 -15.59 -34.48 -30.89\n", + " 28.69 51.46 22.52 33.82 -15.89 -22.99 -35.32 -62.29\n", + " 48.59 22.52 142.25 54.77 -152.3 -53.31 -38.54 -23.98\n", + " 17.79 33.82 54.77 88.5 -48.04 -72.78 -24.51 -49.53\n", + " -57.52 -15.89 -152.3 -48.04 168.56 42.6 41.26 21.33\n", + " -15.59 -22.99 -53.31 -72.78 42.6 67.46 26.29 28.32\n", + " -34.48 -35.32 -38.54 -24.51 41.26 26.29 31.77 33.54\n", + " -30.89 -62.29 -23.98 -49.53 21.33 28.32 33.54 83.5 \n", + "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", + " 43.4 28.7 48.6 17.8 0.0 0.0 -34.5 -30.9 -57.5 -15.6 0.0 0.0 1.0 0.0 0.0 0.0\n", + " 28.7 51.5 22.5 33.8 0.0 0.0 -35.3 -62.3 -15.9 -23.0 0.0 0.0 0.0 1.0 0.0 0.0\n", + " 48.6 22.5 185.7 83.5 48.6 17.8 -38.5 -24.0 -186.8 -84.2 -57.5 -15.6 0.0 0.0 0.0 0.0\n", + " 17.8 33.8 83.5 140.0 22.5 33.8 -24.5 -49.5 -83.4 -135.1 -15.9 -23.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 48.6 22.5 142.2 54.8 0.0 0.0 -38.5 -24.0 -152.3 -53.3 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 17.8 33.8 54.8 88.5 0.0 0.0 -24.5 -49.5 -48.0 -72.8 0.0 0.0 0.0 0.0\n", + " -34.5 -35.3 -38.5 -24.5 0.0 0.0 31.8 33.5 41.3 26.3 0.0 0.0 0.0 0.0 1.0 0.0\n", + " -30.9 -62.3 -24.0 -49.5 0.0 0.0 33.5 83.5 21.3 28.3 0.0 0.0 0.0 0.0 0.0 1.0\n", + " -57.5 -15.9 -186.8 -83.4 -38.5 -24.5 41.3 21.3 200.3 76.1 41.3 26.3 0.0 0.0 0.0 0.0\n", + " -15.6 -23.0 -84.2 -135.1 -24.0 -49.5 26.3 28.3 76.1 151.0 21.3 28.3 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -57.5 -15.9 -152.3 -48.0 0.0 0.0 41.3 21.3 168.6 42.6 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -15.6 -23.0 -53.3 -72.8 0.0 0.0 26.3 28.3 42.6 67.5 0.0 0.0 0.0 0.0\n", + " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", + " 27.5 08.5 22.1 17.8 -5.4 9.3 -21.6 -15.8 -22.1 -17.8 -0.5 -0.0 0.0 0.0 0.0 0.0\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 116.19 1.61 71.4 10.34 -89.72 1.21 -97.86 -13.16\n", + " 1.61 96.17 17.73 49.31 0.67 -49.8 -20.01 -95.68\n", + " 71.4 17.73 191.45 46.09 -197.12 -40.75 -65.73 -23.07\n", + " 10.34 49.31 46.09 167.18 -32.77 -134.57 -23.66 -81.92\n", + " -89.72 0.67 -197.12 -32.77 219.04 18.96 67.81 13.14\n", + " 1.21 -49.8 -40.75 -134.57 18.96 135.27 20.58 49.1 \n", + " -97.86 -20.01 -65.73 -23.66 67.81 20.58 95.78 23.09\n", + " -13.16 -95.68 -23.07 -81.92 13.14 49.1 23.09 128.5 \n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 116.19 1.61 71.4 10.34 -89.72 1.21 -97.86 -13.16\n", + " 1.61 96.17 17.73 49.31 0.67 -49.8 -20.01 -95.68\n", + " 71.4 17.73 191.45 46.09 -197.12 -40.75 -65.73 -23.07\n", + " 10.34 49.31 46.09 167.18 -32.77 -134.57 -23.66 -81.92\n", + " -89.72 0.67 -197.12 -32.77 219.04 18.96 67.81 13.14\n", + " 1.21 -49.8 -40.75 -134.57 18.96 135.27 20.58 49.1 \n", + " -97.86 -20.01 -65.73 -23.66 67.81 20.58 95.78 23.09\n", + " -13.16 -95.68 -23.07 -81.92 13.14 49.1 23.09 128.5 \n", + "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", + " 116.2 1.6 71.4 10.3 0.0 0.0 -97.9 -13.2 -89.7 1.2 0.0 0.0 1.0 0.0 0.0 0.0\n", + " 1.6 96.2 17.7 49.3 0.0 0.0 -20.0 -95.7 0.7 -49.8 0.0 0.0 0.0 1.0 0.0 0.0\n", + " 71.4 17.7 307.6 47.7 71.4 10.3 -65.7 -23.1 -295.0 -53.9 -89.7 1.2 0.0 0.0 0.0 0.0\n", + " 10.3 49.3 47.7 263.4 17.7 49.3 -23.7 -81.9 -52.8 -230.3 0.7 -49.8 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 71.4 17.7 191.5 46.1 0.0 0.0 -65.7 -23.1 -197.1 -40.8 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 10.3 49.3 46.1 167.2 0.0 0.0 -23.7 -81.9 -32.8 -134.6 0.0 0.0 0.0 0.0\n", + " -97.9 -20.0 -65.7 -23.7 0.0 0.0 95.8 23.1 67.8 20.6 0.0 0.0 0.0 0.0 1.0 0.0\n", + " -13.2 -95.7 -23.1 -81.9 0.0 0.0 23.1 128.5 13.1 49.1 0.0 0.0 0.0 0.0 0.0 1.0\n", + " -89.7 0.7 -295.0 -52.8 -65.7 -23.7 67.8 13.1 314.8 42.0 67.8 20.6 0.0 0.0 0.0 0.0\n", + " 1.2 -49.8 -53.9 -230.3 -23.1 -81.9 20.6 49.1 42.0 263.8 13.1 49.1 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -89.7 0.7 -197.1 -32.8 0.0 0.0 67.8 13.1 219.0 19.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 1.2 -49.8 -40.8 -134.6 0.0 0.0 20.6 49.1 19.0 135.3 0.0 0.0 0.0 0.0\n", + " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", + " -02.5 8.8 -27.7 -26.3 -25.2 -35.2 -10.3 26.0 27.7 26.3 38.0 2.3 0.0 0.0 0.0 0.0\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 80.58 18.37 53.97 14.28 -64.27 -7.29 -70.28 -25.36\n", + " 18.37 29.48 19.23 20.58 -7.58 -16.78 -30.02 -33.28\n", + " 53.97 19.23 139.54 47.2 -146.69 -42.11 -46.81 -24.33\n", + " 14.28 20.58 47.2 74.51 -36.82 -59.55 -24.66 -35.54\n", + " -64.27 -7.58 -146.69 -36.82 159.26 28.44 51.7 15.96\n", + " -7.29 -16.78 -42.11 -59.55 28.44 56.47 20.96 19.86\n", + " -70.28 -30.02 -46.81 -24.66 51.7 20.96 65.39 33.72\n", + " -25.36 -33.28 -24.33 -35.54 15.96 19.86 33.72 48.96\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 80.58 18.37 53.97 14.28 -64.27 -7.29 -70.28 -25.36\n", + " 18.37 29.48 19.23 20.58 -7.58 -16.78 -30.02 -33.28\n", + " 53.97 19.23 139.54 47.2 -146.69 -42.11 -46.81 -24.33\n", + " 14.28 20.58 47.2 74.51 -36.82 -59.55 -24.66 -35.54\n", + " -64.27 -7.58 -146.69 -36.82 159.26 28.44 51.7 15.96\n", + " -7.29 -16.78 -42.11 -59.55 28.44 56.47 20.96 19.86\n", + " -70.28 -30.02 -46.81 -24.66 51.7 20.96 65.39 33.72\n", + " -25.36 -33.28 -24.33 -35.54 15.96 19.86 33.72 48.96\n", + "Array(Float64,(16,16)) 16x16 Array{Float64,2}" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:Solution norm = 2.638889456564507\n", + "10-Aug 22:55:50:DEBUG:root:Starting iteration 6\n", + "10-Aug 22:55:50:DEBUG:root:Assembling\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", + "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:dof 1 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 2 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", + "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 16\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:nothing\n", + "10-Aug 22:55:50:DEBUG:root:Solution norm = 2.5846689771724556\n", + "10-Aug 22:55:50:DEBUG:root:Starting iteration 7\n", + "10-Aug 22:55:50:DEBUG:root:Assembling\n", + "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", + "10-Aug 22:55:51:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", + "10-Aug 22:55:51:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 22:55:51:DEBUG:root:dof 1 => 0.0\n", + "10-Aug 22:55:51:DEBUG:root:dof 2 => 0.0\n", + "10-Aug 22:55:51:DEBUG:root:dof 7 => 0.0\n", + "10-Aug 22:55:51:DEBUG:root:dof 8 => 0.0\n", + "10-Aug 22:55:51:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "10-Aug 22:55:51:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 22:55:51:DEBUG:root:Solving system of equations. Total size = 16\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ":\n", + " 80.6 18.4 54.0 14.3 0.0 0.0 -70.3 -25.4 -64.3 -7.3 0.0 0.0 1.0 0.0 0.0 0.0\n", + " 18.4 29.5 19.2 20.6 0.0 0.0 -30.0 -33.3 -7.6 -16.8 0.0 0.0 0.0 1.0 0.0 0.0\n", + " 54.0 19.2 220.1 65.6 54.0 14.3 -46.8 -24.3 -217.0 -67.5 -64.3 -7.3 0.0 0.0 0.0 0.0\n", + " 14.3 20.6 65.6 104.0 19.2 20.6 -24.7 -35.5 -66.8 -92.8 -7.6 -16.8 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 54.0 19.2 139.5 47.2 0.0 0.0 -46.8 -24.3 -146.7 -42.1 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 14.3 20.6 47.2 74.5 0.0 0.0 -24.7 -35.5 -36.8 -59.6 0.0 0.0 0.0 0.0\n", + " -70.3 -30.0 -46.8 -24.7 0.0 0.0 65.4 33.7 51.7 21.0 0.0 0.0 0.0 0.0 1.0 0.0\n", + " -25.4 -33.3 -24.3 -35.5 0.0 0.0 33.7 49.0 16.0 19.9 0.0 0.0 0.0 0.0 0.0 1.0\n", + " -64.3 -7.6 -217.0 -66.8 -46.8 -24.7 51.7 16.0 224.7 62.2 51.7 21.0 0.0 0.0 0.0 0.0\n", + " -7.3 -16.8 -67.5 -92.8 -24.3 -35.5 21.0 19.9 62.2 105.4 16.0 19.9 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -64.3 -7.6 -146.7 -36.8 0.0 0.0 51.7 16.0 159.3 28.4 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -7.3 -16.8 -42.1 -59.6 0.0 0.0 21.0 19.9 28.4 56.5 0.0 0.0 0.0 0.0\n", + " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", + " 28.6 5.9 32.9 14.7 4.3 8.7 -24.6 -14.9 -32.9 -14.7 -8.3 2.2 0.0 0.0 0.0 0.0\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 138.24 6.59 72.3 13.02 -91.67 -1.46 -118.87 -18.14\n", + " 6.59 95.68 20.35 47.41 -1.83 -47.79 -25.11 -95.3 \n", + " 72.3 20.35 177.29 48.61 -182.78 -43.91 -66.81 -25.05\n", + " 13.02 47.41 48.61 159.72 -36.21 -128.01 -25.42 -79.12\n", + " -91.67 -1.83 -182.78 -36.21 203.7 23.62 70.75 14.42\n", + " -1.46 -47.79 -43.91 -128.01 23.62 126.88 21.75 48.93\n", + " -118.87 -25.11 -66.81 -25.42 70.75 21.75 114.93 28.77\n", + " -18.14 -95.3 -25.05 -79.12 14.42 48.93 28.77 125.49\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 138.24 6.59 72.3 13.02 -91.67 -1.46 -118.87 -18.14\n", + " 6.59 95.68 20.35 47.41 -1.83 -47.79 -25.11 -95.3 \n", + " 72.3 20.35 177.29 48.61 -182.78 -43.91 -66.81 -25.05\n", + " 13.02 47.41 48.61 159.72 -36.21 -128.01 -25.42 -79.12\n", + " -91.67 -1.83 -182.78 -36.21 203.7 23.62 70.75 14.42\n", + " -1.46 -47.79 -43.91 -128.01 23.62 126.88 21.75 48.93\n", + " -118.87 -25.11 -66.81 -25.42 70.75 21.75 114.93 28.77\n", + " -18.14 -95.3 -25.05 -79.12 14.42 48.93 28.77 125.49\n", + "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", + " 138.2 6.6 72.3 13.0 0.0 0.0 -118.9 -18.1 -91.7 -1.5 0.0 0.0 1.0 0.0 0.0 0.0\n", + " 6.6 95.7 20.3 47.4 0.0 0.0 -25.1 -95.3 -1.8 -47.8 0.0 0.0 0.0 1.0 0.0 0.0\n", + " 72.3 20.3 315.5 55.2 72.3 13.0 -66.8 -25.0 -301.6 -62.1 -91.7 -1.5 0.0 0.0 0.0 0.0\n", + " 13.0 47.4 55.2 255.4 20.3 47.4 -25.4 -79.1 -61.3 -223.3 -1.8 -47.8 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 72.3 20.3 177.3 48.6 0.0 0.0 -66.8 -25.0 -182.8 -43.9 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 13.0 47.4 48.6 159.7 0.0 0.0 -25.4 -79.1 -36.2 -128.0 0.0 0.0 0.0 0.0\n", + " -118.9 -25.1 -66.8 -25.4 0.0 0.0 114.9 28.8 70.7 21.8 0.0 0.0 0.0 0.0 1.0 0.0\n", + " -18.1 -95.3 -25.0 -79.1 0.0 0.0 28.8 125.5 14.4 48.9 0.0 0.0 0.0 0.0 0.0 1.0\n", + " -91.7 -1.8 -301.6 -61.3 -66.8 -25.4 70.7 14.4 318.6 52.4 70.7 21.8 0.0 0.0 0.0 0.0\n", + " -1.5 -47.8 -62.1 -223.3 -25.0 -79.1 21.8 48.9 52.4 252.4 14.4 48.9 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -91.7 -1.8 -182.8 -36.2 0.0 0.0 70.7 14.4 203.7 23.6 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -1.5 -47.8 -43.9 -128.0 0.0 0.0 21.8 48.9 23.6 126.9 0.0 0.0 0.0 0.0\n", + " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", + " -06.5 7.6 -25.7 -24.5 -19.1 -32.0 -4.1 20.8 25.7 24.5 29.7 5.7 0.0 0.0 0.0 0.0\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 105.18 18.96 58.01 14.76 -69.33 -6.94 -93.85 -26.77\n", + " 18.96 36.86 19.89 21.5 -7.13 -18.68 -31.72 -39.68\n", + " 58.01 19.89 135.28 46.75 -141.88 -41.41 -51.41 -25.23\n", + " 14.76 21.5 46.75 74.5 -36.07 -59.09 -25.44 -36.91\n", + " -69.33 -7.13 -141.88 -36.07 154.31 27.5 56.9 15.7 \n", + " -6.94 -18.68 -41.41 -59.09 27.5 56.13 20.86 21.65\n", + " -93.85 -31.72 -51.41 -25.44 56.9 20.86 88.36 36.3 \n", + " -26.77 -39.68 -25.23 -36.91 15.7 21.65 36.3 54.93\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 105.18 18.96 58.01 14.76 -69.33 -6.94 -93.85 -26.77\n", + " 18.96 36.86 19.89 21.5 -7.13 -18.68 -31.72 -39.68\n", + " 58.01 19.89 135.28 46.75 -141.88 -41.41 -51.41 -25.23\n", + " 14.76 21.5 46.75 74.5 -36.07 -59.09 -25.44 -36.91\n", + " -69.33 -7.13 -141.88 -36.07 154.31 27.5 56.9 15.7 \n", + " -6.94 -18.68 -41.41 -59.09 27.5 56.13 20.86 21.65\n", + " -93.85 -31.72 -51.41 -25.44 56.9 20.86 88.36 36.3 \n", + " -26.77 -39.68 -25.23 -36.91 15.7 21.65 36.3 54.93\n", + "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", + " 105.2 19.0 58.0 14.8 0.0 0.0 -93.9 -26.8 -69.3 -6.9 0.0 0.0 1.0 0.0 0.0 0.0\n", + " 19.0 36.9 19.9 21.5 0.0 0.0 -31.7 -39.7 -7.1 -18.7 0.0 0.0 0.0 1.0 0.0 0.0\n", + " 58.0 19.9 240.5 65.7 58.0 14.8 -51.4 -25.2 -235.7 -68.2 -69.3 -6.9 0.0 0.0 0.0 0.0\n", + " 14.8 21.5 65.7 111.4 19.9 21.5 -25.4 -36.9 -67.8 -98.8 -7.1 -18.7 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 58.0 19.9 135.3 46.7 0.0 0.0 -51.4 -25.2 -141.9 -41.4 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 14.8 21.5 46.7 74.5 0.0 0.0 -25.4 -36.9 -36.1 -59.1 0.0 0.0 0.0 0.0\n", + " -93.9 -31.7 -51.4 -25.4 0.0 0.0 88.4 36.3 56.9 20.9 0.0 0.0 0.0 0.0 1.0 0.0\n", + " -26.8 -39.7 -25.2 -36.9 0.0 0.0 36.3 54.9 15.7 21.6 0.0 0.0 0.0 0.0 0.0 1.0\n", + " -69.3 -7.1 -235.7 -67.8 -51.4 -25.4 56.9 15.7 242.7 63.8 56.9 20.9 0.0 0.0 0.0 0.0\n", + " -6.9 -18.7 -68.2 -98.8 -25.2 -36.9 20.9 21.6 63.8 111.1 15.7 21.6 0.0 0.0 0.0 0.0\n", + " 0.0 " + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "10-Aug 22:55:51:DEBUG:root:nothing\n", + "10-Aug 22:55:51:DEBUG:root:nothing\n", + "10-Aug 22:55:51:DEBUG:root:Solution norm = 2.4116101594574446\n", + "10-Aug 22:55:51:DEBUG:root:Displacement of element = \n", + "[-3.0265017801117513 -5.464687844270099 -4.5022205763589715 -2.2188310526354926\n", + " -1.2759688848713764 -6.757003969576785 -7.2218353000897295 -1.8649226742660745]\n" ] }, { @@ -741,35 +1383,83 @@ "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 49, + "execution_count": 82, "metadata": {}, "output_type": "execute_result" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.0 -69.3 -7.1 -141.9 -36.1 0.0 0.0 56.9 15.7 154.3 27.5 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -6.9 -18.7 -41.4 -59.1 0.0 0.0 20.9 21.6 27.5 56.1 0.0 0.0 0.0 0.0\n", + " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", + " 22.9 4.1 28.6 11.8 5.6 7.6 -19.5 -12.4 -28.6 -11.8 -09.0 2.6 0.0 0.0 0.0 0.0\n", + "0 facts verified.\n" + ] } ], "source": [ - "function solve!(elements, neumann_bcs, dirichlet_bcs; dofs=2, max_iterations=10)\n", + "\"\"\"\n", + "Create local dof to global dof mapping for given elements\n", + "\"\"\"\n", + "function create_ldof2gdofmap(elements; ndofs=2)\n", + " Logging.info(\"create_ldof2gdofmap: dofs per node: $ndofs\")\n", + "\n", + " all_node_ids = Int64[]\n", + " for el in elements\n", + " eldim, elnodes = size(el.coordinates)\n", + " for nid in el.node_ids\n", + " push!(all_node_ids, nid)\n", + " end\n", + " end\n", + " all_node_ids = unique(all_node_ids)\n", + " sort!(all_node_ids)\n", + "\n", + " # Assign global dof for each node\n", + " pdim = 1\n", + " ngdofs = Dict{Int64, Array{Int64,1}}()\n", + " for nid in all_node_ids\n", + " ngdofs[nid] = collect(pdim:pdim+ndofs-1)\n", + " pdim += ndofs\n", + " end\n", + "\n", + " return ngdofs\n", + "end\n", + "\n", + "function solve!(elements, dofmap, neumann_bcs, dirichlet_bcs; ndofs=2, max_iterations=10)\n", + " \n", + " Logging.info(\"solve!: dofs per node: $ndofs\")\n", + " pdim = length(dofmap)*ndofs\n", + " Logging.debug(\"Problem size = $pdim\")\n", "\n", " # Initialize elements ready for solution\n", " for el in elements\n", - " el.attributes[\"displacement\"] = zeros(2, 4)\n", - " el.attributes[\"displacement nodal force\"] = zeros(2, 4)\n", - " el.attributes[\"displacement tangent stiffness\"] = zeros(8, 8)\n", + " eldim, elnodes = size(el.coordinates)\n", + " el.attributes[\"displacement\"] = zeros(ndofs, elnodes)\n", + " el.attributes[\"displacement nodal force\"] = zeros(ndofs, elnodes)\n", + " el.attributes[\"displacement tangent stiffness\"] = zeros(ndofs*elnodes, ndofs*elnodes)\n", " end\n", "\n", " # Assign global dofs for elements\n", - " gdofs = Dict{Int64,Array{Int64,1}}()\n", - " pdim = 1\n", + " gdofs = Dict{Int64, Array{Int64,1}}()\n", " for el in elements\n", - " edofs = length(el.nodes)*dofs-1\n", - " gdofs[el.id] = pdim:pdim+edofs\n", - " pdim += edofs\n", + " gdofs[el.id] = Int64[]\n", + " for nid in el.node_ids\n", + " for ndof in dofmap[nid]\n", + " push!(gdofs[el.id], ndof)\n", + " end\n", + " end\n", " end\n", - " Logging.debug(\"Problem size = $pdim\")\n", "\n", " ass = Assembly(Int64[], Int64[], Float64[], Int64[], Float64[], gdofs)\n", "\n", - " for i=1:max_iterations\n", - " Logging.debug(\"Starting iteration $i\")\n", + " for iter=1:max_iterations\n", + " Logging.debug(\"Starting iteration $iter\")\n", " ass.I = []\n", " ass.J = []\n", " ass.A = []\n", @@ -779,6 +1469,8 @@ " Logging.debug(\"Assembling\")\n", " for el in elements\n", " assemble_element!(ass, el)\n", + " println(\"Element stiffness matrix\")\n", + " dump(round(el.attributes[\"displacement tangent stiffness\"], 2))\n", " end\n", "\n", " Logging.debug(\"Adding Dirichlet boundary conditions\")\n", @@ -815,8 +1507,9 @@ " K = sparse(ass.I, ass.J, ass.A)\n", " R = full(sparsevec(ass.i, ass.b))\n", " R = R - F\n", - " #println(full(K))\n", - " #println(R)\n", + " Logging.debug(dump(round(full(K), 1)))\n", + " #print_matrix(full(K))\n", + " Logging.debug(dump(round(R', 1)))\n", "\n", " du = K \\ -R\n", "\n", @@ -825,38 +1518,272 @@ "\n", " # update solution back to elements\n", " for el in elements\n", + "\n", " eldu = du[ass.gdofs[el.id]]\n", - " eldu = reshape(eldu, (2, round(Int, length(eldu)/2)))\n", + " eldu = reshape(eldu, (ndofs, round(Int, length(eldu)/ndofs)))\n", " el.attributes[\"displacement\"] += eldu\n", " end\n", " if solnorm < 1.0e-9\n", - " Logging.debug(\"Converged in $i iterations.\")\n", + " Logging.debug(\"Converged in $iter iterations.\")\n", " break\n", " end\n", " end\n", "\n", "end\n", "\n", + "ENV[\"COLUMNS\"] = 160\n", + "\n", "facts(\"solve one element problem\") do\n", " # Create model\n", " Logging.debug(\"Creating nodes\")\n", - " n1 = Node(1, Int64[])\n", - " n2 = Node(2, Int64[])\n", - " n3 = Node(3, Int64[])\n", - " n4 = Node(4, Int64[])\n", - " nodes = [n1.id, n2.id, n3.id, n4.id]\n", + " node_ids = [1, 2, 3, 4]\n", " coordinates = [10.0 0.0; 10.0 1.0; 0.0 1.0; 0.0 0.0]'\n", " attributes = Dict(\"Young\" => 90, \"Poisson\" => 0.25)\n", " Logging.debug(\"Creating elements\")\n", - " el = Element(1, nodes, coordinates, attributes)\n", + " el = Element(1, node_ids, coordinates, attributes)\n", " elements = [el]\n", + " dofmap = create_ldof2gdofmap(elements)\n", + " Logging.debug(dofmap)\n", " # Boundary conditions\n", - " bc1 = BC([4], [-2.0]) # force boundary condition, third dof -2\n", - " bc2 = BC([5, 6, 7, 8], [0.0, 0.0, 0.0, 0.0]) # dirichlet bc, set dx=dy=0 on support\n", - " solve!(elements, [bc1], [bc2]; max_iterations=7)\n", + " # here we want to create nodal force for third dof, that is, node id 2, second dof\n", + " bc1 = BC([dofmap[2][2]], [-2.0])\n", + " # dirichlet bc, set dx=dy=0 on support\n", + " bc2 = BC([dofmap[3][1], dofmap[3][2], dofmap[4][1], dofmap[4][2]], [0.0, 0.0, 0.0, 0.0])\n", + " solve!(elements, dofmap, [bc1], [bc2]; max_iterations=7)\n", " disp = elements[1].attributes[\"displacement\"]\n", " Logging.debug(\"Displacement of element = \\n$disp\")\n", " @fact norm(disp) => roughly(3.1292483947150043)\n", + "end\n", + "\n", + "facts(\"solve two element problem\") do\n", + " # Create model\n", + " attributes = Dict(\"Young\" => 90, \"Poisson\" => 0.25)\n", + "\n", + " Logging.debug(\"Creating elements\")\n", + " nids1 = [1, 2, 5, 4]\n", + " coords1 = [0.0 0.0; 5.0 0.0; 5.0 1.0; 0.0 1.0]'\n", + " el1 = Element(1, nids1, coords1, attributes)\n", + " nids2 = [2, 3, 6, 5]\n", + " coords2 = [5.0 0.0; 10.0 0.0; 10.0 1.0; 5.0 1.0]'\n", + " el2 = Element(2, nids2, coords2, attributes)\n", + " elements = [el1, el2]\n", + "\n", + " dofmap = create_ldof2gdofmap(elements)\n", + " Logging.debug(dofmap)\n", + " # Boundary conditions\n", + " # here we want to create nodal force for third dof, that is, node id 2, second dof\n", + " bc1 = BC([dofmap[6][2]], [-2.0])\n", + " # dirichlet bc, set dx=dy=0 on support\n", + " bc2 = BC([dofmap[1][1], dofmap[1][2], dofmap[4][1], dofmap[4][2]], [0.0, 0.0, 0.0, 0.0])\n", + " solve!(elements, dofmap, [bc1], [bc2]; max_iterations=7)\n", + " disp = elements[2].attributes[\"displacement\"]\n", + " Logging.debug(\"Displacement of element = \\n$disp\")\n", + " #@fact norm(disp) => roughly(3.1292483947150043)\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Top-down design\n", + "\n", + "Next we see this problem from \"other direction\", by parsing ABAQUS .inp file and making 3d simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1x1 sparse matrix with 1 Float64 entries:\n", + "\t[1, 1] = 2.0" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sparse([1, 1], [1, 1], [1.0, 1.0])" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "10-Aug 20:59:55:INFO:root:Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\"]\n", + "10-Aug 20:59:55:DEBUG:root:Found NODE section\n", + "10-Aug 20:59:56:DEBUG:root:Found ELEMENT section\n", + "10-Aug 20:59:57:DEBUG:root:120 elements found\n", + "10-Aug 20:59:57:INFO:root:Creating ELSET Body1\n", + "10-Aug 20:59:57:DEBUG:root:Found NSET section\n", + "10-Aug 20:59:57:DEBUG:root:Creating node set SUPPORT\n", + "10-Aug 20:59:57:DEBUG:root:Found NSET section\n", + "10-Aug 20:59:57:DEBUG:root:Creating node set LOAD\n", + "10-Aug 20:59:57:DEBUG:root:Found NSET section\n", + "10-Aug 20:59:57:DEBUG:root:Creating node set TOP\n" + ] + }, + { + "data": { + "text/plain": [ + "Dict{Any,Any} with 4 entries:\n", + " \"nodes\" => Dict{Any,Any}(288=>[97.5,7.5,10.0],11=>[92.5,2.5,5.0],134=>[45.…\n", + " \"elements\" => Dict{Any,Any}(68=>[71,144,149,198,51,150,57,43,50,214],2=>[204,…\n", + " \"elsets\" => Dict{Any,Any}(\"Body1\"=>[1,2,3,4,5,6,7,8,9,10 … 111,112,113,11…\n", + " \"nsets\" => Dict{Any,Any}(\"LOAD\"=>[82,84,87,179,197,246,249,256,257],\"SUPPO…" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "using JuliaFEM.abaqus_reader\n", + "fid = open(\"../geometry/3d_beam/palkki.inp\")\n", + "model = JuliaFEM.abaqus_reader.parse_abaqus(fid)\n", + "close(fid)\n", + "model" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "solve 3d elasticity problem\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "10-Aug 21:16:13:DEBUG:root:Creating elements\n", + "10-Aug 21:16:13:INFO:root:dofs per node: 3\n", + "10-Aug 21:16:13:INFO:root:dofs per node: 3\n", + "10-Aug 21:16:13:DEBUG:root:Problem size = 894\n", + "10-Aug 21:16:13:DEBUG:root:Starting iteration 1\n", + "10-Aug 21:16:13:DEBUG:root:Assembling\n", + "10-Aug 21:16:15:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 21:16:15:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "10-Aug 21:16:15:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 21:16:15:DEBUG:root:Solving system of equations. Total size = 921\n", + "10-Aug 21:16:15:DEBUG:root:Solution norm = 0.2429242363684311\n", + "10-Aug 21:16:15:DEBUG:root:Starting iteration 2\n", + "10-Aug 21:16:15:DEBUG:root:Assembling\n", + "10-Aug 21:16:16:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 21:16:16:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "10-Aug 21:16:16:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 21:16:16:DEBUG:root:Solving system of equations. Total size = 921\n", + "10-Aug 21:16:16:DEBUG:root:Solution norm = 0.220339941648292\n", + "10-Aug 21:16:16:DEBUG:root:Starting iteration 3\n", + "10-Aug 21:16:16:DEBUG:root:Assembling\n", + "10-Aug 21:16:17:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 21:16:17:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "10-Aug 21:16:17:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 21:16:17:DEBUG:root:Solving system of equations. Total size = 921\n", + "10-Aug 21:16:18:DEBUG:root:Solution norm = 31.956186974599095\n", + "10-Aug 21:16:18:DEBUG:root:Starting iteration 4\n", + "10-Aug 21:16:18:DEBUG:root:Assembling\n", + "10-Aug 21:16:19:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 21:16:19:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "10-Aug 21:16:19:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 21:16:19:DEBUG:root:Solving system of equations. Total size = 921\n", + "10-Aug 21:16:19:DEBUG:root:Solution norm = 411.4719431105651\n", + "10-Aug 21:16:19:DEBUG:root:Starting iteration 5\n", + "10-Aug 21:16:19:DEBUG:root:Assembling\n", + "10-Aug 21:16:21:DEBUG:root:Adding Dirichlet boundary conditions\n", + "10-Aug 21:16:21:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "10-Aug 21:16:21:DEBUG:root:Adding Neumann boundary conditions\n", + "10-Aug 21:16:21:DEBUG:root:Solving system of equations. Total size = 921\n", + "10-Aug 21:16:21:DEBUG:root:Solution norm = 7077.644216187514\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 facts verified.\n" + ] + }, + { + "data": { + "text/plain": [ + "delayed_handler (generic function with 4 methods)" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "facts(\"solve 3d elasticity problem\") do\n", + "\n", + " attributes = Dict(\"Young\" => 90, \"Poisson\" => 0.25)\n", + "\n", + " Logging.debug(\"Creating elements\")\n", + " elements = Element[]\n", + " coordinates = zeros(3, 10)\n", + " for (elid, node_ids) in model[\"elements\"]\n", + " for (i, nid) in enumerate(node_ids)\n", + " coordinates[:,i] = model[\"nodes\"][nid]\n", + " end\n", + " el = Element(elid, node_ids, coordinates, attributes)\n", + " push!(elements, el)\n", + " end\n", + "\n", + " # create \"dofmap\" so that we know how to assemble global stiffness matrix\n", + " dofmap = create_ldof2gdofmap(elements; ndofs=3)\n", + "\n", + " # Boundary conditions\n", + "\n", + " # dirichlet bc, set dx=dy=dz for all nodes in set SUPPORT\n", + " bc_support = BC(Int64[], Float64[])\n", + " for nid in model[\"nsets\"][\"SUPPORT\"]\n", + " for i=1:3\n", + " push!(bc_support.dofs, dofmap[nid][i])\n", + " push!(bc_support.values, 0.0)\n", + " end\n", + " end\n", + "\n", + " # force boundary condition, put -1 to 2nd dof for each node in set LOAD\n", + " bc_load = BC(Int64[], Float64[])\n", + " for nid in model[\"nsets\"][\"LOAD\"]\n", + " push!(bc_load.dofs, dofmap[nid][2])\n", + " push!(bc_load.values, -0.1)\n", + " end\n", + "\n", + " #solve!(elements, [bc1], [bc2]; max_iterations=7)\n", + " neumann_bcs = [bc_load]\n", + " dirichlet_bcs = [bc_support]\n", + " # ndofs = dimension of unknown field in nodes\n", + " solve!(elements, dofmap, neumann_bcs, dirichlet_bcs; ndofs=3, max_iterations=5)\n", + "# disp = elements[1].attributes[\"displacement\"]\n", + "# Logging.debug(\"Displacement of element = \\n$disp\")\n", + "# @fact norm(disp) => roughly(3.1292483947150043)\n", "end" ] }, @@ -938,31 +1865,6 @@ "JuliaFEM.xdmf.xdmf_save_model(xdoc, \"/tmp/foo.xmf\")" ] }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "PyObject " - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "using PyCall\n", - "@pyimport IPython.display as d\n", - "d.Image(\"/tmp/displacement.png\")" - ] - }, { "cell_type": "markdown", "metadata": { @@ -972,82 +1874,6 @@ "## 3d beam with quadratic elements" ] }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "27-Jun 23:44:05:INFO:root:Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\"]\n", - "WARNING: beginswith is deprecated, use startswith instead.\n", - " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", - " in beginswith at deprecated.jl:30\n", - " in parse_abaqus at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:113\n", - " in include_string at loading.jl:99\n", - " in execute_request_0x535c5df2 at /Users/jukka/.julia/v0.4/IJulia/src/execute_request.jl:157\n", - " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", - " in anonymous at task.jl:365\n", - "while loading In[4], in expression starting on line 2\n", - "WARNING: beginswith is deprecated, use startswith instead.\n", - " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", - " in beginswith at deprecated.jl:30\n", - " in parse_abaqus at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:113\n", - " in include_string at loading.jl:99\n", - " in execute_request_0x535c5df2 at /Users/jukka/.julia/v0.4/IJulia/src/execute_request.jl:157\n", - " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", - " in anonymous at task.jl:365\n", - "while loading In[4], in expression starting on line 2\n", - "27-Jun 23:44:06:DEBUG:root:Found NODE section\n", - "27-Jun 23:44:07:DEBUG:root:Found ELEMENT section\n", - "WARNING: integer(s::AbstractString) is deprecated, use parse(Int,s) instead.\n", - " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", - " in integer at deprecated.jl:49\n", - " in map at abstractarray.jl:1251\n", - " in parse_element_section at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:59\n", - " in process_section at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:108\n", - " in parse_abaqus at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:117\n", - " in include_string at loading.jl:99\n", - " in execute_request_0x535c5df2 at /Users/jukka/.julia/v0.4/IJulia/src/execute_request.jl:157\n", - " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", - " in anonymous at task.jl:365\n", - "while loading In[4], in expression starting on line 2\n", - "27-Jun 23:44:08:DEBUG:root:120 elements found\n", - "27-Jun 23:44:08:INFO:root:Creating ELSET Body1\n", - "27-Jun 23:44:08:DEBUG:root:Found NSET section\n", - "27-Jun 23:44:08:DEBUG:root:Creating node set SUPPORT\n", - "27-Jun 23:44:08:DEBUG:root:Found NSET section\n", - "27-Jun 23:44:08:DEBUG:root:Creating node set LOAD\n", - "27-Jun 23:44:08:DEBUG:root:Found NSET section\n", - "27-Jun 23:44:08:DEBUG:root:Creating node set TOP\n" - ] - }, - { - "data": { - "text/plain": [ - "Dict{Any,Any} with 4 entries:\n", - " \"nodes\" => Dict{Any,Any}(288=>[97.5,7.5,10.0],11=>[92.5,2.5,5.0],134=>[45.…\n", - " \"elements\" => Dict{Any,Any}(68=>[71,144,149,198,51,150,57,43,50,214],2=>[204,…\n", - " \"elsets\" => Dict{Any,Any}(\"Body1\"=>[1,2,3,4,5,6,7,8,9,10 … 111,112,113,11…\n", - " \"nsets\" => Dict{Any,Any}(\"LOAD\"=>[82,84,87,179,197,246,249,256,257],\"SUPPO…" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fid = open(\"../geometry/3d_beam/palkki.inp\")\n", - "model = JuliaFEM.abaqus_reader.parse_abaqus(fid)\n", - "close(fid)\n", - "model" - ] - }, { "cell_type": "code", "execution_count": 5, @@ -1153,98 +1979,6 @@ "Shape functions and integration points" ] }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "dNtet (generic function with 1 method)" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Ntet(xi) = [(xi[1] + xi[2] + xi[3] - 1)*(2*xi[1] + 2*xi[2] + 2*xi[3] - 1)\n", - " -xi[1]*(-2*xi[1] + 1)\n", - " -xi[2]*(-2*xi[2] + 1)\n", - " -xi[3]*(-2*xi[3] + 1)\n", - " 4*xi[1]*(-xi[1] - xi[2] - xi[3] + 1)\n", - " 4*xi[1]*xi[2]\n", - " 4*xi[2]*(-xi[1] - xi[2] - xi[3] + 1)\n", - " 4*xi[1]*xi[3]\n", - " 4*xi[2]*xi[3]\n", - " 4*xi[3]*(-xi[1] - xi[2] - xi[3] + 1)]\n", - "\n", - "dNtet(xi) = [\n", - " 4*xi[1] + 4*xi[2] + 4*xi[3] - 3 4*xi[1] + 4*xi[2] + 4*xi[3] - 3 4*xi[1] + 4*xi[2] + 4*xi[3] - 3\n", - " 4*xi[1] - 1 0 0\n", - " 0 4*xi[2] - 1 0\n", - " 0 0 4*xi[3] - 1\n", - "-8*xi[1] - 4*xi[2] - 4*xi[3] + 4 -4*xi[1] -4*xi[1]\n", - " 4*xi[2] 4*xi[1] 0\n", - " -4*xi[2] -4*xi[1] - 8*xi[2] - 4*xi[3] + 4 -4*xi[2]\n", - " 4*xi[3] 0 4*xi[1]\n", - " 0 4*xi[3] 4*xi[2]\n", - " -4*xi[3] -4*xi[3] -4*xi[1] - 4*xi[2] - 8*xi[3] + 4]" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sum(Ntet([0, 1, 1]))" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1x4 Array{Float64,2}:\n", - " 0.0416667 0.0416667 0.0416667 0.0416667" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# from code aster documentation\n", - "a = 1/20*(5-sqrt(5))\n", - "b = 1/20*(5+3*sqrt(5))\n", - "ipoints = [a a a; a a b; a b a; b a a]\n", - "iweights = 1/24*[1 1 1 1]" - ] - }, { "cell_type": "markdown", "metadata": {}, From f04a912192054616285b3c2dbea1e74c6da023df Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Tue, 11 Aug 2015 00:29:22 +0300 Subject: [PATCH 09/26] Added autodiff version, still not converging... --- ...2015-06-25-elasticity-solver-example.ipynb | 1119 +++++++++++------ 1 file changed, 738 insertions(+), 381 deletions(-) diff --git a/notebooks/2015-06-25-elasticity-solver-example.ipynb b/notebooks/2015-06-25-elasticity-solver-example.ipynb index c999049..57f2e11 100644 --- a/notebooks/2015-06-25-elasticity-solver-example.ipynb +++ b/notebooks/2015-06-25-elasticity-solver-example.ipynb @@ -50,10 +50,32 @@ "execution_count": 1, "metadata": {}, "output_type": "execute_result" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", + " in int32 at deprecated.jl:49\n", + " in recv at /Users/jukka/.julia/v0.4/ZMQ/src/ZMQ.jl:617\n", + " in recv_ipython at /Users/jukka/.julia/v0.4/IJulia/src/msg.jl:63\n", + " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:120\n", + " in anonymous at task.jl:365\n", + "while loading /Users/jukka/.julia/v0.4/IJulia/src/kernel.jl, in expression starting on line 35\n", + "WARNING: int32(x) is deprecated, use Int32(x) instead.\n", + " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", + " in int32 at deprecated.jl:49\n", + " in recv at /Users/jukka/.julia/v0.4/ZMQ/src/ZMQ.jl:617\n", + " in recv_ipython at /Users/jukka/.julia/v0.4/IJulia/src/msg.jl:63\n", + " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:120\n", + " in anonymous at task.jl:365\n", + "while loading /Users/jukka/.julia/v0.4/IJulia/src/kernel.jl, in expression starting on line 35\n" + ] } ], "source": [ "using Logging\n", + "using ForwardDiff\n", "Logging.configure(level=DEBUG)" ] }, @@ -119,7 +141,7 @@ "--------\n", "\n", "\"\"\"\n", - "function calc_local_matrices!(X, u, R, K, basis, dbasis, lambda_, mu_, ipoints, iweights)\n", + "function calc_local_matrices2!(X, u, R, K, basis, dbasis, lambda_, mu_, ipoints, iweights)\n", " dim, nnodes = size(X)\n", " I = eye(dim)\n", " R[:,:] = 0.0\n", @@ -161,6 +183,50 @@ " end\n", "\n", " end\n", + "end\n", + "\n", + "\"\"\"\n", + "Autodiff version.\n", + "\"\"\"\n", + "function calc_local_matrices!(X, u, R, K, basis, dbasis, lambda_, mu_, ipoints, iweights)\n", + " dim, nnodes = size(X)\n", + " I = eye(dim)\n", + " R[:,:] = 0.0\n", + "\n", + " #dF = zeros(dim, dim)\n", + "\n", + " function calc_R!(u, R)\n", + " for m = 1:length(iweights)\n", + " w = iweights[m]\n", + " xi = ipoints[m, :]\n", + " # calculate material parameters\n", + " lambda = typeof(lambda_) == Float64 ? lambda_ : dot(lambda_, basis(xi))\n", + " mu = typeof(mu_) == Float64 ? mu_ : dot(mu_, basis(xi))\n", + " Jt = X*dbasis(xi)\n", + " detJ = det(Jt)\n", + " dbasisdX = dbasis(xi)*inv(Jt)\n", + "\n", + " gradu = u*dbasisdX\n", + " F = I + gradu # Deformation gradient\n", + " E = 1/2*(gradu' + gradu + gradu'*gradu) # Green-Lagrange strain tensor\n", + " S = lambda*trace(E)*I + 2*mu*E # PK2 stress tensor\n", + " P = F*S # PK1 stress tensor\n", + "\n", + " R[:,:] += w*P*dbasisdX'*detJ\n", + " end\n", + " end\n", + "\n", + " # herlper for tangent stiffness matrix\n", + " function R!(u, R)\n", + " R[:] = 0\n", + " calc_R!(reshape(u, dim, nnodes), reshape(R, dim, nnodes))\n", + " #calc_Wext!(reshape(u, 2, 4), reshape(R, 2, 4))\n", + " end\n", + " Jacobian = ForwardDiff.forwarddiff_jacobian(R!, Float64, fadtype=:dual, n=dim*nnodes, m=dim*nnodes)\n", + "\n", + " K[:, :] = Jacobian(reshape(u, dim*nnodes))\n", + " R!(reshape(u, 8), reshape(R, dim*nnodes))\n", + "\n", "end" ] }, @@ -189,6 +255,13 @@ "collapsed": false }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: the `=>` syntax is deprecated, use `-->` instead\n" + ] + }, { "name": "stdout", "output_type": "stream", @@ -200,16 +273,16 @@ "name": "stderr", "output_type": "stream", "text": [ - "10-Aug 19:18:44:DEBUG:root:Converged in 6 iterations.\n", - "10-Aug 19:18:45:DEBUG:root:solution vector: \n", - " [0.0 -0.39914506095474317 -0.07228582695592449 0.0\n", + "11-Aug 00:20:24:DEBUG:root:Converged in 6 iterations.\n", + "11-Aug 00:20:25:DEBUG:root:solution vector: \n", + " [0.0 -0.3991450609547433 -0.07228582695592461 0.0\n", " 0.0 -2.1779892317073504 -2.222244754401764 0.0]\n", - "10-Aug 19:18:45:DEBUG:root:norm of u: 3.1292483947150043\n", - "10-Aug 19:18:45:DEBUG:root:Converged in 6 iterations.\n", - "10-Aug 19:18:45:DEBUG:root:solution vector: \n", - " [0.0 0.7433248532717793 1.0485210147234858 0.0\n", + "11-Aug 00:20:25:DEBUG:root:norm of u: 3.1292483947150047\n", + "11-Aug 00:20:25:DEBUG:root:Converged in 6 iterations.\n", + "11-Aug 00:20:25:DEBUG:root:solution vector: \n", + " [0.0 0.7433248532717796 1.048521014723486 0.0\n", " 0.0 -2.085766534304891 -1.9606633242166027 0.0]\n", - "10-Aug 19:18:45:DEBUG:root:norm of u: 3.129248394715006\n" + "11-Aug 00:20:25:DEBUG:root:norm of u: 3.1292483947150056\n" ] }, { @@ -310,7 +383,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 5, "metadata": { "collapsed": false }, @@ -361,7 +434,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 8, "metadata": { "collapsed": false }, @@ -372,7 +445,7 @@ "get_integration_scheme (generic function with 2 methods)" ] }, - "execution_count": 56, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -452,7 +525,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 9, "metadata": { "collapsed": false }, @@ -463,7 +536,7 @@ "assemble_element! (generic function with 2 methods)" ] }, - "execution_count": 79, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -516,7 +589,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 10, "metadata": { "collapsed": false }, @@ -532,30 +605,43 @@ "name": "stderr", "output_type": "stream", "text": [ - "10-Aug 21:03:06:DEBUG:root:Adding nodes to array\n", - "10-Aug 21:03:06:DEBUG:root:Creating elements\n", - "10-Aug 21:03:06:DEBUG:root:Starting iteration 1\n", - "10-Aug 21:03:06:DEBUG:root:Assembling\n", - "10-Aug 21:03:06:DEBUG:root:Solution norm = 3.090022136728999\n", - "10-Aug 21:03:06:DEBUG:root:Starting iteration 2\n", - "10-Aug 21:03:06:DEBUG:root:Assembling\n", - "10-Aug 21:03:06:DEBUG:root:Solution norm = 0.3212131602153504\n", - "10-Aug 21:03:06:DEBUG:root:Starting iteration 3\n", - "10-Aug 21:03:06:DEBUG:root:Assembling\n", - "10-Aug 21:03:06:DEBUG:root:Solution norm = 0.040431781940005365\n", - "10-Aug 21:03:06:DEBUG:root:Starting iteration 4\n", - "10-Aug 21:03:06:DEBUG:root:Assembling\n", - "10-Aug 21:03:06:DEBUG:root:Solution norm = 0.0009291101052064257\n", - "10-Aug 21:03:06:DEBUG:root:Starting iteration 5\n", - "10-Aug 21:03:06:DEBUG:root:Assembling\n", - "10-Aug 21:03:06:DEBUG:root:Solution norm = 1.5638899025378415e-7\n", - "10-Aug 21:03:06:DEBUG:root:Starting iteration 6\n", - "10-Aug 21:03:06:DEBUG:root:Assembling\n", - "10-Aug 21:03:06:DEBUG:root:Solution norm = 1.0355045356935844e-14\n", - "10-Aug 21:03:06:DEBUG:root:Converged in 6 iterations.\n", - "10-Aug 21:03:06:DEBUG:root:Displacement of element = \n", - "[-0.39914506095474334 -0.07228582695592464 0.0 0.0\n", - " -2.1779892317073504 -2.222244754401764 0.0 0.0]\n" + "11-Aug 00:20:40:DEBUG:root:Adding nodes to array\n", + "11-Aug 00:20:40:DEBUG:root:Creating elements\n", + "11-Aug 00:20:40:DEBUG:root:Starting iteration 1\n", + "11-Aug 00:20:40:DEBUG:root:Assembling\n", + "11-Aug 00:20:40:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", + "11-Aug 00:20:41:DEBUG:root:Solution norm = 3.090022136728999\n", + "11-Aug 00:20:41:DEBUG:root:Starting iteration 2\n", + "11-Aug 00:20:41:DEBUG:root:Assembling\n", + "11-Aug 00:20:41:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", + "11-Aug 00:20:41:DEBUG:root:Solution norm = 0.32121316021535135\n", + "11-Aug 00:20:41:DEBUG:root:Starting iteration 3\n", + "11-Aug 00:20:41:DEBUG:root:Assembling\n", + "11-Aug 00:20:41:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", + "11-Aug 00:20:41:DEBUG:root:Solution norm = 0.040431781939994194\n", + "11-Aug 00:20:41:DEBUG:root:Starting iteration 4\n", + "11-Aug 00:20:41:DEBUG:root:Assembling\n", + "11-Aug 00:20:41:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", + "11-Aug 00:20:41:DEBUG:root:Solution norm = 0.0009291101052124042\n", + "11-Aug 00:20:41:DEBUG:root:Starting iteration 5\n", + "11-Aug 00:20:41:DEBUG:root:Assembling\n", + "11-Aug 00:20:41:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", + "11-Aug 00:20:41:DEBUG:root:Solution norm = 1.5638899022213175e-7\n", + "11-Aug 00:20:41:DEBUG:root:Starting iteration 6\n", + "11-Aug 00:20:41:DEBUG:root:Assembling\n", + "11-Aug 00:20:41:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", + "11-Aug 00:20:41:DEBUG:root:Solution norm = 1.0118539067290854e-14\n", + "11-Aug 00:20:41:DEBUG:root:Converged in 6 iterations.\n", + "11-Aug 00:20:41:DEBUG:root:Displacement of element = \n", + "[-0.39914506095474334 -0.0722858269559246 0.0 0.0\n", + " -2.1779892317073504 -2.2222447544017645 0.0 0.0]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 fact verified.\n" ] }, { @@ -564,16 +650,9 @@ "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 58, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1 fact verified.\n" - ] } ], "source": [ @@ -646,7 +725,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 11, "metadata": { "collapsed": false }, @@ -660,7 +739,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 12, "metadata": { "collapsed": false, "scrolled": false @@ -677,98 +756,115 @@ "name": "stderr", "output_type": "stream", "text": [ - "10-Aug 22:55:49:DEBUG:root:Creating nodes\n", - "10-Aug 22:55:49:DEBUG:root:Creating elements\n", - "10-Aug 22:55:49:INFO:root:create_ldof2gdofmap: dofs per node: 2\n", - "10-Aug 22:55:49:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],1=>[1,2])\n", - "10-Aug 22:55:50:INFO:root:solve!: dofs per node: 2\n", - "10-Aug 22:55:50:DEBUG:root:Problem size = 8\n", - "10-Aug 22:55:50:DEBUG:root:Starting iteration 1\n", - "10-Aug 22:55:50:DEBUG:root:Assembling\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n" + "11-Aug 00:20:47:DEBUG:root:Creating nodes\n", + "11-Aug 00:20:47:DEBUG:root:Creating elements\n", + "11-Aug 00:20:47:INFO:root:create_ldof2gdofmap: dofs per node: 2\n", + "11-Aug 00:20:47:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],1=>[1,2])\n", + "11-Aug 00:20:48:INFO:root:solve!: dofs per node: 2\n", + "11-Aug 00:20:48:DEBUG:root:Problem size = 8\n", + "11-Aug 00:20:48:DEBUG:root:Starting iteration 1\n", + "11-Aug 00:20:48:DEBUG:root:Assembling\n", + "11-Aug 00:20:48:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Element stiffness matrix\n" + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:dof 5 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 6 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 12\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:Solution norm = 3.0900221367289444\n", - "10-Aug 22:55:50:DEBUG:root:Starting iteration 2\n", - "10-Aug 22:55:50:DEBUG:root:Assembling\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", - "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:dof 5 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 6 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 12\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:Solution norm = 0.32121316021534363\n", - "10-Aug 22:55:50:DEBUG:root:Starting iteration 3\n", - "10-Aug 22:55:50:DEBUG:root:Assembling\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", - "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:dof 5 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 6 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 12\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:Solution norm = 0.04043178194002483\n", - "10-Aug 22:55:50:DEBUG:root:Starting iteration 4\n" + "11-Aug 00:20:49:DEBUG:root:Adding Dirichlet boundary conditions\n", + "11-Aug 00:20:49:DEBUG:root:dof 5 => 0.0\n", + "11-Aug 00:20:49:DEBUG:root:dof 6 => 0.0\n", + "11-Aug 00:20:49:DEBUG:root:dof 7 => 0.0\n", + "11-Aug 00:20:49:DEBUG:root:dof 8 => 0.0\n", + "11-Aug 00:20:49:DEBUG:root:Added 4 Lagrange multipliers to model\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " 123.2 -15.0 -118.4 -3.0 -61.6 15.0 56.8 3.0\n", + " -15.0 321.2 3.0 -319.4 15.0 -160.6 -3.0 158.8\n", + " -118.4 3.0 123.2 15.0 56.8 -3.0 -61.6 -15.0\n", + " -3.0 -319.4 15.0 321.2 3.0 158.8 -15.0 -160.6\n", + " -61.6 15.0 56.8 3.0 123.2 -15.0 -118.4 -3.0\n", + " 15.0 -160.6 -3.0 158.8 -15.0 321.2 3.0 -319.4\n", + " 56.8 -3.0 -61.6 -15.0 -118.4 3.0 123.2 15.0\n", + " 3.0 158.8 -15.0 -160.6 -3.0 -319.4 15.0 321.2\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:49:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 00:20:49:DEBUG:root:Solving system of equations. Total size = 12\n", + "11-Aug 00:20:49:DEBUG:root:nothing\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 123.2 -15.0 -118.4 -03.0 -61.6 15.0 56.8 03.0\n", - " -15.0 321.2 03.0 -319.4 15.0 -160.6 -03.0 158.8\n", - " -118.4 03.0 123.2 15.0 56.8 -03.0 -61.6 -15.0\n", - " -03.0 -319.4 15.0 321.2 03.0 158.8 -15.0 -160.6\n", - " -61.6 15.0 56.8 03.0 123.2 -15.0 -118.4 -03.0\n", - " 15.0 -160.6 -03.0 158.8 -15.0 321.2 03.0 -319.4\n", - " 56.8 -03.0 -61.6 -15.0 -118.4 03.0 123.2 15.0\n", - " 03.0 158.8 -15.0 -160.6 -03.0 -319.4 15.0 321.2\n", "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", - " 123.2 -15.0 -118.4 -03.0 -61.6 15.0 56.8 03.0 0.0 0.0 0.0 0.0\n", - " -15.0 321.2 03.0 -319.4 15.0 -160.6 -03.0 158.8 0.0 0.0 0.0 0.0\n", - " -118.4 03.0 123.2 15.0 56.8 -03.0 -61.6 -15.0 0.0 0.0 0.0 0.0\n", - " -03.0 -319.4 15.0 321.2 03.0 158.8 -15.0 -160.6 0.0 0.0 0.0 0.0\n", - " -61.6 15.0 56.8 03.0 123.2 -15.0 -118.4 -03.0 1.0 0.0 0.0 0.0\n", - " 15.0 -160.6 -03.0 158.8 -15.0 321.2 03.0 -319.4 0.0 1.0 0.0 0.0\n", - " 56.8 -03.0 -61.6 -15.0 -118.4 03.0 123.2 15.0 0.0 0.0 1.0 0.0\n", - " 03.0 158.8 -15.0 -160.6 -03.0 -319.4 15.0 321.2 0.0 0.0 0.0 1.0\n", + " 123.2 -15.0 -118.4 -3.0 -61.6 15.0 56.8 3.0 0.0 0.0 0.0 0.0\n", + " -15.0 321.2 3.0 -319.4 15.0 -160.6 -3.0 158.8 0.0 0.0 0.0 0.0\n", + " -118.4 3.0 123.2 15.0 56.8 -3.0 -61.6 -15.0 0.0 0.0 0.0 0.0\n", + " -3.0 -319.4 15.0 321.2 3.0 158.8 -15.0 -160.6 0.0 0.0 0.0 0.0\n", + " -61.6 15.0 56.8 3.0 123.2 -15.0 -118.4 -3.0 1.0 0.0 0.0 0.0\n", + " 15.0 -160.6 -3.0 158.8 -15.0 321.2 3.0 -319.4 0.0 1.0 0.0 0.0\n", + " 56.8 -3.0 -61.6 -15.0 -118.4 3.0 123.2 15.0 0.0 0.0 1.0 0.0\n", + " 3.0 158.8 -15.0 -160.6 -3.0 -319.4 15.0 321.2 0.0 0.0 0.0 1.0\n", " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", - "Array(Float64,(1,12)) 1x12 Array{Float64,2}:\n", - " 0.0 0.0 0.0 02.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "Array(Float64,(1,12)) 1x12 Array{Float64,2}" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:49:DEBUG:root:nothing\n", + "11-Aug 00:20:49:DEBUG:root:Solution norm = 3.0900221367289444\n", + "11-Aug 00:20:49:DEBUG:root:Starting iteration 2\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ":\n", + " 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:49:DEBUG:root:Assembling\n", + "11-Aug 00:20:49:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", + "11-Aug 00:20:49:DEBUG:root:Adding Dirichlet boundary conditions\n", + "11-Aug 00:20:49:DEBUG:root:dof 5 => 0.0\n", + "11-Aug 00:20:49:DEBUG:root:dof 6 => 0.0\n", + "11-Aug 00:20:49:DEBUG:root:dof 7 => 0.0\n", + "11-Aug 00:20:49:DEBUG:root:dof 8 => 0.0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Element stiffness matrix\n", "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", " 147.61 36.88 -149.16 -55.03 -66.97 1.91 68.52 16.24\n", @@ -778,22 +874,60 @@ " -66.97 1.81 63.17 16.65 128.11 -15.44 -124.3 -3.03\n", " 1.91 -174.07 10.41 163.39 -15.44 338.21 3.11 -327.53\n", " 68.52 10.06 -74.73 -27.02 -124.3 3.11 130.51 13.85\n", - " 16.24 165.4 -27.06 -159.04 -3.03 -327.53 13.85 321.16\n", + " 16.24 165.4 -27.06 -159.04 -3.03 -327.53 13.85 321.16\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:49:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "11-Aug 00:20:49:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 00:20:49:DEBUG:root:Solving system of equations. Total size = 12\n", + "11-Aug 00:20:49:DEBUG:root:nothing\n", + "11-Aug 00:20:49:DEBUG:root:nothing\n", + "11-Aug 00:20:49:DEBUG:root:Solution norm = 0.3212131602153477\n", + "11-Aug 00:20:49:DEBUG:root:Starting iteration 3\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", " 147.6 36.9 -149.2 -55.0 -67.0 1.9 68.5 16.2 0.0 0.0 0.0 0.0\n", " 36.9 343.1 -48.8 -334.4 1.8 -174.1 10.1 165.4 0.0 0.0 0.0 0.0\n", " -149.2 -48.8 160.7 65.4 63.2 10.4 -74.7 -27.1 0.0 0.0 0.0 0.0\n", " -55.0 -334.4 65.4 330.1 16.7 163.4 -27.0 -159.0 0.0 0.0 0.0 0.0\n", - " -67.0 1.8 63.2 16.7 128.1 -15.4 -124.3 -03.0 1.0 0.0 0.0 0.0\n", + " -67.0 1.8 63.2 16.7 128.1 -15.4 -124.3 -3.0 1.0 0.0 0.0 0.0\n", " 1.9 -174.1 10.4 163.4 -15.4 338.2 3.1 -327.5 0.0 1.0 0.0 0.0\n", " 68.5 10.1 -74.7 -27.0 -124.3 3.1 130.5 13.8 0.0 0.0 1.0 0.0\n", - " 16.2 165.4 -27.1 -159.0 -03.0 -327.5 13.8 321.2 0.0 0.0 0.0 1.0\n", + " 16.2 165.4 -27.1 -159.0 -3.0 -327.5 13.8 321.2 0.0 0.0 0.0 1.0\n", " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", "Array(Float64,(1,12)) 1x12 Array{Float64,2}:\n", - " -2.3 -15.7 05.0 15.2 -20.2 12.2 17.5 -9.6 0.0 0.0 0.0 0.0\n", + " -2.3 -15.7 5.0 15.2 -20.2 12.2 17.5 -9.6 0.0 0.0 0.0 0.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:49:DEBUG:root:Assembling\n", + "11-Aug 00:20:49:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", + "11-Aug 00:20:50:DEBUG:root:Adding Dirichlet boundary conditions\n", + "11-Aug 00:20:50:DEBUG:root:dof 5 => 0.0\n", + "11-Aug 00:20:50:DEBUG:root:dof 6 => 0.0\n", + "11-Aug 00:20:50:DEBUG:root:dof 7 => 0.0\n", + "11-Aug 00:20:50:DEBUG:root:dof 8 => 0.0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Element stiffness matrix\n", "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", " 131.01 35.45 -132.72 -52.73 -60.29 1.77 62.0 15.51\n", @@ -803,7 +937,26 @@ " -60.29 1.71 56.75 16.11 117.72 -14.75 -114.18 -3.07\n", " 1.77 -163.9 10.12 153.51 -14.75 327.07 2.86 -316.69\n", " 62.0 9.58 -67.77 -25.93 -114.18 2.86 119.94 13.49\n", - " 15.51 155.6 -25.93 -149.13 -3.07 -316.69 13.49 310.22\n", + " 15.51 155.6 -25.93 -149.13 -3.07 -316.69 13.49 310.22\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "11-Aug 00:20:50:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 00:20:50:DEBUG:root:Solving system of equations. Total size = 12\n", + "11-Aug 00:20:50:DEBUG:root:nothing\n", + "11-Aug 00:20:50:DEBUG:root:nothing\n", + "11-Aug 00:20:50:DEBUG:root:Solution norm = 0.04043178194000972\n", + "11-Aug 00:20:50:DEBUG:root:Starting iteration 4\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", " 131.0 35.4 -132.7 -52.7 -60.3 1.8 62.0 15.5 0.0 0.0 0.0 0.0\n", " 35.4 313.8 -46.7 -305.5 1.7 -163.9 9.6 155.6 0.0 0.0 0.0 0.0\n", @@ -825,52 +978,13 @@ "name": "stderr", "output_type": "stream", "text": [ - "10-Aug 22:55:50:DEBUG:root:Assembling\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", - "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:dof 5 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 6 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 12\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:Solution norm = 0.0009291101052060104\n", - "10-Aug 22:55:50:DEBUG:root:Starting iteration 5\n", - "10-Aug 22:55:50:DEBUG:root:Assembling\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", - "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:dof 5 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 6 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 12\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:Solution norm = 1.563889898905983e-7\n", - "10-Aug 22:55:50:DEBUG:root:Starting iteration 6\n", - "10-Aug 22:55:50:DEBUG:root:Assembling\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", - "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:dof 5 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 6 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 12\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:Solution norm = 1.2782462771683917e-14\n", - "10-Aug 22:55:50:DEBUG:root:Converged in 6 iterations.\n", - "10-Aug 22:55:50:DEBUG:root:Displacement of element = \n", - "[-0.3991450609547439 -0.07228582695592495 0.0 0.0\n", - " -2.1779892317073513 -2.2222447544017654 0.0 0.0]\n", - "10-Aug 22:55:50:DEBUG:root:Creating elements\n" + "11-Aug 00:20:50:DEBUG:root:Assembling\n", + "11-Aug 00:20:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", + "11-Aug 00:20:50:DEBUG:root:Adding Dirichlet boundary conditions\n", + "11-Aug 00:20:50:DEBUG:root:dof 5 => 0.0\n", + "11-Aug 00:20:50:DEBUG:root:dof 6 => 0.0\n", + "11-Aug 00:20:50:DEBUG:root:dof 7 => 0.0\n", + "11-Aug 00:20:50:DEBUG:root:dof 8 => 0.0\n" ] }, { @@ -886,7 +1000,26 @@ " -60.05 1.52 56.54 16.27 117.21 -14.68 -113.7 -3.11\n", " 1.58 -163.43 10.29 152.96 -14.68 326.61 2.81 -316.14\n", " 61.86 9.73 -67.63 -26.02 -113.7 2.81 119.47 13.49\n", - " 15.64 155.09 -26.02 -148.53 -3.11 -316.14 13.49 309.58\n", + " 15.64 155.09 -26.02 -148.53 -3.11 -316.14 13.49 309.58\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "11-Aug 00:20:50:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 00:20:50:DEBUG:root:Solving system of equations. Total size = 12\n", + "11-Aug 00:20:50:DEBUG:root:nothing\n", + "11-Aug 00:20:50:DEBUG:root:nothing\n", + "11-Aug 00:20:50:DEBUG:root:Solution norm = 0.0009291101052125497\n", + "11-Aug 00:20:50:DEBUG:root:Starting iteration 5\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", " 130.7 36.0 -132.5 -53.3 -60.1 1.6 61.9 15.6 0.0 0.0 0.0 0.0\n", " 36.0 312.2 -47.3 -303.9 1.5 -163.4 9.7 155.1 0.0 0.0 0.0 0.0\n", @@ -901,7 +1034,27 @@ " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", "Array(Float64,(1,12)) 1x12 Array{Float64,2}:\n", - " 0.0 -0.0 -0.0 0.0 -19.9 2.8 19.9 -0.8 0.0 0.0 0.0 0.0\n", + " 0.0 -0.0 -0.0 0.0 -19.9 2.8 19.9 -0.8 0.0 0.0 0.0 0.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:50:DEBUG:root:Assembling\n", + "11-Aug 00:20:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", + "11-Aug 00:20:50:DEBUG:root:Adding Dirichlet boundary conditions\n", + "11-Aug 00:20:50:DEBUG:root:dof 5 => 0.0\n", + "11-Aug 00:20:50:DEBUG:root:dof 6 => 0.0\n", + "11-Aug 00:20:50:DEBUG:root:dof 7 => 0.0\n", + "11-Aug 00:20:50:DEBUG:root:dof 8 => 0.0\n", + "11-Aug 00:20:50:DEBUG:root:Added 4 Lagrange multipliers to model\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Element stiffness matrix\n", "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", " 130.66 36.06 -132.47 -53.28 -60.05 1.57 61.86 15.64\n", @@ -911,7 +1064,27 @@ " -60.05 1.51 56.54 16.27 117.21 -14.67 -113.69 -3.11\n", " 1.57 -163.43 10.29 152.96 -14.67 326.61 2.81 -316.14\n", " 61.86 9.73 -67.63 -26.02 -113.69 2.81 119.46 13.49\n", - " 15.64 155.08 -26.02 -148.52 -3.11 -316.14 13.49 309.58\n", + " 15.64 155.08 -26.02 -148.52 -3.11 -316.14 13.49 309.58\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:50:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 00:20:50:DEBUG:root:Solving system of equations. Total size = 12\n", + "11-Aug 00:20:50:DEBUG:root:nothing\n", + "11-Aug 00:20:50:DEBUG:root:nothing\n", + "11-Aug 00:20:50:DEBUG:root:Solution norm = 1.5638898939617795e-7\n", + "11-Aug 00:20:50:DEBUG:root:Starting iteration 6\n", + "11-Aug 00:20:50:DEBUG:root:Assembling\n", + "11-Aug 00:20:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", " 130.7 36.1 -132.5 -53.3 -60.1 1.6 61.9 15.6 0.0 0.0 0.0 0.0\n", " 36.1 312.2 -47.3 -303.9 1.5 -163.4 9.7 155.1 0.0 0.0 0.0 0.0\n", @@ -927,7 +1100,27 @@ " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", "Array(Float64,(1,12)) 1x12 Array{Float64,2}:\n", " 0.0 -0.0 0.0 0.0 -19.9 2.8 19.9 -0.8 0.0 0.0 0.0 0.0\n", - "Element stiffness matrix\n", + "Element stiffness matrix" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:50:DEBUG:root:Adding Dirichlet boundary conditions\n", + "11-Aug 00:20:50:DEBUG:root:dof 5 => 0.0\n", + "11-Aug 00:20:50:DEBUG:root:dof 6 => 0.0\n", + "11-Aug 00:20:50:DEBUG:root:dof 7 => 0.0\n", + "11-Aug 00:20:50:DEBUG:root:dof 8 => 0.0\n", + "11-Aug 00:20:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "11-Aug 00:20:50:DEBUG:root:Adding Neumann boundary conditions\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", " 130.66 36.06 -132.47 -53.28 -60.05 1.57 61.86 15.64\n", " 36.06 312.22 -47.3 -303.88 1.51 -163.43 9.73 155.08\n", @@ -936,7 +1129,27 @@ " -60.05 1.51 56.54 16.27 117.21 -14.67 -113.69 -3.11\n", " 1.57 -163.43 10.29 152.96 -14.67 326.61 2.81 -316.14\n", " 61.86 9.73 -67.63 -26.02 -113.69 2.81 119.46 13.49\n", - " 15.64 155.08 -26.02 -148.52 -3.11 -316.14 13.49 309.58\n", + " 15.64 155.08 -26.02 -148.52 -3.11 -316.14 13.49 309.58\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:50:DEBUG:root:Solving system of equations. Total size = 12\n", + "11-Aug 00:20:50:DEBUG:root:nothing\n", + "11-Aug 00:20:50:DEBUG:root:nothing\n", + "11-Aug 00:20:50:DEBUG:root:Solution norm = 1.0991584038546891e-14\n", + "11-Aug 00:20:50:DEBUG:root:Converged in 6 iterations.\n", + "11-Aug 00:20:51:DEBUG:root:Displacement of element = \n", + "[-0.39914506095474345 -0.07228582695592463 0.0 0.0\n", + " -2.1779892317073504 -2.2222447544017645 0.0 0.0]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", " 130.7 36.1 -132.5 -53.3 -60.1 1.6 61.9 15.6 0.0 0.0 0.0 0.0\n", " 36.1 312.2 -47.3 -303.9 1.5 -163.4 9.7 155.1 0.0 0.0 0.0 0.0\n", @@ -951,7 +1164,7 @@ " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", "Array(Float64,(1,12)) 1x12 Array{Float64,2}:\n", - " 0.0 -0.0 -0.0 0.0 -19.9 2.8 19.9 -0.8 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -0.0 -0.0 -19.9 2.8 19.9 -0.8 0.0 0.0 0.0 0.0\n", "1 fact verified.\n", "solve two element problem\n" ] @@ -960,89 +1173,116 @@ "name": "stderr", "output_type": "stream", "text": [ - "10-Aug 22:55:50:INFO:root:create_ldof2gdofmap: dofs per node: 2\n", - "10-Aug 22:55:50:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],5=>[9,10],6=>[11,12],1=>[1,2])\n", - "10-Aug 22:55:50:INFO:root:solve!: dofs per node: 2\n", - "10-Aug 22:55:50:DEBUG:root:Problem size = 12\n", - "10-Aug 22:55:50:DEBUG:root:Starting iteration 1\n", - "10-Aug 22:55:50:DEBUG:root:Assembling\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", - "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:dof 1 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 2 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 16\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:Solution norm = 12.031677381267034\n", - "10-Aug 22:55:50:DEBUG:root:Starting iteration 2\n", - "10-Aug 22:55:50:DEBUG:root:Assembling\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", - "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:dof 1 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 2 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 16\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:Solution norm = 8.151050361276255\n", - "10-Aug 22:55:50:DEBUG:root:Starting iteration 3\n", - "10-Aug 22:55:50:DEBUG:root:Assembling\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n" + "11-Aug 00:20:51:DEBUG:root:Creating elements\n", + "11-Aug 00:20:51:INFO:root:create_ldof2gdofmap: dofs per node: 2\n", + "11-Aug 00:20:51:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],5=>[9,10],6=>[11,12],1=>[1,2])\n", + "11-Aug 00:20:51:INFO:root:solve!: dofs per node: 2\n", + "11-Aug 00:20:51:DEBUG:root:Problem size = 12\n", + "11-Aug 00:20:51:DEBUG:root:Starting iteration 1\n", + "11-Aug 00:20:51:DEBUG:root:Assembling\n", + "11-Aug 00:20:51:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Element stiffness matrix\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:51:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", + "11-Aug 00:20:51:DEBUG:root:Adding Dirichlet boundary conditions\n", + "11-Aug 00:20:51:DEBUG:root:dof 1 => 0.0\n", + "11-Aug 00:20:51:DEBUG:root:dof 2 => 0.0\n", + "11-Aug 00:20:51:DEBUG:root:dof 7 => 0.0\n", + "11-Aug 00:20:51:DEBUG:root:dof 8 => 0.0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 66.4 15.0 23.6 -3.0 -33.2 -15.0 -56.8 3.0\n", + " 15.0 162.4 3.0 77.6 -15.0 -81.2 -3.0 -158.8\n", + " 23.6 3.0 66.4 -15.0 -56.8 -3.0 -33.2 15.0\n", + " -3.0 77.6 -15.0 162.4 3.0 -158.8 15.0 -81.2\n", + " -33.2 -15.0 -56.8 3.0 66.4 15.0 23.6 -3.0\n", + " -15.0 -81.2 -3.0 -158.8 15.0 162.4 3.0 77.6\n", + " -56.8 -3.0 -33.2 15.0 23.6 3.0 66.4 -15.0\n", + " 3.0 -158.8 15.0 -81.2 -3.0 77.6 -15.0 162.4\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 66.4 15.0 23.6 -3.0 -33.2 -15.0 -56.8 3.0\n", + " 15.0 162.4 3.0 77.6 -15.0 -81.2 -3.0 -158.8\n", + " 23.6 3.0 66.4 -15.0 -56.8 -3.0 -33.2 15.0\n", + " -3.0 77.6 -15.0 162.4 3.0 -158.8 15.0 -81.2\n", + " -33.2 -15.0 -56.8 3.0 66.4 15.0 23.6 -3.0\n", + " -15.0 -81.2 -3.0 -158.8 15.0 162.4 3.0 77.6\n", + " -56.8 -3.0 -33.2 15.0 23.6 3.0 66.4 -15.0\n", + " 3.0 -158.8 15.0 -81.2 -3.0 77.6 -15.0 162.4\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:51:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "11-Aug 00:20:51:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 00:20:51:DEBUG:root:Solving system of equations. Total size = 16\n", + "11-Aug 00:20:51:DEBUG:root:nothing\n", + "11-Aug 00:20:51:DEBUG:root:nothing\n", + "11-Aug 00:20:51:DEBUG:root:Solution norm = 12.031677381267034\n", + "11-Aug 00:20:51:DEBUG:root:Starting iteration 2\n", + "11-Aug 00:20:51:DEBUG:root:Assembling\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", + " 66.4 15.0 23.6 -3.0 0.0 0.0 -56.8 3.0 -33.2 -15.0 0.0 0.0 1.0 0.0 0.0 0.0\n", + " 15.0 162.4 3.0 77.6 0.0 0.0 -3.0 -158.8 -15.0 -81.2 0.0 0.0 0.0 1.0 0.0 0.0\n", + " 23.6 3.0 132.8 0.0 23.6 -3.0 -33.2 15.0 -113.6 0.0 -33.2 -15.0 0.0 0.0 0.0 0.0\n", + " -3.0 77.6 0.0 324.8 3.0 77.6 15.0 -81.2 0.0 -317.6 -15.0 -81.2 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 23.6 3.0 66.4 -15.0 0.0 0.0 -33.2 15.0 -56.8 -3.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -3.0 77.6 -15.0 162.4 0.0 0.0 15.0 -81.2 3.0 -158.8 0.0 0.0 0.0 0.0\n", + " -56.8 -3.0 -33.2 15.0 0.0 0.0 66.4 -15.0 23.6 3.0 0.0 0.0 0.0 0.0 1.0 0.0\n", + " 3.0 -158.8 15.0 -81.2 0.0 0.0 -15.0 162.4 -3.0 77.6 0.0 0.0 0.0 0.0 0.0 1.0\n", + " -33.2 -15.0 -113.6 0.0 -33.2 15.0 23.6 -3.0 132.8 0.0 23.6 3.0 0.0 0.0 0.0 0.0\n", + " -15.0 -81.2 0.0 -317.6 15.0 -81.2 3.0 77.6 0.0 324.8 -3.0 77.6 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -33.2 -15.0 -56.8 3.0 0.0 0.0 23.6 -3.0 66.4 15.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -15.0 -81.2 -3.0 -158.8 0.0 0.0 3.0 77.6 15.0 162.4 0.0 0.0 0.0 0.0\n", + " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:51:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", + "11-Aug 00:20:51:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", + "11-Aug 00:20:51:DEBUG:root:Adding Dirichlet boundary conditions\n", + "11-Aug 00:20:51:DEBUG:root:dof 1 => 0.0\n", + "11-Aug 00:20:51:DEBUG:root:dof 2 => 0.0\n", + "11-Aug 00:20:51:DEBUG:root:dof 7 => 0.0\n", + "11-Aug 00:20:51:DEBUG:root:dof 8 => 0.0\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 66.4 15.0 23.6 -03.0 -33.2 -15.0 -56.8 03.0\n", - " 15.0 162.4 03.0 77.6 -15.0 -81.2 -03.0 -158.8\n", - " 23.6 03.0 66.4 -15.0 -56.8 -03.0 -33.2 15.0\n", - " -03.0 77.6 -15.0 162.4 03.0 -158.8 15.0 -81.2\n", - " -33.2 -15.0 -56.8 03.0 66.4 15.0 23.6 -03.0\n", - " -15.0 -81.2 -03.0 -158.8 15.0 162.4 03.0 77.6\n", - " -56.8 -03.0 -33.2 15.0 23.6 03.0 66.4 -15.0\n", - " 03.0 -158.8 15.0 -81.2 -03.0 77.6 -15.0 162.4\n", - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 66.4 15.0 23.6 -03.0 -33.2 -15.0 -56.8 03.0\n", - " 15.0 162.4 03.0 77.6 -15.0 -81.2 -03.0 -158.8\n", - " 23.6 03.0 66.4 -15.0 -56.8 -03.0 -33.2 15.0\n", - " -03.0 77.6 -15.0 162.4 03.0 -158.8 15.0 -81.2\n", - " -33.2 -15.0 -56.8 03.0 66.4 15.0 23.6 -03.0\n", - " -15.0 -81.2 -03.0 -158.8 15.0 162.4 03.0 77.6\n", - " -56.8 -03.0 -33.2 15.0 23.6 03.0 66.4 -15.0\n", - " 03.0 -158.8 15.0 -81.2 -03.0 77.6 -15.0 162.4\n", - "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", - " 66.4 15.0 23.6 -03.0 0.0 0.0 -56.8 03.0 -33.2 -15.0 0.0 0.0 1.0 0.0 0.0 0.0\n", - " 15.0 162.4 03.0 77.6 0.0 0.0 -03.0 -158.8 -15.0 -81.2 0.0 0.0 0.0 1.0 0.0 0.0\n", - " 23.6 03.0 132.8 0.0 23.6 -03.0 -33.2 15.0 -113.6 0.0 -33.2 -15.0 0.0 0.0 0.0 0.0\n", - " -03.0 77.6 0.0 324.8 03.0 77.6 15.0 -81.2 0.0 -317.6 -15.0 -81.2 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 23.6 03.0 66.4 -15.0 0.0 0.0 -33.2 15.0 -56.8 -03.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -03.0 77.6 -15.0 162.4 0.0 0.0 15.0 -81.2 03.0 -158.8 0.0 0.0 0.0 0.0\n", - " -56.8 -03.0 -33.2 15.0 0.0 0.0 66.4 -15.0 23.6 03.0 0.0 0.0 0.0 0.0 1.0 0.0\n", - " 03.0 -158.8 15.0 -81.2 0.0 0.0 -15.0 162.4 -03.0 77.6 0.0 0.0 0.0 0.0 0.0 1.0\n", - " -33.2 -15.0 -113.6 0.0 -33.2 15.0 23.6 -03.0 132.8 0.0 23.6 03.0 0.0 0.0 0.0 0.0\n", - " -15.0 -81.2 0.0 -317.6 15.0 -81.2 03.0 77.6 0.0 324.8 -03.0 77.6 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -33.2 -15.0 -56.8 03.0 0.0 0.0 23.6 -03.0 66.4 15.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -15.0 -81.2 -03.0 -158.8 0.0 0.0 03.0 77.6 15.0 162.4 0.0 0.0 0.0 0.0\n", - " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 02.0 0.0 0.0 0.0 0.0\n", "Element stiffness matrix\n", "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", " 520.78 72.26 330.9 62.7 -397.04 -45.87 -454.64 -89.09\n", @@ -1062,7 +1302,27 @@ " -397.04 -47.57 -895.33 -183.65 983.14 157.73 309.22 73.49\n", " -45.87 -243.98 -206.2 -617.73 157.73 615.62 94.34 246.08\n", " -454.64 -107.75 -310.49 -90.92 309.22 94.34 455.91 104.34\n", - " -89.09 -472.18 -88.74 -344.68 73.49 246.08 104.34 570.77\n", + " -89.09 -472.18 -88.74 -344.68 73.49 246.08 104.34 570.77\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:51:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "11-Aug 00:20:51:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 00:20:51:DEBUG:root:Solving system of equations. Total size = 16\n", + "11-Aug 00:20:51:DEBUG:root:nothing\n", + "11-Aug 00:20:51:DEBUG:root:nothing\n", + "11-Aug 00:20:51:DEBUG:root:Solution norm = 8.151050361276273\n", + "11-Aug 00:20:51:DEBUG:root:Starting iteration 3\n", + "11-Aug 00:20:51:DEBUG:root:Assembling\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", " 520.8 72.3 330.9 62.7 0.0 0.0 -454.6 -89.1 -397.0 -45.9 0.0 0.0 1.0 0.0 0.0 0.0\n", " 72.3 461.9 83.1 254.3 0.0 0.0 -107.8 -472.2 -47.6 -244.0 0.0 0.0 0.0 1.0 0.0 0.0\n", @@ -1081,7 +1341,26 @@ " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", - " -453.5 -212.6 -1168.0 -759.0 -714.5 -546.4 300.0 466.2 1168.0 759.0 868.1 294.8 0.0 0.0 0.0 0.0\n", + " -453.5 -212.6 -1168.0 -759.0 -714.5 -546.4 300.0 466.2 1168.0 759.0 868.1 294.8 0.0 0.0 0.0 0.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:51:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", + "11-Aug 00:20:51:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", + "11-Aug 00:20:51:DEBUG:root:Adding Dirichlet boundary conditions\n", + "11-Aug 00:20:51:DEBUG:root:dof 1 => 0.0\n", + "11-Aug 00:20:51:DEBUG:root:dof 2 => 0.0\n", + "11-Aug 00:20:51:DEBUG:root:dof 7 => 0.0\n", + "11-Aug 00:20:51:DEBUG:root:dof 8 => 0.0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Element stiffness matrix\n", "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", " 43.42 28.69 48.59 17.79 -57.52 -15.59 -34.48 -30.89\n", @@ -1092,57 +1371,7 @@ " -15.59 -22.99 -53.31 -72.78 42.6 67.46 26.29 28.32\n", " -34.48 -35.32 -38.54 -24.51 41.26 26.29 31.77 33.54\n", " -30.89 -62.29 -23.98 -49.53 21.33 28.32 33.54 83.5 \n", - "Element stiffness matrix\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:dof 1 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 2 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 16\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:Solution norm = 3.886954756970209\n", - "10-Aug 22:55:50:DEBUG:root:Starting iteration 4\n", - "10-Aug 22:55:50:DEBUG:root:Assembling\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", - "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:dof 1 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 2 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 16\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:Solution norm = 2.9651628976855293\n", - "10-Aug 22:55:50:DEBUG:root:Starting iteration 5\n", - "10-Aug 22:55:50:DEBUG:root:Assembling\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", - "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:dof 1 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 2 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 16\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "Element stiffness matrix\n", "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", " 43.42 28.69 48.59 17.79 -57.52 -15.59 -34.48 -30.89\n", " 28.69 51.46 22.52 33.82 -15.89 -22.99 -35.32 -62.29\n", @@ -1151,7 +1380,26 @@ " -57.52 -15.89 -152.3 -48.04 168.56 42.6 41.26 21.33\n", " -15.59 -22.99 -53.31 -72.78 42.6 67.46 26.29 28.32\n", " -34.48 -35.32 -38.54 -24.51 41.26 26.29 31.77 33.54\n", - " -30.89 -62.29 -23.98 -49.53 21.33 28.32 33.54 83.5 \n", + " -30.89 -62.29 -23.98 -49.53 21.33 28.32 33.54 83.5 \n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:51:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "11-Aug 00:20:51:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 00:20:51:DEBUG:root:Solving system of equations. Total size = 16\n", + "11-Aug 00:20:51:DEBUG:root:nothing\n", + "11-Aug 00:20:52:DEBUG:root:nothing\n", + "11-Aug 00:20:52:DEBUG:root:Solution norm = 3.8869547569703458\n", + "11-Aug 00:20:52:DEBUG:root:Starting iteration 4\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", " 43.4 28.7 48.6 17.8 0.0 0.0 -34.5 -30.9 -57.5 -15.6 0.0 0.0 1.0 0.0 0.0 0.0\n", " 28.7 51.5 22.5 33.8 0.0 0.0 -35.3 -62.3 -15.9 -23.0 0.0 0.0 0.0 1.0 0.0 0.0\n", @@ -1170,7 +1418,27 @@ " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", - " 27.5 08.5 22.1 17.8 -5.4 9.3 -21.6 -15.8 -22.1 -17.8 -0.5 -0.0 0.0 0.0 0.0 0.0\n", + " 27.5 8.5 22.1 17.8 -5.4 9.3 -21.6 -15.8 -22.1 -17.8 -0.5 -0.0 0.0 0.0 0.0 0.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:52:DEBUG:root:Assembling\n", + "11-Aug 00:20:52:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", + "11-Aug 00:20:52:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", + "11-Aug 00:20:52:DEBUG:root:Adding Dirichlet boundary conditions\n", + "11-Aug 00:20:52:DEBUG:root:dof 1 => 0.0\n", + "11-Aug 00:20:52:DEBUG:root:dof 2 => 0.0\n", + "11-Aug 00:20:52:DEBUG:root:dof 7 => 0.0\n", + "11-Aug 00:20:52:DEBUG:root:dof 8 => 0.0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Element stiffness matrix\n", "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", " 116.19 1.61 71.4 10.34 -89.72 1.21 -97.86 -13.16\n", @@ -1190,7 +1458,27 @@ " -89.72 0.67 -197.12 -32.77 219.04 18.96 67.81 13.14\n", " 1.21 -49.8 -40.75 -134.57 18.96 135.27 20.58 49.1 \n", " -97.86 -20.01 -65.73 -23.66 67.81 20.58 95.78 23.09\n", - " -13.16 -95.68 -23.07 -81.92 13.14 49.1 23.09 128.5 \n", + " -13.16 -95.68 -23.07 -81.92 13.14 49.1 23.09 128.5 \n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:52:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "11-Aug 00:20:52:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 00:20:52:DEBUG:root:Solving system of equations. Total size = 16\n", + "11-Aug 00:20:52:DEBUG:root:nothing\n", + "11-Aug 00:20:52:DEBUG:root:nothing\n", + "11-Aug 00:20:52:DEBUG:root:Solution norm = 2.9651628976855995\n", + "11-Aug 00:20:52:DEBUG:root:Starting iteration 5\n", + "11-Aug 00:20:52:DEBUG:root:Assembling\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", " 116.2 1.6 71.4 10.3 0.0 0.0 -97.9 -13.2 -89.7 1.2 0.0 0.0 1.0 0.0 0.0 0.0\n", " 1.6 96.2 17.7 49.3 0.0 0.0 -20.0 -95.7 0.7 -49.8 0.0 0.0 0.0 1.0 0.0 0.0\n", @@ -1209,71 +1497,66 @@ " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", - " -02.5 8.8 -27.7 -26.3 -25.2 -35.2 -10.3 26.0 27.7 26.3 38.0 2.3 0.0 0.0 0.0 0.0\n", - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 80.58 18.37 53.97 14.28 -64.27 -7.29 -70.28 -25.36\n", - " 18.37 29.48 19.23 20.58 -7.58 -16.78 -30.02 -33.28\n", - " 53.97 19.23 139.54 47.2 -146.69 -42.11 -46.81 -24.33\n", - " 14.28 20.58 47.2 74.51 -36.82 -59.55 -24.66 -35.54\n", - " -64.27 -7.58 -146.69 -36.82 159.26 28.44 51.7 15.96\n", - " -7.29 -16.78 -42.11 -59.55 28.44 56.47 20.96 19.86\n", - " -70.28 -30.02 -46.81 -24.66 51.7 20.96 65.39 33.72\n", - " -25.36 -33.28 -24.33 -35.54 15.96 19.86 33.72 48.96\n", - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 80.58 18.37 53.97 14.28 -64.27 -7.29 -70.28 -25.36\n", - " 18.37 29.48 19.23 20.58 -7.58 -16.78 -30.02 -33.28\n", - " 53.97 19.23 139.54 47.2 -146.69 -42.11 -46.81 -24.33\n", - " 14.28 20.58 47.2 74.51 -36.82 -59.55 -24.66 -35.54\n", - " -64.27 -7.58 -146.69 -36.82 159.26 28.44 51.7 15.96\n", - " -7.29 -16.78 -42.11 -59.55 28.44 56.47 20.96 19.86\n", - " -70.28 -30.02 -46.81 -24.66 51.7 20.96 65.39 33.72\n", - " -25.36 -33.28 -24.33 -35.54 15.96 19.86 33.72 48.96\n", - "Array(Float64,(16,16)) 16x16 Array{Float64,2}" + " -2.5 8.8 -27.7 -26.3 -25.2 -35.2 -10.3 26.0 27.7 26.3 38.0 2.3 0.0 0.0 0.0 0.0\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:Solution norm = 2.638889456564507\n", - "10-Aug 22:55:50:DEBUG:root:Starting iteration 6\n", - "10-Aug 22:55:50:DEBUG:root:Assembling\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", - "10-Aug 22:55:50:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:dof 1 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 2 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 7 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:dof 8 => 0.0\n", - "10-Aug 22:55:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "10-Aug 22:55:50:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 22:55:50:DEBUG:root:Solving system of equations. Total size = 16\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:nothing\n", - "10-Aug 22:55:50:DEBUG:root:Solution norm = 2.5846689771724556\n", - "10-Aug 22:55:50:DEBUG:root:Starting iteration 7\n", - "10-Aug 22:55:50:DEBUG:root:Assembling\n", - "10-Aug 22:55:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", - "10-Aug 22:55:51:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", - "10-Aug 22:55:51:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 22:55:51:DEBUG:root:dof 1 => 0.0\n", - "10-Aug 22:55:51:DEBUG:root:dof 2 => 0.0\n", - "10-Aug 22:55:51:DEBUG:root:dof 7 => 0.0\n", - "10-Aug 22:55:51:DEBUG:root:dof 8 => 0.0\n", - "10-Aug 22:55:51:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "10-Aug 22:55:51:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 22:55:51:DEBUG:root:Solving system of equations. Total size = 16\n" + "11-Aug 00:20:52:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", + "11-Aug 00:20:52:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", + "11-Aug 00:20:52:DEBUG:root:Adding Dirichlet boundary conditions\n", + "11-Aug 00:20:52:DEBUG:root:dof 1 => 0.0\n", + "11-Aug 00:20:52:DEBUG:root:dof 2 => 0.0\n", + "11-Aug 00:20:52:DEBUG:root:dof 7 => 0.0\n", + "11-Aug 00:20:52:DEBUG:root:dof 8 => 0.0\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - ":\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 80.58 18.37 53.97 14.28 -64.27 -7.29 -70.28 -25.36\n", + " 18.37 29.48 19.23 20.58 -7.58 -16.78 -30.02 -33.28\n", + " 53.97 19.23 139.54 47.2 -146.69 -42.11 -46.81 -24.33\n", + " 14.28 20.58 47.2 74.51 -36.82 -59.55 -24.66 -35.54\n", + " -64.27 -7.58 -146.69 -36.82 159.26 28.44 51.7 15.96\n", + " -7.29 -16.78 -42.11 -59.55 28.44 56.47 20.96 19.86\n", + " -70.28 -30.02 -46.81 -24.66 51.7 20.96 65.39 33.72\n", + " -25.36 -33.28 -24.33 -35.54 15.96 19.86 33.72 48.96\n", + "Element stiffness matrix\n", + "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", + " 80.58 18.37 53.97 14.28 -64.27 -7.29 -70.28 -25.36\n", + " 18.37 29.48 19.23 20.58 -7.58 -16.78 -30.02 -33.28\n", + " 53.97 19.23 139.54 47.2 -146.69 -42.11 -46.81 -24.33\n", + " 14.28 20.58 47.2 74.51 -36.82 -59.55 -24.66 -35.54\n", + " -64.27 -7.58 -146.69 -36.82 159.26 28.44 51.7 15.96\n", + " -7.29 -16.78 -42.11 -59.55 28.44 56.47 20.96 19.86\n", + " -70.28 -30.02 -46.81 -24.66 51.7 20.96 65.39 33.72\n", + " -25.36 -33.28 -24.33 -35.54 15.96 19.86 33.72 48.96\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:52:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "11-Aug 00:20:52:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 00:20:52:DEBUG:root:Solving system of equations. Total size = 16\n", + "11-Aug 00:20:52:DEBUG:root:nothing\n", + "11-Aug 00:20:52:DEBUG:root:nothing\n", + "11-Aug 00:20:52:DEBUG:root:Solution norm = 2.638889456564558\n", + "11-Aug 00:20:52:DEBUG:root:Starting iteration 6\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", " 80.6 18.4 54.0 14.3 0.0 0.0 -70.3 -25.4 -64.3 -7.3 0.0 0.0 1.0 0.0 0.0 0.0\n", " 18.4 29.5 19.2 20.6 0.0 0.0 -30.0 -33.3 -7.6 -16.8 0.0 0.0 0.0 1.0 0.0 0.0\n", " 54.0 19.2 220.1 65.6 54.0 14.3 -46.8 -24.3 -217.0 -67.5 -64.3 -7.3 0.0 0.0 0.0 0.0\n", @@ -1291,7 +1574,26 @@ " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", - " 28.6 5.9 32.9 14.7 4.3 8.7 -24.6 -14.9 -32.9 -14.7 -8.3 2.2 0.0 0.0 0.0 0.0\n", + " 28.6 5.9 32.9 14.7 4.3 8.7 -24.6 -14.9 -32.9 -14.7 -8.3 2.2 0.0 0.0 0.0 0.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:52:DEBUG:root:Assembling\n", + "11-Aug 00:20:52:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", + "11-Aug 00:20:52:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", + "11-Aug 00:20:52:DEBUG:root:Adding Dirichlet boundary conditions\n", + "11-Aug 00:20:52:DEBUG:root:dof 1 => 0.0\n", + "11-Aug 00:20:52:DEBUG:root:dof 2 => 0.0\n", + "11-Aug 00:20:52:DEBUG:root:dof 7 => 0.0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Element stiffness matrix\n", "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", " 138.24 6.59 72.3 13.02 -91.67 -1.46 -118.87 -18.14\n", @@ -1311,7 +1613,26 @@ " -91.67 -1.83 -182.78 -36.21 203.7 23.62 70.75 14.42\n", " -1.46 -47.79 -43.91 -128.01 23.62 126.88 21.75 48.93\n", " -118.87 -25.11 -66.81 -25.42 70.75 21.75 114.93 28.77\n", - " -18.14 -95.3 -25.05 -79.12 14.42 48.93 28.77 125.49\n", + " -18.14 -95.3 -25.05 -79.12 14.42 48.93 28.77 125.49\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:52:DEBUG:root:dof 8 => 0.0\n", + "11-Aug 00:20:52:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "11-Aug 00:20:52:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 00:20:52:DEBUG:root:Solving system of equations. Total size = 16\n", + "11-Aug 00:20:52:DEBUG:root:nothing\n", + "11-Aug 00:20:52:DEBUG:root:nothing\n", + "11-Aug 00:20:52:DEBUG:root:Solution norm = 2.584668977172499\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", " 138.2 6.6 72.3 13.0 0.0 0.0 -118.9 -18.1 -91.7 -1.5 0.0 0.0 1.0 0.0 0.0 0.0\n", " 6.6 95.7 20.3 47.4 0.0 0.0 -25.1 -95.3 -1.8 -47.8 0.0 0.0 0.0 1.0 0.0 0.0\n", @@ -1330,7 +1651,26 @@ " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", - " -06.5 7.6 -25.7 -24.5 -19.1 -32.0 -4.1 20.8 25.7 24.5 29.7 5.7 0.0 0.0 0.0 0.0\n", + " -6.5 7.6 -25.7 -24.5 -19.1 -32.0 -4.1 20.8 25.7 24.5 29.7 5.7 0.0 0.0 0.0 0.0\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:52:DEBUG:root:Starting iteration 7\n", + "11-Aug 00:20:52:DEBUG:root:Assembling\n", + "11-Aug 00:20:52:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", + "11-Aug 00:20:52:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", + "11-Aug 00:20:52:DEBUG:root:Adding Dirichlet boundary conditions\n", + "11-Aug 00:20:53:DEBUG:root:dof 1 => 0.0\n", + "11-Aug 00:20:53:DEBUG:root:dof 2 => 0.0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Element stiffness matrix\n", "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", " 105.18 18.96 58.01 14.76 -69.33 -6.94 -93.85 -26.77\n", @@ -1350,7 +1690,25 @@ " -69.33 -7.13 -141.88 -36.07 154.31 27.5 56.9 15.7 \n", " -6.94 -18.68 -41.41 -59.09 27.5 56.13 20.86 21.65\n", " -93.85 -31.72 -51.41 -25.44 56.9 20.86 88.36 36.3 \n", - " -26.77 -39.68 -25.23 -36.91 15.7 21.65 36.3 54.93\n", + " -26.77 -39.68 -25.23 -36.91 15.7 21.65 36.3 54.93\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 00:20:53:DEBUG:root:dof 7 => 0.0\n", + "11-Aug 00:20:53:DEBUG:root:dof 8 => 0.0\n", + "11-Aug 00:20:53:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "11-Aug 00:20:53:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 00:20:53:DEBUG:root:Solving system of equations. Total size = 16\n", + "11-Aug 00:20:53:DEBUG:root:nothing\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", " 105.2 19.0 58.0 14.8 0.0 0.0 -93.9 -26.8 -69.3 -6.9 0.0 0.0 1.0 0.0 0.0 0.0\n", " 19.0 36.9 19.9 21.5 0.0 0.0 -31.7 -39.7 -7.1 -18.7 0.0 0.0 0.0 1.0 0.0 0.0\n", @@ -1362,19 +1720,24 @@ " -26.8 -39.7 -25.2 -36.9 0.0 0.0 36.3 54.9 15.7 21.6 0.0 0.0 0.0 0.0 0.0 1.0\n", " -69.3 -7.1 -235.7 -67.8 -51.4 -25.4 56.9 15.7 242.7 63.8 56.9 20.9 0.0 0.0 0.0 0.0\n", " -6.9 -18.7 -68.2 -98.8 -25.2 -36.9 20.9 21.6 63.8 111.1 15.7 21.6 0.0 0.0 0.0 0.0\n", - " 0.0 " + " 0.0 0.0 -69.3 -7.1 -141.9 -36.1 0.0 0.0 56.9 15.7 154.3 27.5 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 -6.9 -18.7 -41.4 -59.1 0.0 0.0 20.9 21.6 27.5 56.1 0.0 0.0 0.0 0.0\n", + " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + "Array(Float64,(1,16)) 1x16 Array{Float64,2}" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "10-Aug 22:55:51:DEBUG:root:nothing\n", - "10-Aug 22:55:51:DEBUG:root:nothing\n", - "10-Aug 22:55:51:DEBUG:root:Solution norm = 2.4116101594574446\n", - "10-Aug 22:55:51:DEBUG:root:Displacement of element = \n", - "[-3.0265017801117513 -5.464687844270099 -4.5022205763589715 -2.2188310526354926\n", - " -1.2759688848713764 -6.757003969576785 -7.2218353000897295 -1.8649226742660745]\n" + "11-Aug 00:20:53:DEBUG:root:nothing\n", + "11-Aug 00:20:53:DEBUG:root:Solution norm = 2.411610159457492\n", + "11-Aug 00:20:53:DEBUG:root:Displacement of element = \n", + "[-3.026501780111713 -5.464687844269877 -4.502220576358782 -2.218831052635469\n", + " -1.2759688848714141 -6.757003969576775 -7.221835300089658 -1.8649226742660827]\n" ] }, { @@ -1383,7 +1746,7 @@ "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 82, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, @@ -1391,14 +1754,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "0.0 -69.3 -7.1 -141.9 -36.1 0.0 0.0 56.9 15.7 154.3 27.5 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -6.9 -18.7 -41.4 -59.1 0.0 0.0 20.9 21.6 27.5 56.1 0.0 0.0 0.0 0.0\n", - " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", - " 22.9 4.1 28.6 11.8 5.6 7.6 -19.5 -12.4 -28.6 -11.8 -09.0 2.6 0.0 0.0 0.0 0.0\n", + ":\n", + " 22.9 4.1 28.6 11.8 5.6 7.6 -19.5 -12.4 -28.6 -11.8 -9.0 2.6 0.0 0.0 0.0 0.0\n", "0 facts verified.\n" ] } From 64f8ce03272b28f10d575c0e457102572268a108 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Tue, 11 Aug 2015 22:48:35 +0300 Subject: [PATCH 10/26] Finally working... --- ...2015-06-25-elasticity-solver-example.ipynb | 2770 ++++------------- 1 file changed, 573 insertions(+), 2197 deletions(-) diff --git a/notebooks/2015-06-25-elasticity-solver-example.ipynb b/notebooks/2015-06-25-elasticity-solver-example.ipynb index 57f2e11..c4b82ae 100644 --- a/notebooks/2015-06-25-elasticity-solver-example.ipynb +++ b/notebooks/2015-06-25-elasticity-solver-example.ipynb @@ -50,27 +50,6 @@ "execution_count": 1, "metadata": {}, "output_type": "execute_result" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", - " in int32 at deprecated.jl:49\n", - " in recv at /Users/jukka/.julia/v0.4/ZMQ/src/ZMQ.jl:617\n", - " in recv_ipython at /Users/jukka/.julia/v0.4/IJulia/src/msg.jl:63\n", - " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:120\n", - " in anonymous at task.jl:365\n", - "while loading /Users/jukka/.julia/v0.4/IJulia/src/kernel.jl, in expression starting on line 35\n", - "WARNING: int32(x) is deprecated, use Int32(x) instead.\n", - " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", - " in int32 at deprecated.jl:49\n", - " in recv at /Users/jukka/.julia/v0.4/ZMQ/src/ZMQ.jl:617\n", - " in recv_ipython at /Users/jukka/.julia/v0.4/IJulia/src/msg.jl:63\n", - " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:120\n", - " in anonymous at task.jl:365\n", - "while loading /Users/jukka/.julia/v0.4/IJulia/src/kernel.jl, in expression starting on line 35\n" - ] } ], "source": [ @@ -94,7 +73,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 18, "metadata": { "collapsed": false }, @@ -105,7 +84,7 @@ "calc_local_matrices! (generic function with 1 method)" ] }, - "execution_count": 2, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -225,7 +204,7 @@ " Jacobian = ForwardDiff.forwarddiff_jacobian(R!, Float64, fadtype=:dual, n=dim*nnodes, m=dim*nnodes)\n", "\n", " K[:, :] = Jacobian(reshape(u, dim*nnodes))\n", - " R!(reshape(u, 8), reshape(R, dim*nnodes))\n", + " R!(reshape(u, dim*nnodes), reshape(R, dim*nnodes))\n", "\n", "end" ] @@ -239,7 +218,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 16, "metadata": { "collapsed": true }, @@ -250,18 +229,12 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 19, "metadata": { - "collapsed": false + "collapsed": false, + "scrolled": false }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING: the `=>` syntax is deprecated, use `-->` instead\n" - ] - }, { "name": "stdout", "output_type": "stream", @@ -273,23 +246,39 @@ "name": "stderr", "output_type": "stream", "text": [ - "11-Aug 00:20:24:DEBUG:root:Converged in 6 iterations.\n", - "11-Aug 00:20:25:DEBUG:root:solution vector: \n", + "11-Aug 21:42:03:DEBUG:root:Converged in 6 iterations.\n", + "11-Aug 21:42:03:DEBUG:root:solution vector: \n", " [0.0 -0.3991450609547433 -0.07228582695592461 0.0\n", " 0.0 -2.1779892317073504 -2.222244754401764 0.0]\n", - "11-Aug 00:20:25:DEBUG:root:norm of u: 3.1292483947150047\n", - "11-Aug 00:20:25:DEBUG:root:Converged in 6 iterations.\n", - "11-Aug 00:20:25:DEBUG:root:solution vector: \n", + "11-Aug 21:42:03:DEBUG:root:norm of u: 3.1292483947150047\n", + "11-Aug 21:42:03:DEBUG:root:Converged in 6 iterations.\n", + "11-Aug 21:42:03:DEBUG:root:solution vector: \n", " [0.0 0.7433248532717796 1.048521014723486 0.0\n", " 0.0 -2.085766534304891 -1.9606633242166027 0.0]\n", - "11-Aug 00:20:25:DEBUG:root:norm of u: 3.1292483947150056\n" + "11-Aug 21:42:03:DEBUG:root:norm of u: 3.1292483947150056\n", + "11-Aug 21:42:03:DEBUG:root:Iteration 1\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "2 facts verified.\n" + "Array(Float64,(12,12)) 12x12 Array{Float64,2}" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "11-Aug 21:42:04:DEBUG:root:Norm of du: 0.5992228342549063\n", + "11-Aug 21:42:04:DEBUG:root:Element displacement: [0.0 -0.02264423092574128 0.022536491965822688 0.0\n", + " 0.0 -0.12688379170176511 -0.12679760053383046 0.0]\n", + "11-Aug 21:42:04:DEBUG:root:Element displacement: [-0.02264423092574128 -0.029998807330416523 0.030242156525002267 0.022536491965822688\n", + " -0.12688379170176511 -0.4041002710283739 -0.40446733271991214 -0.12679760053383046]\n", + "11-Aug 21:42:04:DEBUG:root:solution vector: \n", + " [-0.02264423092574128 -0.029998807330416523 0.022536491965822688 0.030242156525002267 0.0 0.0\n", + " -0.12688379170176511 -0.4041002710283739 -0.12679760053383046 -0.40446733271991214 0.0 0.0]\n", + "11-Aug 21:42:04:DEBUG:root:norm of u: 0.5992228342549063\n" ] }, { @@ -298,9 +287,34 @@ "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 4, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ":\n", + " 132.8 0.0 23.6 -3.0 -113.6 0.0 -33.2 -15.0 23.6 3.0 -33.2 15.0\n", + " 0.0 324.8 3.0 77.6 0.0 -317.6 -15.0 -81.2 -3.0 77.6 15.0 -81.2\n", + " 23.6 3.0 66.4 -15.0 -33.2 15.0 -56.8 -3.0 0.0 0.0 0.0 0.0\n", + " -3.0 77.6 -15.0 162.4 15.0 -81.2 3.0 -158.8 0.0 0.0 0.0 0.0\n", + " -113.6 0.0 -33.2 15.0 132.8 0.0 23.6 3.0 -33.2 -15.0 23.6 -3.0\n", + " 0.0 -317.6 15.0 -81.2 0.0 324.8 -3.0 77.6 -15.0 -81.2 3.0 77.6\n", + " -33.2 -15.0 -56.8 3.0 23.6 -3.0 66.4 15.0 0.0 0.0 0.0 0.0\n", + " -15.0 -81.2 -3.0 -158.8 3.0 77.6 15.0 162.4 0.0 0.0 0.0 0.0\n", + " 23.6 -3.0 0.0 0.0 -33.2 -15.0 0.0 0.0 66.4 15.0 -56.8 3.0\n", + " 3.0 77.6 0.0 0.0 -15.0 -81.2 0.0 0.0 15.0 162.4 -3.0 -158.8\n", + " -33.2 15.0 0.0 0.0 23.6 3.0 0.0 0.0 -56.8 -3.0 66.4 -15.0\n", + " 15.0 -81.2 0.0 0.0 -3.0 77.6 0.0 0.0 3.0 -158.8 -15.0 162.4\n", + "K norm = 708.0378644377365\n", + "du = [-0.02264423092574128 -0.029998807330416523 0.022536491965822688 0.030242156525002267 0.0 0.0\n", + " -0.12688379170176511 -0.4041002710283739 -0.12679760053383046 -0.40446733271991214 0.0 0.0]\n", + "Out of 3 total facts:\n", + " Verified: 2\n", + " Pending: 1\n" + ] } ], "source": [ @@ -347,7 +361,7 @@ "\n", " # Tested against Elmer solution\n", " Logging.debug(\"solution vector: \\n $u\")\n", - " @fact u[2, 3] => roughly(-2.222244754401764)\n", + " @fact u[2, 3] --> roughly(-2.222244754401764)\n", " norm1 = norm(u)\n", " Logging.debug(\"norm of u: $(norm(u))\")\n", "\n", @@ -370,7 +384,49 @@ " end\n", " Logging.debug(\"solution vector: \\n $u\")\n", " Logging.debug(\"norm of u: $(norm(u))\")\n", - " @fact norm(u) => roughly(norm1) \n", + " @fact norm(u) --> roughly(norm1) \n", + "\n", + " # test two element model\n", + " X = [0.0 0.0; 5.0 0.0; 5.0 1.0; 0.0 1.0]'\n", + " u = zeros(2, 6)\n", + " du = zeros(2, 6)\n", + " R = zeros(2, 4)\n", + " K = zeros(8, 8)\n", + " ass1 = [9, 10, 1, 2, 5, 6, 11, 12]\n", + " ass2 = [1, 2, 3, 4, 7, 8, 5, 6]\n", + " free_dofs = collect(1:8)\n", + " F = [0 0; 0 0; 0 0; 0 -0.1; 0 0; 0 0]'\n", + "\n", + " A = zeros(12, 12)\n", + " b = zeros(2, 6)\n", + " for i=1:1\n", + " Logging.debug(\"Iteration $i\")\n", + " A[:,:] = 0.0\n", + " b[:] = 0.0\n", + " #Logging.debug(\"Assembling\")\n", + " for ass in (ass1, ass2)\n", + " #Logging.debug(\"ass = $ass, u[ass] = $(u[ass])\")\n", + " calc_local_matrices!(X, u[ass], R, K, basis, dbasis, la, mu, ipoints, iweights)\n", + " A[ass,ass] += K\n", + " b[ass] += R[:]\n", + " end\n", + " dump(round(A, 2))\n", + " println(\"K norm = $(norm(A[free_dofs, free_dofs]))\")\n", + " du[free_dofs] = A[free_dofs, free_dofs] \\ -(b - F)[free_dofs]\n", + " println(\"du = $du\")\n", + " u += du\n", + " Logging.debug(\"Norm of du: $(norm(du))\")\n", + " for ass in (ass1, ass2)\n", + " Logging.debug(\"Element displacement: $(reshape(u[ass], 2, 4))\")\n", + " end\n", + " if norm(du) < 1.0e-9\n", + " Logging.debug(\"Converged in $i iterations.\")\n", + " break\n", + " end\n", + " end\n", + " Logging.debug(\"solution vector: \\n $u\")\n", + " Logging.debug(\"norm of u: $(norm(u))\")\n", + " @pending norm(u) --> :something\n", "end" ] }, @@ -558,7 +614,7 @@ " K = el.attributes[\"displacement tangent stiffness\"]\n", "\n", " gdofs = ass.gdofs[el.id]\n", - " Logging.debug(\"Assemble element to gdofs $gdofs\")\n", + " #Logging.debug(\"Assemble element $(el.id) to gdofs $gdofs\")\n", " basis, dbasis = get_shape_functions(el)\n", " ipoints, iweights = get_integration_scheme(el, io)\n", " calc_local_matrices!(X, u, R, K, basis, dbasis, la, mu, ipoints, iweights)\n", @@ -594,6 +650,13 @@ "collapsed": false }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: the `=>` syntax is deprecated, use `-->` instead\n" + ] + }, { "name": "stdout", "output_type": "stream", @@ -605,34 +668,28 @@ "name": "stderr", "output_type": "stream", "text": [ - "11-Aug 00:20:40:DEBUG:root:Adding nodes to array\n", - "11-Aug 00:20:40:DEBUG:root:Creating elements\n", - "11-Aug 00:20:40:DEBUG:root:Starting iteration 1\n", - "11-Aug 00:20:40:DEBUG:root:Assembling\n", - "11-Aug 00:20:40:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", - "11-Aug 00:20:41:DEBUG:root:Solution norm = 3.090022136728999\n", - "11-Aug 00:20:41:DEBUG:root:Starting iteration 2\n", - "11-Aug 00:20:41:DEBUG:root:Assembling\n", - "11-Aug 00:20:41:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", - "11-Aug 00:20:41:DEBUG:root:Solution norm = 0.32121316021535135\n", - "11-Aug 00:20:41:DEBUG:root:Starting iteration 3\n", - "11-Aug 00:20:41:DEBUG:root:Assembling\n", - "11-Aug 00:20:41:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", - "11-Aug 00:20:41:DEBUG:root:Solution norm = 0.040431781939994194\n", - "11-Aug 00:20:41:DEBUG:root:Starting iteration 4\n", - "11-Aug 00:20:41:DEBUG:root:Assembling\n", - "11-Aug 00:20:41:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", - "11-Aug 00:20:41:DEBUG:root:Solution norm = 0.0009291101052124042\n", - "11-Aug 00:20:41:DEBUG:root:Starting iteration 5\n", - "11-Aug 00:20:41:DEBUG:root:Assembling\n", - "11-Aug 00:20:41:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", - "11-Aug 00:20:41:DEBUG:root:Solution norm = 1.5638899022213175e-7\n", - "11-Aug 00:20:41:DEBUG:root:Starting iteration 6\n", - "11-Aug 00:20:41:DEBUG:root:Assembling\n", - "11-Aug 00:20:41:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", - "11-Aug 00:20:41:DEBUG:root:Solution norm = 1.0118539067290854e-14\n", - "11-Aug 00:20:41:DEBUG:root:Converged in 6 iterations.\n", - "11-Aug 00:20:41:DEBUG:root:Displacement of element = \n", + "11-Aug 21:39:42:DEBUG:root:Adding nodes to array\n", + "11-Aug 21:39:42:DEBUG:root:Creating elements\n", + "11-Aug 21:39:42:DEBUG:root:Starting iteration 1\n", + "11-Aug 21:39:42:DEBUG:root:Assembling\n", + "11-Aug 21:39:42:DEBUG:root:Solution norm = 3.090022136728999\n", + "11-Aug 21:39:42:DEBUG:root:Starting iteration 2\n", + "11-Aug 21:39:42:DEBUG:root:Assembling\n", + "11-Aug 21:39:43:DEBUG:root:Solution norm = 0.32121316021535135\n", + "11-Aug 21:39:43:DEBUG:root:Starting iteration 3\n", + "11-Aug 21:39:43:DEBUG:root:Assembling\n", + "11-Aug 21:39:43:DEBUG:root:Solution norm = 0.040431781939994194\n", + "11-Aug 21:39:43:DEBUG:root:Starting iteration 4\n", + "11-Aug 21:39:43:DEBUG:root:Assembling\n", + "11-Aug 21:39:43:DEBUG:root:Solution norm = 0.0009291101052124042\n", + "11-Aug 21:39:43:DEBUG:root:Starting iteration 5\n", + "11-Aug 21:39:43:DEBUG:root:Assembling\n", + "11-Aug 21:39:43:DEBUG:root:Solution norm = 1.5638899022213175e-7\n", + "11-Aug 21:39:43:DEBUG:root:Starting iteration 6\n", + "11-Aug 21:39:43:DEBUG:root:Assembling\n", + "11-Aug 21:39:43:DEBUG:root:Solution norm = 1.0118539067290854e-14\n", + "11-Aug 21:39:43:DEBUG:root:Converged in 6 iterations.\n", + "11-Aug 21:39:43:DEBUG:root:Displacement of element = \n", "[-0.39914506095474334 -0.0722858269559246 0.0 0.0\n", " -2.1779892317073504 -2.2222447544017645 0.0 0.0]\n" ] @@ -749,423 +806,6 @@ "name": "stdout", "output_type": "stream", "text": [ - "solve one element problem\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:47:DEBUG:root:Creating nodes\n", - "11-Aug 00:20:47:DEBUG:root:Creating elements\n", - "11-Aug 00:20:47:INFO:root:create_ldof2gdofmap: dofs per node: 2\n", - "11-Aug 00:20:47:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],1=>[1,2])\n", - "11-Aug 00:20:48:INFO:root:solve!: dofs per node: 2\n", - "11-Aug 00:20:48:DEBUG:root:Problem size = 8\n", - "11-Aug 00:20:48:DEBUG:root:Starting iteration 1\n", - "11-Aug 00:20:48:DEBUG:root:Assembling\n", - "11-Aug 00:20:48:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:49:DEBUG:root:Adding Dirichlet boundary conditions\n", - "11-Aug 00:20:49:DEBUG:root:dof 5 => 0.0\n", - "11-Aug 00:20:49:DEBUG:root:dof 6 => 0.0\n", - "11-Aug 00:20:49:DEBUG:root:dof 7 => 0.0\n", - "11-Aug 00:20:49:DEBUG:root:dof 8 => 0.0\n", - "11-Aug 00:20:49:DEBUG:root:Added 4 Lagrange multipliers to model\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - " 123.2 -15.0 -118.4 -3.0 -61.6 15.0 56.8 3.0\n", - " -15.0 321.2 3.0 -319.4 15.0 -160.6 -3.0 158.8\n", - " -118.4 3.0 123.2 15.0 56.8 -3.0 -61.6 -15.0\n", - " -3.0 -319.4 15.0 321.2 3.0 158.8 -15.0 -160.6\n", - " -61.6 15.0 56.8 3.0 123.2 -15.0 -118.4 -3.0\n", - " 15.0 -160.6 -3.0 158.8 -15.0 321.2 3.0 -319.4\n", - " 56.8 -3.0 -61.6 -15.0 -118.4 3.0 123.2 15.0\n", - " 3.0 158.8 -15.0 -160.6 -3.0 -319.4 15.0 321.2\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:49:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 00:20:49:DEBUG:root:Solving system of equations. Total size = 12\n", - "11-Aug 00:20:49:DEBUG:root:nothing\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", - " 123.2 -15.0 -118.4 -3.0 -61.6 15.0 56.8 3.0 0.0 0.0 0.0 0.0\n", - " -15.0 321.2 3.0 -319.4 15.0 -160.6 -3.0 158.8 0.0 0.0 0.0 0.0\n", - " -118.4 3.0 123.2 15.0 56.8 -3.0 -61.6 -15.0 0.0 0.0 0.0 0.0\n", - " -3.0 -319.4 15.0 321.2 3.0 158.8 -15.0 -160.6 0.0 0.0 0.0 0.0\n", - " -61.6 15.0 56.8 3.0 123.2 -15.0 -118.4 -3.0 1.0 0.0 0.0 0.0\n", - " 15.0 -160.6 -3.0 158.8 -15.0 321.2 3.0 -319.4 0.0 1.0 0.0 0.0\n", - " 56.8 -3.0 -61.6 -15.0 -118.4 3.0 123.2 15.0 0.0 0.0 1.0 0.0\n", - " 3.0 158.8 -15.0 -160.6 -3.0 -319.4 15.0 321.2 0.0 0.0 0.0 1.0\n", - " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", - "Array(Float64,(1,12)) 1x12 Array{Float64,2}" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:49:DEBUG:root:nothing\n", - "11-Aug 00:20:49:DEBUG:root:Solution norm = 3.0900221367289444\n", - "11-Aug 00:20:49:DEBUG:root:Starting iteration 2\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - ":\n", - " 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:49:DEBUG:root:Assembling\n", - "11-Aug 00:20:49:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", - "11-Aug 00:20:49:DEBUG:root:Adding Dirichlet boundary conditions\n", - "11-Aug 00:20:49:DEBUG:root:dof 5 => 0.0\n", - "11-Aug 00:20:49:DEBUG:root:dof 6 => 0.0\n", - "11-Aug 00:20:49:DEBUG:root:dof 7 => 0.0\n", - "11-Aug 00:20:49:DEBUG:root:dof 8 => 0.0\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 147.61 36.88 -149.16 -55.03 -66.97 1.91 68.52 16.24\n", - " 36.88 343.08 -48.76 -334.42 1.81 -174.07 10.06 165.4 \n", - " -149.16 -48.76 160.72 65.4 63.17 10.41 -74.73 -27.06\n", - " -55.03 -334.42 65.4 330.06 16.65 163.39 -27.02 -159.04\n", - " -66.97 1.81 63.17 16.65 128.11 -15.44 -124.3 -3.03\n", - " 1.91 -174.07 10.41 163.39 -15.44 338.21 3.11 -327.53\n", - " 68.52 10.06 -74.73 -27.02 -124.3 3.11 130.51 13.85\n", - " 16.24 165.4 -27.06 -159.04 -3.03 -327.53 13.85 321.16\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:49:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "11-Aug 00:20:49:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 00:20:49:DEBUG:root:Solving system of equations. Total size = 12\n", - "11-Aug 00:20:49:DEBUG:root:nothing\n", - "11-Aug 00:20:49:DEBUG:root:nothing\n", - "11-Aug 00:20:49:DEBUG:root:Solution norm = 0.3212131602153477\n", - "11-Aug 00:20:49:DEBUG:root:Starting iteration 3\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", - " 147.6 36.9 -149.2 -55.0 -67.0 1.9 68.5 16.2 0.0 0.0 0.0 0.0\n", - " 36.9 343.1 -48.8 -334.4 1.8 -174.1 10.1 165.4 0.0 0.0 0.0 0.0\n", - " -149.2 -48.8 160.7 65.4 63.2 10.4 -74.7 -27.1 0.0 0.0 0.0 0.0\n", - " -55.0 -334.4 65.4 330.1 16.7 163.4 -27.0 -159.0 0.0 0.0 0.0 0.0\n", - " -67.0 1.8 63.2 16.7 128.1 -15.4 -124.3 -3.0 1.0 0.0 0.0 0.0\n", - " 1.9 -174.1 10.4 163.4 -15.4 338.2 3.1 -327.5 0.0 1.0 0.0 0.0\n", - " 68.5 10.1 -74.7 -27.0 -124.3 3.1 130.5 13.8 0.0 0.0 1.0 0.0\n", - " 16.2 165.4 -27.1 -159.0 -3.0 -327.5 13.8 321.2 0.0 0.0 0.0 1.0\n", - " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", - "Array(Float64,(1,12)) 1x12 Array{Float64,2}:\n", - " -2.3 -15.7 5.0 15.2 -20.2 12.2 17.5 -9.6 0.0 0.0 0.0 0.0\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:49:DEBUG:root:Assembling\n", - "11-Aug 00:20:49:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", - "11-Aug 00:20:50:DEBUG:root:Adding Dirichlet boundary conditions\n", - "11-Aug 00:20:50:DEBUG:root:dof 5 => 0.0\n", - "11-Aug 00:20:50:DEBUG:root:dof 6 => 0.0\n", - "11-Aug 00:20:50:DEBUG:root:dof 7 => 0.0\n", - "11-Aug 00:20:50:DEBUG:root:dof 8 => 0.0\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 131.01 35.45 -132.72 -52.73 -60.29 1.77 62.0 15.51\n", - " 35.45 313.79 -46.75 -305.49 1.71 -163.9 9.58 155.6 \n", - " -132.72 -46.75 143.74 62.55 56.75 10.12 -67.77 -25.93\n", - " -52.73 -305.49 62.55 301.12 16.11 153.51 -25.93 -149.13\n", - " -60.29 1.71 56.75 16.11 117.72 -14.75 -114.18 -3.07\n", - " 1.77 -163.9 10.12 153.51 -14.75 327.07 2.86 -316.69\n", - " 62.0 9.58 -67.77 -25.93 -114.18 2.86 119.94 13.49\n", - " 15.51 155.6 -25.93 -149.13 -3.07 -316.69 13.49 310.22\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "11-Aug 00:20:50:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 00:20:50:DEBUG:root:Solving system of equations. Total size = 12\n", - "11-Aug 00:20:50:DEBUG:root:nothing\n", - "11-Aug 00:20:50:DEBUG:root:nothing\n", - "11-Aug 00:20:50:DEBUG:root:Solution norm = 0.04043178194000972\n", - "11-Aug 00:20:50:DEBUG:root:Starting iteration 4\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", - " 131.0 35.4 -132.7 -52.7 -60.3 1.8 62.0 15.5 0.0 0.0 0.0 0.0\n", - " 35.4 313.8 -46.7 -305.5 1.7 -163.9 9.6 155.6 0.0 0.0 0.0 0.0\n", - " -132.7 -46.7 143.7 62.6 56.7 10.1 -67.8 -25.9 0.0 0.0 0.0 0.0\n", - " -52.7 -305.5 62.6 301.1 16.1 153.5 -25.9 -149.1 0.0 0.0 0.0 0.0\n", - " -60.3 1.7 56.7 16.1 117.7 -14.8 -114.2 -3.1 1.0 0.0 0.0 0.0\n", - " 1.8 -163.9 10.1 153.5 -14.8 327.1 2.9 -316.7 0.0 1.0 0.0 0.0\n", - " 62.0 9.6 -67.8 -25.9 -114.2 2.9 119.9 13.5 0.0 0.0 1.0 0.0\n", - " 15.5 155.6 -25.9 -149.1 -3.1 -316.7 13.5 310.2 0.0 0.0 0.0 1.0\n", - " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", - "Array(Float64,(1,12)) 1x12 Array{Float64,2}:\n", - " -0.0 -0.6 0.1 0.6 -19.7 3.2 19.6 -1.1 0.0 0.0 0.0 0.0\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:50:DEBUG:root:Assembling\n", - "11-Aug 00:20:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", - "11-Aug 00:20:50:DEBUG:root:Adding Dirichlet boundary conditions\n", - "11-Aug 00:20:50:DEBUG:root:dof 5 => 0.0\n", - "11-Aug 00:20:50:DEBUG:root:dof 6 => 0.0\n", - "11-Aug 00:20:50:DEBUG:root:dof 7 => 0.0\n", - "11-Aug 00:20:50:DEBUG:root:dof 8 => 0.0\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 130.66 36.04 -132.46 -53.26 -60.05 1.58 61.86 15.64\n", - " 36.04 312.24 -47.29 -303.89 1.52 -163.43 9.73 155.09\n", - " -132.46 -47.29 143.55 63.02 56.54 10.29 -67.63 -26.02\n", - " -53.26 -303.89 63.02 299.46 16.27 152.96 -26.02 -148.53\n", - " -60.05 1.52 56.54 16.27 117.21 -14.68 -113.7 -3.11\n", - " 1.58 -163.43 10.29 152.96 -14.68 326.61 2.81 -316.14\n", - " 61.86 9.73 -67.63 -26.02 -113.7 2.81 119.47 13.49\n", - " 15.64 155.09 -26.02 -148.53 -3.11 -316.14 13.49 309.58\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "11-Aug 00:20:50:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 00:20:50:DEBUG:root:Solving system of equations. Total size = 12\n", - "11-Aug 00:20:50:DEBUG:root:nothing\n", - "11-Aug 00:20:50:DEBUG:root:nothing\n", - "11-Aug 00:20:50:DEBUG:root:Solution norm = 0.0009291101052125497\n", - "11-Aug 00:20:50:DEBUG:root:Starting iteration 5\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", - " 130.7 36.0 -132.5 -53.3 -60.1 1.6 61.9 15.6 0.0 0.0 0.0 0.0\n", - " 36.0 312.2 -47.3 -303.9 1.5 -163.4 9.7 155.1 0.0 0.0 0.0 0.0\n", - " -132.5 -47.3 143.5 63.0 56.5 10.3 -67.6 -26.0 0.0 0.0 0.0 0.0\n", - " -53.3 -303.9 63.0 299.5 16.3 153.0 -26.0 -148.5 0.0 0.0 0.0 0.0\n", - " -60.1 1.5 56.5 16.3 117.2 -14.7 -113.7 -3.1 1.0 0.0 0.0 0.0\n", - " 1.6 -163.4 10.3 153.0 -14.7 326.6 2.8 -316.1 0.0 1.0 0.0 0.0\n", - " 61.9 9.7 -67.6 -26.0 -113.7 2.8 119.5 13.5 0.0 0.0 1.0 0.0\n", - " 15.6 155.1 -26.0 -148.5 -3.1 -316.1 13.5 309.6 0.0 0.0 0.0 1.0\n", - " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", - "Array(Float64,(1,12)) 1x12 Array{Float64,2}:\n", - " 0.0 -0.0 -0.0 0.0 -19.9 2.8 19.9 -0.8 0.0 0.0 0.0 0.0\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:50:DEBUG:root:Assembling\n", - "11-Aug 00:20:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n", - "11-Aug 00:20:50:DEBUG:root:Adding Dirichlet boundary conditions\n", - "11-Aug 00:20:50:DEBUG:root:dof 5 => 0.0\n", - "11-Aug 00:20:50:DEBUG:root:dof 6 => 0.0\n", - "11-Aug 00:20:50:DEBUG:root:dof 7 => 0.0\n", - "11-Aug 00:20:50:DEBUG:root:dof 8 => 0.0\n", - "11-Aug 00:20:50:DEBUG:root:Added 4 Lagrange multipliers to model\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 130.66 36.06 -132.47 -53.28 -60.05 1.57 61.86 15.64\n", - " 36.06 312.22 -47.3 -303.88 1.51 -163.43 9.73 155.08\n", - " -132.47 -47.3 143.56 63.03 56.54 10.29 -67.63 -26.02\n", - " -53.28 -303.88 63.03 299.44 16.27 152.96 -26.02 -148.52\n", - " -60.05 1.51 56.54 16.27 117.21 -14.67 -113.69 -3.11\n", - " 1.57 -163.43 10.29 152.96 -14.67 326.61 2.81 -316.14\n", - " 61.86 9.73 -67.63 -26.02 -113.69 2.81 119.46 13.49\n", - " 15.64 155.08 -26.02 -148.52 -3.11 -316.14 13.49 309.58\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:50:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 00:20:50:DEBUG:root:Solving system of equations. Total size = 12\n", - "11-Aug 00:20:50:DEBUG:root:nothing\n", - "11-Aug 00:20:50:DEBUG:root:nothing\n", - "11-Aug 00:20:50:DEBUG:root:Solution norm = 1.5638898939617795e-7\n", - "11-Aug 00:20:50:DEBUG:root:Starting iteration 6\n", - "11-Aug 00:20:50:DEBUG:root:Assembling\n", - "11-Aug 00:20:50:DEBUG:root:Assemble element to gdofs [1,2,3,4,5,6,7,8]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", - " 130.7 36.1 -132.5 -53.3 -60.1 1.6 61.9 15.6 0.0 0.0 0.0 0.0\n", - " 36.1 312.2 -47.3 -303.9 1.5 -163.4 9.7 155.1 0.0 0.0 0.0 0.0\n", - " -132.5 -47.3 143.6 63.0 56.5 10.3 -67.6 -26.0 0.0 0.0 0.0 0.0\n", - " -53.3 -303.9 63.0 299.4 16.3 153.0 -26.0 -148.5 0.0 0.0 0.0 0.0\n", - " -60.1 1.5 56.5 16.3 117.2 -14.7 -113.7 -3.1 1.0 0.0 0.0 0.0\n", - " 1.6 -163.4 10.3 153.0 -14.7 326.6 2.8 -316.1 0.0 1.0 0.0 0.0\n", - " 61.9 9.7 -67.6 -26.0 -113.7 2.8 119.5 13.5 0.0 0.0 1.0 0.0\n", - " 15.6 155.1 -26.0 -148.5 -3.1 -316.1 13.5 309.6 0.0 0.0 0.0 1.0\n", - " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", - "Array(Float64,(1,12)) 1x12 Array{Float64,2}:\n", - " 0.0 -0.0 0.0 0.0 -19.9 2.8 19.9 -0.8 0.0 0.0 0.0 0.0\n", - "Element stiffness matrix" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:50:DEBUG:root:Adding Dirichlet boundary conditions\n", - "11-Aug 00:20:50:DEBUG:root:dof 5 => 0.0\n", - "11-Aug 00:20:50:DEBUG:root:dof 6 => 0.0\n", - "11-Aug 00:20:50:DEBUG:root:dof 7 => 0.0\n", - "11-Aug 00:20:50:DEBUG:root:dof 8 => 0.0\n", - "11-Aug 00:20:50:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "11-Aug 00:20:50:DEBUG:root:Adding Neumann boundary conditions\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 130.66 36.06 -132.47 -53.28 -60.05 1.57 61.86 15.64\n", - " 36.06 312.22 -47.3 -303.88 1.51 -163.43 9.73 155.08\n", - " -132.47 -47.3 143.56 63.03 56.54 10.29 -67.63 -26.02\n", - " -53.28 -303.88 63.03 299.44 16.27 152.96 -26.02 -148.52\n", - " -60.05 1.51 56.54 16.27 117.21 -14.67 -113.69 -3.11\n", - " 1.57 -163.43 10.29 152.96 -14.67 326.61 2.81 -316.14\n", - " 61.86 9.73 -67.63 -26.02 -113.69 2.81 119.46 13.49\n", - " 15.64 155.08 -26.02 -148.52 -3.11 -316.14 13.49 309.58\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:50:DEBUG:root:Solving system of equations. Total size = 12\n", - "11-Aug 00:20:50:DEBUG:root:nothing\n", - "11-Aug 00:20:50:DEBUG:root:nothing\n", - "11-Aug 00:20:50:DEBUG:root:Solution norm = 1.0991584038546891e-14\n", - "11-Aug 00:20:50:DEBUG:root:Converged in 6 iterations.\n", - "11-Aug 00:20:51:DEBUG:root:Displacement of element = \n", - "[-0.39914506095474345 -0.07228582695592463 0.0 0.0\n", - " -2.1779892317073504 -2.2222447544017645 0.0 0.0]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Array(Float64,(12,12)) 12x12 Array{Float64,2}:\n", - " 130.7 36.1 -132.5 -53.3 -60.1 1.6 61.9 15.6 0.0 0.0 0.0 0.0\n", - " 36.1 312.2 -47.3 -303.9 1.5 -163.4 9.7 155.1 0.0 0.0 0.0 0.0\n", - " -132.5 -47.3 143.6 63.0 56.5 10.3 -67.6 -26.0 0.0 0.0 0.0 0.0\n", - " -53.3 -303.9 63.0 299.4 16.3 153.0 -26.0 -148.5 0.0 0.0 0.0 0.0\n", - " -60.1 1.5 56.5 16.3 117.2 -14.7 -113.7 -3.1 1.0 0.0 0.0 0.0\n", - " 1.6 -163.4 10.3 153.0 -14.7 326.6 2.8 -316.1 0.0 1.0 0.0 0.0\n", - " 61.9 9.7 -67.6 -26.0 -113.7 2.8 119.5 13.5 0.0 0.0 1.0 0.0\n", - " 15.6 155.1 -26.0 -148.5 -3.1 -316.1 13.5 309.6 0.0 0.0 0.0 1.0\n", - " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", - "Array(Float64,(1,12)) 1x12 Array{Float64,2}:\n", - " 0.0 0.0 -0.0 -0.0 -19.9 2.8 19.9 -0.8 0.0 0.0 0.0 0.0\n", - "1 fact verified.\n", "solve two element problem\n" ] }, @@ -1173,571 +813,57 @@ "name": "stderr", "output_type": "stream", "text": [ - "11-Aug 00:20:51:DEBUG:root:Creating elements\n", - "11-Aug 00:20:51:INFO:root:create_ldof2gdofmap: dofs per node: 2\n", - "11-Aug 00:20:51:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],5=>[9,10],6=>[11,12],1=>[1,2])\n", - "11-Aug 00:20:51:INFO:root:solve!: dofs per node: 2\n", - "11-Aug 00:20:51:DEBUG:root:Problem size = 12\n", - "11-Aug 00:20:51:DEBUG:root:Starting iteration 1\n", - "11-Aug 00:20:51:DEBUG:root:Assembling\n", - "11-Aug 00:20:51:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n" + "11-Aug 21:39:49:DEBUG:root:Creating elements\n", + "11-Aug 21:39:49:INFO:root:create_ldof2gdofmap: dofs per node: 2\n", + "11-Aug 21:39:49:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],5=>[9,10],6=>[11,12],1=>[1,2])\n", + "11-Aug 21:39:50:INFO:root:solve!: dofs per node: 2\n", + "11-Aug 21:39:50:DEBUG:root:Problem size = 12\n", + "11-Aug 21:39:50:DEBUG:root:Starting iteration 1\n", + "11-Aug 21:39:50:DEBUG:root:Assembling\n", + "11-Aug 21:39:50:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "11-Aug 21:39:50:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "11-Aug 21:39:50:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 21:39:50:DEBUG:root:Solving system of equations. Total size = 16\n", + "11-Aug 21:39:51:DEBUG:root:Solution norm du = 0.6015838690633517\n", + "11-Aug 21:39:51:DEBUG:root:Starting iteration 2\n", + "11-Aug 21:39:51:DEBUG:root:Assembling\n", + "11-Aug 21:39:51:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "11-Aug 21:39:51:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "11-Aug 21:39:51:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 21:39:51:DEBUG:root:Solving system of equations. Total size = 16\n", + "11-Aug 21:39:51:DEBUG:root:Solution norm du = 0.013420417380980414\n", + "11-Aug 21:39:51:DEBUG:root:Starting iteration 3\n", + "11-Aug 21:39:51:DEBUG:root:Assembling\n", + "11-Aug 21:39:51:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "11-Aug 21:39:51:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "11-Aug 21:39:51:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 21:39:51:DEBUG:root:Solving system of equations. Total size = 16\n", + "11-Aug 21:39:51:DEBUG:root:Solution norm du = 0.00032202957936854873\n", + "11-Aug 21:39:51:DEBUG:root:Starting iteration 4\n", + "11-Aug 21:39:51:DEBUG:root:Assembling\n", + "11-Aug 21:39:51:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "11-Aug 21:39:51:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "11-Aug 21:39:51:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 21:39:51:DEBUG:root:Solving system of equations. Total size = 16\n", + "11-Aug 21:39:51:DEBUG:root:Solution norm du = 9.906677094801476e-8\n", + "11-Aug 21:39:51:DEBUG:root:Starting iteration 5\n", + "11-Aug 21:39:51:DEBUG:root:Assembling\n", + "11-Aug 21:39:51:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "11-Aug 21:39:51:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "11-Aug 21:39:51:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 21:39:51:DEBUG:root:Solving system of equations. Total size = 16\n", + "11-Aug 21:39:51:DEBUG:root:Solution norm du = 5.027624635820698e-15\n", + "11-Aug 21:39:51:DEBUG:root:Converged in 5 iterations.\n", + "11-Aug 21:39:51:DEBUG:root:Displacement of element = \n", + "[-0.02442313597467864 -0.039356000063335075 0.021097993207232584 0.020877031423993653\n", + " -0.12673626841485705 -0.40433021969759375 -0.40656320177872923 -0.1275776940913048]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Element stiffness matrix\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:51:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", - "11-Aug 00:20:51:DEBUG:root:Adding Dirichlet boundary conditions\n", - "11-Aug 00:20:51:DEBUG:root:dof 1 => 0.0\n", - "11-Aug 00:20:51:DEBUG:root:dof 2 => 0.0\n", - "11-Aug 00:20:51:DEBUG:root:dof 7 => 0.0\n", - "11-Aug 00:20:51:DEBUG:root:dof 8 => 0.0\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 66.4 15.0 23.6 -3.0 -33.2 -15.0 -56.8 3.0\n", - " 15.0 162.4 3.0 77.6 -15.0 -81.2 -3.0 -158.8\n", - " 23.6 3.0 66.4 -15.0 -56.8 -3.0 -33.2 15.0\n", - " -3.0 77.6 -15.0 162.4 3.0 -158.8 15.0 -81.2\n", - " -33.2 -15.0 -56.8 3.0 66.4 15.0 23.6 -3.0\n", - " -15.0 -81.2 -3.0 -158.8 15.0 162.4 3.0 77.6\n", - " -56.8 -3.0 -33.2 15.0 23.6 3.0 66.4 -15.0\n", - " 3.0 -158.8 15.0 -81.2 -3.0 77.6 -15.0 162.4\n", - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 66.4 15.0 23.6 -3.0 -33.2 -15.0 -56.8 3.0\n", - " 15.0 162.4 3.0 77.6 -15.0 -81.2 -3.0 -158.8\n", - " 23.6 3.0 66.4 -15.0 -56.8 -3.0 -33.2 15.0\n", - " -3.0 77.6 -15.0 162.4 3.0 -158.8 15.0 -81.2\n", - " -33.2 -15.0 -56.8 3.0 66.4 15.0 23.6 -3.0\n", - " -15.0 -81.2 -3.0 -158.8 15.0 162.4 3.0 77.6\n", - " -56.8 -3.0 -33.2 15.0 23.6 3.0 66.4 -15.0\n", - " 3.0 -158.8 15.0 -81.2 -3.0 77.6 -15.0 162.4\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:51:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "11-Aug 00:20:51:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 00:20:51:DEBUG:root:Solving system of equations. Total size = 16\n", - "11-Aug 00:20:51:DEBUG:root:nothing\n", - "11-Aug 00:20:51:DEBUG:root:nothing\n", - "11-Aug 00:20:51:DEBUG:root:Solution norm = 12.031677381267034\n", - "11-Aug 00:20:51:DEBUG:root:Starting iteration 2\n", - "11-Aug 00:20:51:DEBUG:root:Assembling\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", - " 66.4 15.0 23.6 -3.0 0.0 0.0 -56.8 3.0 -33.2 -15.0 0.0 0.0 1.0 0.0 0.0 0.0\n", - " 15.0 162.4 3.0 77.6 0.0 0.0 -3.0 -158.8 -15.0 -81.2 0.0 0.0 0.0 1.0 0.0 0.0\n", - " 23.6 3.0 132.8 0.0 23.6 -3.0 -33.2 15.0 -113.6 0.0 -33.2 -15.0 0.0 0.0 0.0 0.0\n", - " -3.0 77.6 0.0 324.8 3.0 77.6 15.0 -81.2 0.0 -317.6 -15.0 -81.2 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 23.6 3.0 66.4 -15.0 0.0 0.0 -33.2 15.0 -56.8 -3.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -3.0 77.6 -15.0 162.4 0.0 0.0 15.0 -81.2 3.0 -158.8 0.0 0.0 0.0 0.0\n", - " -56.8 -3.0 -33.2 15.0 0.0 0.0 66.4 -15.0 23.6 3.0 0.0 0.0 0.0 0.0 1.0 0.0\n", - " 3.0 -158.8 15.0 -81.2 0.0 0.0 -15.0 162.4 -3.0 77.6 0.0 0.0 0.0 0.0 0.0 1.0\n", - " -33.2 -15.0 -113.6 0.0 -33.2 15.0 23.6 -3.0 132.8 0.0 23.6 3.0 0.0 0.0 0.0 0.0\n", - " -15.0 -81.2 0.0 -317.6 15.0 -81.2 3.0 77.6 0.0 324.8 -3.0 77.6 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -33.2 -15.0 -56.8 3.0 0.0 0.0 23.6 -3.0 66.4 15.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -15.0 -81.2 -3.0 -158.8 0.0 0.0 3.0 77.6 15.0 162.4 0.0 0.0 0.0 0.0\n", - " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:51:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", - "11-Aug 00:20:51:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", - "11-Aug 00:20:51:DEBUG:root:Adding Dirichlet boundary conditions\n", - "11-Aug 00:20:51:DEBUG:root:dof 1 => 0.0\n", - "11-Aug 00:20:51:DEBUG:root:dof 2 => 0.0\n", - "11-Aug 00:20:51:DEBUG:root:dof 7 => 0.0\n", - "11-Aug 00:20:51:DEBUG:root:dof 8 => 0.0\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 520.78 72.26 330.9 62.7 -397.04 -45.87 -454.64 -89.09\n", - " 72.26 461.85 83.07 254.3 -47.57 -243.98 -107.75 -472.18\n", - " 330.9 83.07 874.92 211.87 -895.33 -206.2 -310.49 -88.74\n", - " 62.7 254.3 211.87 708.11 -183.65 -617.73 -90.92 -344.68\n", - " -397.04 -47.57 -895.33 -183.65 983.14 157.73 309.22 73.49\n", - " -45.87 -243.98 -206.2 -617.73 157.73 615.62 94.34 246.08\n", - " -454.64 -107.75 -310.49 -90.92 309.22 94.34 455.91 104.34\n", - " -89.09 -472.18 -88.74 -344.68 73.49 246.08 104.34 570.77\n", - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 520.78 72.26 330.9 62.7 -397.04 -45.87 -454.64 -89.09\n", - " 72.26 461.85 83.07 254.3 -47.57 -243.98 -107.75 -472.18\n", - " 330.9 83.07 874.92 211.87 -895.33 -206.2 -310.49 -88.74\n", - " 62.7 254.3 211.87 708.11 -183.65 -617.73 -90.92 -344.68\n", - " -397.04 -47.57 -895.33 -183.65 983.14 157.73 309.22 73.49\n", - " -45.87 -243.98 -206.2 -617.73 157.73 615.62 94.34 246.08\n", - " -454.64 -107.75 -310.49 -90.92 309.22 94.34 455.91 104.34\n", - " -89.09 -472.18 -88.74 -344.68 73.49 246.08 104.34 570.77\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:51:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "11-Aug 00:20:51:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 00:20:51:DEBUG:root:Solving system of equations. Total size = 16\n", - "11-Aug 00:20:51:DEBUG:root:nothing\n", - "11-Aug 00:20:51:DEBUG:root:nothing\n", - "11-Aug 00:20:51:DEBUG:root:Solution norm = 8.151050361276273\n", - "11-Aug 00:20:51:DEBUG:root:Starting iteration 3\n", - "11-Aug 00:20:51:DEBUG:root:Assembling\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", - " 520.8 72.3 330.9 62.7 0.0 0.0 -454.6 -89.1 -397.0 -45.9 0.0 0.0 1.0 0.0 0.0 0.0\n", - " 72.3 461.9 83.1 254.3 0.0 0.0 -107.8 -472.2 -47.6 -244.0 0.0 0.0 0.0 1.0 0.0 0.0\n", - " 330.9 83.1 1395.7 284.1 330.9 62.7 -310.5 -88.7 -1350.0 -295.3 -397.0 -45.9 0.0 0.0 0.0 0.0\n", - " 62.7 254.3 284.1 1170.0 83.1 254.3 -90.9 -344.7 -291.4 -1089.9 -47.6 -244.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 330.9 83.1 874.9 211.9 0.0 0.0 -310.5 -88.7 -895.3 -206.2 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 62.7 254.3 211.9 708.1 0.0 0.0 -90.9 -344.7 -183.7 -617.7 0.0 0.0 0.0 0.0\n", - " -454.6 -107.8 -310.5 -90.9 0.0 0.0 455.9 104.3 309.2 94.3 0.0 0.0 0.0 0.0 1.0 0.0\n", - " -89.1 -472.2 -88.7 -344.7 0.0 0.0 104.3 570.8 73.5 246.1 0.0 0.0 0.0 0.0 0.0 1.0\n", - " -397.0 -47.6 -1350.0 -291.4 -310.5 -90.9 309.2 73.5 1439.1 262.1 309.2 94.3 0.0 0.0 0.0 0.0\n", - " -45.9 -244.0 -295.3 -1089.9 -88.7 -344.7 94.3 246.1 262.1 1186.4 73.5 246.1 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -397.0 -47.6 -895.3 -183.7 0.0 0.0 309.2 73.5 983.1 157.7 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -45.9 -244.0 -206.2 -617.7 0.0 0.0 94.3 246.1 157.7 615.6 0.0 0.0 0.0 0.0\n", - " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", - " -453.5 -212.6 -1168.0 -759.0 -714.5 -546.4 300.0 466.2 1168.0 759.0 868.1 294.8 0.0 0.0 0.0 0.0\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:51:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", - "11-Aug 00:20:51:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", - "11-Aug 00:20:51:DEBUG:root:Adding Dirichlet boundary conditions\n", - "11-Aug 00:20:51:DEBUG:root:dof 1 => 0.0\n", - "11-Aug 00:20:51:DEBUG:root:dof 2 => 0.0\n", - "11-Aug 00:20:51:DEBUG:root:dof 7 => 0.0\n", - "11-Aug 00:20:51:DEBUG:root:dof 8 => 0.0\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 43.42 28.69 48.59 17.79 -57.52 -15.59 -34.48 -30.89\n", - " 28.69 51.46 22.52 33.82 -15.89 -22.99 -35.32 -62.29\n", - " 48.59 22.52 142.25 54.77 -152.3 -53.31 -38.54 -23.98\n", - " 17.79 33.82 54.77 88.5 -48.04 -72.78 -24.51 -49.53\n", - " -57.52 -15.89 -152.3 -48.04 168.56 42.6 41.26 21.33\n", - " -15.59 -22.99 -53.31 -72.78 42.6 67.46 26.29 28.32\n", - " -34.48 -35.32 -38.54 -24.51 41.26 26.29 31.77 33.54\n", - " -30.89 -62.29 -23.98 -49.53 21.33 28.32 33.54 83.5 \n", - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 43.42 28.69 48.59 17.79 -57.52 -15.59 -34.48 -30.89\n", - " 28.69 51.46 22.52 33.82 -15.89 -22.99 -35.32 -62.29\n", - " 48.59 22.52 142.25 54.77 -152.3 -53.31 -38.54 -23.98\n", - " 17.79 33.82 54.77 88.5 -48.04 -72.78 -24.51 -49.53\n", - " -57.52 -15.89 -152.3 -48.04 168.56 42.6 41.26 21.33\n", - " -15.59 -22.99 -53.31 -72.78 42.6 67.46 26.29 28.32\n", - " -34.48 -35.32 -38.54 -24.51 41.26 26.29 31.77 33.54\n", - " -30.89 -62.29 -23.98 -49.53 21.33 28.32 33.54 83.5 \n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:51:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "11-Aug 00:20:51:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 00:20:51:DEBUG:root:Solving system of equations. Total size = 16\n", - "11-Aug 00:20:51:DEBUG:root:nothing\n", - "11-Aug 00:20:52:DEBUG:root:nothing\n", - "11-Aug 00:20:52:DEBUG:root:Solution norm = 3.8869547569703458\n", - "11-Aug 00:20:52:DEBUG:root:Starting iteration 4\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", - " 43.4 28.7 48.6 17.8 0.0 0.0 -34.5 -30.9 -57.5 -15.6 0.0 0.0 1.0 0.0 0.0 0.0\n", - " 28.7 51.5 22.5 33.8 0.0 0.0 -35.3 -62.3 -15.9 -23.0 0.0 0.0 0.0 1.0 0.0 0.0\n", - " 48.6 22.5 185.7 83.5 48.6 17.8 -38.5 -24.0 -186.8 -84.2 -57.5 -15.6 0.0 0.0 0.0 0.0\n", - " 17.8 33.8 83.5 140.0 22.5 33.8 -24.5 -49.5 -83.4 -135.1 -15.9 -23.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 48.6 22.5 142.2 54.8 0.0 0.0 -38.5 -24.0 -152.3 -53.3 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 17.8 33.8 54.8 88.5 0.0 0.0 -24.5 -49.5 -48.0 -72.8 0.0 0.0 0.0 0.0\n", - " -34.5 -35.3 -38.5 -24.5 0.0 0.0 31.8 33.5 41.3 26.3 0.0 0.0 0.0 0.0 1.0 0.0\n", - " -30.9 -62.3 -24.0 -49.5 0.0 0.0 33.5 83.5 21.3 28.3 0.0 0.0 0.0 0.0 0.0 1.0\n", - " -57.5 -15.9 -186.8 -83.4 -38.5 -24.5 41.3 21.3 200.3 76.1 41.3 26.3 0.0 0.0 0.0 0.0\n", - " -15.6 -23.0 -84.2 -135.1 -24.0 -49.5 26.3 28.3 76.1 151.0 21.3 28.3 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -57.5 -15.9 -152.3 -48.0 0.0 0.0 41.3 21.3 168.6 42.6 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -15.6 -23.0 -53.3 -72.8 0.0 0.0 26.3 28.3 42.6 67.5 0.0 0.0 0.0 0.0\n", - " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", - " 27.5 8.5 22.1 17.8 -5.4 9.3 -21.6 -15.8 -22.1 -17.8 -0.5 -0.0 0.0 0.0 0.0 0.0\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:52:DEBUG:root:Assembling\n", - "11-Aug 00:20:52:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", - "11-Aug 00:20:52:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", - "11-Aug 00:20:52:DEBUG:root:Adding Dirichlet boundary conditions\n", - "11-Aug 00:20:52:DEBUG:root:dof 1 => 0.0\n", - "11-Aug 00:20:52:DEBUG:root:dof 2 => 0.0\n", - "11-Aug 00:20:52:DEBUG:root:dof 7 => 0.0\n", - "11-Aug 00:20:52:DEBUG:root:dof 8 => 0.0\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 116.19 1.61 71.4 10.34 -89.72 1.21 -97.86 -13.16\n", - " 1.61 96.17 17.73 49.31 0.67 -49.8 -20.01 -95.68\n", - " 71.4 17.73 191.45 46.09 -197.12 -40.75 -65.73 -23.07\n", - " 10.34 49.31 46.09 167.18 -32.77 -134.57 -23.66 -81.92\n", - " -89.72 0.67 -197.12 -32.77 219.04 18.96 67.81 13.14\n", - " 1.21 -49.8 -40.75 -134.57 18.96 135.27 20.58 49.1 \n", - " -97.86 -20.01 -65.73 -23.66 67.81 20.58 95.78 23.09\n", - " -13.16 -95.68 -23.07 -81.92 13.14 49.1 23.09 128.5 \n", - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 116.19 1.61 71.4 10.34 -89.72 1.21 -97.86 -13.16\n", - " 1.61 96.17 17.73 49.31 0.67 -49.8 -20.01 -95.68\n", - " 71.4 17.73 191.45 46.09 -197.12 -40.75 -65.73 -23.07\n", - " 10.34 49.31 46.09 167.18 -32.77 -134.57 -23.66 -81.92\n", - " -89.72 0.67 -197.12 -32.77 219.04 18.96 67.81 13.14\n", - " 1.21 -49.8 -40.75 -134.57 18.96 135.27 20.58 49.1 \n", - " -97.86 -20.01 -65.73 -23.66 67.81 20.58 95.78 23.09\n", - " -13.16 -95.68 -23.07 -81.92 13.14 49.1 23.09 128.5 \n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:52:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "11-Aug 00:20:52:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 00:20:52:DEBUG:root:Solving system of equations. Total size = 16\n", - "11-Aug 00:20:52:DEBUG:root:nothing\n", - "11-Aug 00:20:52:DEBUG:root:nothing\n", - "11-Aug 00:20:52:DEBUG:root:Solution norm = 2.9651628976855995\n", - "11-Aug 00:20:52:DEBUG:root:Starting iteration 5\n", - "11-Aug 00:20:52:DEBUG:root:Assembling\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", - " 116.2 1.6 71.4 10.3 0.0 0.0 -97.9 -13.2 -89.7 1.2 0.0 0.0 1.0 0.0 0.0 0.0\n", - " 1.6 96.2 17.7 49.3 0.0 0.0 -20.0 -95.7 0.7 -49.8 0.0 0.0 0.0 1.0 0.0 0.0\n", - " 71.4 17.7 307.6 47.7 71.4 10.3 -65.7 -23.1 -295.0 -53.9 -89.7 1.2 0.0 0.0 0.0 0.0\n", - " 10.3 49.3 47.7 263.4 17.7 49.3 -23.7 -81.9 -52.8 -230.3 0.7 -49.8 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 71.4 17.7 191.5 46.1 0.0 0.0 -65.7 -23.1 -197.1 -40.8 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 10.3 49.3 46.1 167.2 0.0 0.0 -23.7 -81.9 -32.8 -134.6 0.0 0.0 0.0 0.0\n", - " -97.9 -20.0 -65.7 -23.7 0.0 0.0 95.8 23.1 67.8 20.6 0.0 0.0 0.0 0.0 1.0 0.0\n", - " -13.2 -95.7 -23.1 -81.9 0.0 0.0 23.1 128.5 13.1 49.1 0.0 0.0 0.0 0.0 0.0 1.0\n", - " -89.7 0.7 -295.0 -52.8 -65.7 -23.7 67.8 13.1 314.8 42.0 67.8 20.6 0.0 0.0 0.0 0.0\n", - " 1.2 -49.8 -53.9 -230.3 -23.1 -81.9 20.6 49.1 42.0 263.8 13.1 49.1 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -89.7 0.7 -197.1 -32.8 0.0 0.0 67.8 13.1 219.0 19.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 1.2 -49.8 -40.8 -134.6 0.0 0.0 20.6 49.1 19.0 135.3 0.0 0.0 0.0 0.0\n", - " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", - " -2.5 8.8 -27.7 -26.3 -25.2 -35.2 -10.3 26.0 27.7 26.3 38.0 2.3 0.0 0.0 0.0 0.0\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:52:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", - "11-Aug 00:20:52:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", - "11-Aug 00:20:52:DEBUG:root:Adding Dirichlet boundary conditions\n", - "11-Aug 00:20:52:DEBUG:root:dof 1 => 0.0\n", - "11-Aug 00:20:52:DEBUG:root:dof 2 => 0.0\n", - "11-Aug 00:20:52:DEBUG:root:dof 7 => 0.0\n", - "11-Aug 00:20:52:DEBUG:root:dof 8 => 0.0\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 80.58 18.37 53.97 14.28 -64.27 -7.29 -70.28 -25.36\n", - " 18.37 29.48 19.23 20.58 -7.58 -16.78 -30.02 -33.28\n", - " 53.97 19.23 139.54 47.2 -146.69 -42.11 -46.81 -24.33\n", - " 14.28 20.58 47.2 74.51 -36.82 -59.55 -24.66 -35.54\n", - " -64.27 -7.58 -146.69 -36.82 159.26 28.44 51.7 15.96\n", - " -7.29 -16.78 -42.11 -59.55 28.44 56.47 20.96 19.86\n", - " -70.28 -30.02 -46.81 -24.66 51.7 20.96 65.39 33.72\n", - " -25.36 -33.28 -24.33 -35.54 15.96 19.86 33.72 48.96\n", - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 80.58 18.37 53.97 14.28 -64.27 -7.29 -70.28 -25.36\n", - " 18.37 29.48 19.23 20.58 -7.58 -16.78 -30.02 -33.28\n", - " 53.97 19.23 139.54 47.2 -146.69 -42.11 -46.81 -24.33\n", - " 14.28 20.58 47.2 74.51 -36.82 -59.55 -24.66 -35.54\n", - " -64.27 -7.58 -146.69 -36.82 159.26 28.44 51.7 15.96\n", - " -7.29 -16.78 -42.11 -59.55 28.44 56.47 20.96 19.86\n", - " -70.28 -30.02 -46.81 -24.66 51.7 20.96 65.39 33.72\n", - " -25.36 -33.28 -24.33 -35.54 15.96 19.86 33.72 48.96\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:52:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "11-Aug 00:20:52:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 00:20:52:DEBUG:root:Solving system of equations. Total size = 16\n", - "11-Aug 00:20:52:DEBUG:root:nothing\n", - "11-Aug 00:20:52:DEBUG:root:nothing\n", - "11-Aug 00:20:52:DEBUG:root:Solution norm = 2.638889456564558\n", - "11-Aug 00:20:52:DEBUG:root:Starting iteration 6\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", - " 80.6 18.4 54.0 14.3 0.0 0.0 -70.3 -25.4 -64.3 -7.3 0.0 0.0 1.0 0.0 0.0 0.0\n", - " 18.4 29.5 19.2 20.6 0.0 0.0 -30.0 -33.3 -7.6 -16.8 0.0 0.0 0.0 1.0 0.0 0.0\n", - " 54.0 19.2 220.1 65.6 54.0 14.3 -46.8 -24.3 -217.0 -67.5 -64.3 -7.3 0.0 0.0 0.0 0.0\n", - " 14.3 20.6 65.6 104.0 19.2 20.6 -24.7 -35.5 -66.8 -92.8 -7.6 -16.8 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 54.0 19.2 139.5 47.2 0.0 0.0 -46.8 -24.3 -146.7 -42.1 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 14.3 20.6 47.2 74.5 0.0 0.0 -24.7 -35.5 -36.8 -59.6 0.0 0.0 0.0 0.0\n", - " -70.3 -30.0 -46.8 -24.7 0.0 0.0 65.4 33.7 51.7 21.0 0.0 0.0 0.0 0.0 1.0 0.0\n", - " -25.4 -33.3 -24.3 -35.5 0.0 0.0 33.7 49.0 16.0 19.9 0.0 0.0 0.0 0.0 0.0 1.0\n", - " -64.3 -7.6 -217.0 -66.8 -46.8 -24.7 51.7 16.0 224.7 62.2 51.7 21.0 0.0 0.0 0.0 0.0\n", - " -7.3 -16.8 -67.5 -92.8 -24.3 -35.5 21.0 19.9 62.2 105.4 16.0 19.9 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -64.3 -7.6 -146.7 -36.8 0.0 0.0 51.7 16.0 159.3 28.4 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -7.3 -16.8 -42.1 -59.6 0.0 0.0 21.0 19.9 28.4 56.5 0.0 0.0 0.0 0.0\n", - " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", - " 28.6 5.9 32.9 14.7 4.3 8.7 -24.6 -14.9 -32.9 -14.7 -8.3 2.2 0.0 0.0 0.0 0.0\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:52:DEBUG:root:Assembling\n", - "11-Aug 00:20:52:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", - "11-Aug 00:20:52:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", - "11-Aug 00:20:52:DEBUG:root:Adding Dirichlet boundary conditions\n", - "11-Aug 00:20:52:DEBUG:root:dof 1 => 0.0\n", - "11-Aug 00:20:52:DEBUG:root:dof 2 => 0.0\n", - "11-Aug 00:20:52:DEBUG:root:dof 7 => 0.0\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 138.24 6.59 72.3 13.02 -91.67 -1.46 -118.87 -18.14\n", - " 6.59 95.68 20.35 47.41 -1.83 -47.79 -25.11 -95.3 \n", - " 72.3 20.35 177.29 48.61 -182.78 -43.91 -66.81 -25.05\n", - " 13.02 47.41 48.61 159.72 -36.21 -128.01 -25.42 -79.12\n", - " -91.67 -1.83 -182.78 -36.21 203.7 23.62 70.75 14.42\n", - " -1.46 -47.79 -43.91 -128.01 23.62 126.88 21.75 48.93\n", - " -118.87 -25.11 -66.81 -25.42 70.75 21.75 114.93 28.77\n", - " -18.14 -95.3 -25.05 -79.12 14.42 48.93 28.77 125.49\n", - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 138.24 6.59 72.3 13.02 -91.67 -1.46 -118.87 -18.14\n", - " 6.59 95.68 20.35 47.41 -1.83 -47.79 -25.11 -95.3 \n", - " 72.3 20.35 177.29 48.61 -182.78 -43.91 -66.81 -25.05\n", - " 13.02 47.41 48.61 159.72 -36.21 -128.01 -25.42 -79.12\n", - " -91.67 -1.83 -182.78 -36.21 203.7 23.62 70.75 14.42\n", - " -1.46 -47.79 -43.91 -128.01 23.62 126.88 21.75 48.93\n", - " -118.87 -25.11 -66.81 -25.42 70.75 21.75 114.93 28.77\n", - " -18.14 -95.3 -25.05 -79.12 14.42 48.93 28.77 125.49\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:52:DEBUG:root:dof 8 => 0.0\n", - "11-Aug 00:20:52:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "11-Aug 00:20:52:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 00:20:52:DEBUG:root:Solving system of equations. Total size = 16\n", - "11-Aug 00:20:52:DEBUG:root:nothing\n", - "11-Aug 00:20:52:DEBUG:root:nothing\n", - "11-Aug 00:20:52:DEBUG:root:Solution norm = 2.584668977172499\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", - " 138.2 6.6 72.3 13.0 0.0 0.0 -118.9 -18.1 -91.7 -1.5 0.0 0.0 1.0 0.0 0.0 0.0\n", - " 6.6 95.7 20.3 47.4 0.0 0.0 -25.1 -95.3 -1.8 -47.8 0.0 0.0 0.0 1.0 0.0 0.0\n", - " 72.3 20.3 315.5 55.2 72.3 13.0 -66.8 -25.0 -301.6 -62.1 -91.7 -1.5 0.0 0.0 0.0 0.0\n", - " 13.0 47.4 55.2 255.4 20.3 47.4 -25.4 -79.1 -61.3 -223.3 -1.8 -47.8 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 72.3 20.3 177.3 48.6 0.0 0.0 -66.8 -25.0 -182.8 -43.9 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 13.0 47.4 48.6 159.7 0.0 0.0 -25.4 -79.1 -36.2 -128.0 0.0 0.0 0.0 0.0\n", - " -118.9 -25.1 -66.8 -25.4 0.0 0.0 114.9 28.8 70.7 21.8 0.0 0.0 0.0 0.0 1.0 0.0\n", - " -18.1 -95.3 -25.0 -79.1 0.0 0.0 28.8 125.5 14.4 48.9 0.0 0.0 0.0 0.0 0.0 1.0\n", - " -91.7 -1.8 -301.6 -61.3 -66.8 -25.4 70.7 14.4 318.6 52.4 70.7 21.8 0.0 0.0 0.0 0.0\n", - " -1.5 -47.8 -62.1 -223.3 -25.0 -79.1 21.8 48.9 52.4 252.4 14.4 48.9 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -91.7 -1.8 -182.8 -36.2 0.0 0.0 70.7 14.4 203.7 23.6 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -1.5 -47.8 -43.9 -128.0 0.0 0.0 21.8 48.9 23.6 126.9 0.0 0.0 0.0 0.0\n", - " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - "Array(Float64,(1,16)) 1x16 Array{Float64,2}:\n", - " -6.5 7.6 -25.7 -24.5 -19.1 -32.0 -4.1 20.8 25.7 24.5 29.7 5.7 0.0 0.0 0.0 0.0\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:52:DEBUG:root:Starting iteration 7\n", - "11-Aug 00:20:52:DEBUG:root:Assembling\n", - "11-Aug 00:20:52:DEBUG:root:Assemble element to gdofs [1,2,3,4,9,10,7,8]\n", - "11-Aug 00:20:52:DEBUG:root:Assemble element to gdofs [3,4,5,6,11,12,9,10]\n", - "11-Aug 00:20:52:DEBUG:root:Adding Dirichlet boundary conditions\n", - "11-Aug 00:20:53:DEBUG:root:dof 1 => 0.0\n", - "11-Aug 00:20:53:DEBUG:root:dof 2 => 0.0\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 105.18 18.96 58.01 14.76 -69.33 -6.94 -93.85 -26.77\n", - " 18.96 36.86 19.89 21.5 -7.13 -18.68 -31.72 -39.68\n", - " 58.01 19.89 135.28 46.75 -141.88 -41.41 -51.41 -25.23\n", - " 14.76 21.5 46.75 74.5 -36.07 -59.09 -25.44 -36.91\n", - " -69.33 -7.13 -141.88 -36.07 154.31 27.5 56.9 15.7 \n", - " -6.94 -18.68 -41.41 -59.09 27.5 56.13 20.86 21.65\n", - " -93.85 -31.72 -51.41 -25.44 56.9 20.86 88.36 36.3 \n", - " -26.77 -39.68 -25.23 -36.91 15.7 21.65 36.3 54.93\n", - "Element stiffness matrix\n", - "Array(Float64,(8,8)) 8x8 Array{Float64,2}:\n", - " 105.18 18.96 58.01 14.76 -69.33 -6.94 -93.85 -26.77\n", - " 18.96 36.86 19.89 21.5 -7.13 -18.68 -31.72 -39.68\n", - " 58.01 19.89 135.28 46.75 -141.88 -41.41 -51.41 -25.23\n", - " 14.76 21.5 46.75 74.5 -36.07 -59.09 -25.44 -36.91\n", - " -69.33 -7.13 -141.88 -36.07 154.31 27.5 56.9 15.7 \n", - " -6.94 -18.68 -41.41 -59.09 27.5 56.13 20.86 21.65\n", - " -93.85 -31.72 -51.41 -25.44 56.9 20.86 88.36 36.3 \n", - " -26.77 -39.68 -25.23 -36.91 15.7 21.65 36.3 54.93\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:53:DEBUG:root:dof 7 => 0.0\n", - "11-Aug 00:20:53:DEBUG:root:dof 8 => 0.0\n", - "11-Aug 00:20:53:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "11-Aug 00:20:53:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 00:20:53:DEBUG:root:Solving system of equations. Total size = 16\n", - "11-Aug 00:20:53:DEBUG:root:nothing\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Array(Float64,(16,16)) 16x16 Array{Float64,2}:\n", - " 105.2 19.0 58.0 14.8 0.0 0.0 -93.9 -26.8 -69.3 -6.9 0.0 0.0 1.0 0.0 0.0 0.0\n", - " 19.0 36.9 19.9 21.5 0.0 0.0 -31.7 -39.7 -7.1 -18.7 0.0 0.0 0.0 1.0 0.0 0.0\n", - " 58.0 19.9 240.5 65.7 58.0 14.8 -51.4 -25.2 -235.7 -68.2 -69.3 -6.9 0.0 0.0 0.0 0.0\n", - " 14.8 21.5 65.7 111.4 19.9 21.5 -25.4 -36.9 -67.8 -98.8 -7.1 -18.7 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 58.0 19.9 135.3 46.7 0.0 0.0 -51.4 -25.2 -141.9 -41.4 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 14.8 21.5 46.7 74.5 0.0 0.0 -25.4 -36.9 -36.1 -59.1 0.0 0.0 0.0 0.0\n", - " -93.9 -31.7 -51.4 -25.4 0.0 0.0 88.4 36.3 56.9 20.9 0.0 0.0 0.0 0.0 1.0 0.0\n", - " -26.8 -39.7 -25.2 -36.9 0.0 0.0 36.3 54.9 15.7 21.6 0.0 0.0 0.0 0.0 0.0 1.0\n", - " -69.3 -7.1 -235.7 -67.8 -51.4 -25.4 56.9 15.7 242.7 63.8 56.9 20.9 0.0 0.0 0.0 0.0\n", - " -6.9 -18.7 -68.2 -98.8 -25.2 -36.9 20.9 21.6 63.8 111.1 15.7 21.6 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -69.3 -7.1 -141.9 -36.1 0.0 0.0 56.9 15.7 154.3 27.5 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 -6.9 -18.7 -41.4 -59.1 0.0 0.0 20.9 21.6 27.5 56.1 0.0 0.0 0.0 0.0\n", - " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - "Array(Float64,(1,16)) 1x16 Array{Float64,2}" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "11-Aug 00:20:53:DEBUG:root:nothing\n", - "11-Aug 00:20:53:DEBUG:root:Solution norm = 2.411610159457492\n", - "11-Aug 00:20:53:DEBUG:root:Displacement of element = \n", - "[-3.026501780111713 -5.464687844269877 -4.502220576358782 -2.218831052635469\n", - " -1.2759688848714141 -6.757003969576775 -7.221835300089658 -1.8649226742660827]\n" + "0 facts verified.\n" ] }, { @@ -1749,15 +875,6 @@ "execution_count": 12, "metadata": {}, "output_type": "execute_result" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - ":\n", - " 22.9 4.1 28.6 11.8 5.6 7.6 -19.5 -12.4 -28.6 -11.8 -9.0 2.6 0.0 0.0 0.0 0.0\n", - "0 facts verified.\n" - ] } ], "source": [ @@ -1789,6 +906,8 @@ "end\n", "\n", "function solve!(elements, dofmap, neumann_bcs, dirichlet_bcs; ndofs=2, max_iterations=10)\n", + "\n", + " dbc = \"lagrange\"\n", " \n", " Logging.info(\"solve!: dofs per node: $ndofs\")\n", " pdim = length(dofmap)*ndofs\n", @@ -1826,29 +945,31 @@ " Logging.debug(\"Assembling\")\n", " for el in elements\n", " assemble_element!(ass, el)\n", - " println(\"Element stiffness matrix\")\n", - " dump(round(el.attributes[\"displacement tangent stiffness\"], 2))\n", + " #println(\"Element stiffness matrix\")\n", + " #dump(round(el.attributes[\"displacement tangent stiffness\"], 2))\n", " end\n", "\n", - " Logging.debug(\"Adding Dirichlet boundary conditions\")\n", - " # Dirichlet boundary conditions\n", " i = 1\n", - " for bc in dirichlet_bcs\n", - " for (dof, val) in zip(bc.dofs, bc.values)\n", - " Logging.debug(\"dof $dof => $val\")\n", - " push!(ass.I, dof)\n", - " push!(ass.J, pdim+i)\n", - " push!(ass.A, 1)\n", - " push!(ass.I, pdim+i)\n", - " push!(ass.J, dof)\n", - " push!(ass.A, 1)\n", - " push!(ass.i, pdim+i)\n", - " push!(ass.b, 0)\n", - " i += 1\n", + " if dbc == \"lagrange\"\n", + " Logging.debug(\"Adding Dirichlet boundary conditions using Lagrange multipliers\")\n", + " # Dirichlet boundary conditions\n", + " for bc in dirichlet_bcs\n", + " for (dof, val) in zip(bc.dofs, bc.values)\n", + " #Logging.debug(\"dof $dof => $val\")\n", + " push!(ass.I, dof)\n", + " push!(ass.J, pdim+i)\n", + " push!(ass.A, 1)\n", + " push!(ass.I, pdim+i)\n", + " push!(ass.J, dof)\n", + " push!(ass.A, 1)\n", + " push!(ass.i, pdim+i)\n", + " push!(ass.b, 0)\n", + " i += 1\n", + " end\n", " end\n", + " Logging.debug(\"Added $i Lagrange multipliers to model\")\n", " end\n", " i -= 1\n", - " Logging.debug(\"Added $i Lagrange multipliers to model\")\n", "\n", " Logging.debug(\"Adding Neumann boundary conditions\")\n", " F = zeros(pdim+i)\n", @@ -1864,21 +985,38 @@ " K = sparse(ass.I, ass.J, ass.A)\n", " R = full(sparsevec(ass.i, ass.b))\n", " R = R - F\n", - " Logging.debug(dump(round(full(K), 1)))\n", + " #Logging.debug(dump(round(full(K), 2)))\n", " #print_matrix(full(K))\n", - " Logging.debug(dump(round(R', 1)))\n", + " #Logging.debug(dump(round(R', 1)))\n", "\n", - " du = K \\ -R\n", + " if dbc == \"eliminate\"\n", + " Logging.debug(\"Eliminating Dirichlet boundary conditions\")\n", + " throw(\"Implement this properly\")\n", + " free_dofs = [1, 2, 3, 4, 5, 6, 7, 8]\n", + " du = zeros(12)\n", + " Logging.debug(\"K norm = $(norm(full(K[free_dofs, free_dofs])))\")\n", + " du[free_dofs] = K[free_dofs, free_dofs] \\ -R[free_dofs]\n", + " else\n", + " du = K \\ -R\n", + " end\n", "\n", + " #du = reshape(du, 2, 6)\n", " solnorm = norm(du[1:pdim])\n", - " Logging.debug(\"Solution norm = $solnorm\")\n", + " #Logging.debug(\"du = $du\")\n", + " Logging.debug(\"Solution norm du = $solnorm\")\n", "\n", " # update solution back to elements\n", " for el in elements\n", - "\n", + " #Logging.debug(\"update element $(el.id)\")\n", + " eldisp = el.attributes[\"displacement\"]\n", + " #Logging.debug(\"displacement before update $(el.id) : \\n$eldisp\")\n", " eldu = du[ass.gdofs[el.id]]\n", " eldu = reshape(eldu, (ndofs, round(Int, length(eldu)/ndofs)))\n", + " #Logging.debug(\"eldu for element $(el.id) \\n$eldu\")\n", " el.attributes[\"displacement\"] += eldu\n", + " eldisp = el.attributes[\"displacement\"]\n", + " #Logging.debug(\"displacement after update $(el.id) : \\n$eldisp\")\n", + "\n", " end\n", " if solnorm < 1.0e-9\n", " Logging.debug(\"Converged in $iter iterations.\")\n", @@ -1890,26 +1028,28 @@ "\n", "ENV[\"COLUMNS\"] = 160\n", "\n", - "facts(\"solve one element problem\") do\n", - " # Create model\n", - " Logging.debug(\"Creating nodes\")\n", - " node_ids = [1, 2, 3, 4]\n", - " coordinates = [10.0 0.0; 10.0 1.0; 0.0 1.0; 0.0 0.0]'\n", - " attributes = Dict(\"Young\" => 90, \"Poisson\" => 0.25)\n", - " Logging.debug(\"Creating elements\")\n", - " el = Element(1, node_ids, coordinates, attributes)\n", - " elements = [el]\n", - " dofmap = create_ldof2gdofmap(elements)\n", - " Logging.debug(dofmap)\n", - " # Boundary conditions\n", - " # here we want to create nodal force for third dof, that is, node id 2, second dof\n", - " bc1 = BC([dofmap[2][2]], [-2.0])\n", - " # dirichlet bc, set dx=dy=0 on support\n", - " bc2 = BC([dofmap[3][1], dofmap[3][2], dofmap[4][1], dofmap[4][2]], [0.0, 0.0, 0.0, 0.0])\n", - " solve!(elements, dofmap, [bc1], [bc2]; max_iterations=7)\n", - " disp = elements[1].attributes[\"displacement\"]\n", - " Logging.debug(\"Displacement of element = \\n$disp\")\n", - " @fact norm(disp) => roughly(3.1292483947150043)\n", + "function test1():\n", + " facts(\"solve one element problem\") do\n", + " # Create model\n", + " Logging.debug(\"Creating nodes\")\n", + " node_ids = [1, 2, 3, 4]\n", + " coordinates = [10.0 0.0; 10.0 1.0; 0.0 1.0; 0.0 0.0]'\n", + " attributes = Dict(\"Young\" => 90, \"Poisson\" => 0.25)\n", + " Logging.debug(\"Creating elements\")\n", + " el = Element(1, node_ids, coordinates, attributes)\n", + " elements = [el]\n", + " dofmap = create_ldof2gdofmap(elements)\n", + " Logging.debug(dofmap)\n", + " # Boundary conditions\n", + " # here we want to create nodal force for third dof, that is, node id 2, second dof\n", + " bc1 = BC([dofmap[2][2]], [-2.0])\n", + " # dirichlet bc, set dx=dy=0 on support\n", + " bc2 = BC([dofmap[3][1], dofmap[3][2], dofmap[4][1], dofmap[4][2]], [0.0, 0.0, 0.0, 0.0])\n", + " solve!(elements, dofmap, [bc1], [bc2]; max_iterations=7)\n", + " disp = elements[1].attributes[\"displacement\"]\n", + " Logging.debug(\"Displacement of element = \\n$disp\")\n", + " @fact norm(disp) => roughly(3.1292483947150043)\n", + " end\n", "end\n", "\n", "facts(\"solve two element problem\") do\n", @@ -1917,21 +1057,21 @@ " attributes = Dict(\"Young\" => 90, \"Poisson\" => 0.25)\n", "\n", " Logging.debug(\"Creating elements\")\n", - " nids1 = [1, 2, 5, 4]\n", + " nids1 = [5, 1, 3, 6]\n", " coords1 = [0.0 0.0; 5.0 0.0; 5.0 1.0; 0.0 1.0]'\n", - " el1 = Element(1, nids1, coords1, attributes)\n", - " nids2 = [2, 3, 6, 5]\n", + " el1 = Element(1, nids1, coords1, copy(attributes))\n", + " nids2 = [1, 2, 4, 3]\n", " coords2 = [5.0 0.0; 10.0 0.0; 10.0 1.0; 5.0 1.0]'\n", - " el2 = Element(2, nids2, coords2, attributes)\n", + " el2 = Element(2, nids2, coords2, copy(attributes))\n", " elements = [el1, el2]\n", "\n", " dofmap = create_ldof2gdofmap(elements)\n", " Logging.debug(dofmap)\n", " # Boundary conditions\n", " # here we want to create nodal force for third dof, that is, node id 2, second dof\n", - " bc1 = BC([dofmap[6][2]], [-2.0])\n", + " bc1 = BC([dofmap[4][2]], [-0.1])\n", " # dirichlet bc, set dx=dy=0 on support\n", - " bc2 = BC([dofmap[1][1], dofmap[1][2], dofmap[4][1], dofmap[4][2]], [0.0, 0.0, 0.0, 0.0])\n", + " bc2 = BC([dofmap[5][1], dofmap[5][2], dofmap[6][1], dofmap[6][2]], [0.0, 0.0, 0.0, 0.0])\n", " solve!(elements, dofmap, [bc1], [bc2]; max_iterations=7)\n", " disp = elements[2].attributes[\"displacement\"]\n", " Logging.debug(\"Displacement of element = \\n$disp\")\n", @@ -1950,30 +1090,7 @@ }, { "cell_type": "code", - "execution_count": 74, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1x1 sparse matrix with 1 Float64 entries:\n", - "\t[1, 1] = 2.0" - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sparse([1, 1], [1, 1], [1.0, 1.0])" - ] - }, - { - "cell_type": "code", - "execution_count": 46, + "execution_count": 13, "metadata": { "collapsed": false }, @@ -1982,30 +1099,66 @@ "name": "stderr", "output_type": "stream", "text": [ - "10-Aug 20:59:55:INFO:root:Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\"]\n", - "10-Aug 20:59:55:DEBUG:root:Found NODE section\n", - "10-Aug 20:59:56:DEBUG:root:Found ELEMENT section\n", - "10-Aug 20:59:57:DEBUG:root:120 elements found\n", - "10-Aug 20:59:57:INFO:root:Creating ELSET Body1\n", - "10-Aug 20:59:57:DEBUG:root:Found NSET section\n", - "10-Aug 20:59:57:DEBUG:root:Creating node set SUPPORT\n", - "10-Aug 20:59:57:DEBUG:root:Found NSET section\n", - "10-Aug 20:59:57:DEBUG:root:Creating node set LOAD\n", - "10-Aug 20:59:57:DEBUG:root:Found NSET section\n", - "10-Aug 20:59:57:DEBUG:root:Creating node set TOP\n" + "\n", + "WARNING: deprecated syntax \"{a=>b, ...}\" at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:11.\n", + "Use \"Dict{Any,Any}(a=>b, ...)\" instead.\n", + "\n", + "WARNING: deprecated syntax \"{a=>b, ...}\" at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:32.\n", + "Use \"Dict{Any,Any}(a=>b, ...)\" instead.\n", + "11-Aug 21:40:01:INFO:root:Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\"]\n", + "WARNING: beginswith is deprecated, use startswith instead.\n", + " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", + " in beginswith at deprecated.jl:30\n", + " in parse_abaqus at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:113\n", + " in include_string at loading.jl:99\n", + " in execute_request_0x535c5df2 at /Users/jukka/.julia/v0.4/IJulia/src/execute_request.jl:157\n", + " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", + " in anonymous at task.jl:365\n", + "while loading In[13], in expression starting on line 3\n", + "WARNING: beginswith is deprecated, use startswith instead.\n", + " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", + " in beginswith at deprecated.jl:30\n", + " in parse_abaqus at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:113\n", + " in include_string at loading.jl:99\n", + " in execute_request_0x535c5df2 at /Users/jukka/.julia/v0.4/IJulia/src/execute_request.jl:157\n", + " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", + " in anonymous at task.jl:365\n", + "while loading In[13], in expression starting on line 3\n", + "11-Aug 21:40:01:DEBUG:root:Found NODE section\n", + "11-Aug 21:40:01:DEBUG:root:Found ELEMENT section\n", + "WARNING: integer(s::AbstractString) is deprecated, use parse(Int,s) instead.\n", + " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", + " in integer at deprecated.jl:49\n", + " in map at abstractarray.jl:1251\n", + " in parse_element_section at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:59\n", + " in process_section at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:108\n", + " in parse_abaqus at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:117\n", + " in include_string at loading.jl:99\n", + " in execute_request_0x535c5df2 at /Users/jukka/.julia/v0.4/IJulia/src/execute_request.jl:157\n", + " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", + " in anonymous at task.jl:365\n", + "while loading In[13], in expression starting on line 3\n", + "11-Aug 21:40:03:DEBUG:root:120 elements found\n", + "11-Aug 21:40:03:INFO:root:Creating ELSET Body1\n", + "11-Aug 21:40:03:DEBUG:root:Found NSET section\n", + "11-Aug 21:40:03:DEBUG:root:Creating node set SUPPORT\n", + "11-Aug 21:40:03:DEBUG:root:Found NSET section\n", + "11-Aug 21:40:03:DEBUG:root:Creating node set LOAD\n", + "11-Aug 21:40:03:DEBUG:root:Found NSET section\n", + "11-Aug 21:40:03:DEBUG:root:Creating node set TOP\n" ] }, { "data": { "text/plain": [ "Dict{Any,Any} with 4 entries:\n", - " \"nodes\" => Dict{Any,Any}(288=>[97.5,7.5,10.0],11=>[92.5,2.5,5.0],134=>[45.…\n", - " \"elements\" => Dict{Any,Any}(68=>[71,144,149,198,51,150,57,43,50,214],2=>[204,…\n", - " \"elsets\" => Dict{Any,Any}(\"Body1\"=>[1,2,3,4,5,6,7,8,9,10 … 111,112,113,11…\n", - " \"nsets\" => Dict{Any,Any}(\"LOAD\"=>[82,84,87,179,197,246,249,256,257],\"SUPPO…" + " \"nodes\" => Dict{Any,Any}(288=>[97.5,7.5,10.0],11=>[92.5,2.5,5.0],134=>[45.0,10.0,0.0],158=>[2.5,2.5,0.0],160=>[7.5,7.5,0.0],215=>[60.0,0.0,5.0],29=>[2.5,7…\n", + " \"elements\" => Dict{Any,Any}(68=>[71,144,149,198,51,150,57,43,50,214],2=>[204,199,175,130,207,208,209,3,4,176],89=>[95,78,104,52,127,126,106,60,68,67],11=>[15…\n", + " \"elsets\" => Dict{Any,Any}(\"Body1\"=>[1,2,3,4,5,6,7,8,9,10 … 111,112,113,114,115,116,117,118,119,120])\n", + " \"nsets\" => Dict{Any,Any}(\"LOAD\"=>[82,84,87,179,197,246,249,256,257],\"SUPPORT\"=>[108,109,111,155,162,216,225,281,298],\"TOP\"=>[70,75,76,84,88,90,95,96,98,10…" ] }, - "execution_count": 46, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -2020,87 +1173,62 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 34, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "solve 3d elasticity problem\n" - ] - }, { "name": "stderr", "output_type": "stream", "text": [ - "10-Aug 21:16:13:DEBUG:root:Creating elements\n", - "10-Aug 21:16:13:INFO:root:dofs per node: 3\n", - "10-Aug 21:16:13:INFO:root:dofs per node: 3\n", - "10-Aug 21:16:13:DEBUG:root:Problem size = 894\n", - "10-Aug 21:16:13:DEBUG:root:Starting iteration 1\n", - "10-Aug 21:16:13:DEBUG:root:Assembling\n", - "10-Aug 21:16:15:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 21:16:15:DEBUG:root:Added 27 Lagrange multipliers to model\n", - "10-Aug 21:16:15:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 21:16:15:DEBUG:root:Solving system of equations. Total size = 921\n", - "10-Aug 21:16:15:DEBUG:root:Solution norm = 0.2429242363684311\n", - "10-Aug 21:16:15:DEBUG:root:Starting iteration 2\n", - "10-Aug 21:16:15:DEBUG:root:Assembling\n", - "10-Aug 21:16:16:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 21:16:16:DEBUG:root:Added 27 Lagrange multipliers to model\n", - "10-Aug 21:16:16:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 21:16:16:DEBUG:root:Solving system of equations. Total size = 921\n", - "10-Aug 21:16:16:DEBUG:root:Solution norm = 0.220339941648292\n", - "10-Aug 21:16:16:DEBUG:root:Starting iteration 3\n", - "10-Aug 21:16:16:DEBUG:root:Assembling\n", - "10-Aug 21:16:17:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 21:16:17:DEBUG:root:Added 27 Lagrange multipliers to model\n", - "10-Aug 21:16:17:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 21:16:17:DEBUG:root:Solving system of equations. Total size = 921\n", - "10-Aug 21:16:18:DEBUG:root:Solution norm = 31.956186974599095\n", - "10-Aug 21:16:18:DEBUG:root:Starting iteration 4\n", - "10-Aug 21:16:18:DEBUG:root:Assembling\n", - "10-Aug 21:16:19:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 21:16:19:DEBUG:root:Added 27 Lagrange multipliers to model\n", - "10-Aug 21:16:19:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 21:16:19:DEBUG:root:Solving system of equations. Total size = 921\n", - "10-Aug 21:16:19:DEBUG:root:Solution norm = 411.4719431105651\n", - "10-Aug 21:16:19:DEBUG:root:Starting iteration 5\n", - "10-Aug 21:16:19:DEBUG:root:Assembling\n", - "10-Aug 21:16:21:DEBUG:root:Adding Dirichlet boundary conditions\n", - "10-Aug 21:16:21:DEBUG:root:Added 27 Lagrange multipliers to model\n", - "10-Aug 21:16:21:DEBUG:root:Adding Neumann boundary conditions\n", - "10-Aug 21:16:21:DEBUG:root:Solving system of equations. Total size = 921\n", - "10-Aug 21:16:21:DEBUG:root:Solution norm = 7077.644216187514\n" + "11-Aug 22:15:29:DEBUG:root:Creating elements\n", + "11-Aug 22:15:29:INFO:root:create_ldof2gdofmap: dofs per node: 3\n", + "11-Aug 22:15:29:INFO:root:solve!: dofs per node: 3\n", + "11-Aug 22:15:29:DEBUG:root:Problem size = 894\n", + "11-Aug 22:15:29:DEBUG:root:Starting iteration 1\n", + "11-Aug 22:15:29:DEBUG:root:Assembling\n", + "11-Aug 22:15:30:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "11-Aug 22:15:30:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "11-Aug 22:15:30:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 22:15:30:DEBUG:root:Solving system of equations. Total size = 921\n", + "11-Aug 22:15:30:DEBUG:root:Solution norm du = 72.87727091053921\n", + "11-Aug 22:15:30:DEBUG:root:Starting iteration 2\n", + "11-Aug 22:15:31:DEBUG:root:Assembling\n", + "11-Aug 22:15:32:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "11-Aug 22:15:32:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "11-Aug 22:15:32:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 22:15:32:DEBUG:root:Solving system of equations. Total size = 921\n", + "11-Aug 22:15:32:DEBUG:root:Solution norm du = 2.737285770100854\n", + "11-Aug 22:15:32:DEBUG:root:Starting iteration 3\n", + "11-Aug 22:15:32:DEBUG:root:Assembling\n", + "11-Aug 22:15:33:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "11-Aug 22:15:34:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "11-Aug 22:15:34:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 22:15:34:DEBUG:root:Solving system of equations. Total size = 921\n", + "11-Aug 22:15:34:DEBUG:root:Solution norm du = 0.07997112801214978\n", + "11-Aug 22:15:34:DEBUG:root:Starting iteration 4\n", + "11-Aug 22:15:34:DEBUG:root:Assembling\n", + "11-Aug 22:15:35:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "11-Aug 22:15:35:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "11-Aug 22:15:35:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 22:15:35:DEBUG:root:Solving system of equations. Total size = 921\n", + "11-Aug 22:15:35:DEBUG:root:Solution norm du = 6.406557430235748e-5\n", + "11-Aug 22:15:35:DEBUG:root:Starting iteration 5\n", + "11-Aug 22:15:35:DEBUG:root:Assembling\n", + "11-Aug 22:15:37:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "11-Aug 22:15:37:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "11-Aug 22:15:37:DEBUG:root:Adding Neumann boundary conditions\n", + "11-Aug 22:15:37:DEBUG:root:Solving system of equations. Total size = 921\n", + "11-Aug 22:15:37:DEBUG:root:Solution norm du = 6.870072007793185e-11\n", + "11-Aug 22:15:37:DEBUG:root:Converged in 5 iterations.\n", + "11-Aug 22:15:37:INFO:root:Maximum absolute displacement in y direction: 6.9925206227884695\n" ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 facts verified.\n" - ] - }, - { - "data": { - "text/plain": [ - "delayed_handler (generic function with 4 methods)" - ] - }, - "execution_count": 63, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ - "facts(\"solve 3d elasticity problem\") do\n", - "\n", - " attributes = Dict(\"Young\" => 90, \"Poisson\" => 0.25)\n", - "\n", + "function solve_3d_model()\n", " Logging.debug(\"Creating elements\")\n", " elements = Element[]\n", " coordinates = zeros(3, 10)\n", @@ -2108,6 +1236,7 @@ " for (i, nid) in enumerate(node_ids)\n", " coordinates[:,i] = model[\"nodes\"][nid]\n", " end\n", + " attributes = Dict(\"Young\" => 90, \"Poisson\" => 0.25)\n", " el = Element(elid, node_ids, coordinates, attributes)\n", " push!(elements, el)\n", " end\n", @@ -2130,355 +1259,42 @@ " bc_load = BC(Int64[], Float64[])\n", " for nid in model[\"nsets\"][\"LOAD\"]\n", " push!(bc_load.dofs, dofmap[nid][2])\n", - " push!(bc_load.values, -0.1)\n", + " push!(bc_load.values, -30.0)\n", " end\n", "\n", " #solve!(elements, [bc1], [bc2]; max_iterations=7)\n", " neumann_bcs = [bc_load]\n", " dirichlet_bcs = [bc_support]\n", " # ndofs = dimension of unknown field in nodes\n", - " solve!(elements, dofmap, neumann_bcs, dirichlet_bcs; ndofs=3, max_iterations=5)\n", - "# disp = elements[1].attributes[\"displacement\"]\n", - "# Logging.debug(\"Displacement of element = \\n$disp\")\n", - "# @fact norm(disp) => roughly(3.1292483947150043)\n", - "end" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING: int(x) is deprecated, use Int(x) instead.\n" - ] - }, - { - "data": { - "text/plain": [ - "1015" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", - " in int at deprecated.jl:49\n", - " in save_file at /Users/jukka/.julia/v0.4/LightXML/src/document.jl:108\n", - " in xdmf_save_model at /Users/jukka/.julia/v0.4/JuliaFEM/src/xdmf.jl:106\n", - " in include_string at loading.jl:99\n", - " in execute_request_0x535c5df2 at /Users/jukka/.julia/v0.4/IJulia/src/execute_request.jl:157\n", - " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", - " in anonymous at task.jl:365\n", - "while loading In[4], in expression starting on line 7\n" - ] - } - ], - "source": [ - "xdoc, model = JuliaFEM.xdmf.xdmf_new_model()\n", - "temporal_collection = JuliaFEM.xdmf.xdmf_new_temporal_collection(model)\n", - "grid = JuliaFEM.xdmf.xdmf_new_grid(temporal_collection; time=0)\n", - "JuliaFEM.xdmf.xdmf_new_mesh(grid, X3d, elmap2)\n", - "JuliaFEM.xdmf.xdmf_new_field(grid, \"Displacement\", \"nodes\", u3d)\n", - "print(xdoc)\n", - "JuliaFEM.xdmf.xdmf_save_model(xdoc, \"/tmp/foo.xmf\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "## 3d beam with quadratic elements" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "10x120 Array{Int64,2}:\n", - " 243 204 259 145 96 96 236 285 … 217 69 154 179 203 96 259\n", - " 240 199 70 175 88 101 88 179 216 144 114 91 204 267 199\n", - " 191 175 69 199 236 164 285 178 278 78 278 178 259 95 204\n", - " 117 130 130 130 178 97 178 83 155 71 218 83 199 97 130\n", - " 245 207 265 177 141 102 290 12 219 146 20 181 206 268 39\n", - " 242 208 72 208 290 171 289 182 … 282 152 280 180 263 272 207\n", - " 244 209 5 202 291 9 287 11 33 79 32 182 262 98 263\n", - " 1 3 6 174 7 99 237 13 224 74 223 14 205 99 6\n", - " 2 4 132 176 8 103 8 14 225 51 284 93 207 24 4\n", - " 196 176 134 4 237 10 11 15 17 80 283 15 39 100 3" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nnodes = length(model[\"nodes\"])\n", - "nelements = length(model[\"elements\"])\n", - "dim = 3\n", - "E = 90\n", - "nu = 0.25\n", - "mu = E/(2*(1+nu))\n", - "la = E*nu/((1+nu)*(1-2*nu))\n", + " solve!(elements, dofmap, neumann_bcs, dirichlet_bcs; ndofs=3, max_iterations=10)\n", "\n", - "X = zeros(dim, nnodes)\n", - "u = zeros(dim, nnodes)\n", - "du = zeros(dim, nnodes)\n", - "elmap = zeros(Int, 10, nelements)\n", - "nodalloads = zeros(3, nnodes)\n", - "dirichletbc = NaN*ones(3, nnodes)\n", - "la = la*ones(1, nnodes)\n", - "mu = mu*ones(1, nnodes)\n", - "\n", - "# calculate permutation which maps node ids to matrix indices\n", - "perm = Dict()\n", - "for (j, k) in enumerate(keys(model[\"nodes\"]))\n", - " perm[k] = j\n", - "end\n", - "\n", - "for j=1:nnodes\n", - " #X[:,j] = model[\"nodes\"][perm[j]]\n", - " X[:,j] = model[\"nodes\"][j]\n", - "end\n", - "\n", - "for (j, k) in enumerate(keys(model[\"elements\"]))\n", - " #node_ids = model[\"elements\"][j]\n", - " elmap[:,j] = model[\"elements\"][j]\n", - " #for l=1:10\n", - " # elmap[l, j] = perm[node_ids[l]]\n", - " #end\n", - "end\n", - "\n", - "elmap" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "3x298 Array{Float64,2}:\n", - " NaN NaN NaN NaN NaN NaN NaN NaN … NaN NaN NaN NaN NaN NaN NaN\n", - " NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN\n", - " NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Handle dirichlet boundaries on SUPPORT\n", - "for j in model[\"nsets\"][\"SUPPORT\"]\n", - " #dirichletbc[perm[j]] = 0.0\n", - " dirichletbc[j] = 0.0\n", - "end\n", - "dirichletbc" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Shape functions and integration points" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Add point force to LOAD nodeset" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "9-element Array{Int64,1}:\n", - " 82\n", - " 84\n", - " 87\n", - " 179\n", - " 197\n", - " 246\n", - " 249\n", - " 256\n", - " 257" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model[\"nsets\"][\"LOAD\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[100.0,10.0,0.0]\n" - ] - } - ], - "source": [ - "#nodalloads[3, perm[82]] = -0.06\n", - "nodalloads[3, 82] = -50.0\n", - "println(model[\"nodes\"][82])" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "iteration 1, norm = 93.13879357262775\n", - "iteration 2, norm = 14.241640589907869\n", - "iteration 3, norm = 2.3999534862146534\n", - "iteration 4, norm = 0.8191634532858331\n", - "iteration 5, norm = 0.08574651168344295\n", - "iteration 6, norm = 0.00032306479346201524\n", - "iteration 7, norm = 8.052462405199464e-9\n", - "iteration 8, norm = 3.0878906643174355e-14\n" - ] - }, - { - "data": { - "text/plain": [ - "3x298 Array{Float64,2}:\n", - " -0.0479657 -0.0483971 -0.0497284 … -0.0155295 -0.0150513 -0.0462958\n", - " -0.474054 -0.418817 -0.254176 -0.229641 -0.283098 -0.694379 \n", - " 0.232677 0.198051 0.0948355 0.128246 0.162511 0.371043 " - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Converged\n" - ] - } - ], - "source": [ - "u = zeros(dim, nnodes)\n", - "du = zeros(dim, nnodes)\n", - "\n", - "for i=1:10\n", - " JuliaFEM.elasticity_solver.solve_elasticity_increment!(X, u, du, elmap, nodalloads, dirichletbc,\n", - " la, mu, Ntet, dNtet, ipoints, iweights)\n", - " u += du\n", - " println(\"iteration $i, norm = $(norm(du))\")\n", - " if norm(du) < 1.0e-9\n", - " println(\"Converged\")\n", - " break\n", + " # Let's pick maximum absolute displacement in y direction\n", + " maxdisp = 0.0\n", + " for el in elements\n", + " eldisp = el.attributes[\"displacement\"]\n", + " eldispy = eldisp[2,:]\n", + " maxeldisp = maximum(abs(eldispy))\n", + " if maxeldisp > maxdisp\n", + " maxdisp = maxeldisp\n", + " end\n", " end\n", + " Logging.info(\"Maximum absolute displacement in y direction: $maxdisp\")\n", + " return model, elements, dofmap\n", "end\n", - "u" + "\n", + "model, elements, dofmap = solve_3d_model();" ] }, { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "15.449170689704438" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "cell_type": "markdown", + "metadata": {}, "source": [ - "maximum(abs(u))" + "## Saving results to file" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 49, "metadata": { "collapsed": false }, @@ -2486,680 +1302,81 @@ { "data": { "text/plain": [ - "(10,120)" + "\n", + " \n" ] }, - "execution_count": 14, + "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "size(elmap)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "120" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nelements" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "11x120 Array{Int64,2}:\n", - " 38 38 38 38 38 38 38 38 … 38 38 38 38 38 38 38\n", - " 243 204 259 145 96 96 236 285 217 69 154 179 203 96 259\n", - " 240 199 70 175 88 101 88 179 216 144 114 91 204 267 199\n", - " 191 175 69 199 236 164 285 178 278 78 278 178 259 95 204\n", - " 117 130 130 130 178 97 178 83 155 71 218 83 199 97 130\n", - " 245 207 265 177 141 102 290 12 … 219 146 20 181 206 268 39\n", - " 242 208 72 208 290 171 289 182 282 152 280 180 263 272 207\n", - " 244 209 5 202 291 9 287 11 33 79 32 182 262 98 263\n", - " 1 3 6 174 7 99 237 13 224 74 223 14 205 99 6\n", - " 2 4 132 176 8 103 8 14 225 51 284 93 207 24 4\n", - " 196 176 134 4 237 10 11 15 … 17 80 283 15 39 100 3" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "elcodes = 0x0026*ones(Int, nelements)\n", - "elmap2 = [elcodes'\n", - " elmap]" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING: int(x) is deprecated, use Int(x) instead.\n" - ] - }, - { - "data": { - "text/plain": [ - "9568" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", - " in int at deprecated.jl:49\n", - " in save_file at /Users/jukka/.julia/v0.4/LightXML/src/document.jl:108\n", - " in xdmf_save_model at /Users/jukka/.julia/v0.4/JuliaFEM/src/xdmf.jl:140\n", - " in include_string at loading.jl:99\n", - " in execute_request_0x535c5df2 at /Users/jukka/.julia/v0.4/IJulia/src/execute_request.jl:157\n", - " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", - " in anonymous at task.jl:365\n", - "while loading In[17], in expression starting on line 7\n" - ] - } - ], "source": [ "xdoc, xmodel = JuliaFEM.xdmf.xdmf_new_model()\n", "temporal_collection = JuliaFEM.xdmf.xdmf_new_temporal_collection(xmodel)\n", - "grid = JuliaFEM.xdmf.xdmf_new_grid(temporal_collection; time=0)\n", - "JuliaFEM.xdmf.xdmf_new_mesh(grid, X, elmap2)\n", - "#JuliaFEM.xdmf.xdmf_new_field(grid, \"Displacement\", \"nodes\", u)\n", - "#print(xdoc)\n", - "JuliaFEM.xdmf.xdmf_save_model(xdoc, \"/tmp/foo3d2.xmf\")" + "grid = JuliaFEM.xdmf.xdmf_new_grid(temporal_collection; time=0)" ] }, { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "10x2 Array{Int64,2}:\n", - " 243 145\n", - " 240 199\n", - " 191 69\n", - " 117 130\n", - " 245 202\n", - " 242 47\n", - " 244 148\n", - " 1 174\n", - " 2 4\n", - " 196 134" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "cell_type": "markdown", + "metadata": {}, "source": [ - "elmap[:,[1, 101]]" + "Save geometry to xdmf file" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [ { - "data": { - "text/plain": [ - "3x10 Array{Float64,2}:\n", - " 20.0 30.0 20.0 20.0 25.0 25.0 20.0 20.0 25.0 20.0\n", - " 0.0 0.0 0.0 10.0 0.0 0.0 0.0 5.0 5.0 5.0\n", - " 10.0 10.0 0.0 0.0 10.0 5.0 5.0 5.0 5.0 0.0" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tmp = elmap[:,[1]]\n", - "tmp = reshape(tmp, length(tmp))\n", - "X[:, tmp]" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "11x1 Array{Int64,2}:\n", - " 38\n", - " 1\n", - " 2\n", - " 3\n", - " 4\n", - " 5\n", - " 6\n", - " 7\n", - " 8\n", - " 9\n", - " 10" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#tmpelmap = [38 1 2 3 4 5 6 7 8 9 10; 38 11 12 13 14 15 16 17 18 19 20]'\n", - "tmpelmap = [38 1 2 3 4 5 6 7 8 9 10]'" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n" + "11-Aug 22:38:28:INFO:root:Number of nodes in model: 298\n", + "11-Aug 22:38:28:INFO:root:Number of elements in model: 120\n" ] - }, + } + ], + "source": [ + "nnodes = length(model[\"nodes\"])\n", + "Logging.info(\"Number of nodes in model: $nnodes\")\n", + "node_ids = Int64[]\n", + "for nid in keys(model[\"nodes\"])\n", + " push!(node_ids, nid)\n", + "end\n", + "sort!(node_ids)\n", + "X = zeros(3, nnodes)\n", + "for (i, nid) in enumerate(node_ids)\n", + " X[:,i] = model[\"nodes\"][nid]\n", + "end\n", + "\n", + "nelements = length(model[\"elements\"])\n", + "Logging.info(\"Number of elements in model: $nelements\")\n", + "elmap = zeros(Int64, 11, nelements)\n", + "elmap[1,:] = 0x0026\n", + "for elid in 1:nelements\n", + " elmap[2:end,elid] = model[\"elements\"][elid]\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": false + }, + "outputs": [ { "data": { "text/plain": [ - "28476" + "true" ] }, - "execution_count": 48, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -3207,14 +1424,173 @@ " \n", "end\n", "\n", - "xdoc, xmodel = JuliaFEM.xdmf.xdmf_new_model()\n", - "temporal_collection = JuliaFEM.xdmf.xdmf_new_temporal_collection(xmodel)\n", - "grid = JuliaFEM.xdmf.xdmf_new_grid(temporal_collection; time=0)\n", - "xdmf_new_mesh(grid, X, elmap2)\n", - "JuliaFEM.xdmf.xdmf_new_field(grid, \"Displacement\", \"nodes\", u)\n", - "print(xdoc)\n", - "JuliaFEM.xdmf.xdmf_save_model(xdoc, \"/tmp/foo3d.xmf\")" + "xdmf_new_mesh(grid, X, elmap)" ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "10435" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "JuliaFEM.xdmf.xdmf_save_model(xdoc, \"/tmp/3d_solid_model.xmf\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Save nodal data to model" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Dict{Any,Any} with 298 entries:\n", + " 288 => [-0.21784897897079505,-6.64256844921929,0.18339325827190953]\n", + " 11 => [-0.17342410820059667,-6.343125806991628,0.17544367431766225]\n", + " 158 => [-0.0007723334905839533,-0.2321904799732306,-0.03883691791045858]\n", + " 215 => [-0.03299227384130259,-4.2236276356937505,-0.0017757488281830807]\n", + " 134 => [-0.06336705102703495,-3.3332586850719337,0.06555932581531249]\n", + " 160 => [0.03205303832663507,-0.536361456950779,-0.07291283371223893]\n", + " 29 => [-0.01620524134284992,-0.19455583841608232,-0.03838421619811468]\n", + " 131 => [0.04015396763870081,-3.5101776818531523,0.10045744211179368]\n", + " 249 => [-0.2491004521409732,-6.570813533283954,0.06837890174506163]\n", + " 207 => [0.03974407267311282,-3.48588780058722,0.007971846403163977]\n", + " 173 => [-0.04472757590353555,-4.582185697159958,-0.04434348606400347]\n", + " 289 => [-0.16494613158592017,-6.360857515886982,0.33435404817411213]\n", + " 74 => [-0.03449870789750817,-3.947284664599636,0.0692691027146262]\n", + " 201 => [-0.00128347996939122,-3.8527236749372054,0.054216444201382656]\n", + " 176 => [-0.004729440266412542,-3.132546258410676,0.0036604388995965386]\n", + " 57 => [-0.021453552968802154,-4.134921994863808,0.04888988010136468]\n", + " 31 => [-0.005045439296021616,-0.3424143474221696,-0.0365148544462663]\n", + " 285 => [-0.19371941654927557,-6.446502168659889,0.18022053743770028]\n", + " 70 => [0.006277500845425116,-3.802694347992476,0.06251589929767469]\n", + " 33 => [-0.02778798411401373,-0.5091869603980016,0.03538255963543149]\n", + " 252 => [-0.11915625386204923,-1.2182594899567352,-0.025975085489623087]\n", + " 114 => [-0.14643901527350212,-0.4628626545501056,-0.0057156433415159625]\n", + " 165 => [-0.07462160313837857,-4.426674712264929,-0.04391022455570823]\n", + " 96 => [0.0541064545893336,-5.057801826440659,-0.01669155772495867]\n", + " 133 => [0.01615115174975327,-3.140610327091724,0.028951801068022566]\n", + " ⋮ => ⋮" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nodaldisp = Dict()\n", + "for el in elements\n", + " for (i, nid) in enumerate(el.node_ids)\n", + " nodaldisp[nid] = el.attributes[\"displacement\"][:, i]\n", + " end\n", + "end\n", + "nodaldisp" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3x298 Array{Float64,2}:\n", + " -0.202475 -0.17437 0.0131267 -0.0340868 -0.0252162 0.0521758 … -0.054781 -0.169903 0.186936 0.102666 -0.0970747 -0.164397 0.0\n", + " -1.34204 -1.66404 -3.20587 -3.27673 -3.68732 -3.36789 -4.33822 -1.03943 -2.27466 -1.67467 -2.91213 -2.52353 0.0\n", + " 0.0211856 0.0324162 0.00213878 0.0377156 0.0683502 0.030081 -0.00684333 -0.035509 0.304867 0.26033 0.113802 0.152433 0.0" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "u = zeros(3, nnodes)\n", + "for (i, nid) in enumerate(node_ids)\n", + " u[:,i] = nodaldisp[nid]\n", + "end\n", + "u" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "true" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "JuliaFEM.xdmf.xdmf_new_field(grid, \"Displacement\", \"nodes\", u)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "28330" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "JuliaFEM.xdmf.xdmf_save_model(xdoc, \"/tmp/3d_solid_model.xmf\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } ], "metadata": { From 5181755ca50a9e5b4b3e16f4e4c5f2e32702db3d Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Thu, 13 Aug 2015 00:39:20 +0300 Subject: [PATCH 11/26] Updated shape functions. Let's calculate them. --- ...2015-06-25-elasticity-solver-example.ipynb | 485 +++++++++-------- notebooks/2015-06-25-shape-functions.ipynb | 486 ++++++++++++++++-- 2 files changed, 698 insertions(+), 273 deletions(-) diff --git a/notebooks/2015-06-25-elasticity-solver-example.ipynb b/notebooks/2015-06-25-elasticity-solver-example.ipynb index c4b82ae..361a2d5 100644 --- a/notebooks/2015-06-25-elasticity-solver-example.ipynb +++ b/notebooks/2015-06-25-elasticity-solver-example.ipynb @@ -50,6 +50,27 @@ "execution_count": 1, "metadata": {}, "output_type": "execute_result" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", + " in int32 at deprecated.jl:49\n", + " in recv at /Users/jukka/.julia/v0.4/ZMQ/src/ZMQ.jl:617\n", + " in recv_ipython at /Users/jukka/.julia/v0.4/IJulia/src/msg.jl:63\n", + " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:120\n", + " in anonymous at task.jl:365\n", + "while loading /Users/jukka/.julia/v0.4/IJulia/src/kernel.jl, in expression starting on line 35\n", + "WARNING: int32(x) is deprecated, use Int32(x) instead.\n", + " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", + " in int32 at deprecated.jl:49\n", + " in recv at /Users/jukka/.julia/v0.4/ZMQ/src/ZMQ.jl:617\n", + " in recv_ipython at /Users/jukka/.julia/v0.4/IJulia/src/msg.jl:63\n", + " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:120\n", + " in anonymous at task.jl:365\n", + "while loading /Users/jukka/.julia/v0.4/IJulia/src/kernel.jl, in expression starting on line 35\n" + ] } ], "source": [ @@ -73,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 2, "metadata": { "collapsed": false }, @@ -84,7 +105,7 @@ "calc_local_matrices! (generic function with 1 method)" ] }, - "execution_count": 18, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -218,7 +239,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 3, "metadata": { "collapsed": true }, @@ -229,7 +250,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 4, "metadata": { "collapsed": false, "scrolled": false @@ -246,17 +267,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "11-Aug 21:42:03:DEBUG:root:Converged in 6 iterations.\n", - "11-Aug 21:42:03:DEBUG:root:solution vector: \n", + "13-Aug 00:37:26:DEBUG:root:Converged in 6 iterations.\n", + "13-Aug 00:37:26:DEBUG:root:solution vector: \n", " [0.0 -0.3991450609547433 -0.07228582695592461 0.0\n", " 0.0 -2.1779892317073504 -2.222244754401764 0.0]\n", - "11-Aug 21:42:03:DEBUG:root:norm of u: 3.1292483947150047\n", - "11-Aug 21:42:03:DEBUG:root:Converged in 6 iterations.\n", - "11-Aug 21:42:03:DEBUG:root:solution vector: \n", + "13-Aug 00:37:26:DEBUG:root:norm of u: 3.1292483947150047\n", + "13-Aug 00:37:27:DEBUG:root:Converged in 6 iterations.\n", + "13-Aug 00:37:27:DEBUG:root:solution vector: \n", " [0.0 0.7433248532717796 1.048521014723486 0.0\n", " 0.0 -2.085766534304891 -1.9606633242166027 0.0]\n", - "11-Aug 21:42:03:DEBUG:root:norm of u: 3.1292483947150056\n", - "11-Aug 21:42:03:DEBUG:root:Iteration 1\n" + "13-Aug 00:37:27:DEBUG:root:norm of u: 3.1292483947150056\n", + "13-Aug 00:37:27:DEBUG:root:Iteration 1\n" ] }, { @@ -270,15 +291,38 @@ "name": "stderr", "output_type": "stream", "text": [ - "11-Aug 21:42:04:DEBUG:root:Norm of du: 0.5992228342549063\n", - "11-Aug 21:42:04:DEBUG:root:Element displacement: [0.0 -0.02264423092574128 0.022536491965822688 0.0\n", + "13-Aug 00:37:27:DEBUG:root:Norm of du: 0.5992228342549063\n", + "13-Aug 00:37:27:DEBUG:root:Element displacement: [0.0 -0.02264423092574128 0.022536491965822688 0.0\n", " 0.0 -0.12688379170176511 -0.12679760053383046 0.0]\n", - "11-Aug 21:42:04:DEBUG:root:Element displacement: [-0.02264423092574128 -0.029998807330416523 0.030242156525002267 0.022536491965822688\n", + "13-Aug 00:37:27:DEBUG:root:Element displacement: [-0.02264423092574128 -0.029998807330416523 0.030242156525002267 0.022536491965822688\n", " -0.12688379170176511 -0.4041002710283739 -0.40446733271991214 -0.12679760053383046]\n", - "11-Aug 21:42:04:DEBUG:root:solution vector: \n", + "13-Aug 00:37:27:DEBUG:root:solution vector: \n", " [-0.02264423092574128 -0.029998807330416523 0.022536491965822688 0.030242156525002267 0.0 0.0\n", " -0.12688379170176511 -0.4041002710283739 -0.12679760053383046 -0.40446733271991214 0.0 0.0]\n", - "11-Aug 21:42:04:DEBUG:root:norm of u: 0.5992228342549063\n" + "13-Aug 00:37:27:DEBUG:root:norm of u: 0.5992228342549063\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + ":\n", + " 132.8 0.0 23.6 -3.0 -113.6 … 23.6 3.0 -33.2 15.0\n", + " 0.0 324.8 3.0 77.6 0.0 -3.0 77.6 15.0 -81.2\n", + " 23.6 3.0 66.4 -15.0 -33.2 0.0 0.0 0.0 0.0\n", + " -3.0 77.6 -15.0 162.4 15.0 0.0 0.0 0.0 0.0\n", + " -113.6 0.0 -33.2 15.0 132.8 -33.2 -15.0 23.6 -3.0\n", + " 0.0 -317.6 15.0 -81.2 0.0 … -15.0 -81.2 3.0 77.6\n", + " -33.2 -15.0 -56.8 3.0 23.6 0.0 0.0 0.0 0.0\n", + " -15.0 -81.2 -3.0 -158.8 3.0 0.0 0.0 0.0 0.0\n", + " 23.6 -3.0 0.0 0.0 -33.2 66.4 15.0 -56.8 3.0\n", + " 3.0 77.6 0.0 0.0 -15.0 15.0 162.4 -3.0 -158.8\n", + " -33.2 15.0 0.0 0.0 23.6 … -56.8 -3.0 66.4 -15.0\n", + " 15.0 -81.2 0.0 0.0 -3.0 3.0 -158.8 -15.0 162.4\n", + "K norm = 708.0378644377365\n", + "du = [-0.02264423092574128 -0.029998807330416523 0.022536491965822688 0.030242156525002267 0.0 0.0\n", + " -0.12688379170176511 -0.4041002710283739 -0.12679760053383046 -0.40446733271991214 0.0 0.0]\n", + "Out of 3 total facts:" ] }, { @@ -287,34 +331,9 @@ "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 19, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - ":\n", - " 132.8 0.0 23.6 -3.0 -113.6 0.0 -33.2 -15.0 23.6 3.0 -33.2 15.0\n", - " 0.0 324.8 3.0 77.6 0.0 -317.6 -15.0 -81.2 -3.0 77.6 15.0 -81.2\n", - " 23.6 3.0 66.4 -15.0 -33.2 15.0 -56.8 -3.0 0.0 0.0 0.0 0.0\n", - " -3.0 77.6 -15.0 162.4 15.0 -81.2 3.0 -158.8 0.0 0.0 0.0 0.0\n", - " -113.6 0.0 -33.2 15.0 132.8 0.0 23.6 3.0 -33.2 -15.0 23.6 -3.0\n", - " 0.0 -317.6 15.0 -81.2 0.0 324.8 -3.0 77.6 -15.0 -81.2 3.0 77.6\n", - " -33.2 -15.0 -56.8 3.0 23.6 -3.0 66.4 15.0 0.0 0.0 0.0 0.0\n", - " -15.0 -81.2 -3.0 -158.8 3.0 77.6 15.0 162.4 0.0 0.0 0.0 0.0\n", - " 23.6 -3.0 0.0 0.0 -33.2 -15.0 0.0 0.0 66.4 15.0 -56.8 3.0\n", - " 3.0 77.6 0.0 0.0 -15.0 -81.2 0.0 0.0 15.0 162.4 -3.0 -158.8\n", - " -33.2 15.0 0.0 0.0 23.6 3.0 0.0 0.0 -56.8 -3.0 66.4 -15.0\n", - " 15.0 -81.2 0.0 0.0 -3.0 77.6 0.0 0.0 3.0 -158.8 -15.0 162.4\n", - "K norm = 708.0378644377365\n", - "du = [-0.02264423092574128 -0.029998807330416523 0.022536491965822688 0.030242156525002267 0.0 0.0\n", - " -0.12688379170176511 -0.4041002710283739 -0.12679760053383046 -0.40446733271991214 0.0 0.0]\n", - "Out of 3 total facts:\n", - " Verified: 2\n", - " Pending: 1\n" - ] } ], "source": [ @@ -473,7 +492,17 @@ "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " Verified: 2\n", + " Pending: 1\n" + ] + } + ], "source": [ "type Assembly\n", " # LHS\n", @@ -533,28 +562,30 @@ " -(1+xi[2])/4.0 (1-xi[1])/4.0]\n", " return basis, dbasis\n", " elseif (nnodes == 10) & (ndim == 3)\n", - " basis(xi) = [(xi[1] + xi[2] + xi[3] - 1)*(2*xi[1] + 2*xi[2] + 2*xi[3] - 1)\n", - " -xi[1]*(-2*xi[1] + 1)\n", - " -xi[2]*(-2*xi[2] + 1)\n", - " -xi[3]*(-2*xi[3] + 1)\n", - " 4*xi[1]*(-xi[1] - xi[2] - xi[3] + 1)\n", - " 4*xi[1]*xi[2]\n", - " 4*xi[2]*(-xi[1] - xi[2] - xi[3] + 1)\n", - " 4*xi[1]*xi[3]\n", - " 4*xi[2]*xi[3]\n", - " 4*xi[3]*(-xi[1] - xi[2] - xi[3] + 1)]\n", - "\n", + " basis(xi) = [\n", + " (xi[1] + xi[2] + xi[3] - 1)*(2*xi[1] + 2*xi[2] + 2*xi[3] - 1)\n", + " xi[1]*(2*xi[1] - 1)\n", + " xi[2]*(2*xi[2] - 1)\n", + " xi[3]*(2*xi[3] - 1)\n", + " -4*xi[1]*(xi[1] + xi[2] + xi[3] - 1)\n", + " 4*xi[1]*xi[2]\n", + " -4*xi[2]*(xi[1] + xi[2] + xi[3] - 1)\n", + " -4*xi[3]*(xi[1] + xi[2] + xi[3] - 1)\n", + " 4*xi[1]*xi[3]\n", + " 4*xi[2]*xi[3]\n", + " ]\n", " dbasis(xi) = [\n", - " 4*xi[1] + 4*xi[2] + 4*xi[3] - 3 4*xi[1] + 4*xi[2] + 4*xi[3] - 3 4*xi[1] + 4*xi[2] + 4*xi[3] - 3\n", - " 4*xi[1] - 1 0 0\n", - " 0 4*xi[2] - 1 0\n", - " 0 0 4*xi[3] - 1\n", - " -8*xi[1] - 4*xi[2] - 4*xi[3] + 4 -4*xi[1] -4*xi[1]\n", - " 4*xi[2] 4*xi[1] 0\n", - " -4*xi[2] -4*xi[1] - 8*xi[2] - 4*xi[3] + 4 -4*xi[2]\n", - " 4*xi[3] 0 4*xi[1]\n", - " 0 4*xi[3] 4*xi[2]\n", - " -4*xi[3] -4*xi[3] -4*xi[1] - 4*xi[2] - 8*xi[3] + 4]\n", + " 4*xi[1] + 4*xi[2] + 4*xi[3] - 3 4*xi[1] + 4*xi[2] + 4*xi[3] - 3 4*xi[1] + 4*xi[2] + 4*xi[3] - 3\n", + " 4*xi[1] - 1 0 0\n", + " 0 4*xi[2] - 1 0\n", + " 0 0 4*xi[3] - 1\n", + " -4*(2*xi[1] + xi[2] + xi[3] - 1) -4*xi[1] -4*xi[1]\n", + " 4*xi[2] 4*xi[1] 0\n", + " -4*xi[2] -4*(xi[1] + 2*xi[2] + xi[3] - 1) -4*xi[2]\n", + " -4*xi[3] -4*xi[3] -4*(xi[1] + xi[2] + 2*xi[3] - 1)\n", + " 4*xi[3] 0 4*xi[1]\n", + " 0 4*xi[3] 4*xi[2]\n", + " ]\n", " return basis, dbasis\n", " end\n", " throw(\"Unknown function space, ndim=$ndim, nnodes=$nnodes\")\n", @@ -668,28 +699,28 @@ "name": "stderr", "output_type": "stream", "text": [ - "11-Aug 21:39:42:DEBUG:root:Adding nodes to array\n", - "11-Aug 21:39:42:DEBUG:root:Creating elements\n", - "11-Aug 21:39:42:DEBUG:root:Starting iteration 1\n", - "11-Aug 21:39:42:DEBUG:root:Assembling\n", - "11-Aug 21:39:42:DEBUG:root:Solution norm = 3.090022136728999\n", - "11-Aug 21:39:42:DEBUG:root:Starting iteration 2\n", - "11-Aug 21:39:42:DEBUG:root:Assembling\n", - "11-Aug 21:39:43:DEBUG:root:Solution norm = 0.32121316021535135\n", - "11-Aug 21:39:43:DEBUG:root:Starting iteration 3\n", - "11-Aug 21:39:43:DEBUG:root:Assembling\n", - "11-Aug 21:39:43:DEBUG:root:Solution norm = 0.040431781939994194\n", - "11-Aug 21:39:43:DEBUG:root:Starting iteration 4\n", - "11-Aug 21:39:43:DEBUG:root:Assembling\n", - "11-Aug 21:39:43:DEBUG:root:Solution norm = 0.0009291101052124042\n", - "11-Aug 21:39:43:DEBUG:root:Starting iteration 5\n", - "11-Aug 21:39:43:DEBUG:root:Assembling\n", - "11-Aug 21:39:43:DEBUG:root:Solution norm = 1.5638899022213175e-7\n", - "11-Aug 21:39:43:DEBUG:root:Starting iteration 6\n", - "11-Aug 21:39:43:DEBUG:root:Assembling\n", - "11-Aug 21:39:43:DEBUG:root:Solution norm = 1.0118539067290854e-14\n", - "11-Aug 21:39:43:DEBUG:root:Converged in 6 iterations.\n", - "11-Aug 21:39:43:DEBUG:root:Displacement of element = \n", + "13-Aug 00:37:30:DEBUG:root:Adding nodes to array\n", + "13-Aug 00:37:30:DEBUG:root:Creating elements\n", + "13-Aug 00:37:30:DEBUG:root:Starting iteration 1\n", + "13-Aug 00:37:30:DEBUG:root:Assembling\n", + "13-Aug 00:37:30:DEBUG:root:Solution norm = 3.090022136728999\n", + "13-Aug 00:37:30:DEBUG:root:Starting iteration 2\n", + "13-Aug 00:37:30:DEBUG:root:Assembling\n", + "13-Aug 00:37:30:DEBUG:root:Solution norm = 0.32121316021535135\n", + "13-Aug 00:37:30:DEBUG:root:Starting iteration 3\n", + "13-Aug 00:37:30:DEBUG:root:Assembling\n", + "13-Aug 00:37:30:DEBUG:root:Solution norm = 0.040431781939994194\n", + "13-Aug 00:37:30:DEBUG:root:Starting iteration 4\n", + "13-Aug 00:37:30:DEBUG:root:Assembling\n", + "13-Aug 00:37:30:DEBUG:root:Solution norm = 0.0009291101052124042\n", + "13-Aug 00:37:30:DEBUG:root:Starting iteration 5\n", + "13-Aug 00:37:30:DEBUG:root:Assembling\n", + "13-Aug 00:37:30:DEBUG:root:Solution norm = 1.5638899022213175e-7\n", + "13-Aug 00:37:30:DEBUG:root:Starting iteration 6\n", + "13-Aug 00:37:30:DEBUG:root:Assembling\n", + "13-Aug 00:37:30:DEBUG:root:Solution norm = 1.0118539067290854e-14\n", + "13-Aug 00:37:30:DEBUG:root:Converged in 6 iterations.\n", + "13-Aug 00:37:30:DEBUG:root:Displacement of element = \n", "[-0.39914506095474334 -0.0722858269559246 0.0 0.0\n", " -2.1779892317073504 -2.2222447544017645 0.0 0.0]\n" ] @@ -813,48 +844,48 @@ "name": "stderr", "output_type": "stream", "text": [ - "11-Aug 21:39:49:DEBUG:root:Creating elements\n", - "11-Aug 21:39:49:INFO:root:create_ldof2gdofmap: dofs per node: 2\n", - "11-Aug 21:39:49:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],5=>[9,10],6=>[11,12],1=>[1,2])\n", - "11-Aug 21:39:50:INFO:root:solve!: dofs per node: 2\n", - "11-Aug 21:39:50:DEBUG:root:Problem size = 12\n", - "11-Aug 21:39:50:DEBUG:root:Starting iteration 1\n", - "11-Aug 21:39:50:DEBUG:root:Assembling\n", - "11-Aug 21:39:50:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "11-Aug 21:39:50:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "11-Aug 21:39:50:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 21:39:50:DEBUG:root:Solving system of equations. Total size = 16\n", - "11-Aug 21:39:51:DEBUG:root:Solution norm du = 0.6015838690633517\n", - "11-Aug 21:39:51:DEBUG:root:Starting iteration 2\n", - "11-Aug 21:39:51:DEBUG:root:Assembling\n", - "11-Aug 21:39:51:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "11-Aug 21:39:51:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "11-Aug 21:39:51:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 21:39:51:DEBUG:root:Solving system of equations. Total size = 16\n", - "11-Aug 21:39:51:DEBUG:root:Solution norm du = 0.013420417380980414\n", - "11-Aug 21:39:51:DEBUG:root:Starting iteration 3\n", - "11-Aug 21:39:51:DEBUG:root:Assembling\n", - "11-Aug 21:39:51:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "11-Aug 21:39:51:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "11-Aug 21:39:51:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 21:39:51:DEBUG:root:Solving system of equations. Total size = 16\n", - "11-Aug 21:39:51:DEBUG:root:Solution norm du = 0.00032202957936854873\n", - "11-Aug 21:39:51:DEBUG:root:Starting iteration 4\n", - "11-Aug 21:39:51:DEBUG:root:Assembling\n", - "11-Aug 21:39:51:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "11-Aug 21:39:51:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "11-Aug 21:39:51:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 21:39:51:DEBUG:root:Solving system of equations. Total size = 16\n", - "11-Aug 21:39:51:DEBUG:root:Solution norm du = 9.906677094801476e-8\n", - "11-Aug 21:39:51:DEBUG:root:Starting iteration 5\n", - "11-Aug 21:39:51:DEBUG:root:Assembling\n", - "11-Aug 21:39:51:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "11-Aug 21:39:51:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "11-Aug 21:39:51:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 21:39:51:DEBUG:root:Solving system of equations. Total size = 16\n", - "11-Aug 21:39:51:DEBUG:root:Solution norm du = 5.027624635820698e-15\n", - "11-Aug 21:39:51:DEBUG:root:Converged in 5 iterations.\n", - "11-Aug 21:39:51:DEBUG:root:Displacement of element = \n", + "13-Aug 00:37:31:DEBUG:root:Creating elements\n", + "13-Aug 00:37:31:INFO:root:create_ldof2gdofmap: dofs per node: 2\n", + "13-Aug 00:37:31:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],5=>[9,10],6=>[11,12],1=>[1,2])\n", + "13-Aug 00:37:32:INFO:root:solve!: dofs per node: 2\n", + "13-Aug 00:37:32:DEBUG:root:Problem size = 12\n", + "13-Aug 00:37:32:DEBUG:root:Starting iteration 1\n", + "13-Aug 00:37:32:DEBUG:root:Assembling\n", + "13-Aug 00:37:32:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "13-Aug 00:37:32:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "13-Aug 00:37:32:DEBUG:root:Adding Neumann boundary conditions\n", + "13-Aug 00:37:32:DEBUG:root:Solving system of equations. Total size = 16\n", + "13-Aug 00:37:32:DEBUG:root:Solution norm du = 0.6015838690633517\n", + "13-Aug 00:37:32:DEBUG:root:Starting iteration 2\n", + "13-Aug 00:37:32:DEBUG:root:Assembling\n", + "13-Aug 00:37:32:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "13-Aug 00:37:32:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "13-Aug 00:37:32:DEBUG:root:Adding Neumann boundary conditions\n", + "13-Aug 00:37:32:DEBUG:root:Solving system of equations. Total size = 16\n", + "13-Aug 00:37:32:DEBUG:root:Solution norm du = 0.013420417380980414\n", + "13-Aug 00:37:33:DEBUG:root:Starting iteration 3\n", + "13-Aug 00:37:33:DEBUG:root:Assembling\n", + "13-Aug 00:37:33:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "13-Aug 00:37:33:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "13-Aug 00:37:33:DEBUG:root:Adding Neumann boundary conditions\n", + "13-Aug 00:37:33:DEBUG:root:Solving system of equations. Total size = 16\n", + "13-Aug 00:37:33:DEBUG:root:Solution norm du = 0.00032202957936854873\n", + "13-Aug 00:37:33:DEBUG:root:Starting iteration 4\n", + "13-Aug 00:37:33:DEBUG:root:Assembling\n", + "13-Aug 00:37:33:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "13-Aug 00:37:33:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "13-Aug 00:37:33:DEBUG:root:Adding Neumann boundary conditions\n", + "13-Aug 00:37:33:DEBUG:root:Solving system of equations. Total size = 16\n", + "13-Aug 00:37:33:DEBUG:root:Solution norm du = 9.906677094801476e-8\n", + "13-Aug 00:37:33:DEBUG:root:Starting iteration 5\n", + "13-Aug 00:37:33:DEBUG:root:Assembling\n", + "13-Aug 00:37:33:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "13-Aug 00:37:33:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "13-Aug 00:37:33:DEBUG:root:Adding Neumann boundary conditions\n", + "13-Aug 00:37:33:DEBUG:root:Solving system of equations. Total size = 16\n", + "13-Aug 00:37:33:DEBUG:root:Solution norm du = 5.027624635820698e-15\n", + "13-Aug 00:37:33:DEBUG:root:Converged in 5 iterations.\n", + "13-Aug 00:37:33:DEBUG:root:Displacement of element = \n", "[-0.02442313597467864 -0.039356000063335075 0.021097993207232584 0.020877031423993653\n", " -0.12673626841485705 -0.40433021969759375 -0.40656320177872923 -0.1275776940913048]\n" ] @@ -1105,7 +1136,7 @@ "\n", "WARNING: deprecated syntax \"{a=>b, ...}\" at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:32.\n", "Use \"Dict{Any,Any}(a=>b, ...)\" instead.\n", - "11-Aug 21:40:01:INFO:root:Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\"]\n", + "13-Aug 00:37:37:INFO:root:Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\"]\n", "WARNING: beginswith is deprecated, use startswith instead.\n", " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", " in beginswith at deprecated.jl:30\n", @@ -1124,8 +1155,8 @@ " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", " in anonymous at task.jl:365\n", "while loading In[13], in expression starting on line 3\n", - "11-Aug 21:40:01:DEBUG:root:Found NODE section\n", - "11-Aug 21:40:01:DEBUG:root:Found ELEMENT section\n", + "13-Aug 00:37:38:DEBUG:root:Found NODE section\n", + "13-Aug 00:37:38:DEBUG:root:Found ELEMENT section\n", "WARNING: integer(s::AbstractString) is deprecated, use parse(Int,s) instead.\n", " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", " in integer at deprecated.jl:49\n", @@ -1138,14 +1169,14 @@ " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", " in anonymous at task.jl:365\n", "while loading In[13], in expression starting on line 3\n", - "11-Aug 21:40:03:DEBUG:root:120 elements found\n", - "11-Aug 21:40:03:INFO:root:Creating ELSET Body1\n", - "11-Aug 21:40:03:DEBUG:root:Found NSET section\n", - "11-Aug 21:40:03:DEBUG:root:Creating node set SUPPORT\n", - "11-Aug 21:40:03:DEBUG:root:Found NSET section\n", - "11-Aug 21:40:03:DEBUG:root:Creating node set LOAD\n", - "11-Aug 21:40:03:DEBUG:root:Found NSET section\n", - "11-Aug 21:40:03:DEBUG:root:Creating node set TOP\n" + "13-Aug 00:37:39:DEBUG:root:120 elements found\n", + "13-Aug 00:37:40:INFO:root:Creating ELSET Body1\n", + "13-Aug 00:37:40:DEBUG:root:Found NSET section\n", + "13-Aug 00:37:40:DEBUG:root:Creating node set SUPPORT\n", + "13-Aug 00:37:40:DEBUG:root:Found NSET section\n", + "13-Aug 00:37:40:DEBUG:root:Creating node set LOAD\n", + "13-Aug 00:37:40:DEBUG:root:Found NSET section\n", + "13-Aug 00:37:40:DEBUG:root:Creating node set TOP\n" ] }, { @@ -1173,7 +1204,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 14, "metadata": { "collapsed": false, "scrolled": false @@ -1183,47 +1214,47 @@ "name": "stderr", "output_type": "stream", "text": [ - "11-Aug 22:15:29:DEBUG:root:Creating elements\n", - "11-Aug 22:15:29:INFO:root:create_ldof2gdofmap: dofs per node: 3\n", - "11-Aug 22:15:29:INFO:root:solve!: dofs per node: 3\n", - "11-Aug 22:15:29:DEBUG:root:Problem size = 894\n", - "11-Aug 22:15:29:DEBUG:root:Starting iteration 1\n", - "11-Aug 22:15:29:DEBUG:root:Assembling\n", - "11-Aug 22:15:30:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "11-Aug 22:15:30:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "11-Aug 22:15:30:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 22:15:30:DEBUG:root:Solving system of equations. Total size = 921\n", - "11-Aug 22:15:30:DEBUG:root:Solution norm du = 72.87727091053921\n", - "11-Aug 22:15:30:DEBUG:root:Starting iteration 2\n", - "11-Aug 22:15:31:DEBUG:root:Assembling\n", - "11-Aug 22:15:32:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "11-Aug 22:15:32:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "11-Aug 22:15:32:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 22:15:32:DEBUG:root:Solving system of equations. Total size = 921\n", - "11-Aug 22:15:32:DEBUG:root:Solution norm du = 2.737285770100854\n", - "11-Aug 22:15:32:DEBUG:root:Starting iteration 3\n", - "11-Aug 22:15:32:DEBUG:root:Assembling\n", - "11-Aug 22:15:33:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "11-Aug 22:15:34:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "11-Aug 22:15:34:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 22:15:34:DEBUG:root:Solving system of equations. Total size = 921\n", - "11-Aug 22:15:34:DEBUG:root:Solution norm du = 0.07997112801214978\n", - "11-Aug 22:15:34:DEBUG:root:Starting iteration 4\n", - "11-Aug 22:15:34:DEBUG:root:Assembling\n", - "11-Aug 22:15:35:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "11-Aug 22:15:35:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "11-Aug 22:15:35:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 22:15:35:DEBUG:root:Solving system of equations. Total size = 921\n", - "11-Aug 22:15:35:DEBUG:root:Solution norm du = 6.406557430235748e-5\n", - "11-Aug 22:15:35:DEBUG:root:Starting iteration 5\n", - "11-Aug 22:15:35:DEBUG:root:Assembling\n", - "11-Aug 22:15:37:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "11-Aug 22:15:37:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "11-Aug 22:15:37:DEBUG:root:Adding Neumann boundary conditions\n", - "11-Aug 22:15:37:DEBUG:root:Solving system of equations. Total size = 921\n", - "11-Aug 22:15:37:DEBUG:root:Solution norm du = 6.870072007793185e-11\n", - "11-Aug 22:15:37:DEBUG:root:Converged in 5 iterations.\n", - "11-Aug 22:15:37:INFO:root:Maximum absolute displacement in y direction: 6.9925206227884695\n" + "13-Aug 00:37:41:DEBUG:root:Creating elements\n", + "13-Aug 00:37:41:INFO:root:create_ldof2gdofmap: dofs per node: 3\n", + "13-Aug 00:37:41:INFO:root:solve!: dofs per node: 3\n", + "13-Aug 00:37:41:DEBUG:root:Problem size = 894\n", + "13-Aug 00:37:41:DEBUG:root:Starting iteration 1\n", + "13-Aug 00:37:41:DEBUG:root:Assembling\n", + "13-Aug 00:37:43:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "13-Aug 00:37:43:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "13-Aug 00:37:43:DEBUG:root:Adding Neumann boundary conditions\n", + "13-Aug 00:37:43:DEBUG:root:Solving system of equations. Total size = 921\n", + "13-Aug 00:37:43:DEBUG:root:Solution norm du = 54.19642700242575\n", + "13-Aug 00:37:43:DEBUG:root:Starting iteration 2\n", + "13-Aug 00:37:43:DEBUG:root:Assembling\n", + "13-Aug 00:37:45:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "13-Aug 00:37:45:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "13-Aug 00:37:45:DEBUG:root:Adding Neumann boundary conditions\n", + "13-Aug 00:37:45:DEBUG:root:Solving system of equations. Total size = 921\n", + "13-Aug 00:37:45:DEBUG:root:Solution norm du = 1.68729144400063\n", + "13-Aug 00:37:45:DEBUG:root:Starting iteration 3\n", + "13-Aug 00:37:45:DEBUG:root:Assembling\n", + "13-Aug 00:37:47:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "13-Aug 00:37:47:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "13-Aug 00:37:47:DEBUG:root:Adding Neumann boundary conditions\n", + "13-Aug 00:37:47:DEBUG:root:Solving system of equations. Total size = 921\n", + "13-Aug 00:37:47:DEBUG:root:Solution norm du = 0.04175080278208098\n", + "13-Aug 00:37:47:DEBUG:root:Starting iteration 4\n", + "13-Aug 00:37:47:DEBUG:root:Assembling\n", + "13-Aug 00:37:48:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "13-Aug 00:37:48:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "13-Aug 00:37:48:DEBUG:root:Adding Neumann boundary conditions\n", + "13-Aug 00:37:48:DEBUG:root:Solving system of equations. Total size = 921\n", + "13-Aug 00:37:49:DEBUG:root:Solution norm du = 2.4176157836844963e-5\n", + "13-Aug 00:37:49:DEBUG:root:Starting iteration 5\n", + "13-Aug 00:37:49:DEBUG:root:Assembling\n", + "13-Aug 00:37:50:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "13-Aug 00:37:50:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "13-Aug 00:37:50:DEBUG:root:Adding Neumann boundary conditions\n", + "13-Aug 00:37:50:DEBUG:root:Solving system of equations. Total size = 921\n", + "13-Aug 00:37:50:DEBUG:root:Solution norm du = 1.4448231751500831e-11\n", + "13-Aug 00:37:50:DEBUG:root:Converged in 5 iterations.\n", + "13-Aug 00:37:50:INFO:root:Maximum absolute displacement in y direction: 5.245400568184194\n" ] } ], @@ -1294,7 +1325,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 15, "metadata": { "collapsed": false }, @@ -1307,7 +1338,7 @@ "\n" ] }, - "execution_count": 49, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -1327,7 +1358,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 16, "metadata": { "collapsed": false }, @@ -1336,8 +1367,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "11-Aug 22:38:28:INFO:root:Number of nodes in model: 298\n", - "11-Aug 22:38:28:INFO:root:Number of elements in model: 120\n" + "13-Aug 00:37:51:INFO:root:Number of nodes in model: 298\n", + "13-Aug 00:37:51:INFO:root:Number of elements in model: 120\n" ] } ], @@ -1365,7 +1396,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 17, "metadata": { "collapsed": false }, @@ -1376,7 +1407,7 @@ "true" ] }, - "execution_count": 51, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -1429,7 +1460,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 18, "metadata": { "collapsed": false }, @@ -1440,7 +1471,7 @@ "10435" ] }, - "execution_count": 52, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -1458,7 +1489,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 19, "metadata": { "collapsed": false }, @@ -1467,35 +1498,35 @@ "data": { "text/plain": [ "Dict{Any,Any} with 298 entries:\n", - " 288 => [-0.21784897897079505,-6.64256844921929,0.18339325827190953]\n", - " 11 => [-0.17342410820059667,-6.343125806991628,0.17544367431766225]\n", - " 158 => [-0.0007723334905839533,-0.2321904799732306,-0.03883691791045858]\n", - " 215 => [-0.03299227384130259,-4.2236276356937505,-0.0017757488281830807]\n", - " 134 => [-0.06336705102703495,-3.3332586850719337,0.06555932581531249]\n", - " 160 => [0.03205303832663507,-0.536361456950779,-0.07291283371223893]\n", - " 29 => [-0.01620524134284992,-0.19455583841608232,-0.03838421619811468]\n", - " 131 => [0.04015396763870081,-3.5101776818531523,0.10045744211179368]\n", - " 249 => [-0.2491004521409732,-6.570813533283954,0.06837890174506163]\n", - " 207 => [0.03974407267311282,-3.48588780058722,0.007971846403163977]\n", - " 173 => [-0.04472757590353555,-4.582185697159958,-0.04434348606400347]\n", - " 289 => [-0.16494613158592017,-6.360857515886982,0.33435404817411213]\n", - " 74 => [-0.03449870789750817,-3.947284664599636,0.0692691027146262]\n", - " 201 => [-0.00128347996939122,-3.8527236749372054,0.054216444201382656]\n", - " 176 => [-0.004729440266412542,-3.132546258410676,0.0036604388995965386]\n", - " 57 => [-0.021453552968802154,-4.134921994863808,0.04888988010136468]\n", - " 31 => [-0.005045439296021616,-0.3424143474221696,-0.0365148544462663]\n", - " 285 => [-0.19371941654927557,-6.446502168659889,0.18022053743770028]\n", - " 70 => [0.006277500845425116,-3.802694347992476,0.06251589929767469]\n", - " 33 => [-0.02778798411401373,-0.5091869603980016,0.03538255963543149]\n", - " 252 => [-0.11915625386204923,-1.2182594899567352,-0.025975085489623087]\n", - " 114 => [-0.14643901527350212,-0.4628626545501056,-0.0057156433415159625]\n", - " 165 => [-0.07462160313837857,-4.426674712264929,-0.04391022455570823]\n", - " 96 => [0.0541064545893336,-5.057801826440659,-0.01669155772495867]\n", - " 133 => [0.01615115174975327,-3.140610327091724,0.028951801068022566]\n", + " 288 => [-0.11672879201601734,-4.945796660856531,0.34641446977739976]\n", + " 11 => [-0.10351195894967631,-4.756564623966246,0.3419475317395125]\n", + " 158 => [-0.004781967238459207,-0.15800625216143013,-0.03641750463465448]\n", + " 215 => [-0.009679264390442352,-3.1283115653077243,0.1060066992444004]\n", + " 134 => [-0.012153531002752209,-2.568061461984137,0.1358780416251414]\n", + " 160 => [0.045841800099574996,-0.3952996715282528,-0.04337647899598485]\n", + " 29 => [-0.019610173840903154,-0.13106872577808154,-0.04187494739380516]\n", + " 131 => [0.04911611452200464,-2.5861023637514955,0.15290704689462717]\n", + " 249 => [-0.18589774363886435,-4.932931637644884,0.27789363131184]\n", + " 207 => [0.05588675730587902,-2.563471323701039,0.0669746466494972]\n", + " 173 => [-0.017826777186855432,-3.4323824666471117,0.08923268461041232]\n", + " 289 => [-0.08168560138254058,-4.782381469728047,0.4566974667444831]\n", + " 74 => [-0.013759506382279562,-2.9054222587693794,0.1389413161160111]\n", + " 201 => [0.006183182231407451,-2.8511450493652664,0.14659955727801022]\n", + " 176 => [0.04229935999959756,-2.349387641785469,0.09405299762367403]\n", + " 57 => [-0.0022029054234204426,-3.062804411311773,0.14846103116563106]\n", + " 31 => [0.005313697788644969,-0.25237461591643895,-0.030307540603490793]\n", + " 285 => [-0.10859185872935265,-4.832314881155342,0.35832378735042353]\n", + " 70 => [0.042811232565748765,-2.7950866978216338,0.1421452814276251]\n", + " 33 => [-0.016450709743293015,-0.379272230318473,0.027549328283933208]\n", + " 252 => [-0.14470395638682446,-0.9284887677850233,0.043594035381458736]\n", + " 114 => [-0.14842327883584733,-0.3532980011491899,-0.018641651848308006]\n", + " 165 => [-0.04346921888336824,-3.2745129973662452,0.07316785266950793]\n", + " 96 => [0.1501458469524447,-3.8471140528652787,0.1489845291162686]\n", + " 133 => [0.09045793517058681,-2.3950191788705957,0.12799724500423504]\n", " ⋮ => ⋮" ] }, - "execution_count": 53, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -1512,7 +1543,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 20, "metadata": { "collapsed": false }, @@ -1521,12 +1552,12 @@ "data": { "text/plain": [ "3x298 Array{Float64,2}:\n", - " -0.202475 -0.17437 0.0131267 -0.0340868 -0.0252162 0.0521758 … -0.054781 -0.169903 0.186936 0.102666 -0.0970747 -0.164397 0.0\n", - " -1.34204 -1.66404 -3.20587 -3.27673 -3.68732 -3.36789 -4.33822 -1.03943 -2.27466 -1.67467 -2.91213 -2.52353 0.0\n", - " 0.0211856 0.0324162 0.00213878 0.0377156 0.0683502 0.030081 -0.00684333 -0.035509 0.304867 0.26033 0.113802 0.152433 0.0" + " -0.174259 -0.175081 0.0359566 0.0279021 0.00925611 0.0379208 … -0.0248959 -0.116472 0.191156 0.193018 -0.0153311 -0.123282 0.0\n", + " -0.978534 -1.32327 -2.42646 -2.50175 -2.72095 -2.59357 -3.20696 -0.707364 -1.76025 -1.33439 -2.22191 -1.93398 0.0\n", + " 0.0535874 0.111758 0.125464 0.115461 0.145374 0.1251 0.0902774 0.00418633 0.368958 0.387435 0.185441 0.230546 0.0" ] }, - "execution_count": 54, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -1541,7 +1572,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 21, "metadata": { "collapsed": false }, @@ -1552,7 +1583,7 @@ "true" ] }, - "execution_count": 55, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -1563,7 +1594,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 22, "metadata": { "collapsed": false }, @@ -1571,10 +1602,10 @@ { "data": { "text/plain": [ - "28330" + "28215" ] }, - "execution_count": 56, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } diff --git a/notebooks/2015-06-25-shape-functions.ipynb b/notebooks/2015-06-25-shape-functions.ipynb index 6b87a27..3113e17 100644 --- a/notebooks/2015-06-25-shape-functions.ipynb +++ b/notebooks/2015-06-25-shape-functions.ipynb @@ -1,5 +1,16 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Shape function and integration points\n", + "\n", + "Author(s): Jukka Aho\n", + "\n", + "**Abstract**: Shape functions and element descriptions used in JuliaFEM." + ] + }, { "cell_type": "code", "execution_count": 1, @@ -8,18 +19,325 @@ }, "outputs": [], "source": [ - "from sympy import *" + "from sympy import *\n", + "#init_printing()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ - "xi = DeferredVector(\"xi\")" + "xi = DeferredVector(r\"xi\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1D shape function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Linear 2-node segment (Lagrange family)\n", + "\n", + "| | $\\xi_1$ |\n", + "| ----- | -------:|\n", + "| $N_1$ | -1 |\n", + "| $N_2$ | 1 |\n", + "\n", + "\\begin{equation}\n", + " \\left(\\mathbf{P}\\boldsymbol{\\alpha}\\right)\\left(\\xi_1\\right) = \\alpha_{1}+\\alpha_{2}\\xi_{1}\n", + "\\end{equation}" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(Matrix([\n", + " [-xi[1]/2 + 1/2],\n", + " [ xi[1]/2 + 1/2]]), Matrix([\n", + " [-1/2],\n", + " [ 1/2]]))" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = Matrix([[1, -1], [1, 1]])\n", + "P = Matrix([1, xi[1]]).T\n", + "N = (P*A.inv()).T\n", + "dN = Matrix([N.diff(xi[1]).T]).T\n", + "N, dN" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Quadratic 3-node segment (Lagrange family)\n", + "\n", + "| | $\\xi_1$ |\n", + "| ----- | -------:|\n", + "| $N_1$ | -1 |\n", + "| $N_2$ | 1 |\n", + "| $N_3$ | 0 |\n", + "\n", + "\\begin{equation}\n", + " \\left(\\mathbf{P}\\boldsymbol{\\alpha}\\right)\\left(\\xi_1\\right) = \\alpha_1 + \\alpha_2\\xi_1 + \\alpha_3\\xi_1^2\n", + "\\end{equation}" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(Matrix([\n", + " [xi[1]**2/2 - xi[1]/2],\n", + " [xi[1]**2/2 + xi[1]/2],\n", + " [ -xi[1]**2 + 1]]), Matrix([\n", + " [xi[1] - 1/2],\n", + " [xi[1] + 1/2],\n", + " [ -2*xi[1]]]))" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = Matrix([[1, -1, (-1)**2],\n", + " [1, 1, 1**2],\n", + " [1, 0, 0**2]])\n", + "P = Matrix([1, xi[1], xi[1]**2]).T\n", + "N = (P*A.inv()).T\n", + "dN = Matrix([N.diff(xi[1]).T]).T\n", + "N, dN" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### P-elements" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2D shape functions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Linear triangle\n", + "\n", + "| | $\\xi_1$ | $\\xi_2$ |\n", + "| ----- | -------:| -------:|\n", + "| $N_1$ | 0 | 0 |\n", + "| $N_2$ | 1 | 0 |\n", + "| $N_3$ | 0 | 1 |" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(Matrix([\n", + " [-xi[1] - xi[2] + 1],\n", + " [ xi[1]],\n", + " [ xi[2]]]), Matrix([\n", + " [-1, -1],\n", + " [ 1, 0],\n", + " [ 0, 1]]))" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = Matrix([[1, 0, 0], [1, 1, 0], [1, 0, 1]])\n", + "P = Matrix([1, xi[1], xi[2]]).T\n", + "N = (P*A.inv()).T\n", + "dN = Matrix([N.diff(xi[1]).T, N.diff(xi[2]).T]).T\n", + "N, dN" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Quadratic triangle\n", + "\n", + "| | $\\xi_1$ | $\\xi_2$ |\n", + "| ----- | -------:| -------:|\n", + "| $N_1$ | 0 | 0 |\n", + "| $N_2$ | 1 | 0 |\n", + "| $N_3$ | 0 | 1 |\n", + "| $N_4$ | 1/2 | 0 |\n", + "| $N_5$ | 1/2 | 1/2 |\n", + "| $N_6$ | 0 | 1/2 |" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Matrix([\n", + "[1, 0, 0, 0, 0, 0],\n", + "[1, 1, 0, 1, 0, 0],\n", + "[1, 0, 1, 0, 1, 0],\n", + "[1, 1/2, 0, 1/4, 0, 0],\n", + "[1, 1/2, 1/2, 1/4, 1/4, 1/4],\n", + "[1, 0, 1/2, 0, 1/4, 0]])" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "P = Matrix([1, xi[1], xi[2], xi[1]**2, xi[2]**2, xi[1]*xi[2]]).T\n", + "A = Matrix([\n", + " P.subs({xi[1]: 0, xi[2]: 0}),\n", + " P.subs({xi[1]: 1, xi[2]: 0}),\n", + " P.subs({xi[1]: 0, xi[2]: 1}),\n", + " P.subs({xi[1]: Rational(1,2), xi[2]: 0}),\n", + " P.subs({xi[1]: Rational(1,2), xi[2]: Rational(1,2)}),\n", + " P.subs({xi[1]: 0, xi[2]: Rational(1,2)}),\n", + " ])\n", + "A" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(Matrix([\n", + " [2*xi[1]**2 + 4*xi[1]*xi[2] - 3*xi[1] + 2*xi[2]**2 - 3*xi[2] + 1],\n", + " [ 2*xi[1]**2 - xi[1]],\n", + " [ 2*xi[2]**2 - xi[2]],\n", + " [ -4*xi[1]**2 - 4*xi[1]*xi[2] + 4*xi[1]],\n", + " [ 4*xi[1]*xi[2]],\n", + " [ -4*xi[1]*xi[2] - 4*xi[2]**2 + 4*xi[2]]]), Matrix([\n", + " [ 4*xi[1] + 4*xi[2] - 3, 4*xi[1] + 4*xi[2] - 3],\n", + " [ 4*xi[1] - 1, 0],\n", + " [ 0, 4*xi[2] - 1],\n", + " [-8*xi[1] - 4*xi[2] + 4, -4*xi[1]],\n", + " [ 4*xi[2], 4*xi[1]],\n", + " [ -4*xi[2], -4*xi[1] - 8*xi[2] + 4]]))" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "N = (P*A.inv()).T\n", + "dN = Matrix([N.diff(xi[1]).T, N.diff(xi[2]).T]).T\n", + "N, dN" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3D shape functions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Linear tetrahedra, **tet4**\n", + "\n", + "| | $\\xi_1$ | $\\xi_2$ | $\\xi_2$ |\n", + "| ----- | -------:| -------:| -------:|\n", + "| $N_1$ | 0 | 0 | 0 |\n", + "| $N_2$ | 1 | 0 | 0 |\n", + "| $N_3$ | 0 | 1 | 0 |\n", + "| $N_4$ | 0 | 0 | 1 |" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Matrix([\n", + "[1, 0, 0, 0],\n", + "[1, 1, 0, 0],\n", + "[1, 0, 1, 0],\n", + "[1, 0, 0, 1]])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "P = Matrix([1, xi[1], xi[2], xi[3]]).T\n", + "A = Matrix([\n", + " P.subs({xi[1]: 0, xi[2]: 0, xi[3]: 0}),\n", + " P.subs({xi[1]: 1, xi[2]: 0, xi[3]: 0}),\n", + " P.subs({xi[1]: 0, xi[2]: 1, xi[3]: 0}),\n", + " P.subs({xi[1]: 0, xi[2]: 0, xi[3]: 1}),\n", + " ])\n", + "A" ] }, { @@ -32,17 +350,15 @@ { "data": { "text/plain": [ - "Matrix([\n", - "[ -xi[1] - xi[2] - xi[3] + 1],\n", - "[ xi[1]],\n", - "[ xi[2]],\n", - "[ xi[3]],\n", - "[4*xi[1]*(-xi[1] - xi[2] - xi[3] + 1)],\n", - "[ 4*xi[1]*xi[2]],\n", - "[4*xi[2]*(-xi[1] - xi[2] - xi[3] + 1)],\n", - "[4*xi[3]*(-xi[1] - xi[2] - xi[3] + 1)],\n", - "[ 4*xi[1]*xi[3]],\n", - "[ 4*xi[2]*xi[3]]])" + "(Matrix([\n", + " [-xi[1] - xi[2] - xi[3] + 1],\n", + " [ xi[1]],\n", + " [ xi[2]],\n", + " [ xi[3]]]), Matrix([\n", + " [-1, -1, -1],\n", + " [ 1, 0, 0],\n", + " [ 0, 1, 0],\n", + " [ 0, 0, 1]]))" ] }, "execution_count": 9, @@ -51,23 +367,29 @@ } ], "source": [ - "def c3d10():\n", - " N1 = 1 - xi[1] - xi[2] - xi[3]\n", - " N2 = xi[1]\n", - " N3 = xi[2]\n", - " N4 = xi[3]\n", - " N5 = 4*xi[1]*(1-xi[1]-xi[2]-xi[3])\n", - " N6 = 4*xi[1]*xi[2]\n", - " N7 = 4*xi[2]*(1-xi[1]-xi[2]-xi[3])\n", - " N8 = 4*xi[3]*(1-xi[1]-xi[2]-xi[3])\n", - " N9 = 4*xi[1]*xi[3]\n", - " N10 = 4*xi[2]*xi[3]\n", - " N = Matrix([N1, N2, N3, N4, N5, N6, N7, N8, N9, N10])\n", - " dN = Matrix([N.diff(xi[1]).T, N.diff(xi[2]).T, N.diff(xi[3]).T]).T\n", - " return N, dN\n", + "N = (P*A.inv()).T\n", + "dN = Matrix([N.diff(xi[1]).T, N.diff(xi[2]).T, N.diff(xi[3]).T]).T\n", + "N, dN" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Quadratic Lagrange tetrahedral element, 10 nodes, **tet10**\n", "\n", - "N, dN = c3d10()\n", - "N" + "| | $\\xi_1$ | $\\xi_2$ | $\\xi_2$ |\n", + "| ----- | -------:| -------:| -------:|\n", + "| $N_1$ | 0 | 0 | 0 |\n", + "| $N_2$ | 1 | 0 | 0 |\n", + "| $N_3$ | 0 | 1 | 0 |\n", + "| $N_4$ | 0 | 0 | 1 |\n", + "| $N_5$ | 1/2 | 0 | 0 |\n", + "| $N_6$ | 1/2 | 1/2 | 0 |\n", + "| $N_7$ | 0 | 1/2 | 0 |\n", + "| $N_8$ | 0 | 0 | 1/2 |\n", + "| $N_9$ | 1/2 | 0 | 1/2 |\n", + "| $N_{10}$ | 0 | 1/2 | 1/2 |" ] }, { @@ -81,16 +403,16 @@ "data": { "text/plain": [ "Matrix([\n", - "[ -1, -1, -1],\n", - "[ 1, 0, 0],\n", - "[ 0, 1, 0],\n", - "[ 0, 0, 1],\n", - "[-8*xi[1] - 4*xi[2] - 4*xi[3] + 4, -4*xi[1], -4*xi[1]],\n", - "[ 4*xi[2], 4*xi[1], 0],\n", - "[ -4*xi[2], -4*xi[1] - 8*xi[2] - 4*xi[3] + 4, -4*xi[2]],\n", - "[ -4*xi[3], -4*xi[3], -4*xi[1] - 4*xi[2] - 8*xi[3] + 4],\n", - "[ 4*xi[3], 0, 4*xi[1]],\n", - "[ 0, 4*xi[3], 4*xi[2]]])" + "[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n", + "[1, 1, 0, 0, 1, 0, 0, 0, 0, 0],\n", + "[1, 0, 1, 0, 0, 0, 1, 0, 0, 0],\n", + "[1, 0, 0, 1, 0, 0, 0, 0, 1, 0],\n", + "[1, 1/2, 0, 0, 1/4, 0, 0, 0, 0, 0],\n", + "[1, 1/2, 1/2, 0, 1/4, 1/4, 1/4, 0, 0, 0],\n", + "[1, 0, 1/2, 0, 0, 0, 1/4, 0, 0, 0],\n", + "[1, 0, 0, 1/2, 0, 0, 0, 0, 1/4, 0],\n", + "[1, 1/2, 0, 1/2, 1/4, 0, 0, 0, 1/4, 1/4],\n", + "[1, 0, 1/2, 1/2, 0, 0, 1/4, 1/4, 1/4, 0]])" ] }, "execution_count": 10, @@ -99,17 +421,89 @@ } ], "source": [ - "dN" + "P = Matrix([1, xi[1], xi[2], xi[3], xi[1]**2, xi[1]*xi[2], xi[2]**2, xi[2]*xi[3], xi[3]**2, xi[1]*xi[3]]).T\n", + "A = Matrix([\n", + " P.subs({xi[1]: 0, xi[2]: 0, xi[3]: 0}),\n", + " P.subs({xi[1]: 1, xi[2]: 0, xi[3]: 0}),\n", + " P.subs({xi[1]: 0, xi[2]: 1, xi[3]: 0}),\n", + " P.subs({xi[1]: 0, xi[2]: 0, xi[3]: 1}),\n", + "\n", + " P.subs({xi[1]: Rational(1,2), xi[2]: 0, xi[3]: 0}),\n", + " P.subs({xi[1]: Rational(1,2), xi[2]: Rational(1,2), xi[3]: 0}),\n", + " P.subs({xi[1]: 0, xi[2]: Rational(1,2), xi[3]: 0}),\n", + "\n", + " P.subs({xi[1]: 0, xi[2]: 0, xi[3]: Rational(1,2)}),\n", + " P.subs({xi[1]: Rational(1,2), xi[2]: 0, xi[3]: Rational(1,2)}),\n", + " P.subs({xi[1]: 0, xi[2]: Rational(1,2), xi[3]: Rational(1,2)}),\n", + " ])\n", + "A" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": { - "collapsed": true + "collapsed": false }, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "Matrix([\n", + "[(xi[1] + xi[2] + xi[3] - 1)*(2*xi[1] + 2*xi[2] + 2*xi[3] - 1)],\n", + "[ xi[1]*(2*xi[1] - 1)],\n", + "[ xi[2]*(2*xi[2] - 1)],\n", + "[ xi[3]*(2*xi[3] - 1)],\n", + "[ -4*xi[1]*(xi[1] + xi[2] + xi[3] - 1)],\n", + "[ 4*xi[1]*xi[2]],\n", + "[ -4*xi[2]*(xi[1] + xi[2] + xi[3] - 1)],\n", + "[ -4*xi[3]*(xi[1] + xi[2] + xi[3] - 1)],\n", + "[ 4*xi[1]*xi[3]],\n", + "[ 4*xi[2]*xi[3]]])" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "N = (P*A.inv()).T\n", + "dN = Matrix([N.diff(xi[1]).T, N.diff(xi[2]).T, N.diff(xi[3]).T]).T\n", + "factor(N)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Matrix([\n", + "[ 4*xi[1] + 4*xi[2] + 4*xi[3] - 3, 4*xi[1] + 4*xi[2] + 4*xi[3] - 3, 4*xi[1] + 4*xi[2] + 4*xi[3] - 3],\n", + "[ 4*xi[1] - 1, 0, 0],\n", + "[ 0, 4*xi[2] - 1, 0],\n", + "[ 0, 0, 4*xi[3] - 1],\n", + "[-4*(2*xi[1] + xi[2] + xi[3] - 1), -4*xi[1], -4*xi[1]],\n", + "[ 4*xi[2], 4*xi[1], 0],\n", + "[ -4*xi[2], -4*(xi[1] + 2*xi[2] + xi[3] - 1), -4*xi[2]],\n", + "[ -4*xi[3], -4*xi[3], -4*(xi[1] + xi[2] + 2*xi[3] - 1)],\n", + "[ 4*xi[3], 0, 4*xi[1]],\n", + "[ 0, 4*xi[3], 4*xi[2]]])" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "factor(dN)" + ] } ], "metadata": { @@ -128,7 +522,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.9" + "version": "2.7.10" } }, "nbformat": 4, From e7c110a414b8f4eddf8408688bf7f01720928c2e Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Fri, 14 Aug 2015 17:42:33 +0300 Subject: [PATCH 12/26] updated calc local matrices to use autodiff --- src/elasticity_solver.jl | 105 +++++++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 43 deletions(-) diff --git a/src/elasticity_solver.jl b/src/elasticity_solver.jl index 5386d2e..38580a3 100644 --- a/src/elasticity_solver.jl +++ b/src/elasticity_solver.jl @@ -3,6 +3,8 @@ module elasticity_solver +using ForwardDiff + using Logging @Logging.configure(level=INFO) @@ -40,8 +42,8 @@ Examples [2.0, 3.0, 4.0] """ function dummy(a) - # not doing anything useful. - return a+1 + # not doing anything useful. + return a+1 end @@ -93,54 +95,71 @@ function interpolate{T<:Real}(field::Array{T,2}, basis::Function, ip) end - """ -Calculate local tangent stiffness matrix and residual force vector R = T - F +Calculate local tangent stiffness matrix and residual force vector +R = T - F for elasticity problem. + +Parameters +---------- +X : Element coordinates +u : Displacement field +R : Residual force vector +K : Tangent stiffness matrix +basis : Basis functions +dbasis : Derivative of basis functions +lambda : Material parameter +mu : Material parameter +ipoints : integration points +iweights : integration weights + +Returns +------- +None + +Notes +----- +If material parameters are given in list, they are interpolated to gauss +points using shape functions. """ -function calc_local_matrices!(X, u, R, Kt, N, dNdchi, lambda_, mu_, ipoints, iweights) - dim, nnodes = size(X) - I = eye(dim) - R[:,:] = 0.0 - Kt[:,:] = 0.0 +function calc_local_matrices!(X, u, R, K, basis, dbasis, lambda_, mu_, ipoints, iweights) + dim, nnodes = size(X) + I = eye(dim) + R[:,:] = 0.0 - dF = zeros(dim, dim) + #dF = zeros(dim, dim) - for m = 1:length(iweights) - w = iweights[m] - chi = ipoints[m, :] - # interpolate material parameters from element node fields - #lambda = (lambda_*N(chi))[1] - #mu = (mu_*N(chi))[1] - # Jt = X*dNdchi(chi) - #@debug("Jt:\n",Jt) - lambda = interpolate(lambda_, N, chi) - mu = interpolate(mu_, N, chi) - Jt = interpolate(X, dNdchi, chi) - detJ = det(Jt) - deltaN = inv(Jt)*dNdchi(chi)' - delta_u = u*deltaN' - F = I + delta_u # Deformation gradient - E = 1/2*(delta_u' + delta_u + delta_u'*delta_u) # Green-Lagrange strain tensor - S = lambda*trace(E)*I + 2*mu*E # PK2 stress tensor - P = F*S # PK1 stress tensor - R[:,:] += w*P*deltaN*detJ + function calc_R!(u, R) + for m = 1:length(iweights) + w = iweights[m] + xi = ipoints[m, :] + # calculate material parameters + lambda = typeof(lambda_) == Float64 ? lambda_ : dot(lambda_, basis(xi)) + mu = typeof(mu_) == Float64 ? mu_ : dot(mu_, basis(xi)) + Jt = X*dbasis(xi) + detJ = det(Jt) + dbasisdX = dbasis(xi)*inv(Jt) - for p = 1:nnodes - for i = 1:dim - dF[:,:] = 0.0 - dF[i,:] = deltaN[:,p] - dE = 1/2*(F'*dF + dF'*F) - dS = lambda*trace(dE)*I + 2*mu*dE - dP = dF*S + F*dS - for q = 1:nnodes - for j = 1:dim - Kt[dim*(p-1)+i,dim*(q-1)+j] += w*(dP[j,:]*deltaN[:,q])[1]*detJ - end - end - end + gradu = u*dbasisdX + F = I + gradu # Deformation gradient + E = 1/2*(gradu' + gradu + gradu'*gradu) # Green-Lagrange strain tensor + S = lambda*trace(E)*I + 2*mu*E # PK2 stress tensor + P = F*S # PK1 stress tensor + + R[:,:] += w*P*dbasisdX'*detJ end - end + + # herlper for tangent stiffness matrix + function R!(u, R) + R[:] = 0 + calc_R!(reshape(u, dim, nnodes), reshape(R, dim, nnodes)) + #calc_Wext!(reshape(u, 2, 4), reshape(R, 2, 4)) + end + Jacobian = ForwardDiff.forwarddiff_jacobian(R!, Float64, fadtype=:dual, n=dim*nnodes, m=dim*nnodes) + + K[:, :] = Jacobian(reshape(u, dim*nnodes)) + R!(reshape(u, dim*nnodes), reshape(R, dim*nnodes)) + end From 9792a2244c574b5645350fb472e8935a9bb63bf2 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Fri, 14 Aug 2015 17:50:08 +0300 Subject: [PATCH 13/26] updated tests for elasticity solver --- test/test_elasticity_solver.jl | 119 +++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/test/test_elasticity_solver.jl b/test/test_elasticity_solver.jl index 142eaf3..167c9e3 100644 --- a/test/test_elasticity_solver.jl +++ b/test/test_elasticity_solver.jl @@ -280,3 +280,122 @@ facts("test that elimination of non-homogeneous dirichlet boundary conditions ra I, J, V = findnz(A) @fact_throws I, V = eliminate_boundary_conditions(dirichletbc, I, V) end + +module TestElasticitySolver + +using JuliaFEM.elasticity_solver: calc_local_matrices + +facts("test solve one element model") do + X = [0.0 0.0; 10.0 0.0; 10.0 1.0; 0.0 1.0]' + F = [0 0; 0 0; 0 -2; 0 0]' + + # Material properties + E = 90 + nu = 0.25 + mu = E/(2*(1+nu)) + la = E*nu/((1+nu)*(1-2*nu)) + la = 2*la*mu/(la + 2*mu) + + u = zeros(2, 4) + du = zeros(2, 4) + R = zeros(2, 4) + K = zeros(8, 8) + + basis(xi) = [ + (1-xi[1])*(1-xi[2])/4 + (1+xi[1])*(1-xi[2])/4 + (1+xi[1])*(1+xi[2])/4 + (1-xi[1])*(1+xi[2])/4] + + dbasis(xi) = [-(1-xi[2])/4.0 -(1-xi[1])/4.0 + (1-xi[2])/4.0 -(1+xi[1])/4.0 + (1+xi[2])/4.0 (1+xi[1])/4.0 + -(1+xi[2])/4.0 (1-xi[1])/4.0] + + ipoints = 1/sqrt(3)*[-1 -1; 1 -1; 1 1; -1 1] + iweights = [1, 1, 1, 1] + free_dofs = [3, 4, 5, 6] + + for i=1:10 + calc_local_matrices!(X, u, R, K, basis, dbasis, la, mu, ipoints, iweights) + du[free_dofs] = K[free_dofs, free_dofs] \ -(R - F)[free_dofs] + u += du + if norm(du) < 1.0e-9 + Logging.debug("Converged in $i iterations.") + break + end + end + + # Tested against Elmer solution + Logging.debug("solution vector: \n $u") + @fact u[2, 3] --> roughly(-2.222244754401764) + norm1 = norm(u) + Logging.debug("norm of u: $(norm(u))") + + # We rotate model a bit and make sure that L2 norm is same + phi = 30/180*pi + rmat = [ + cos(phi) -sin(phi) + sin(phi) cos(phi)] + X = rmat*X + F = rmat*F + u = zeros(2, 4) + for i=1:10 + calc_local_matrices!(X, u, R, K, basis, dbasis, la, mu, ipoints, iweights) + du[free_dofs] = K[free_dofs, free_dofs] \ -(R - F)[free_dofs] + u += du + if norm(du) < 1.0e-9 + Logging.debug("Converged in $i iterations.") + break + end + end + Logging.debug("solution vector: \n $u") + Logging.debug("norm of u: $(norm(u))") + @fact norm(u) --> roughly(norm1) + + # test two element model + X = [0.0 0.0; 5.0 0.0; 5.0 1.0; 0.0 1.0]' + u = zeros(2, 6) + du = zeros(2, 6) + R = zeros(2, 4) + K = zeros(8, 8) + ass1 = [9, 10, 1, 2, 5, 6, 11, 12] + ass2 = [1, 2, 3, 4, 7, 8, 5, 6] + free_dofs = collect(1:8) + F = [0 0; 0 0; 0 0; 0 -0.1; 0 0; 0 0]' + + A = zeros(12, 12) + b = zeros(2, 6) + for i=1:1 + Logging.debug("Iteration $i") + A[:,:] = 0.0 + b[:] = 0.0 + #Logging.debug("Assembling") + for ass in (ass1, ass2) + #Logging.debug("ass = $ass, u[ass] = $(u[ass])") + calc_local_matrices!(X, u[ass], R, K, basis, dbasis, la, mu, ipoints, iweights) + A[ass,ass] += K + b[ass] += R[:] + end + dump(round(A, 2)) + println("K norm = $(norm(A[free_dofs, free_dofs]))") + du[free_dofs] = A[free_dofs, free_dofs] \ -(b - F)[free_dofs] + println("du = $du") + u += du + Logging.debug("Norm of du: $(norm(du))") + for ass in (ass1, ass2) + Logging.debug("Element displacement: $(reshape(u[ass], 2, 4))") + end + if norm(du) < 1.0e-9 + Logging.debug("Converged in $i iterations.") + break + end + end + Logging.debug("solution vector: \n $u") + Logging.debug("norm of u: $(norm(u))") + @pending norm(u) --> :something +end + +exitstatus() + +end From cb72cd17fec12e9883ee1a7d2010be1dc202c4b4 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Sun, 16 Aug 2015 13:33:02 +0300 Subject: [PATCH 14/26] interpolation routines to separate file. --- src/JuliaFEM.jl | 2 ++ src/elasticity_solver.jl | 48 ------------------------------ src/interpolate.jl | 53 ++++++++++++++++++++++++++++++++++ src/types.jl | 28 ++++++++++++++++++ test/test_elasticity_solver.jl | 29 ------------------- test/test_interpolate.jl | 33 +++++++++++++++++++++ 6 files changed, 116 insertions(+), 77 deletions(-) create mode 100644 src/interpolate.jl create mode 100644 src/types.jl create mode 100644 test/test_interpolate.jl diff --git a/src/JuliaFEM.jl b/src/JuliaFEM.jl index a8920eb..a454199 100644 --- a/src/JuliaFEM.jl +++ b/src/JuliaFEM.jl @@ -6,6 +6,8 @@ module JuliaFEM VERSION < v"0.4-" && using Docile using Lexicon +include("types.jl") # type definitions +include("interpolate.jl") include("elasticity_solver.jl") include("xdmf.jl") include("abaqus_reader.jl") diff --git a/src/elasticity_solver.jl b/src/elasticity_solver.jl index 38580a3..b23ee62 100644 --- a/src/elasticity_solver.jl +++ b/src/elasticity_solver.jl @@ -47,54 +47,6 @@ function dummy(a) end -""" -Interpolate field variable using basis functions f for point ip. -This function tries to be as general as possible and allows interpolating -lot of different fields. - -Parameters ----------- -field :: Array{Number, dim} - Field variable -basis :: Function - Basis functions -ip :: Array{Number, 1} - Point to interpolate -""" -function interpolate{T<:Real}(field::Array{T,1}, basis::Function, ip) - result = dot(field, basis(ip)) - return result -end -function interpolate{T<:Real}(field::Array{T,2}, basis::Function, ip) - m, n = size(field) - bip = basis(ip) - tmp = size(bip) - if length(tmp) == 1 - ndim = 1 - nnodes = tmp[1] - else - ndim, nnodes = size(bip) - end - if ndim == 1 - if n == nnodes - result = field * bip - elseif m == nnodes - result = field' * bip - end - else - if n == nnodes - result = bip' * field - elseif m == nnodes - result = bip' * field' - end - end - if length(result) == 1 - result = result[1] - end - return result -end - - """ Calculate local tangent stiffness matrix and residual force vector R = T - F for elasticity problem. diff --git a/src/interpolate.jl b/src/interpolate.jl new file mode 100644 index 0000000..e0441ac --- /dev/null +++ b/src/interpolate.jl @@ -0,0 +1,53 @@ +# This file is a part of JuliaFEM. +# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md + +""" +Interpolate field variable using basis functions f for point ip. +This function tries to be as general as possible and allows interpolating +lot of different fields. + +Parameters +---------- +field :: Array{Number, dim} + Field variable +basis :: Function + Basis functions +ip :: Array{Number, 1} + Point to interpolate +""" +function interpolate{T<:Real}(field::Array{T,1}, basis::Function, ip) + result = dot(field, basis(ip)) + return result +end +function interpolate{T<:Real}(field::Array{T,2}, basis::Function, ip) + m, n = size(field) + bip = basis(ip) + tmp = size(bip) + if length(tmp) == 1 + ndim = 1 + nnodes = tmp[1] + else + ndim, nnodes = size(bip) + end + if ndim == 1 + if n == nnodes + result = field * bip + elseif m == nnodes + result = field' * bip + end + else + if n == nnodes + result = bip' * field + elseif m == nnodes + result = bip' * field' + end + end + if length(result) == 1 + result = result[1] + end + return result +end +function interpolate(e::Element, field::ASCIIString, x::Array{Float64,1}; derivative=false) + return interpolate(e.attributes[field], derivative ? e.dbasis : e.basis, x) +end + diff --git a/src/types.jl b/src/types.jl new file mode 100644 index 0000000..6ddedfd --- /dev/null +++ b/src/types.jl @@ -0,0 +1,28 @@ +# This file is a part of JuliaFEM. +# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md + + +type Element + id :: Int + element_type :: Int + node_ids :: Array{Int, 1} + basis :: Function + dbasis :: Function + attributes :: Dict{ASCIIString, Any} + ipoints :: Array{Float64, 2} + iweights :: Array{Float64, 1} +end + + +type Assembly + # LHS + I :: Array{Int64, 1} + J :: Array{Int64, 1} + A :: Array{Float64, 1} + # RHS + i :: Array{Int64, 1} + b :: Array{Float64, 1} + # global dofs for each element + gdofs :: Dict{Int64, Array{Int64, 1}} +end + diff --git a/test/test_elasticity_solver.jl b/test/test_elasticity_solver.jl index 167c9e3..57263b3 100644 --- a/test/test_elasticity_solver.jl +++ b/test/test_elasticity_solver.jl @@ -140,35 +140,6 @@ facts("test solve elasticity increment, two elements") do end -using JuliaFEM.elasticity_solver: interpolate -facts("test interpolation of different field variables") do - N(xi) = [ - (1-xi[1])*(1-xi[2])/4 - (1+xi[1])*(1-xi[2])/4 - (1+xi[1])*(1+xi[2])/4 - (1-xi[1])*(1+xi[2])/4 - ] - dNdξ(ξ) = [-(1-ξ[2])/4.0 -(1-ξ[1])/4.0 - (1-ξ[2])/4.0 -(1+ξ[1])/4.0 - (1+ξ[2])/4.0 (1+ξ[1])/4.0 - -(1+ξ[2])/4.0 (1-ξ[1])/4.0] - F1 = [36.0, 36.0, 36.0, 36.0] - F2 = [36.0 36.0 36.0 36.0] - F3 = F2' - F4 = [0.0 0.0; 10.0 0.0; 10.0 1.0; 0.0 1.0]' - F5 = F4' - F6 = [36, 36, 36, 36] - - @fact interpolate(F1, N, [0.0, 0.0]) => 36.0 - @fact interpolate(F2, N, [0.0, 0.0]) => 36.0 - @fact interpolate(F3, N, [0.0, 0.0]) => 36.0 - @fact interpolate(F4, N, [0.0, 0.0]) => [5.0; 0.5] - @fact interpolate(F5, N, [0.0, 0.0]) => [5.0; 0.5] - @fact interpolate(F5, dNdξ, [0.0, 0.0]) => [5.0 0.0; 0.0 0.5] - @fact interpolate(F6, N, [0.0, 0.0]) => 36 -end - - using JuliaFEM.elasticity_solver: assemble! diff --git a/test/test_interpolate.jl b/test/test_interpolate.jl new file mode 100644 index 0000000..37caf1b --- /dev/null +++ b/test/test_interpolate.jl @@ -0,0 +1,33 @@ +# This file is a part of JuliaFEM. +# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md + +using JuliaFEM: interpolate + +using FactCheck + +facts("test interpolation of different field variables") do + N(xi) = [ + (1-xi[1])*(1-xi[2])/4 + (1+xi[1])*(1-xi[2])/4 + (1+xi[1])*(1+xi[2])/4 + (1-xi[1])*(1+xi[2])/4 + ] + dNdξ(ξ) = [-(1-ξ[2])/4.0 -(1-ξ[1])/4.0 + (1-ξ[2])/4.0 -(1+ξ[1])/4.0 + (1+ξ[2])/4.0 (1+ξ[1])/4.0 + -(1+ξ[2])/4.0 (1-ξ[1])/4.0] + F1 = [36.0, 36.0, 36.0, 36.0] + F2 = [36.0 36.0 36.0 36.0] + F3 = F2' + F4 = [0.0 0.0; 10.0 0.0; 10.0 1.0; 0.0 1.0]' + F5 = F4' + F6 = [36, 36, 36, 36] + + @fact interpolate(F1, N, [0.0, 0.0]) --> 36.0 + @fact interpolate(F2, N, [0.0, 0.0]) --> 36.0 + @fact interpolate(F3, N, [0.0, 0.0]) --> 36.0 + @fact interpolate(F4, N, [0.0, 0.0]) --> [5.0; 0.5] + @fact interpolate(F5, N, [0.0, 0.0]) --> [5.0; 0.5] + @fact interpolate(F5, dNdξ, [0.0, 0.0]) --> [5.0 0.0; 0.0 0.5] + @fact interpolate(F6, N, [0.0, 0.0]) --> 36 +end From e97a7ca0f147e9c4ea12f789c7cd47dd5b11836c Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Sun, 16 Aug 2015 13:36:09 +0300 Subject: [PATCH 15/26] rename. --- src/JuliaFEM.jl | 2 +- src/{interpolate.jl => interpolation.jl} | 0 test/{test_interpolate.jl => test_interpolation.jl} | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename src/{interpolate.jl => interpolation.jl} (100%) rename test/{test_interpolate.jl => test_interpolation.jl} (100%) diff --git a/src/JuliaFEM.jl b/src/JuliaFEM.jl index a454199..7f4573e 100644 --- a/src/JuliaFEM.jl +++ b/src/JuliaFEM.jl @@ -7,7 +7,7 @@ VERSION < v"0.4-" && using Docile using Lexicon include("types.jl") # type definitions -include("interpolate.jl") +include("interpolation.jl") include("elasticity_solver.jl") include("xdmf.jl") include("abaqus_reader.jl") diff --git a/src/interpolate.jl b/src/interpolation.jl similarity index 100% rename from src/interpolate.jl rename to src/interpolation.jl diff --git a/test/test_interpolate.jl b/test/test_interpolation.jl similarity index 100% rename from test/test_interpolate.jl rename to test/test_interpolation.jl From 457d208908872dd7ba84c987126b3ccf89288d5b Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Sun, 16 Aug 2015 22:22:24 +0300 Subject: [PATCH 16/26] interpolation & integration --- src/JuliaFEM.jl | 3 +- src/interpolation.jl | 53 -------- src/math.jl | 120 +++++++++++++++++++ src/types.jl | 2 +- test/{test_interpolation.jl => test_math.jl} | 0 5 files changed, 123 insertions(+), 55 deletions(-) delete mode 100644 src/interpolation.jl create mode 100644 src/math.jl rename test/{test_interpolation.jl => test_math.jl} (100%) diff --git a/src/JuliaFEM.jl b/src/JuliaFEM.jl index 7f4573e..07cfebf 100644 --- a/src/JuliaFEM.jl +++ b/src/JuliaFEM.jl @@ -7,7 +7,8 @@ VERSION < v"0.4-" && using Docile using Lexicon include("types.jl") # type definitions -include("interpolation.jl") +include("math.jl") # basic mathematical operations + include("elasticity_solver.jl") include("xdmf.jl") include("abaqus_reader.jl") diff --git a/src/interpolation.jl b/src/interpolation.jl deleted file mode 100644 index e0441ac..0000000 --- a/src/interpolation.jl +++ /dev/null @@ -1,53 +0,0 @@ -# This file is a part of JuliaFEM. -# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md - -""" -Interpolate field variable using basis functions f for point ip. -This function tries to be as general as possible and allows interpolating -lot of different fields. - -Parameters ----------- -field :: Array{Number, dim} - Field variable -basis :: Function - Basis functions -ip :: Array{Number, 1} - Point to interpolate -""" -function interpolate{T<:Real}(field::Array{T,1}, basis::Function, ip) - result = dot(field, basis(ip)) - return result -end -function interpolate{T<:Real}(field::Array{T,2}, basis::Function, ip) - m, n = size(field) - bip = basis(ip) - tmp = size(bip) - if length(tmp) == 1 - ndim = 1 - nnodes = tmp[1] - else - ndim, nnodes = size(bip) - end - if ndim == 1 - if n == nnodes - result = field * bip - elseif m == nnodes - result = field' * bip - end - else - if n == nnodes - result = bip' * field - elseif m == nnodes - result = bip' * field' - end - end - if length(result) == 1 - result = result[1] - end - return result -end -function interpolate(e::Element, field::ASCIIString, x::Array{Float64,1}; derivative=false) - return interpolate(e.attributes[field], derivative ? e.dbasis : e.basis, x) -end - diff --git a/src/math.jl b/src/math.jl new file mode 100644 index 0000000..c4c45e6 --- /dev/null +++ b/src/math.jl @@ -0,0 +1,120 @@ +# This file is a part of JuliaFEM. +# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md + +using ForwardDiff + +""" +Interpolate field variable using basis functions f for point ip. +This function tries to be as general as possible and allows interpolating +lot of different fields. + +Parameters +---------- +field :: Array{Number, dim} + Field variable +basis :: Function + Basis functions +ip :: Array{Number, 1} + Point to interpolate +""" +function interpolate(field::Float64, basis::Function, ip::Array{Float64,1}) + # dummy function, unable to interpolate scalar value! + return field +end +function interpolate{T<:Real}(field::Array{T,1}, basis::Function, ip) + result = dot(field, basis(ip)) + return result +end +function interpolate{T<:Real}(field::Array{T,2}, basis::Function, ip) + m, n = size(field) + bip = basis(ip) + tmp = size(bip) + if length(tmp) == 1 + ndim = 1 + nnodes = tmp[1] + else + ndim, nnodes = size(bip) + end + if ndim == 1 + if n == nnodes + result = field * bip + elseif m == nnodes + result = field' * bip + end + else + if n == nnodes + result = bip' * field + elseif m == nnodes + result = bip' * field' + end + end + if length(result) == 1 + result = result[1] + end + return result +end +function interpolate(e::Element, field::ASCIIString, x::Array{Float64,1}; derivative=false) + return interpolate(e.attributes[field], derivative ? e.dbasis : e.basis, x) +end + + +function get_basis(el::Element, xi) + return el.basis(xi) +end + +function get_dbasisdX(el::Element, xi) + J = interpolate(el, "coordinates", xi; derivative=true) + dbasisdX = el.dbasis(xi)*inv(J) + return dbasisdX +end + +""" +Linearize function f w.r.t some given field, i.e. calculate dR/du + +Parameters +---------- +f::Function + (possibly) nonlinear function to linearize +field::ASCIIString + field variable +""" +function linearize(f::Function, field::ASCIIString) + function jacobian(el::Element, xi) + dim, nnodes = size(el.attributes[field]) + function helper!(x, y) + orig = copy(el.attributes[field]) + el.attributes[field] = reshape(x, dim, nnodes) + y[:] = f(el, xi) + el.attributes[field] = copy(orig) + end + jac = ForwardDiff.forwarddiff_jacobian(helper!, Float64, fadtype=:dual, n=dim*nnodes, m=dim*nnodes) + return jac(el.attributes[field][:]) + end + return jacobian +end + + +""" +Integrate f over element using Gaussian quadrature rules. + +Parameters +---------- +el::Element + well defined element +f::Function + Function to integrate +target::ASCIIString + Where to save result (el.attributes[target]) +""" +function integrate!(el::Element, f::Function, target::ASCIIString) + # set target to zero + el.attributes[target][:] = 0.0 + for m = 1:length(el.iweights) + w = el.iweights[m] + xi = el.ipoints[:, m] + J = interpolate(el, "coordinates", xi; derivative=true) + el.attributes[target] += w*f(el, xi)*det(J) + end +end + + diff --git a/src/types.jl b/src/types.jl index 6ddedfd..05d38e9 100644 --- a/src/types.jl +++ b/src/types.jl @@ -4,7 +4,7 @@ type Element id :: Int - element_type :: Int +# element_type :: Int node_ids :: Array{Int, 1} basis :: Function dbasis :: Function diff --git a/test/test_interpolation.jl b/test/test_math.jl similarity index 100% rename from test/test_interpolation.jl rename to test/test_math.jl From 7f0875dcb716e952fab33f98f37fa1442f8f1f11 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Sun, 16 Aug 2015 22:48:19 +0300 Subject: [PATCH 17/26] Integration. --- .gitignore | 1 + src/math.jl | 44 ++++++++++++++++++++++++++++++++++++-------- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 6ad4124..eaebe9c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .DS_Store .ipynb_checkpoints docs/build/html +*.swp diff --git a/src/math.jl b/src/math.jl index c4c45e6..8fbd80c 100644 --- a/src/math.jl +++ b/src/math.jl @@ -103,18 +103,46 @@ el::Element well defined element f::Function Function to integrate -target::ASCIIString - Where to save result (el.attributes[target]) """ -function integrate!(el::Element, f::Function, target::ASCIIString) - # set target to zero - el.attributes[target][:] = 0.0 +function integrate(f::Function, el::JuliaFEM.Element) + target = [] for m = 1:length(el.iweights) w = el.iweights[m] xi = el.ipoints[:, m] - J = interpolate(el, "coordinates", xi; derivative=true) - el.attributes[target] += w*f(el, xi)*det(J) + J = JuliaFEM.interpolate(el, "coordinates", xi; derivative=true) + push!(target, w*f(el, xi)*det(J)) + end + return sum(target) +end + +""" +This version returns a function which must be operated with element e +""" +function integrate(f::Function) + function integrate(el::JuliaFEM.Element) + target = [] + for m = 1:length(el.iweights) + w = el.iweights[m] + xi = el.ipoints[:, m] + J = JuliaFEM.interpolate(el, "coordinates", xi; derivative=true) + push!(target, w*f(el, xi)*det(J)) + end + return sum(target) + end + return integrate +end + +""" +This version saves results inplace to target, garbage collection free +""" +function integrate!(f::Function, el::JuliaFEM.Element, target) + # set target to zero + target[:] = 0.0 + for m = 1:length(el.iweights) + w = el.iweights[m] + xi = el.ipoints[:, m] + J = JuliaFEM.interpolate(el, "coordinates", xi; derivative=true) + target[:,:] += w*f(el, xi)*det(J) end end - From c8214bc210b3e65eaf1065196f34eb2b4398d3e9 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Sun, 16 Aug 2015 22:50:16 +0300 Subject: [PATCH 18/26] using JuliaFEM... --- src/math.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/math.jl b/src/math.jl index 8fbd80c..df1e010 100644 --- a/src/math.jl +++ b/src/math.jl @@ -1,6 +1,7 @@ # This file is a part of JuliaFEM. # License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md +using JuliaFEM using ForwardDiff """ From 45ea803136e9a2a0db9893d80812ca8890f0e8cb Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Mon, 17 Aug 2015 00:18:21 +0300 Subject: [PATCH 19/26] notebook with different optoins... --- ...gration-and-linearization-strategies.ipynb | 548 ++++++++++++++++++ src/math.jl | 58 +- 2 files changed, 601 insertions(+), 5 deletions(-) create mode 100644 notebooks/2015-08-15-interpolation-integration-and-linearization-strategies.ipynb diff --git a/notebooks/2015-08-15-interpolation-integration-and-linearization-strategies.ipynb b/notebooks/2015-08-15-interpolation-integration-and-linearization-strategies.ipynb new file mode 100644 index 0000000..bf1c07f --- /dev/null +++ b/notebooks/2015-08-15-interpolation-integration-and-linearization-strategies.ipynb @@ -0,0 +1,548 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Interpolation and integration algorithms\n", + "\n", + "Author(s): Jukka Aho\n", + "\n", + "**Abstract**: Some strategies to implement automatic differentiation. The number of different choises is caused by a fact that the linearization of function can be done before integration or vice versa, and functions can return values or do in-place modifications. There is probably performance differences between different strategies, but all of them should work." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "using JuliaFEM\n", + "using ForwardDiff" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\"Old good\" elasticity force equilibrium equation $R = T - F$" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "calc_residual_vector_integrand (generic function with 1 method)" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function calc_residual_vector_integrand(el::JuliaFEM.Element, xi)\n", + " # Calculate dN/dX and interpolate material parameters\n", + " dbasisdX = JuliaFEM.get_dbasisdX(el, xi)\n", + " u = el.attributes[\"displacement\"]\n", + " lambda = JuliaFEM.interpolate(el, \"lambda\", xi)\n", + " mu = JuliaFEM.interpolate(el, \"mu\", xi)\n", + "\n", + " # Calculate residual force vector R = T - F\n", + " gradu = u*dbasisdX\n", + " F = I + gradu\n", + " E = 1/2*(gradu' + gradu + gradu'*gradu)\n", + " S = lambda*trace(E)*I + 2*mu*E\n", + " P = F*S\n", + " T = P*dbasisdX'\n", + " return T\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test case, already well known 2d elasticity in [0,10] x [0,1] grid." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "basis(xi) = [\n", + " (1-xi[1])*(1-xi[2])/4\n", + " (1+xi[1])*(1-xi[2])/4\n", + " (1+xi[1])*(1+xi[2])/4\n", + " (1-xi[1])*(1+xi[2])/4]\n", + "dbasis(xi) = [-(1-xi[2])/4.0 -(1-xi[1])/4.0\n", + " (1-xi[2])/4.0 -(1+xi[1])/4.0\n", + " (1+xi[2])/4.0 (1+xi[1])/4.0\n", + " -(1+xi[2])/4.0 (1-xi[1])/4.0]\n", + "ipoints = 1/sqrt(3)*[-1 -1; 1 -1; 1 1; -1 1]'\n", + "iweights = [1, 1, 1, 1]\n", + "attributes = Dict()\n", + "e = JuliaFEM.Element(1, [1, 2, 3, 4], basis, dbasis, attributes, ipoints, iweights)\n", + "\n", + "E = 90\n", + "nu = 0.25\n", + "mu = E/(2*(1+nu))\n", + "la = E*nu/((1+nu)*(1-2*nu))\n", + "la = 2*la*mu/(la + 2*mu)\n", + "\n", + "e.attributes[\"coordinates\"] = [0.0 0.0; 10.0 0.0; 10.0 1.0; 0.0 1.0]'\n", + "e.attributes[\"lambda\"] = la\n", + "e.attributes[\"mu\"] = mu\n", + "e.attributes[\"displacement\"] = [0.0 0.0; 0.0 0.0; 0.5 0.0; 0.0 0.0]'\n", + "e.attributes[\"displacement nodal force\"] = zeros(2, 4)\n", + "e.attributes[\"displacement tangent stiffness\"] = zeros(8, 8);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Integration\n", + "\n", + "1. take element and function and return value\n", + "2. take function and return function which can be integrated by passing element as a function\n", + "3. do in-place integration, save values to target" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "integrate! (generic function with 1 method)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function integrate(f::Function, el::JuliaFEM.Element)\n", + " target = []\n", + " for m = 1:length(el.iweights)\n", + " w = el.iweights[m]\n", + " xi = el.ipoints[:, m]\n", + " J = JuliaFEM.interpolate(el, \"coordinates\", xi; derivative=true)\n", + " push!(target, w*f(el, xi)*det(J))\n", + " end\n", + " return sum(target)\n", + "end\n", + "\n", + "function integrate(f::Function)\n", + " function integrate(el::JuliaFEM.Element)\n", + " target = []\n", + " for m = 1:length(el.iweights)\n", + " w = el.iweights[m]\n", + " xi = el.ipoints[:, m]\n", + " J = JuliaFEM.interpolate(el, \"coordinates\", xi; derivative=true)\n", + " push!(target, w*f(el, xi)*det(J))\n", + " end\n", + " return sum(target)\n", + " end\n", + " return integrate\n", + "end\n", + "\n", + "function integrate!(f::Function, el::JuliaFEM.Element, target)\n", + " # set target to zero\n", + " el.attributes[target][:] = 0.0\n", + " for m = 1:length(el.iweights)\n", + " w = el.iweights[m]\n", + " xi = el.ipoints[:, m]\n", + " J = JuliaFEM.interpolate(el, \"coordinates\", xi; derivative=true)\n", + " el.attributes[target][:,:] += w*f(el, xi)*det(J)\n", + " end\n", + "end\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "2x4 Array{Float64,2}:\n", + " -38.2303 -72.8697 79.4912 31.6088\n", + " -17.625 -28.475 37.7 8.4 " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "integrate(calc_residual_vector_integrand, e)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "2x4 Array{Float64,2}:\n", + " -38.2303 -72.8697 79.4912 31.6088\n", + " -17.625 -28.475 37.7 8.4 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "calc_residual_vector = integrate(calc_residual_vector_integrand)\n", + "calc_residual_vector(e)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "2x4 Array{Float64,2}:\n", + " -38.2303 -72.8697 79.4912 31.6088\n", + " -17.625 -28.475 37.7 8.4 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "integrate!(calc_residual_vector_integrand, e, \"displacement nodal force\")\n", + "e.attributes[\"displacement nodal force\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Linearization\n", + "\n", + "1. take function, element and field, and return partial derivative\n", + "2. take function and field, return function which takes element as argument\n", + "3. do in-place linearization to target, requires function which takes element as argument\n", + "\n", + "In general linearization can be done before integration and vice versa, i.e.\n", + "\n", + " integrate(linearize(f, \"u\"))(e) <-> linearize(integrate(f), \"u\")(e)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "linearize! (generic function with 1 method)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function linearize(f::Function, el::JuliaFEM.Element, field::ASCIIString)\n", + " dim, nnodes = size(el.attributes[field])\n", + " function helper!(x, y)\n", + " orig = copy(el.attributes[field])\n", + " el.attributes[field] = reshape(x, dim, nnodes)\n", + " y[:] = f(el)\n", + " el.attributes[field] = copy(orig)\n", + " end\n", + " jac = ForwardDiff.forwarddiff_jacobian(helper!, Float64, fadtype=:dual, n=dim*nnodes, m=dim*nnodes)\n", + " return jac(el.attributes[field][:])\n", + "end\n", + "\n", + "function linearize(f::Function, field::ASCIIString)\n", + " function jacobian(el::JuliaFEM.Element, args...)\n", + " dim, nnodes = size(el.attributes[field])\n", + " function helper!(x, y)\n", + " orig = copy(el.attributes[field])\n", + " el.attributes[field] = reshape(x, dim, nnodes)\n", + " y[:] = f(el, args...)\n", + " el.attributes[field] = copy(orig)\n", + " end\n", + " jac = ForwardDiff.forwarddiff_jacobian(helper!, Float64, fadtype=:dual, n=dim*nnodes, m=dim*nnodes)\n", + " return jac(el.attributes[field][:])\n", + " end\n", + " return jacobian\n", + "end\n", + "\n", + "function linearize!(f::Function, el::JuliaFEM.Element, field::ASCIIString, target::ASCIIString)\n", + " el.attributes[target][:] = 0.0\n", + " dim, nnodes = size(el.attributes[field])\n", + " function helper!(x, y)\n", + " orig = copy(el.attributes[field])\n", + " el.attributes[field] = reshape(x, dim, nnodes)\n", + " y[:] = f(el)\n", + " el.attributes[field] = copy(orig)\n", + " end\n", + " jac! = ForwardDiff.forwarddiff_jacobian!(helper!, Float64, fadtype=:dual, n=dim*nnodes, m=dim*nnodes)\n", + " jac!(el.attributes[field][:], el.attributes[target])\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "8x8 Array{Float64,2}:\n", + " 149.721 55.55 84.679 36.65 … -55.55 -136.278 -36.65 \n", + " 55.55 329.69 42.75 167.935 -172.941 -42.8 -324.684\n", + " 84.679 42.75 185.321 105.05 -123.05 -73.522 -24.75 \n", + " 36.65 167.935 105.05 340.54 -344.759 -24.8 -163.716\n", + " -98.122 -55.5 -196.478 -116.9 135.8 76.233 36.6 \n", + " -55.55 -172.941 -123.05 -344.759 … 352.922 42.8 164.778\n", + " -136.278 -42.8 -73.522 -24.8 42.8 133.567 24.8 \n", + " -36.65 -324.684 -24.75 -163.716 164.778 24.8 323.622" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "integrate(linearize(calc_residual_vector_integrand, \"displacement\"))(e)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "8x8 Array{Float64,2}:\n", + " 149.721 55.55 84.679 36.65 … -55.55 -136.278 -36.65 \n", + " 55.55 329.69 42.75 167.935 -172.941 -42.8 -324.684\n", + " 84.679 42.75 185.321 105.05 -123.05 -73.522 -24.75 \n", + " 36.65 167.935 105.05 340.54 -344.759 -24.8 -163.716\n", + " -98.122 -55.5 -196.478 -116.9 135.8 76.233 36.6 \n", + " -55.55 -172.941 -123.05 -344.759 … 352.922 42.8 164.778\n", + " -136.278 -42.8 -73.522 -24.8 42.8 133.567 24.8 \n", + " -36.65 -324.684 -24.75 -163.716 164.778 24.8 323.622" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "linearize(integrate(calc_residual_vector_integrand), \"displacement\")(e)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "8x8 Array{Float64,2}:\n", + " 149.721 55.55 84.679 36.65 … -55.55 -136.278 -36.65 \n", + " 55.55 329.69 42.75 167.935 -172.941 -42.8 -324.684\n", + " 84.679 42.75 185.321 105.05 -123.05 -73.522 -24.75 \n", + " 36.65 167.935 105.05 340.54 -344.759 -24.8 -163.716\n", + " -98.122 -55.5 -196.478 -116.9 135.8 76.233 36.6 \n", + " -55.55 -172.941 -123.05 -344.759 … 352.922 42.8 164.778\n", + " -136.278 -42.8 -73.522 -24.8 42.8 133.567 24.8 \n", + " -36.65 -324.684 -24.75 -163.716 164.778 24.8 323.622" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "linearize(integrate(calc_residual_vector_integrand), e, \"displacement\")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "8x8 Array{Float64,2}:\n", + " 149.721 55.55 84.679 36.65 … -55.55 -136.278 -36.65 \n", + " 55.55 329.69 42.75 167.935 -172.941 -42.8 -324.684\n", + " 84.679 42.75 185.321 105.05 -123.05 -73.522 -24.75 \n", + " 36.65 167.935 105.05 340.54 -344.759 -24.8 -163.716\n", + " -98.122 -55.5 -196.478 -116.9 135.8 76.233 36.6 \n", + " -55.55 -172.941 -123.05 -344.759 … 352.922 42.8 164.778\n", + " -136.278 -42.8 -73.522 -24.8 42.8 133.567 24.8 \n", + " -36.65 -324.684 -24.75 -163.716 164.778 24.8 323.622" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "linearize!(integrate(calc_residual_vector_integrand), e, \"displacement\", \"displacement tangent stiffness\")\n", + "e.attributes[\"displacement tangent stiffness\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "8x8 Array{Float64,2}:\n", + " 149.721 55.55 84.679 36.65 … -55.55 -136.278 -36.65 \n", + " 55.55 329.69 42.75 167.935 -172.941 -42.8 -324.684\n", + " 84.679 42.75 185.321 105.05 -123.05 -73.522 -24.75 \n", + " 36.65 167.935 105.05 340.54 -344.759 -24.8 -163.716\n", + " -98.122 -55.5 -196.478 -116.9 135.8 76.233 36.6 \n", + " -55.55 -172.941 -123.05 -344.759 … 352.922 42.8 164.778\n", + " -136.278 -42.8 -73.522 -24.8 42.8 133.567 24.8 \n", + " -36.65 -324.684 -24.75 -163.716 164.778 24.8 323.622" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "integrate!(linearize(calc_residual_vector_integrand, \"displacement\"), e, \"displacement tangent stiffness\")\n", + "e.attributes[\"displacement tangent stiffness\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Validations" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Converged in 6 iterations.\n" + ] + }, + { + "data": { + "text/plain": [ + "2x4 Array{Float64,2}:\n", + " 0.0 -0.399145 -0.0722858 0.0\n", + " 0.0 -2.17799 -2.22224 0.0" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "free_dofs = [3, 4, 5, 6]\n", + "u = zeros(2, 4)\n", + "du = zeros(2, 4)\n", + "F = [0 0; 0 0; 0 -2; 0 0]'\n", + "for i=1:10\n", + " e.attributes[\"displacement\"] = u\n", + " K = linearize(integrate(calc_residual_vector_integrand), \"displacement\")(e)\n", + " R = integrate(calc_residual_vector_integrand)(e)\n", + " du[free_dofs] = K[free_dofs, free_dofs] \\ -(R - F)[free_dofs]\n", + " u += du\n", + " if norm(du) < 1.0e-9\n", + " println(\"Converged in $i iterations.\")\n", + " break\n", + " end\n", + "end\n", + "u # -2.222244754401764" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 0.4.0-dev", + "language": "julia", + "name": "julia-0.4" + }, + "language_info": { + "name": "julia", + "version": "0.4.0" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/src/math.jl b/src/math.jl index df1e010..5f0864b 100644 --- a/src/math.jl +++ b/src/math.jl @@ -1,6 +1,10 @@ # This file is a part of JuliaFEM. # License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md +""" +This module contains math stuff, including interpolation, integration, linearization, ... +""" + using JuliaFEM using ForwardDiff @@ -59,16 +63,23 @@ function interpolate(e::Element, field::ASCIIString, x::Array{Float64,1}; deriva end +""" + +""" function get_basis(el::Element, xi) return el.basis(xi) end +""" +Return partial derivatives of shape functions w.r.t X using chain rule. +""" function get_dbasisdX(el::Element, xi) J = interpolate(el, "coordinates", xi; derivative=true) dbasisdX = el.dbasis(xi)*inv(J) return dbasisdX end + """ Linearize function f w.r.t some given field, i.e. calculate dR/du @@ -78,14 +89,35 @@ f::Function (possibly) nonlinear function to linearize field::ASCIIString field variable + +Returns +------- +Array{Float64, 2} + jacobian / "tangent stiffness matrix" + +""" +function linearize(f::Function, el::JuliaFEM.Element, field::ASCIIString) + dim, nnodes = size(el.attributes[field]) + function helper!(x, y) + orig = copy(el.attributes[field]) + el.attributes[field] = reshape(x, dim, nnodes) + y[:] = f(el) + el.attributes[field] = copy(orig) + end + jac = ForwardDiff.forwarddiff_jacobian(helper!, Float64, fadtype=:dual, n=dim*nnodes, m=dim*nnodes) + return jac(el.attributes[field][:]) +end + +""" +This version returns another function which can be then evaluated against field """ function linearize(f::Function, field::ASCIIString) - function jacobian(el::Element, xi) + function jacobian(el::JuliaFEM.Element, args...) dim, nnodes = size(el.attributes[field]) function helper!(x, y) orig = copy(el.attributes[field]) el.attributes[field] = reshape(x, dim, nnodes) - y[:] = f(el, xi) + y[:] = f(el, args...) el.attributes[field] = copy(orig) end jac = ForwardDiff.forwarddiff_jacobian(helper!, Float64, fadtype=:dual, n=dim*nnodes, m=dim*nnodes) @@ -94,6 +126,23 @@ function linearize(f::Function, field::ASCIIString) return jacobian end +""" +In-place version, no additional garbage collection. +""" +function linearize!(f::Function, el::JuliaFEM.Element, field::ASCIIString, target::ASCIIString) + el.attributes[target][:] = 0.0 + dim, nnodes = size(el.attributes[field]) + function helper!(x, y) + orig = copy(el.attributes[field]) + el.attributes[field] = reshape(x, dim, nnodes) + y[:] = f(el) + el.attributes[field] = copy(orig) + end + jac! = ForwardDiff.forwarddiff_jacobian!(helper!, Float64, fadtype=:dual, n=dim*nnodes, m=dim*nnodes) + jac!(el.attributes[field][:], el.attributes[target]) +end + + """ Integrate f over element using Gaussian quadrature rules. @@ -138,12 +187,11 @@ This version saves results inplace to target, garbage collection free """ function integrate!(f::Function, el::JuliaFEM.Element, target) # set target to zero - target[:] = 0.0 + el.attributes[target][:] = 0.0 for m = 1:length(el.iweights) w = el.iweights[m] xi = el.ipoints[:, m] J = JuliaFEM.interpolate(el, "coordinates", xi; derivative=true) - target[:,:] += w*f(el, xi)*det(J) + el.attributes[target][:,:] += w*f(el, xi)*det(J) end end - From 21c9c19f1d53f3776766258ffd60ffda79d934ee Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Mon, 17 Aug 2015 21:46:58 +0300 Subject: [PATCH 20/26] Minor update. Again working on elasticity solver notebook. --- ...2015-06-25-elasticity-solver-example.ipynb | 786 +++++------------- src/math.jl | 2 +- 2 files changed, 227 insertions(+), 561 deletions(-) diff --git a/notebooks/2015-06-25-elasticity-solver-example.ipynb b/notebooks/2015-06-25-elasticity-solver-example.ipynb index 361a2d5..2c4110f 100644 --- a/notebooks/2015-06-25-elasticity-solver-example.ipynb +++ b/notebooks/2015-06-25-elasticity-solver-example.ipynb @@ -36,7 +36,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": { "collapsed": false }, @@ -47,35 +47,14 @@ "Logger(root,DEBUG,Pipe(open, 0 bytes waiting),root)" ] }, - "execution_count": 1, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", - " in int32 at deprecated.jl:49\n", - " in recv at /Users/jukka/.julia/v0.4/ZMQ/src/ZMQ.jl:617\n", - " in recv_ipython at /Users/jukka/.julia/v0.4/IJulia/src/msg.jl:63\n", - " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:120\n", - " in anonymous at task.jl:365\n", - "while loading /Users/jukka/.julia/v0.4/IJulia/src/kernel.jl, in expression starting on line 35\n", - "WARNING: int32(x) is deprecated, use Int32(x) instead.\n", - " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", - " in int32 at deprecated.jl:49\n", - " in recv at /Users/jukka/.julia/v0.4/ZMQ/src/ZMQ.jl:617\n", - " in recv_ipython at /Users/jukka/.julia/v0.4/IJulia/src/msg.jl:63\n", - " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:120\n", - " in anonymous at task.jl:365\n", - "while loading /Users/jukka/.julia/v0.4/IJulia/src/kernel.jl, in expression starting on line 35\n" - ] } ], "source": [ + "using JuliaFEM\n", "using Logging\n", - "using ForwardDiff\n", "Logging.configure(level=DEBUG)" ] }, @@ -89,12 +68,12 @@ "\n", "*Design principle 5*: we use 4 space indentation like in Python.\n", "\n", - "First we write some elementary functions to calculate stiffness matrix." + "Our task is: for given $\\mathbf{u}$ calculate $\\mathbf{R}(\\mathbf{u}) = \\mathbf{T}(\\mathbf{u}) - \\mathbf{F}(\\mathbf{u})$ and it's partial derivative with respect to $\\mathbf{u}$, i.e. $\\partial \\mathbf{R}(\\mathbf{u}) / \\partial \\mathbf{u}$." ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": { "collapsed": false }, @@ -102,144 +81,56 @@ { "data": { "text/plain": [ - "calc_local_matrices! (generic function with 1 method)" + "jacobian (generic function with 1 method)" ] }, - "execution_count": 2, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "\"\"\"\n", - "Calculate local tangent stiffness matrix and residual force vector\n", - "R = T - F for elasticity problem.\n", - "\n", - "Parameters\n", - "----------\n", - "X : Element coordinates\n", - "u : Displacement field\n", - "R : Residual force vector\n", - "K : Tangent stiffness matrix\n", - "basis : Basis functions\n", - "dbasis : Derivative of basis functions\n", - "lambda : Material parameter\n", - "mu : Material parameter\n", - "ipoints : integration points\n", - "iweights : integration weights\n", - "\n", - "Returns\n", - "-------\n", - "None\n", - "\n", - "Notes\n", - "-----\n", - "If material parameters are given in list, they are interpolated to gauss\n", - "points using shape functions.\n", - "\n", - "Examples\n", - "--------\n", - "\n", - "\"\"\"\n", - "function calc_local_matrices2!(X, u, R, K, basis, dbasis, lambda_, mu_, ipoints, iweights)\n", - " dim, nnodes = size(X)\n", - " I = eye(dim)\n", - " R[:,:] = 0.0\n", - " K[:,:] = 0.0\n", - "\n", - " dF = zeros(dim, dim)\n", - "\n", - " for m = 1:length(iweights)\n", - " w = iweights[m]\n", - " xi = ipoints[m, :]\n", - " # calculate material parameters\n", - " lambda = typeof(lambda_) == Float64 ? lambda_ : dot(lambda_, basis(xi))\n", - " mu = typeof(mu_) == Float64 ? mu_ : dot(mu_, basis(xi))\n", - " Jt = X*dbasis(xi)\n", - " detJ = det(Jt)\n", - " dbasisdX = dbasis(xi)*inv(Jt)\n", + "function calc_residual_vector_integrand(el::JuliaFEM.Element, xi)\n", + " # Calculate dN/dX\n", + " dbasisdX = JuliaFEM.get_dbasisdX(el, xi)\n", "\n", + " # Calculate residual force vector R(u) = T(u) - F(u)\n", + " function T(u)\n", + " # kinematics\n", " gradu = u*dbasisdX\n", - " F = I + gradu # Deformation gradient\n", - " E = 1/2*(gradu' + gradu + gradu'*gradu) # Green-Lagrange strain tensor\n", - " S = lambda*trace(E)*I + 2*mu*E # PK2 stress tensor\n", - " P = F*S # PK1 stress tensor\n", - "\n", - " R[:,:] += w*P*dbasisdX'*detJ\n", - "\n", - " for p = 1:nnodes\n", - " for i = 1:dim\n", - " dF[:,:] = 0.0\n", - " dF[i,:] = dbasisdX[p,:]\n", - " dE = 1/2*(F'*dF + dF'*F)\n", - " dS = lambda*trace(dE)*I + 2*mu*dE\n", - " dP = dF*S + F*dS\n", - " for q = 1:nnodes\n", - " for j = 1:dim\n", - " K[dim*(p-1)+i,dim*(q-1)+j] += w*(dP[j,:]*dbasisdX[q,:]')[1]*detJ\n", - " end\n", - " end\n", - " end\n", - " end\n", - "\n", + " F = I + gradu\n", + " E = 1/2*(gradu' + gradu + gradu'*gradu)\n", + " # constitutive equation\n", + " lambda = JuliaFEM.interpolate(el, \"lambda\", xi)\n", + " mu = JuliaFEM.interpolate(el, \"mu\", xi)\n", + " S = lambda*trace(E)*I + 2*mu*E\n", + " P = F*S\n", + " T = P*dbasisdX'\n", + " return T\n", " end\n", + "\n", + " u = el.attributes[\"displacement\"]\n", + " R(u) = T(u)\n", + " return R(u) # we skip calculating external force vector for now.\n", "end\n", "\n", - "\"\"\"\n", - "Autodiff version.\n", - "\"\"\"\n", - "function calc_local_matrices!(X, u, R, K, basis, dbasis, lambda_, mu_, ipoints, iweights)\n", - " dim, nnodes = size(X)\n", - " I = eye(dim)\n", - " R[:,:] = 0.0\n", - "\n", - " #dF = zeros(dim, dim)\n", - "\n", - " function calc_R!(u, R)\n", - " for m = 1:length(iweights)\n", - " w = iweights[m]\n", - " xi = ipoints[m, :]\n", - " # calculate material parameters\n", - " lambda = typeof(lambda_) == Float64 ? lambda_ : dot(lambda_, basis(xi))\n", - " mu = typeof(mu_) == Float64 ? mu_ : dot(mu_, basis(xi))\n", - " Jt = X*dbasis(xi)\n", - " detJ = det(Jt)\n", - " dbasisdX = dbasis(xi)*inv(Jt)\n", - "\n", - " gradu = u*dbasisdX\n", - " F = I + gradu # Deformation gradient\n", - " E = 1/2*(gradu' + gradu + gradu'*gradu) # Green-Lagrange strain tensor\n", - " S = lambda*trace(E)*I + 2*mu*E # PK2 stress tensor\n", - " P = F*S # PK1 stress tensor\n", - "\n", - " R[:,:] += w*P*dbasisdX'*detJ\n", - " end\n", - " end\n", - "\n", - " # herlper for tangent stiffness matrix\n", - " function R!(u, R)\n", - " R[:] = 0\n", - " calc_R!(reshape(u, dim, nnodes), reshape(R, dim, nnodes))\n", - " #calc_Wext!(reshape(u, 2, 4), reshape(R, 2, 4))\n", - " end\n", - " Jacobian = ForwardDiff.forwarddiff_jacobian(R!, Float64, fadtype=:dual, n=dim*nnodes, m=dim*nnodes)\n", - "\n", - " K[:, :] = Jacobian(reshape(u, dim*nnodes))\n", - " R!(reshape(u, dim*nnodes), reshape(R, dim*nnodes))\n", - "\n", - "end" + "calc_residual_vector = JuliaFEM.integrate(calc_residual_vector_integrand)\n", + "# calculate partial derivatives of R with respect to field \"displacement\"\n", + "calc_tangent_stiffness = JuliaFEM.linearize(calc_residual_vector, \"displacement\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ + "That was our geometrically nonlinear elasticity solver. Note how we used automatic differentiation to linearize residual vector.\n", + "\n", "*Design principle 6*: we test our code. We use FactCheck for testing." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": { "collapsed": true }, @@ -250,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": { "collapsed": false, "scrolled": false @@ -267,62 +158,23 @@ "name": "stderr", "output_type": "stream", "text": [ - "13-Aug 00:37:26:DEBUG:root:Converged in 6 iterations.\n", - "13-Aug 00:37:26:DEBUG:root:solution vector: \n", + "17-Aug 18:21:25:DEBUG:root:Converged in 6 iterations.\n", + "17-Aug 18:21:25:DEBUG:root:solution vector: \n", " [0.0 -0.3991450609547433 -0.07228582695592461 0.0\n", " 0.0 -2.1779892317073504 -2.222244754401764 0.0]\n", - "13-Aug 00:37:26:DEBUG:root:norm of u: 3.1292483947150047\n", - "13-Aug 00:37:27:DEBUG:root:Converged in 6 iterations.\n", - "13-Aug 00:37:27:DEBUG:root:solution vector: \n", + "17-Aug 18:21:25:DEBUG:root:norm of u: 3.1292483947150047\n", + "17-Aug 18:21:25:DEBUG:root:Converged in 6 iterations.\n", + "17-Aug 18:21:25:DEBUG:root:solution vector: \n", " [0.0 0.7433248532717796 1.048521014723486 0.0\n", " 0.0 -2.085766534304891 -1.9606633242166027 0.0]\n", - "13-Aug 00:37:27:DEBUG:root:norm of u: 3.1292483947150056\n", - "13-Aug 00:37:27:DEBUG:root:Iteration 1\n" + "17-Aug 18:21:26:DEBUG:root:norm of u: 3.1292483947150056\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Array(Float64,(12,12)) 12x12 Array{Float64,2}" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "13-Aug 00:37:27:DEBUG:root:Norm of du: 0.5992228342549063\n", - "13-Aug 00:37:27:DEBUG:root:Element displacement: [0.0 -0.02264423092574128 0.022536491965822688 0.0\n", - " 0.0 -0.12688379170176511 -0.12679760053383046 0.0]\n", - "13-Aug 00:37:27:DEBUG:root:Element displacement: [-0.02264423092574128 -0.029998807330416523 0.030242156525002267 0.022536491965822688\n", - " -0.12688379170176511 -0.4041002710283739 -0.40446733271991214 -0.12679760053383046]\n", - "13-Aug 00:37:27:DEBUG:root:solution vector: \n", - " [-0.02264423092574128 -0.029998807330416523 0.022536491965822688 0.030242156525002267 0.0 0.0\n", - " -0.12688379170176511 -0.4041002710283739 -0.12679760053383046 -0.40446733271991214 0.0 0.0]\n", - "13-Aug 00:37:27:DEBUG:root:norm of u: 0.5992228342549063\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - ":\n", - " 132.8 0.0 23.6 -3.0 -113.6 … 23.6 3.0 -33.2 15.0\n", - " 0.0 324.8 3.0 77.6 0.0 -3.0 77.6 15.0 -81.2\n", - " 23.6 3.0 66.4 -15.0 -33.2 0.0 0.0 0.0 0.0\n", - " -3.0 77.6 -15.0 162.4 15.0 0.0 0.0 0.0 0.0\n", - " -113.6 0.0 -33.2 15.0 132.8 -33.2 -15.0 23.6 -3.0\n", - " 0.0 -317.6 15.0 -81.2 0.0 … -15.0 -81.2 3.0 77.6\n", - " -33.2 -15.0 -56.8 3.0 23.6 0.0 0.0 0.0 0.0\n", - " -15.0 -81.2 -3.0 -158.8 3.0 0.0 0.0 0.0 0.0\n", - " 23.6 -3.0 0.0 0.0 -33.2 66.4 15.0 -56.8 3.0\n", - " 3.0 77.6 0.0 0.0 -15.0 15.0 162.4 -3.0 -158.8\n", - " -33.2 15.0 0.0 0.0 23.6 … -56.8 -3.0 66.4 -15.0\n", - " 15.0 -81.2 0.0 0.0 -3.0 3.0 -158.8 -15.0 162.4\n", - "K norm = 708.0378644377365\n", - "du = [-0.02264423092574128 -0.029998807330416523 0.022536491965822688 0.030242156525002267 0.0 0.0\n", - " -0.12688379170176511 -0.4041002710283739 -0.12679760053383046 -0.40446733271991214 0.0 0.0]\n", - "Out of 3 total facts:" + "2 facts verified.\n" ] }, { @@ -331,47 +183,52 @@ "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 4, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "facts(\"test solve one element model\") do\n", - " X = [0.0 0.0; 10.0 0.0; 10.0 1.0; 0.0 1.0]'\n", - " F = [0 0; 0 0; 0 -2; 0 0]'\n", - "\n", - " # Material properties\n", - " E = 90\n", - " nu = 0.25\n", - " mu = E/(2*(1+nu))\n", - " la = E*nu/((1+nu)*(1-2*nu))\n", - " la = 2*la*mu/(la + 2*mu)\n", - "\n", - " u = zeros(2, 4)\n", - " du = zeros(2, 4)\n", - " R = zeros(2, 4)\n", - " K = zeros(8, 8)\n", - "\n", + "function get_test_element()\n", + " # set up one linear quadrangle element\n", " basis(xi) = [\n", " (1-xi[1])*(1-xi[2])/4\n", " (1+xi[1])*(1-xi[2])/4\n", " (1+xi[1])*(1+xi[2])/4\n", " (1-xi[1])*(1+xi[2])/4]\n", - "\n", " dbasis(xi) = [-(1-xi[2])/4.0 -(1-xi[1])/4.0\n", " (1-xi[2])/4.0 -(1+xi[1])/4.0\n", " (1+xi[2])/4.0 (1+xi[1])/4.0\n", " -(1+xi[2])/4.0 (1-xi[1])/4.0]\n", + " ipoints = 1/sqrt(3)*[-1 -1; 1 -1; 1 1; -1 1]'\n", + " iweights = [1.0, 1.0, 1.0, 1.0]\n", + " attributes = Dict()\n", + " e = JuliaFEM.Element(1, [1, 2, 3, 4], basis, dbasis, attributes, ipoints, iweights)\n", + " E = 90.0\n", + " nu = 0.25\n", + " mu = E/(2*(1+nu))\n", + " la = E*nu/((1+nu)*(1-2*nu))\n", + " la = 2*la*mu/(la + 2*mu)\n", + " e.attributes[\"coordinates\"] = [0.0 0.0; 10.0 0.0; 10.0 1.0; 0.0 1.0]'\n", + " e.attributes[\"lambda\"] = la\n", + " e.attributes[\"mu\"] = mu\n", + " e.attributes[\"displacement\"] = [0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0]'\n", + " return e\n", + "end\n", + "\n", + "facts(\"test solve one element model\") do\n", + "\n", + " e = get_test_element()\n", + " F = [0.0 0.0; 0.0 0.0; 0.0 -2.0; 0.0 0.0]'\n", + "\n", + " du = zeros(2, 4)\n", "\n", - " ipoints = 1/sqrt(3)*[-1 -1; 1 -1; 1 1; -1 1]\n", - " iweights = [1, 1, 1, 1]\n", " free_dofs = [3, 4, 5, 6]\n", - "\n", " for i=1:10\n", - " calc_local_matrices!(X, u, R, K, basis, dbasis, la, mu, ipoints, iweights)\n", + " R = calc_residual_vector(e)\n", + " K = calc_tangent_stiffness(e)\n", " du[free_dofs] = K[free_dofs, free_dofs] \\ -(R - F)[free_dofs]\n", - " u += du\n", + " e.attributes[\"displacement\"] += du\n", " if norm(du) < 1.0e-9\n", " Logging.debug(\"Converged in $i iterations.\")\n", " break\n", @@ -379,73 +236,36 @@ " end\n", "\n", " # Tested against Elmer solution\n", + " u = e.attributes[\"displacement\"]\n", " Logging.debug(\"solution vector: \\n $u\")\n", " @fact u[2, 3] --> roughly(-2.222244754401764)\n", " norm1 = norm(u)\n", " Logging.debug(\"norm of u: $(norm(u))\")\n", "\n", - " # We rotate model a bit and make sure that L2 norm is same\n", + " # We rotate model a bit and make sure that norm remains same\n", " phi = 30/180*pi\n", " rmat = [\n", " cos(phi) -sin(phi)\n", " sin(phi) cos(phi)]\n", - " X = rmat*X\n", + " e.attributes[\"coordinates\"] = rmat*e.attributes[\"coordinates\"]\n", " F = rmat*F\n", - " u = zeros(2, 4)\n", + "\n", + " e.attributes[\"displacement\"] = [0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0]'\n", + " du = zeros(2, 4)\n", " for i=1:10\n", - " calc_local_matrices!(X, u, R, K, basis, dbasis, la, mu, ipoints, iweights)\n", + " R = calc_residual_vector(e)\n", + " K = calc_tangent_stiffness(e)\n", " du[free_dofs] = K[free_dofs, free_dofs] \\ -(R - F)[free_dofs]\n", - " u += du\n", + " e.attributes[\"displacement\"] += du\n", " if norm(du) < 1.0e-9\n", " Logging.debug(\"Converged in $i iterations.\")\n", " break\n", " end\n", " end\n", + " u = e.attributes[\"displacement\"]\n", " Logging.debug(\"solution vector: \\n $u\")\n", " Logging.debug(\"norm of u: $(norm(u))\")\n", " @fact norm(u) --> roughly(norm1) \n", - "\n", - " # test two element model\n", - " X = [0.0 0.0; 5.0 0.0; 5.0 1.0; 0.0 1.0]'\n", - " u = zeros(2, 6)\n", - " du = zeros(2, 6)\n", - " R = zeros(2, 4)\n", - " K = zeros(8, 8)\n", - " ass1 = [9, 10, 1, 2, 5, 6, 11, 12]\n", - " ass2 = [1, 2, 3, 4, 7, 8, 5, 6]\n", - " free_dofs = collect(1:8)\n", - " F = [0 0; 0 0; 0 0; 0 -0.1; 0 0; 0 0]'\n", - "\n", - " A = zeros(12, 12)\n", - " b = zeros(2, 6)\n", - " for i=1:1\n", - " Logging.debug(\"Iteration $i\")\n", - " A[:,:] = 0.0\n", - " b[:] = 0.0\n", - " #Logging.debug(\"Assembling\")\n", - " for ass in (ass1, ass2)\n", - " #Logging.debug(\"ass = $ass, u[ass] = $(u[ass])\")\n", - " calc_local_matrices!(X, u[ass], R, K, basis, dbasis, la, mu, ipoints, iweights)\n", - " A[ass,ass] += K\n", - " b[ass] += R[:]\n", - " end\n", - " dump(round(A, 2))\n", - " println(\"K norm = $(norm(A[free_dofs, free_dofs]))\")\n", - " du[free_dofs] = A[free_dofs, free_dofs] \\ -(b - F)[free_dofs]\n", - " println(\"du = $du\")\n", - " u += du\n", - " Logging.debug(\"Norm of du: $(norm(du))\")\n", - " for ass in (ass1, ass2)\n", - " Logging.debug(\"Element displacement: $(reshape(u[ass], 2, 4))\")\n", - " end\n", - " if norm(du) < 1.0e-9\n", - " Logging.debug(\"Converged in $i iterations.\")\n", - " break\n", - " end\n", - " end\n", - " Logging.debug(\"solution vector: \\n $u\")\n", - " Logging.debug(\"norm of u: $(norm(u))\")\n", - " @pending norm(u) --> :something\n", "end" ] }, @@ -456,160 +276,6 @@ "One element solutions are not particularly interesting so next step is to create function that assembles global matrix from local matrices. Some data types:" ] }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "#type Node\n", - "# id :: Int\n", - "# #elements :: Array{Int64, 1}\n", - "#end" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "type Element\n", - " id :: Int\n", - " node_ids :: Array{Int64, 1}\n", - " coordinates :: Array{Float64, 2}\n", - " attributes :: Dict{ASCIIString, Any}\n", - "end" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - " Verified: 2\n", - " Pending: 1\n" - ] - } - ], - "source": [ - "type Assembly\n", - " # LHS\n", - " I :: Array{Int64, 1}\n", - " J :: Array{Int64, 1}\n", - " A :: Array{Float64, 1}\n", - " # RHS\n", - " i :: Array{Int64, 1}\n", - " b :: Array{Float64, 1}\n", - " # global dofs for each element\n", - " gdofs :: Dict{Int64, Array{Int64, 1}}\n", - "end" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "get_integration_scheme (generic function with 2 methods)" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\"\"\"\n", - "Return shape functions and their derivatives for a element.\n", - "\n", - "Parameters\n", - "----------\n", - "element::Element\n", - "\n", - "Returns\n", - "-------\n", - "tuple (basis, dbasis)\n", - "\"\"\"\n", - "function get_shape_functions(el::Element)\n", - " ndim, nnodes = size(el.coordinates)\n", - " #Logging.debug(\"ndim = $ndim, nnodes=$nnodes\")\n", - " if (nnodes == 4) & (ndim == 2)\n", - " basis(xi) = [\n", - " (1-xi[1])*(1-xi[2])/4\n", - " (1+xi[1])*(1-xi[2])/4\n", - " (1+xi[1])*(1+xi[2])/4\n", - " (1-xi[1])*(1+xi[2])/4]\n", - " dbasis(xi) = [-(1-xi[2])/4.0 -(1-xi[1])/4.0\n", - " (1-xi[2])/4.0 -(1+xi[1])/4.0\n", - " (1+xi[2])/4.0 (1+xi[1])/4.0\n", - " -(1+xi[2])/4.0 (1-xi[1])/4.0]\n", - " return basis, dbasis\n", - " elseif (nnodes == 10) & (ndim == 3)\n", - " basis(xi) = [\n", - " (xi[1] + xi[2] + xi[3] - 1)*(2*xi[1] + 2*xi[2] + 2*xi[3] - 1)\n", - " xi[1]*(2*xi[1] - 1)\n", - " xi[2]*(2*xi[2] - 1)\n", - " xi[3]*(2*xi[3] - 1)\n", - " -4*xi[1]*(xi[1] + xi[2] + xi[3] - 1)\n", - " 4*xi[1]*xi[2]\n", - " -4*xi[2]*(xi[1] + xi[2] + xi[3] - 1)\n", - " -4*xi[3]*(xi[1] + xi[2] + xi[3] - 1)\n", - " 4*xi[1]*xi[3]\n", - " 4*xi[2]*xi[3]\n", - " ]\n", - " dbasis(xi) = [\n", - " 4*xi[1] + 4*xi[2] + 4*xi[3] - 3 4*xi[1] + 4*xi[2] + 4*xi[3] - 3 4*xi[1] + 4*xi[2] + 4*xi[3] - 3\n", - " 4*xi[1] - 1 0 0\n", - " 0 4*xi[2] - 1 0\n", - " 0 0 4*xi[3] - 1\n", - " -4*(2*xi[1] + xi[2] + xi[3] - 1) -4*xi[1] -4*xi[1]\n", - " 4*xi[2] 4*xi[1] 0\n", - " -4*xi[2] -4*(xi[1] + 2*xi[2] + xi[3] - 1) -4*xi[2]\n", - " -4*xi[3] -4*xi[3] -4*(xi[1] + xi[2] + 2*xi[3] - 1)\n", - " 4*xi[3] 0 4*xi[1]\n", - " 0 4*xi[3] 4*xi[2]\n", - " ]\n", - " return basis, dbasis\n", - " end\n", - " throw(\"Unknown function space, ndim=$ndim, nnodes=$nnodes\")\n", - "end\n", - "\n", - "\"\"\"\n", - "\"\"\"\n", - "function get_integration_scheme(el::Element, order=2)\n", - " ndim, nnodes = size(el.coordinates)\n", - " if (nnodes == 4) & (order == 2) & (ndim == 2)\n", - " ipoints = 1/sqrt(3)*[-1 -1; 1 -1; 1 1; -1 1]\n", - " iweights = [1, 1, 1, 1]\n", - " return ipoints, iweights\n", - " elseif (nnodes == 10) & (order == 2) & (ndim == 3) # c3d10\n", - " # from code aster documentation\n", - " a = 1/20*(5-sqrt(5))\n", - " b = 1/20*(5+3*sqrt(5))\n", - " ipoints = [a a a; a a b; a b a; b a a]\n", - " iweights = 1/24*[1 1 1 1]\n", - " return ipoints, iweights\n", - " end\n", - "end" - ] - }, { "cell_type": "code", "execution_count": 9, @@ -629,7 +295,7 @@ } ], "source": [ - "function assemble_element!(ass::Assembly, el::Element, io=2)\n", + "function assemble_element!(ass::Assembly, el::Element)\n", "\n", " # Material properties\n", " E = el.attributes[\"Young\"]\n", @@ -699,28 +365,28 @@ "name": "stderr", "output_type": "stream", "text": [ - "13-Aug 00:37:30:DEBUG:root:Adding nodes to array\n", - "13-Aug 00:37:30:DEBUG:root:Creating elements\n", - "13-Aug 00:37:30:DEBUG:root:Starting iteration 1\n", - "13-Aug 00:37:30:DEBUG:root:Assembling\n", - "13-Aug 00:37:30:DEBUG:root:Solution norm = 3.090022136728999\n", - "13-Aug 00:37:30:DEBUG:root:Starting iteration 2\n", - "13-Aug 00:37:30:DEBUG:root:Assembling\n", - "13-Aug 00:37:30:DEBUG:root:Solution norm = 0.32121316021535135\n", - "13-Aug 00:37:30:DEBUG:root:Starting iteration 3\n", - "13-Aug 00:37:30:DEBUG:root:Assembling\n", - "13-Aug 00:37:30:DEBUG:root:Solution norm = 0.040431781939994194\n", - "13-Aug 00:37:30:DEBUG:root:Starting iteration 4\n", - "13-Aug 00:37:30:DEBUG:root:Assembling\n", - "13-Aug 00:37:30:DEBUG:root:Solution norm = 0.0009291101052124042\n", - "13-Aug 00:37:30:DEBUG:root:Starting iteration 5\n", - "13-Aug 00:37:30:DEBUG:root:Assembling\n", - "13-Aug 00:37:30:DEBUG:root:Solution norm = 1.5638899022213175e-7\n", - "13-Aug 00:37:30:DEBUG:root:Starting iteration 6\n", - "13-Aug 00:37:30:DEBUG:root:Assembling\n", - "13-Aug 00:37:30:DEBUG:root:Solution norm = 1.0118539067290854e-14\n", - "13-Aug 00:37:30:DEBUG:root:Converged in 6 iterations.\n", - "13-Aug 00:37:30:DEBUG:root:Displacement of element = \n", + "15-Aug 17:03:55:DEBUG:root:Adding nodes to array\n", + "15-Aug 17:03:55:DEBUG:root:Creating elements\n", + "15-Aug 17:03:55:DEBUG:root:Starting iteration 1\n", + "15-Aug 17:03:55:DEBUG:root:Assembling\n", + "15-Aug 17:03:57:DEBUG:root:Solution norm = 3.090022136728999\n", + "15-Aug 17:03:57:DEBUG:root:Starting iteration 2\n", + "15-Aug 17:03:57:DEBUG:root:Assembling\n", + "15-Aug 17:03:57:DEBUG:root:Solution norm = 0.32121316021535135\n", + "15-Aug 17:03:57:DEBUG:root:Starting iteration 3\n", + "15-Aug 17:03:57:DEBUG:root:Assembling\n", + "15-Aug 17:03:57:DEBUG:root:Solution norm = 0.040431781939994194\n", + "15-Aug 17:03:57:DEBUG:root:Starting iteration 4\n", + "15-Aug 17:03:57:DEBUG:root:Assembling\n", + "15-Aug 17:03:57:DEBUG:root:Solution norm = 0.0009291101052124042\n", + "15-Aug 17:03:57:DEBUG:root:Starting iteration 5\n", + "15-Aug 17:03:57:DEBUG:root:Assembling\n", + "15-Aug 17:03:57:DEBUG:root:Solution norm = 1.5638899022213175e-7\n", + "15-Aug 17:03:58:DEBUG:root:Starting iteration 6\n", + "15-Aug 17:03:58:DEBUG:root:Assembling\n", + "15-Aug 17:03:58:DEBUG:root:Solution norm = 1.0118539067290854e-14\n", + "15-Aug 17:03:58:DEBUG:root:Converged in 6 iterations.\n", + "15-Aug 17:03:58:DEBUG:root:Displacement of element = \n", "[-0.39914506095474334 -0.0722858269559246 0.0 0.0\n", " -2.1779892317073504 -2.2222447544017645 0.0 0.0]\n" ] @@ -844,48 +510,48 @@ "name": "stderr", "output_type": "stream", "text": [ - "13-Aug 00:37:31:DEBUG:root:Creating elements\n", - "13-Aug 00:37:31:INFO:root:create_ldof2gdofmap: dofs per node: 2\n", - "13-Aug 00:37:31:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],5=>[9,10],6=>[11,12],1=>[1,2])\n", - "13-Aug 00:37:32:INFO:root:solve!: dofs per node: 2\n", - "13-Aug 00:37:32:DEBUG:root:Problem size = 12\n", - "13-Aug 00:37:32:DEBUG:root:Starting iteration 1\n", - "13-Aug 00:37:32:DEBUG:root:Assembling\n", - "13-Aug 00:37:32:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "13-Aug 00:37:32:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "13-Aug 00:37:32:DEBUG:root:Adding Neumann boundary conditions\n", - "13-Aug 00:37:32:DEBUG:root:Solving system of equations. Total size = 16\n", - "13-Aug 00:37:32:DEBUG:root:Solution norm du = 0.6015838690633517\n", - "13-Aug 00:37:32:DEBUG:root:Starting iteration 2\n", - "13-Aug 00:37:32:DEBUG:root:Assembling\n", - "13-Aug 00:37:32:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "13-Aug 00:37:32:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "13-Aug 00:37:32:DEBUG:root:Adding Neumann boundary conditions\n", - "13-Aug 00:37:32:DEBUG:root:Solving system of equations. Total size = 16\n", - "13-Aug 00:37:32:DEBUG:root:Solution norm du = 0.013420417380980414\n", - "13-Aug 00:37:33:DEBUG:root:Starting iteration 3\n", - "13-Aug 00:37:33:DEBUG:root:Assembling\n", - "13-Aug 00:37:33:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "13-Aug 00:37:33:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "13-Aug 00:37:33:DEBUG:root:Adding Neumann boundary conditions\n", - "13-Aug 00:37:33:DEBUG:root:Solving system of equations. Total size = 16\n", - "13-Aug 00:37:33:DEBUG:root:Solution norm du = 0.00032202957936854873\n", - "13-Aug 00:37:33:DEBUG:root:Starting iteration 4\n", - "13-Aug 00:37:33:DEBUG:root:Assembling\n", - "13-Aug 00:37:33:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "13-Aug 00:37:33:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "13-Aug 00:37:33:DEBUG:root:Adding Neumann boundary conditions\n", - "13-Aug 00:37:33:DEBUG:root:Solving system of equations. Total size = 16\n", - "13-Aug 00:37:33:DEBUG:root:Solution norm du = 9.906677094801476e-8\n", - "13-Aug 00:37:33:DEBUG:root:Starting iteration 5\n", - "13-Aug 00:37:33:DEBUG:root:Assembling\n", - "13-Aug 00:37:33:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "13-Aug 00:37:33:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "13-Aug 00:37:33:DEBUG:root:Adding Neumann boundary conditions\n", - "13-Aug 00:37:33:DEBUG:root:Solving system of equations. Total size = 16\n", - "13-Aug 00:37:33:DEBUG:root:Solution norm du = 5.027624635820698e-15\n", - "13-Aug 00:37:33:DEBUG:root:Converged in 5 iterations.\n", - "13-Aug 00:37:33:DEBUG:root:Displacement of element = \n", + "15-Aug 17:03:59:DEBUG:root:Creating elements\n", + "15-Aug 17:03:59:INFO:root:create_ldof2gdofmap: dofs per node: 2\n", + "15-Aug 17:04:00:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],5=>[9,10],6=>[11,12],1=>[1,2])\n", + "15-Aug 17:04:04:INFO:root:solve!: dofs per node: 2\n", + "15-Aug 17:04:04:DEBUG:root:Problem size = 12\n", + "15-Aug 17:04:04:DEBUG:root:Starting iteration 1\n", + "15-Aug 17:04:04:DEBUG:root:Assembling\n", + "15-Aug 17:04:05:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "15-Aug 17:04:05:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "15-Aug 17:04:05:DEBUG:root:Adding Neumann boundary conditions\n", + "15-Aug 17:04:05:DEBUG:root:Solving system of equations. Total size = 16\n", + "15-Aug 17:04:05:DEBUG:root:Solution norm du = 0.6015838690633517\n", + "15-Aug 17:04:05:DEBUG:root:Starting iteration 2\n", + "15-Aug 17:04:05:DEBUG:root:Assembling\n", + "15-Aug 17:04:05:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "15-Aug 17:04:05:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "15-Aug 17:04:05:DEBUG:root:Adding Neumann boundary conditions\n", + "15-Aug 17:04:05:DEBUG:root:Solving system of equations. Total size = 16\n", + "15-Aug 17:04:05:DEBUG:root:Solution norm du = 0.013420417380980414\n", + "15-Aug 17:04:05:DEBUG:root:Starting iteration 3\n", + "15-Aug 17:04:05:DEBUG:root:Assembling\n", + "15-Aug 17:04:05:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "15-Aug 17:04:05:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "15-Aug 17:04:05:DEBUG:root:Adding Neumann boundary conditions\n", + "15-Aug 17:04:06:DEBUG:root:Solving system of equations. Total size = 16\n", + "15-Aug 17:04:06:DEBUG:root:Solution norm du = 0.00032202957936854873\n", + "15-Aug 17:04:06:DEBUG:root:Starting iteration 4\n", + "15-Aug 17:04:06:DEBUG:root:Assembling\n", + "15-Aug 17:04:06:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "15-Aug 17:04:06:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "15-Aug 17:04:06:DEBUG:root:Adding Neumann boundary conditions\n", + "15-Aug 17:04:06:DEBUG:root:Solving system of equations. Total size = 16\n", + "15-Aug 17:04:06:DEBUG:root:Solution norm du = 9.906677094801476e-8\n", + "15-Aug 17:04:06:DEBUG:root:Starting iteration 5\n", + "15-Aug 17:04:06:DEBUG:root:Assembling\n", + "15-Aug 17:04:06:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "15-Aug 17:04:06:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "15-Aug 17:04:06:DEBUG:root:Adding Neumann boundary conditions\n", + "15-Aug 17:04:06:DEBUG:root:Solving system of equations. Total size = 16\n", + "15-Aug 17:04:06:DEBUG:root:Solution norm du = 5.027624635820698e-15\n", + "15-Aug 17:04:06:DEBUG:root:Converged in 5 iterations.\n", + "15-Aug 17:04:06:DEBUG:root:Displacement of element = \n", "[-0.02442313597467864 -0.039356000063335075 0.021097993207232584 0.020877031423993653\n", " -0.12673626841485705 -0.40433021969759375 -0.40656320177872923 -0.1275776940913048]\n" ] @@ -1136,7 +802,7 @@ "\n", "WARNING: deprecated syntax \"{a=>b, ...}\" at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:32.\n", "Use \"Dict{Any,Any}(a=>b, ...)\" instead.\n", - "13-Aug 00:37:37:INFO:root:Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\"]\n", + "15-Aug 17:04:20:INFO:root:Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\"]\n", "WARNING: beginswith is deprecated, use startswith instead.\n", " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", " in beginswith at deprecated.jl:30\n", @@ -1155,8 +821,8 @@ " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", " in anonymous at task.jl:365\n", "while loading In[13], in expression starting on line 3\n", - "13-Aug 00:37:38:DEBUG:root:Found NODE section\n", - "13-Aug 00:37:38:DEBUG:root:Found ELEMENT section\n", + "15-Aug 17:04:21:DEBUG:root:Found NODE section\n", + "15-Aug 17:04:22:DEBUG:root:Found ELEMENT section\n", "WARNING: integer(s::AbstractString) is deprecated, use parse(Int,s) instead.\n", " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", " in integer at deprecated.jl:49\n", @@ -1169,14 +835,14 @@ " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", " in anonymous at task.jl:365\n", "while loading In[13], in expression starting on line 3\n", - "13-Aug 00:37:39:DEBUG:root:120 elements found\n", - "13-Aug 00:37:40:INFO:root:Creating ELSET Body1\n", - "13-Aug 00:37:40:DEBUG:root:Found NSET section\n", - "13-Aug 00:37:40:DEBUG:root:Creating node set SUPPORT\n", - "13-Aug 00:37:40:DEBUG:root:Found NSET section\n", - "13-Aug 00:37:40:DEBUG:root:Creating node set LOAD\n", - "13-Aug 00:37:40:DEBUG:root:Found NSET section\n", - "13-Aug 00:37:40:DEBUG:root:Creating node set TOP\n" + "15-Aug 17:04:27:DEBUG:root:120 elements found\n", + "15-Aug 17:04:27:INFO:root:Creating ELSET Body1\n", + "15-Aug 17:04:27:DEBUG:root:Found NSET section\n", + "15-Aug 17:04:28:DEBUG:root:Creating node set SUPPORT\n", + "15-Aug 17:04:28:DEBUG:root:Found NSET section\n", + "15-Aug 17:04:28:DEBUG:root:Creating node set LOAD\n", + "15-Aug 17:04:28:DEBUG:root:Found NSET section\n", + "15-Aug 17:04:28:DEBUG:root:Creating node set TOP\n" ] }, { @@ -1214,47 +880,47 @@ "name": "stderr", "output_type": "stream", "text": [ - "13-Aug 00:37:41:DEBUG:root:Creating elements\n", - "13-Aug 00:37:41:INFO:root:create_ldof2gdofmap: dofs per node: 3\n", - "13-Aug 00:37:41:INFO:root:solve!: dofs per node: 3\n", - "13-Aug 00:37:41:DEBUG:root:Problem size = 894\n", - "13-Aug 00:37:41:DEBUG:root:Starting iteration 1\n", - "13-Aug 00:37:41:DEBUG:root:Assembling\n", - "13-Aug 00:37:43:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "13-Aug 00:37:43:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "13-Aug 00:37:43:DEBUG:root:Adding Neumann boundary conditions\n", - "13-Aug 00:37:43:DEBUG:root:Solving system of equations. Total size = 921\n", - "13-Aug 00:37:43:DEBUG:root:Solution norm du = 54.19642700242575\n", - "13-Aug 00:37:43:DEBUG:root:Starting iteration 2\n", - "13-Aug 00:37:43:DEBUG:root:Assembling\n", - "13-Aug 00:37:45:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "13-Aug 00:37:45:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "13-Aug 00:37:45:DEBUG:root:Adding Neumann boundary conditions\n", - "13-Aug 00:37:45:DEBUG:root:Solving system of equations. Total size = 921\n", - "13-Aug 00:37:45:DEBUG:root:Solution norm du = 1.68729144400063\n", - "13-Aug 00:37:45:DEBUG:root:Starting iteration 3\n", - "13-Aug 00:37:45:DEBUG:root:Assembling\n", - "13-Aug 00:37:47:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "13-Aug 00:37:47:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "13-Aug 00:37:47:DEBUG:root:Adding Neumann boundary conditions\n", - "13-Aug 00:37:47:DEBUG:root:Solving system of equations. Total size = 921\n", - "13-Aug 00:37:47:DEBUG:root:Solution norm du = 0.04175080278208098\n", - "13-Aug 00:37:47:DEBUG:root:Starting iteration 4\n", - "13-Aug 00:37:47:DEBUG:root:Assembling\n", - "13-Aug 00:37:48:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "13-Aug 00:37:48:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "13-Aug 00:37:48:DEBUG:root:Adding Neumann boundary conditions\n", - "13-Aug 00:37:48:DEBUG:root:Solving system of equations. Total size = 921\n", - "13-Aug 00:37:49:DEBUG:root:Solution norm du = 2.4176157836844963e-5\n", - "13-Aug 00:37:49:DEBUG:root:Starting iteration 5\n", - "13-Aug 00:37:49:DEBUG:root:Assembling\n", - "13-Aug 00:37:50:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "13-Aug 00:37:50:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "13-Aug 00:37:50:DEBUG:root:Adding Neumann boundary conditions\n", - "13-Aug 00:37:50:DEBUG:root:Solving system of equations. Total size = 921\n", - "13-Aug 00:37:50:DEBUG:root:Solution norm du = 1.4448231751500831e-11\n", - "13-Aug 00:37:50:DEBUG:root:Converged in 5 iterations.\n", - "13-Aug 00:37:50:INFO:root:Maximum absolute displacement in y direction: 5.245400568184194\n" + "15-Aug 17:04:30:DEBUG:root:Creating elements\n", + "15-Aug 17:04:31:INFO:root:create_ldof2gdofmap: dofs per node: 3\n", + "15-Aug 17:04:31:INFO:root:solve!: dofs per node: 3\n", + "15-Aug 17:04:31:DEBUG:root:Problem size = 894\n", + "15-Aug 17:04:31:DEBUG:root:Starting iteration 1\n", + "15-Aug 17:04:31:DEBUG:root:Assembling\n", + "15-Aug 17:04:36:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "15-Aug 17:04:36:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "15-Aug 17:04:36:DEBUG:root:Adding Neumann boundary conditions\n", + "15-Aug 17:04:36:DEBUG:root:Solving system of equations. Total size = 921\n", + "15-Aug 17:04:36:DEBUG:root:Solution norm du = 72.87727091053921\n", + "15-Aug 17:04:36:DEBUG:root:Starting iteration 2\n", + "15-Aug 17:04:36:DEBUG:root:Assembling\n", + "15-Aug 17:04:40:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "15-Aug 17:04:40:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "15-Aug 17:04:40:DEBUG:root:Adding Neumann boundary conditions\n", + "15-Aug 17:04:40:DEBUG:root:Solving system of equations. Total size = 921\n", + "15-Aug 17:04:40:DEBUG:root:Solution norm du = 2.737285770100854\n", + "15-Aug 17:04:40:DEBUG:root:Starting iteration 3\n", + "15-Aug 17:04:40:DEBUG:root:Assembling\n", + "15-Aug 17:04:44:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "15-Aug 17:04:44:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "15-Aug 17:04:44:DEBUG:root:Adding Neumann boundary conditions\n", + "15-Aug 17:04:44:DEBUG:root:Solving system of equations. Total size = 921\n", + "15-Aug 17:04:44:DEBUG:root:Solution norm du = 0.07997112801214978\n", + "15-Aug 17:04:44:DEBUG:root:Starting iteration 4\n", + "15-Aug 17:04:44:DEBUG:root:Assembling\n", + "15-Aug 17:04:48:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "15-Aug 17:04:48:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "15-Aug 17:04:48:DEBUG:root:Adding Neumann boundary conditions\n", + "15-Aug 17:04:48:DEBUG:root:Solving system of equations. Total size = 921\n", + "15-Aug 17:04:48:DEBUG:root:Solution norm du = 6.406557430235748e-5\n", + "15-Aug 17:04:48:DEBUG:root:Starting iteration 5\n", + "15-Aug 17:04:48:DEBUG:root:Assembling\n", + "15-Aug 17:04:52:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "15-Aug 17:04:52:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "15-Aug 17:04:52:DEBUG:root:Adding Neumann boundary conditions\n", + "15-Aug 17:04:52:DEBUG:root:Solving system of equations. Total size = 921\n", + "15-Aug 17:04:52:DEBUG:root:Solution norm du = 6.870072007793185e-11\n", + "15-Aug 17:04:52:DEBUG:root:Converged in 5 iterations.\n", + "15-Aug 17:04:52:INFO:root:Maximum absolute displacement in y direction: 6.9925206227884695\n" ] } ], @@ -1367,8 +1033,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "13-Aug 00:37:51:INFO:root:Number of nodes in model: 298\n", - "13-Aug 00:37:51:INFO:root:Number of elements in model: 120\n" + "15-Aug 17:04:54:INFO:root:Number of nodes in model: 298\n", + "15-Aug 17:04:54:INFO:root:Number of elements in model: 120\n" ] } ], @@ -1498,31 +1164,31 @@ "data": { "text/plain": [ "Dict{Any,Any} with 298 entries:\n", - " 288 => [-0.11672879201601734,-4.945796660856531,0.34641446977739976]\n", - " 11 => [-0.10351195894967631,-4.756564623966246,0.3419475317395125]\n", - " 158 => [-0.004781967238459207,-0.15800625216143013,-0.03641750463465448]\n", - " 215 => [-0.009679264390442352,-3.1283115653077243,0.1060066992444004]\n", - " 134 => [-0.012153531002752209,-2.568061461984137,0.1358780416251414]\n", - " 160 => [0.045841800099574996,-0.3952996715282528,-0.04337647899598485]\n", - " 29 => [-0.019610173840903154,-0.13106872577808154,-0.04187494739380516]\n", - " 131 => [0.04911611452200464,-2.5861023637514955,0.15290704689462717]\n", - " 249 => [-0.18589774363886435,-4.932931637644884,0.27789363131184]\n", - " 207 => [0.05588675730587902,-2.563471323701039,0.0669746466494972]\n", - " 173 => [-0.017826777186855432,-3.4323824666471117,0.08923268461041232]\n", - " 289 => [-0.08168560138254058,-4.782381469728047,0.4566974667444831]\n", - " 74 => [-0.013759506382279562,-2.9054222587693794,0.1389413161160111]\n", - " 201 => [0.006183182231407451,-2.8511450493652664,0.14659955727801022]\n", - " 176 => [0.04229935999959756,-2.349387641785469,0.09405299762367403]\n", - " 57 => [-0.0022029054234204426,-3.062804411311773,0.14846103116563106]\n", - " 31 => [0.005313697788644969,-0.25237461591643895,-0.030307540603490793]\n", - " 285 => [-0.10859185872935265,-4.832314881155342,0.35832378735042353]\n", - " 70 => [0.042811232565748765,-2.7950866978216338,0.1421452814276251]\n", - " 33 => [-0.016450709743293015,-0.379272230318473,0.027549328283933208]\n", - " 252 => [-0.14470395638682446,-0.9284887677850233,0.043594035381458736]\n", - " 114 => [-0.14842327883584733,-0.3532980011491899,-0.018641651848308006]\n", - " 165 => [-0.04346921888336824,-3.2745129973662452,0.07316785266950793]\n", - " 96 => [0.1501458469524447,-3.8471140528652787,0.1489845291162686]\n", - " 133 => [0.09045793517058681,-2.3950191788705957,0.12799724500423504]\n", + " 288 => [-0.21784897897079505,-6.64256844921929,0.18339325827190953]\n", + " 11 => [-0.17342410820059667,-6.343125806991628,0.17544367431766225]\n", + " 158 => [-0.0007723334905839533,-0.2321904799732306,-0.03883691791045858]\n", + " 215 => [-0.03299227384130259,-4.2236276356937505,-0.0017757488281830807]\n", + " 134 => [-0.06336705102703495,-3.3332586850719337,0.06555932581531249]\n", + " 160 => [0.03205303832663507,-0.536361456950779,-0.07291283371223893]\n", + " 29 => [-0.01620524134284992,-0.19455583841608232,-0.03838421619811468]\n", + " 131 => [0.04015396763870081,-3.5101776818531523,0.10045744211179368]\n", + " 249 => [-0.2491004521409732,-6.570813533283954,0.06837890174506163]\n", + " 207 => [0.03974407267311282,-3.48588780058722,0.007971846403163977]\n", + " 173 => [-0.04472757590353555,-4.582185697159958,-0.04434348606400347]\n", + " 289 => [-0.16494613158592017,-6.360857515886982,0.33435404817411213]\n", + " 74 => [-0.03449870789750817,-3.947284664599636,0.0692691027146262]\n", + " 201 => [-0.00128347996939122,-3.8527236749372054,0.054216444201382656]\n", + " 176 => [-0.004729440266412542,-3.132546258410676,0.0036604388995965386]\n", + " 57 => [-0.021453552968802154,-4.134921994863808,0.04888988010136468]\n", + " 31 => [-0.005045439296021616,-0.3424143474221696,-0.0365148544462663]\n", + " 285 => [-0.19371941654927557,-6.446502168659889,0.18022053743770028]\n", + " 70 => [0.006277500845425116,-3.802694347992476,0.06251589929767469]\n", + " 33 => [-0.02778798411401373,-0.5091869603980016,0.03538255963543149]\n", + " 252 => [-0.11915625386204923,-1.2182594899567352,-0.025975085489623087]\n", + " 114 => [-0.14643901527350212,-0.4628626545501056,-0.0057156433415159625]\n", + " 165 => [-0.07462160313837857,-4.426674712264929,-0.04391022455570823]\n", + " 96 => [0.0541064545893336,-5.057801826440659,-0.01669155772495867]\n", + " 133 => [0.01615115174975327,-3.140610327091724,0.028951801068022566]\n", " ⋮ => ⋮" ] }, @@ -1552,9 +1218,9 @@ "data": { "text/plain": [ "3x298 Array{Float64,2}:\n", - " -0.174259 -0.175081 0.0359566 0.0279021 0.00925611 0.0379208 … -0.0248959 -0.116472 0.191156 0.193018 -0.0153311 -0.123282 0.0\n", - " -0.978534 -1.32327 -2.42646 -2.50175 -2.72095 -2.59357 -3.20696 -0.707364 -1.76025 -1.33439 -2.22191 -1.93398 0.0\n", - " 0.0535874 0.111758 0.125464 0.115461 0.145374 0.1251 0.0902774 0.00418633 0.368958 0.387435 0.185441 0.230546 0.0" + " -0.202475 -0.17437 0.0131267 -0.0340868 -0.0252162 0.0521758 … -0.054781 -0.169903 0.186936 0.102666 -0.0970747 -0.164397 0.0\n", + " -1.34204 -1.66404 -3.20587 -3.27673 -3.68732 -3.36789 -4.33822 -1.03943 -2.27466 -1.67467 -2.91213 -2.52353 0.0\n", + " 0.0211856 0.0324162 0.00213878 0.0377156 0.0683502 0.030081 -0.00684333 -0.035509 0.304867 0.26033 0.113802 0.152433 0.0" ] }, "execution_count": 20, @@ -1602,7 +1268,7 @@ { "data": { "text/plain": [ - "28215" + "28330" ] }, "execution_count": 22, diff --git a/src/math.jl b/src/math.jl index 5f0864b..b839cb6 100644 --- a/src/math.jl +++ b/src/math.jl @@ -75,7 +75,7 @@ Return partial derivatives of shape functions w.r.t X using chain rule. """ function get_dbasisdX(el::Element, xi) J = interpolate(el, "coordinates", xi; derivative=true) - dbasisdX = el.dbasis(xi)*inv(J) + dbasisdX = el.dbasis(xi)*inv(J') return dbasisdX end From f299ea81e97fc49eae61e870ad4b78751bc6d473 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Wed, 19 Aug 2015 18:50:43 +0300 Subject: [PATCH 21/26] updated. --- ...2015-06-25-elasticity-solver-example.ipynb | 667 +++++++++--------- src/abaqus_reader.jl | 6 +- src/math.jl | 30 +- src/types.jl | 21 +- 4 files changed, 354 insertions(+), 370 deletions(-) diff --git a/notebooks/2015-06-25-elasticity-solver-example.ipynb b/notebooks/2015-06-25-elasticity-solver-example.ipynb index 2c4110f..92a818b 100644 --- a/notebooks/2015-06-25-elasticity-solver-example.ipynb +++ b/notebooks/2015-06-25-elasticity-solver-example.ipynb @@ -36,7 +36,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": { "collapsed": false }, @@ -47,9 +47,30 @@ "Logger(root,DEBUG,Pipe(open, 0 bytes waiting),root)" ] }, - "execution_count": 2, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", + " in int32 at deprecated.jl:49\n", + " in recv at /Users/jukka/.julia/v0.4/ZMQ/src/ZMQ.jl:617\n", + " in recv_ipython at /Users/jukka/.julia/v0.4/IJulia/src/msg.jl:63\n", + " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:120\n", + " in anonymous at task.jl:365\n", + "while loading /Users/jukka/.julia/v0.4/IJulia/src/kernel.jl, in expression starting on line 35\n", + "WARNING: int32(x) is deprecated, use Int32(x) instead.\n", + " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", + " in int32 at deprecated.jl:49\n", + " in recv at /Users/jukka/.julia/v0.4/ZMQ/src/ZMQ.jl:617\n", + " in recv_ipython at /Users/jukka/.julia/v0.4/IJulia/src/msg.jl:63\n", + " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:120\n", + " in anonymous at task.jl:365\n", + "while loading /Users/jukka/.julia/v0.4/IJulia/src/kernel.jl, in expression starting on line 35\n" + ] } ], "source": [ @@ -73,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": { "collapsed": false }, @@ -84,39 +105,35 @@ "jacobian (generic function with 1 method)" ] }, - "execution_count": 3, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "function calc_residual_vector_integrand(el::JuliaFEM.Element, xi)\n", - " # Calculate dN/dX\n", - " dbasisdX = JuliaFEM.get_dbasisdX(el, xi)\n", - "\n", - " # Calculate residual force vector R(u) = T(u) - F(u)\n", - " function T(u)\n", - " # kinematics\n", - " gradu = u*dbasisdX\n", - " F = I + gradu\n", - " E = 1/2*(gradu' + gradu + gradu'*gradu)\n", - " # constitutive equation\n", - " lambda = JuliaFEM.interpolate(el, \"lambda\", xi)\n", - " mu = JuliaFEM.interpolate(el, \"mu\", xi)\n", - " S = lambda*trace(E)*I + 2*mu*E\n", - " P = F*S\n", - " T = P*dbasisdX'\n", - " return T\n", - " end\n", - "\n", + "function Wint_integrand(el, ip)\n", + " xi = ip.xi\n", + " dbasisdX = JuliaFEM.get_dbasisdX(el, ip)\n", " u = el.attributes[\"displacement\"]\n", - " R(u) = T(u)\n", - " return R(u) # we skip calculating external force vector for now.\n", + "\n", + " # kinematics\n", + " gradu = u*dbasisdX\n", + " F = I + gradu\n", + " E = 1/2*(gradu' + gradu + gradu'*gradu)\n", + "\n", + " # constitutive equation\n", + " lambda = JuliaFEM.interpolate(el, \"lambda\", xi)\n", + " mu = JuliaFEM.interpolate(el, \"mu\", xi)\n", + " S = lambda*trace(E)*I + 2*mu*E\n", + " P = F*S\n", + " T = P*dbasisdX'\n", + " return T\n", "end\n", "\n", - "calc_residual_vector = JuliaFEM.integrate(calc_residual_vector_integrand)\n", + "Wint = JuliaFEM.integrate(Wint_integrand)\n", + "\n", "# calculate partial derivatives of R with respect to field \"displacement\"\n", - "calc_tangent_stiffness = JuliaFEM.linearize(calc_residual_vector, \"displacement\")" + "jacobian = JuliaFEM.linearize(Wint, \"displacement\")" ] }, { @@ -130,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": { "collapsed": true }, @@ -141,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": { "collapsed": false, "scrolled": false @@ -158,16 +175,16 @@ "name": "stderr", "output_type": "stream", "text": [ - "17-Aug 18:21:25:DEBUG:root:Converged in 6 iterations.\n", - "17-Aug 18:21:25:DEBUG:root:solution vector: \n", + "19-Aug 18:39:44:DEBUG:root:Converged in 6 iterations.\n", + "19-Aug 18:39:44:DEBUG:root:solution vector: \n", " [0.0 -0.3991450609547433 -0.07228582695592461 0.0\n", " 0.0 -2.1779892317073504 -2.222244754401764 0.0]\n", - "17-Aug 18:21:25:DEBUG:root:norm of u: 3.1292483947150047\n", - "17-Aug 18:21:25:DEBUG:root:Converged in 6 iterations.\n", - "17-Aug 18:21:25:DEBUG:root:solution vector: \n", + "19-Aug 18:39:44:DEBUG:root:norm of u: 3.1292483947150047\n", + "19-Aug 18:39:45:DEBUG:root:Converged in 6 iterations.\n", + "19-Aug 18:39:45:DEBUG:root:solution vector: \n", " [0.0 0.7433248532717796 1.048521014723486 0.0\n", " 0.0 -2.085766534304891 -1.9606633242166027 0.0]\n", - "17-Aug 18:21:26:DEBUG:root:norm of u: 3.1292483947150056\n" + "19-Aug 18:39:45:DEBUG:root:norm of u: 3.1292483947150056\n" ] }, { @@ -183,7 +200,7 @@ "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 6, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -200,10 +217,15 @@ " (1-xi[2])/4.0 -(1+xi[1])/4.0\n", " (1+xi[2])/4.0 (1+xi[1])/4.0\n", " -(1+xi[2])/4.0 (1-xi[1])/4.0]\n", - " ipoints = 1/sqrt(3)*[-1 -1; 1 -1; 1 1; -1 1]'\n", - " iweights = [1.0, 1.0, 1.0, 1.0]\n", + " integration_points = [\n", + " JuliaFEM.IntegrationPoint(1.0/sqrt(3.0)*[-1, -1], 1.0, Dict()),\n", + " JuliaFEM.IntegrationPoint(1.0/sqrt(3.0)*[ 1, -1], 1.0, Dict()),\n", + " JuliaFEM.IntegrationPoint(1.0/sqrt(3.0)*[ 1, 1], 1.0, Dict()),\n", + " JuliaFEM.IntegrationPoint(1.0/sqrt(3.0)*[-1, 1], 1.0, Dict())]\n", " attributes = Dict()\n", - " e = JuliaFEM.Element(1, [1, 2, 3, 4], basis, dbasis, attributes, ipoints, iweights)\n", + " element_id = 1\n", + " node_ids = [1, 2, 3, 4]\n", + " e = JuliaFEM.Element(element_id, node_ids, basis, dbasis, integration_points, attributes)\n", " E = 90.0\n", " nu = 0.25\n", " mu = E/(2*(1+nu))\n", @@ -225,8 +247,8 @@ "\n", " free_dofs = [3, 4, 5, 6]\n", " for i=1:10\n", - " R = calc_residual_vector(e)\n", - " K = calc_tangent_stiffness(e)\n", + " R = Wint(e)\n", + " K = jacobian(e)\n", " du[free_dofs] = K[free_dofs, free_dofs] \\ -(R - F)[free_dofs]\n", " e.attributes[\"displacement\"] += du\n", " if norm(du) < 1.0e-9\n", @@ -253,8 +275,8 @@ " e.attributes[\"displacement\"] = [0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0]'\n", " du = zeros(2, 4)\n", " for i=1:10\n", - " R = calc_residual_vector(e)\n", - " K = calc_tangent_stiffness(e)\n", + " R = Wint(e)\n", + " K = jacobian(e)\n", " du[free_dofs] = K[free_dofs, free_dofs] \\ -(R - F)[free_dofs]\n", " e.attributes[\"displacement\"] += du\n", " if norm(du) < 1.0e-9\n", @@ -269,16 +291,9 @@ "end" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One element solutions are not particularly interesting so next step is to create function that assembles global matrix from local matrices. Some data types:" - ] - }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": { "collapsed": false }, @@ -286,35 +301,21 @@ { "data": { "text/plain": [ - "assemble_element! (generic function with 2 methods)" + "assemble_element! (generic function with 1 method)" ] }, - "execution_count": 9, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "function assemble_element!(ass::Assembly, el::Element)\n", - "\n", - " # Material properties\n", - " E = el.attributes[\"Young\"]\n", - " nu = el.attributes[\"Poisson\"]\n", - " mu = E/(2*(1+nu))\n", - " la = E*nu/((1+nu)*(1-2*nu))\n", - " la = 2*la*mu/(la + 2*mu)\n", - "\n", - " dofs = prod(size(el.coordinates))\n", - " X = el.coordinates\n", - " u = el.attributes[\"displacement\"]\n", - " R = el.attributes[\"displacement nodal force\"]\n", - " K = el.attributes[\"displacement tangent stiffness\"]\n", + "function assemble_element!(ass::JuliaFEM.Assembly, el::JuliaFEM.Element)\n", "\n", " gdofs = ass.gdofs[el.id]\n", - " #Logging.debug(\"Assemble element $(el.id) to gdofs $gdofs\")\n", - " basis, dbasis = get_shape_functions(el)\n", - " ipoints, iweights = get_integration_scheme(el, io)\n", - " calc_local_matrices!(X, u, R, K, basis, dbasis, la, mu, ipoints, iweights)\n", + " R = Wint(el)\n", + " K = jacobian(el)\n", + " dofs = length(R)\n", "\n", " for i=1:dofs\n", " for j=1:dofs\n", @@ -342,18 +343,11 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING: the `=>` syntax is deprecated, use `-->` instead\n" - ] - }, { "name": "stdout", "output_type": "stream", @@ -365,30 +359,29 @@ "name": "stderr", "output_type": "stream", "text": [ - "15-Aug 17:03:55:DEBUG:root:Adding nodes to array\n", - "15-Aug 17:03:55:DEBUG:root:Creating elements\n", - "15-Aug 17:03:55:DEBUG:root:Starting iteration 1\n", - "15-Aug 17:03:55:DEBUG:root:Assembling\n", - "15-Aug 17:03:57:DEBUG:root:Solution norm = 3.090022136728999\n", - "15-Aug 17:03:57:DEBUG:root:Starting iteration 2\n", - "15-Aug 17:03:57:DEBUG:root:Assembling\n", - "15-Aug 17:03:57:DEBUG:root:Solution norm = 0.32121316021535135\n", - "15-Aug 17:03:57:DEBUG:root:Starting iteration 3\n", - "15-Aug 17:03:57:DEBUG:root:Assembling\n", - "15-Aug 17:03:57:DEBUG:root:Solution norm = 0.040431781939994194\n", - "15-Aug 17:03:57:DEBUG:root:Starting iteration 4\n", - "15-Aug 17:03:57:DEBUG:root:Assembling\n", - "15-Aug 17:03:57:DEBUG:root:Solution norm = 0.0009291101052124042\n", - "15-Aug 17:03:57:DEBUG:root:Starting iteration 5\n", - "15-Aug 17:03:57:DEBUG:root:Assembling\n", - "15-Aug 17:03:57:DEBUG:root:Solution norm = 1.5638899022213175e-7\n", - "15-Aug 17:03:58:DEBUG:root:Starting iteration 6\n", - "15-Aug 17:03:58:DEBUG:root:Assembling\n", - "15-Aug 17:03:58:DEBUG:root:Solution norm = 1.0118539067290854e-14\n", - "15-Aug 17:03:58:DEBUG:root:Converged in 6 iterations.\n", - "15-Aug 17:03:58:DEBUG:root:Displacement of element = \n", - "[-0.39914506095474334 -0.0722858269559246 0.0 0.0\n", - " -2.1779892317073504 -2.2222447544017645 0.0 0.0]\n" + "19-Aug 18:39:46:DEBUG:root:Adding nodes to array\n", + "19-Aug 18:39:46:DEBUG:root:Starting iteration 1\n", + "19-Aug 18:39:46:DEBUG:root:Assembling\n", + "19-Aug 18:39:47:DEBUG:root:Solution norm = 3.0900221367289986\n", + "19-Aug 18:39:47:DEBUG:root:Starting iteration 2\n", + "19-Aug 18:39:47:DEBUG:root:Assembling\n", + "19-Aug 18:39:47:DEBUG:root:Solution norm = 0.3212131602153472\n", + "19-Aug 18:39:47:DEBUG:root:Starting iteration 3\n", + "19-Aug 18:39:47:DEBUG:root:Assembling\n", + "19-Aug 18:39:47:DEBUG:root:Solution norm = 0.04043178193999703\n", + "19-Aug 18:39:47:DEBUG:root:Starting iteration 4\n", + "19-Aug 18:39:47:DEBUG:root:Assembling\n", + "19-Aug 18:39:47:DEBUG:root:Solution norm = 0.0009291101052105739\n", + "19-Aug 18:39:47:DEBUG:root:Starting iteration 5\n", + "19-Aug 18:39:47:DEBUG:root:Assembling\n", + "19-Aug 18:39:47:DEBUG:root:Solution norm = 1.5638899027804743e-7\n", + "19-Aug 18:39:47:DEBUG:root:Starting iteration 6\n", + "19-Aug 18:39:47:DEBUG:root:Assembling\n", + "19-Aug 18:39:47:DEBUG:root:Solution norm = 1.0464940956129567e-14\n", + "19-Aug 18:39:47:DEBUG:root:Converged in 6 iterations.\n", + "19-Aug 18:39:47:DEBUG:root:Displacement of element = \n", + "[0.0 -0.39914506095474334 -0.0722858269559246 0.0\n", + " 0.0 -2.1779892317073504 -2.222244754401764 0.0]\n" ] }, { @@ -404,7 +397,7 @@ "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 10, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -412,41 +405,26 @@ "source": [ "facts(\"one element assembly\") do\n", " # Create model\n", - " #Logging.debug(\"Creating nodes\")\n", - " #n1 = Node(1)\n", - " #n2 = Node(2)\n", - " #n3 = Node(3)\n", - " #n4 = Node(4)\n", " Logging.debug(\"Adding nodes to array\")\n", - " #nodes = [n1.id, n2.id, n3.id, n4.id]\n", - " node_ids = [1, 2, 3, 4]\n", - " coordinates = [10.0 0.0; 10.0 1.0; 0.0 1.0; 0.0 0.0]'\n", - " attributes = Dict(\"Young\" => 90, \"Poisson\" => 0.25)\n", - " Logging.debug(\"Creating elements\")\n", - " el = Element(1, node_ids, coordinates, attributes)\n", - "\n", - " # Initialize elements ready for solution\n", - " el.attributes[\"displacement\"] = zeros(2, 4)\n", - " el.attributes[\"displacement nodal force\"] = zeros(2, 4)\n", - " el.attributes[\"displacement tangent stiffness\"] = zeros(8, 8)\n", - "\n", + " el = get_test_element()\n", + " \n", " for i=1:10\n", " Logging.debug(\"Starting iteration $i\")\n", - " ass = Assembly(Int64[], Int64[], Float64[], Int64[], Float64[], Dict{Int64,Array{Int64,1}}())\n", + " ass = JuliaFEM.Assembly(Int64[], Int64[], Float64[], Int64[], Float64[], Dict{Int64,Array{Int64,1}}())\n", " ass.gdofs[el.id] = [1, 2, 3, 4, 5, 6, 7, 8]\n", " Logging.debug(\"Assembling\")\n", " assemble_element!(ass, el)\n", "\n", " # Boundary conditions\n", - " F = [0 0; 0 -2; 0 0; 0 0]'\n", - " F = reshape(F, prod(size(F)))\n", - " free_dofs = [1, 2, 3, 4]\n", + " F = [0.0 0.0; 0.0 0.0; 0.0 -2.0; 0.0 0.0]'\n", + " F = F[:]\n", + " free_dofs = [3, 4, 5, 6]\n", "\n", " # solution\n", " K = sparse(ass.I, ass.J, ass.A)\n", " R = full(sparsevec(ass.i, ass.b))\n", " R = R - F\n", - " du = zeros(8) # must be determined from ass\n", + " du = zeros(8)\n", " du[free_dofs] = K[free_dofs, free_dofs] \\ -R[free_dofs]\n", "\n", " Logging.debug(\"Solution norm = $(norm(du))\")\n", @@ -462,7 +440,7 @@ " end\n", " disp = el.attributes[\"displacement\"]\n", " Logging.debug(\"Displacement of element = \\n$disp\")\n", - " @fact norm(disp) => roughly(3.1292483947150043)\n", + " @fact norm(disp) --> roughly(3.1292483947150043)\n", "end" ] }, @@ -479,7 +457,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 7, "metadata": { "collapsed": false }, @@ -493,83 +471,18 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 8, "metadata": { - "collapsed": false, - "scrolled": false + "collapsed": false }, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "solve two element problem\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "15-Aug 17:03:59:DEBUG:root:Creating elements\n", - "15-Aug 17:03:59:INFO:root:create_ldof2gdofmap: dofs per node: 2\n", - "15-Aug 17:04:00:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],5=>[9,10],6=>[11,12],1=>[1,2])\n", - "15-Aug 17:04:04:INFO:root:solve!: dofs per node: 2\n", - "15-Aug 17:04:04:DEBUG:root:Problem size = 12\n", - "15-Aug 17:04:04:DEBUG:root:Starting iteration 1\n", - "15-Aug 17:04:04:DEBUG:root:Assembling\n", - "15-Aug 17:04:05:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "15-Aug 17:04:05:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "15-Aug 17:04:05:DEBUG:root:Adding Neumann boundary conditions\n", - "15-Aug 17:04:05:DEBUG:root:Solving system of equations. Total size = 16\n", - "15-Aug 17:04:05:DEBUG:root:Solution norm du = 0.6015838690633517\n", - "15-Aug 17:04:05:DEBUG:root:Starting iteration 2\n", - "15-Aug 17:04:05:DEBUG:root:Assembling\n", - "15-Aug 17:04:05:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "15-Aug 17:04:05:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "15-Aug 17:04:05:DEBUG:root:Adding Neumann boundary conditions\n", - "15-Aug 17:04:05:DEBUG:root:Solving system of equations. Total size = 16\n", - "15-Aug 17:04:05:DEBUG:root:Solution norm du = 0.013420417380980414\n", - "15-Aug 17:04:05:DEBUG:root:Starting iteration 3\n", - "15-Aug 17:04:05:DEBUG:root:Assembling\n", - "15-Aug 17:04:05:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "15-Aug 17:04:05:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "15-Aug 17:04:05:DEBUG:root:Adding Neumann boundary conditions\n", - "15-Aug 17:04:06:DEBUG:root:Solving system of equations. Total size = 16\n", - "15-Aug 17:04:06:DEBUG:root:Solution norm du = 0.00032202957936854873\n", - "15-Aug 17:04:06:DEBUG:root:Starting iteration 4\n", - "15-Aug 17:04:06:DEBUG:root:Assembling\n", - "15-Aug 17:04:06:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "15-Aug 17:04:06:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "15-Aug 17:04:06:DEBUG:root:Adding Neumann boundary conditions\n", - "15-Aug 17:04:06:DEBUG:root:Solving system of equations. Total size = 16\n", - "15-Aug 17:04:06:DEBUG:root:Solution norm du = 9.906677094801476e-8\n", - "15-Aug 17:04:06:DEBUG:root:Starting iteration 5\n", - "15-Aug 17:04:06:DEBUG:root:Assembling\n", - "15-Aug 17:04:06:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "15-Aug 17:04:06:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "15-Aug 17:04:06:DEBUG:root:Adding Neumann boundary conditions\n", - "15-Aug 17:04:06:DEBUG:root:Solving system of equations. Total size = 16\n", - "15-Aug 17:04:06:DEBUG:root:Solution norm du = 5.027624635820698e-15\n", - "15-Aug 17:04:06:DEBUG:root:Converged in 5 iterations.\n", - "15-Aug 17:04:06:DEBUG:root:Displacement of element = \n", - "[-0.02442313597467864 -0.039356000063335075 0.021097993207232584 0.020877031423993653\n", - " -0.12673626841485705 -0.40433021969759375 -0.40656320177872923 -0.1275776940913048]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 facts verified.\n" - ] - }, { "data": { "text/plain": [ - "delayed_handler (generic function with 4 methods)" + "create_ldof2gdofmap (generic function with 1 method)" ] }, - "execution_count": 12, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -578,18 +491,17 @@ "\"\"\"\n", "Create local dof to global dof mapping for given elements\n", "\"\"\"\n", - "function create_ldof2gdofmap(elements; ndofs=2)\n", - " Logging.info(\"create_ldof2gdofmap: dofs per node: $ndofs\")\n", + "function create_ldof2gdofmap(elements, field)\n", "\n", + " ndofs = size(elements[1].attributes[field], 1)\n", + " \n", " all_node_ids = Int64[]\n", " for el in elements\n", - " eldim, elnodes = size(el.coordinates)\n", " for nid in el.node_ids\n", " push!(all_node_ids, nid)\n", " end\n", " end\n", " all_node_ids = unique(all_node_ids)\n", - " sort!(all_node_ids)\n", "\n", " # Assign global dof for each node\n", " pdim = 1\n", @@ -600,24 +512,104 @@ " end\n", "\n", " return ngdofs\n", - "end\n", - "\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "solve one element problem\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "19-Aug 18:49:12:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],1=>[1,2])\n", + "19-Aug 18:49:13:INFO:root:solve!: dofs per node: 2\n", + "19-Aug 18:49:13:DEBUG:root:Problem size = 8\n", + "19-Aug 18:49:13:DEBUG:root:Starting iteration 1\n", + "19-Aug 18:49:13:DEBUG:root:Assembling\n", + "19-Aug 18:49:13:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 18:49:13:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "19-Aug 18:49:13:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 18:49:13:DEBUG:root:Solving system of equations. Total size = 12\n", + "19-Aug 18:49:13:DEBUG:root:Solution norm du = 3.0900221367289444\n", + "19-Aug 18:49:13:DEBUG:root:Starting iteration 2\n", + "19-Aug 18:49:13:DEBUG:root:Assembling\n", + "19-Aug 18:49:13:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 18:49:13:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "19-Aug 18:49:13:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 18:49:13:DEBUG:root:Solving system of equations. Total size = 12\n", + "19-Aug 18:49:13:DEBUG:root:Solution norm du = 0.32121316021534796\n", + "19-Aug 18:49:13:DEBUG:root:Starting iteration 3\n", + "19-Aug 18:49:13:DEBUG:root:Assembling\n", + "19-Aug 18:49:13:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 18:49:13:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "19-Aug 18:49:13:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 18:49:13:DEBUG:root:Solving system of equations. Total size = 12\n", + "19-Aug 18:49:13:DEBUG:root:Solution norm du = 0.040431781940014504\n", + "19-Aug 18:49:13:DEBUG:root:Starting iteration 4\n", + "19-Aug 18:49:13:DEBUG:root:Assembling\n", + "19-Aug 18:49:13:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 18:49:13:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "19-Aug 18:49:13:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 18:49:13:DEBUG:root:Solving system of equations. Total size = 12\n", + "19-Aug 18:49:13:DEBUG:root:Solution norm du = 0.0009291101052065917\n", + "19-Aug 18:49:13:DEBUG:root:Starting iteration 5\n", + "19-Aug 18:49:13:DEBUG:root:Assembling\n", + "19-Aug 18:49:13:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 18:49:13:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "19-Aug 18:49:13:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 18:49:13:DEBUG:root:Solving system of equations. Total size = 12\n", + "19-Aug 18:49:13:DEBUG:root:Solution norm du = 1.5638899136781228e-7\n", + "19-Aug 18:49:13:DEBUG:root:Starting iteration 6\n", + "19-Aug 18:49:13:DEBUG:root:Assembling\n", + "19-Aug 18:49:13:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 18:49:13:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "19-Aug 18:49:13:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 18:49:13:DEBUG:root:Solving system of equations. Total size = 12\n", + "19-Aug 18:49:13:DEBUG:root:Solution norm du = 1.0913504694802626e-14\n", + "19-Aug 18:49:13:DEBUG:root:Converged in 6 iterations.\n", + "19-Aug 18:49:13:DEBUG:root:Displacement of element = \n", + "[0.0 -0.39914506095474345 -0.07228582695592467 0.0\n", + " 0.0 -2.177989231707351 -2.222244754401765 0.0]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 fact verified.\n" + ] + }, + { + "data": { + "text/plain": [ + "delayed_handler (generic function with 4 methods)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ "function solve!(elements, dofmap, neumann_bcs, dirichlet_bcs; ndofs=2, max_iterations=10)\n", "\n", - " dbc = \"lagrange\"\n", - " \n", " Logging.info(\"solve!: dofs per node: $ndofs\")\n", " pdim = length(dofmap)*ndofs\n", " Logging.debug(\"Problem size = $pdim\")\n", "\n", - " # Initialize elements ready for solution\n", - " for el in elements\n", - " eldim, elnodes = size(el.coordinates)\n", - " el.attributes[\"displacement\"] = zeros(ndofs, elnodes)\n", - " el.attributes[\"displacement nodal force\"] = zeros(ndofs, elnodes)\n", - " el.attributes[\"displacement tangent stiffness\"] = zeros(ndofs*elnodes, ndofs*elnodes)\n", - " end\n", - "\n", " # Assign global dofs for elements\n", " gdofs = Dict{Int64, Array{Int64,1}}()\n", " for el in elements\n", @@ -629,7 +621,7 @@ " end\n", " end\n", "\n", - " ass = Assembly(Int64[], Int64[], Float64[], Int64[], Float64[], gdofs)\n", + " ass = JuliaFEM.Assembly(Int64[], Int64[], Float64[], Int64[], Float64[], gdofs)\n", "\n", " for iter=1:max_iterations\n", " Logging.debug(\"Starting iteration $iter\")\n", @@ -642,30 +634,26 @@ " Logging.debug(\"Assembling\")\n", " for el in elements\n", " assemble_element!(ass, el)\n", - " #println(\"Element stiffness matrix\")\n", - " #dump(round(el.attributes[\"displacement tangent stiffness\"], 2))\n", " end\n", "\n", " i = 1\n", - " if dbc == \"lagrange\"\n", - " Logging.debug(\"Adding Dirichlet boundary conditions using Lagrange multipliers\")\n", - " # Dirichlet boundary conditions\n", - " for bc in dirichlet_bcs\n", - " for (dof, val) in zip(bc.dofs, bc.values)\n", - " #Logging.debug(\"dof $dof => $val\")\n", - " push!(ass.I, dof)\n", - " push!(ass.J, pdim+i)\n", - " push!(ass.A, 1)\n", - " push!(ass.I, pdim+i)\n", - " push!(ass.J, dof)\n", - " push!(ass.A, 1)\n", - " push!(ass.i, pdim+i)\n", - " push!(ass.b, 0)\n", - " i += 1\n", - " end\n", + " Logging.debug(\"Adding Dirichlet boundary conditions using Lagrange multipliers\")\n", + " # Dirichlet boundary conditions\n", + " for bc in dirichlet_bcs\n", + " for (dof, val) in zip(bc.dofs, bc.values)\n", + " #Logging.debug(\"dof $dof => $val\")\n", + " push!(ass.I, dof)\n", + " push!(ass.J, pdim+i)\n", + " push!(ass.A, 1)\n", + " push!(ass.I, pdim+i)\n", + " push!(ass.J, dof)\n", + " push!(ass.A, 1)\n", + " push!(ass.i, pdim+i)\n", + " push!(ass.b, 0)\n", + " i += 1\n", " end\n", - " Logging.debug(\"Added $i Lagrange multipliers to model\")\n", " end\n", + " Logging.debug(\"Added $i Lagrange multipliers to model\")\n", " i -= 1\n", "\n", " Logging.debug(\"Adding Neumann boundary conditions\")\n", @@ -682,20 +670,8 @@ " K = sparse(ass.I, ass.J, ass.A)\n", " R = full(sparsevec(ass.i, ass.b))\n", " R = R - F\n", - " #Logging.debug(dump(round(full(K), 2)))\n", - " #print_matrix(full(K))\n", - " #Logging.debug(dump(round(R', 1)))\n", "\n", - " if dbc == \"eliminate\"\n", - " Logging.debug(\"Eliminating Dirichlet boundary conditions\")\n", - " throw(\"Implement this properly\")\n", - " free_dofs = [1, 2, 3, 4, 5, 6, 7, 8]\n", - " du = zeros(12)\n", - " Logging.debug(\"K norm = $(norm(full(K[free_dofs, free_dofs])))\")\n", - " du[free_dofs] = K[free_dofs, free_dofs] \\ -R[free_dofs]\n", - " else\n", - " du = K \\ -R\n", - " end\n", + " du = K \\ -R\n", "\n", " #du = reshape(du, 2, 6)\n", " solnorm = norm(du[1:pdim])\n", @@ -725,55 +701,27 @@ "\n", "ENV[\"COLUMNS\"] = 160\n", "\n", - "function test1():\n", - " facts(\"solve one element problem\") do\n", - " # Create model\n", - " Logging.debug(\"Creating nodes\")\n", - " node_ids = [1, 2, 3, 4]\n", - " coordinates = [10.0 0.0; 10.0 1.0; 0.0 1.0; 0.0 0.0]'\n", - " attributes = Dict(\"Young\" => 90, \"Poisson\" => 0.25)\n", - " Logging.debug(\"Creating elements\")\n", - " el = Element(1, node_ids, coordinates, attributes)\n", - " elements = [el]\n", - " dofmap = create_ldof2gdofmap(elements)\n", - " Logging.debug(dofmap)\n", - " # Boundary conditions\n", - " # here we want to create nodal force for third dof, that is, node id 2, second dof\n", - " bc1 = BC([dofmap[2][2]], [-2.0])\n", - " # dirichlet bc, set dx=dy=0 on support\n", - " bc2 = BC([dofmap[3][1], dofmap[3][2], dofmap[4][1], dofmap[4][2]], [0.0, 0.0, 0.0, 0.0])\n", - " solve!(elements, dofmap, [bc1], [bc2]; max_iterations=7)\n", - " disp = elements[1].attributes[\"displacement\"]\n", - " Logging.debug(\"Displacement of element = \\n$disp\")\n", - " @fact norm(disp) => roughly(3.1292483947150043)\n", - " end\n", - "end\n", - "\n", - "facts(\"solve two element problem\") do\n", + "facts(\"solve one element problem\") do\n", " # Create model\n", - " attributes = Dict(\"Young\" => 90, \"Poisson\" => 0.25)\n", - "\n", - " Logging.debug(\"Creating elements\")\n", - " nids1 = [5, 1, 3, 6]\n", - " coords1 = [0.0 0.0; 5.0 0.0; 5.0 1.0; 0.0 1.0]'\n", - " el1 = Element(1, nids1, coords1, copy(attributes))\n", - " nids2 = [1, 2, 4, 3]\n", - " coords2 = [5.0 0.0; 10.0 0.0; 10.0 1.0; 5.0 1.0]'\n", - " el2 = Element(2, nids2, coords2, copy(attributes))\n", - " elements = [el1, el2]\n", - "\n", - " dofmap = create_ldof2gdofmap(elements)\n", + " el = get_test_element()\n", + " elements = [el]\n", + " # Initialize elements ready for solution\n", + " for el in elements\n", + " eldim, elnodes = size(el.attributes[\"coordinates\"])\n", + " el.attributes[\"displacement\"] = zeros(2, elnodes)\n", + " end\n", + " dofmap = create_ldof2gdofmap(elements, \"displacement\")\n", " Logging.debug(dofmap)\n", " # Boundary conditions\n", " # here we want to create nodal force for third dof, that is, node id 2, second dof\n", - " bc1 = BC([dofmap[4][2]], [-0.1])\n", + " bc1 = BC([dofmap[3][2]], [-2.0])\n", " # dirichlet bc, set dx=dy=0 on support\n", - " bc2 = BC([dofmap[5][1], dofmap[5][2], dofmap[6][1], dofmap[6][2]], [0.0, 0.0, 0.0, 0.0])\n", + " bc2 = BC([dofmap[1][1], dofmap[1][2], dofmap[4][1], dofmap[4][2]], [0.0, 0.0, 0.0, 0.0])\n", " solve!(elements, dofmap, [bc1], [bc2]; max_iterations=7)\n", - " disp = elements[2].attributes[\"displacement\"]\n", + " disp = elements[1].attributes[\"displacement\"]\n", " Logging.debug(\"Displacement of element = \\n$disp\")\n", - " #@fact norm(disp) => roughly(3.1292483947150043)\n", - "end" + " @fact norm(disp) --> roughly(3.1292483947150043)\n", + "end\n" ] }, { @@ -787,7 +735,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 17, "metadata": { "collapsed": false }, @@ -796,68 +744,44 @@ "name": "stderr", "output_type": "stream", "text": [ - "\n", - "WARNING: deprecated syntax \"{a=>b, ...}\" at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:11.\n", - "Use \"Dict{Any,Any}(a=>b, ...)\" instead.\n", - "\n", - "WARNING: deprecated syntax \"{a=>b, ...}\" at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:32.\n", - "Use \"Dict{Any,Any}(a=>b, ...)\" instead.\n", - "15-Aug 17:04:20:INFO:root:Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\"]\n", - "WARNING: beginswith is deprecated, use startswith instead.\n", - " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", - " in beginswith at deprecated.jl:30\n", - " in parse_abaqus at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:113\n", - " in include_string at loading.jl:99\n", - " in execute_request_0x535c5df2 at /Users/jukka/.julia/v0.4/IJulia/src/execute_request.jl:157\n", - " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", - " in anonymous at task.jl:365\n", - "while loading In[13], in expression starting on line 3\n", - "WARNING: beginswith is deprecated, use startswith instead.\n", - " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", - " in beginswith at deprecated.jl:30\n", - " in parse_abaqus at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:113\n", - " in include_string at loading.jl:99\n", - " in execute_request_0x535c5df2 at /Users/jukka/.julia/v0.4/IJulia/src/execute_request.jl:157\n", - " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", - " in anonymous at task.jl:365\n", - "while loading In[13], in expression starting on line 3\n", - "15-Aug 17:04:21:DEBUG:root:Found NODE section\n", - "15-Aug 17:04:22:DEBUG:root:Found ELEMENT section\n", - "WARNING: integer(s::AbstractString) is deprecated, use parse(Int,s) instead.\n", - " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", - " in integer at deprecated.jl:49\n", - " in map at abstractarray.jl:1251\n", - " in parse_element_section at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:59\n", - " in process_section at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:108\n", - " in parse_abaqus at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:117\n", - " in include_string at loading.jl:99\n", - " in execute_request_0x535c5df2 at /Users/jukka/.julia/v0.4/IJulia/src/execute_request.jl:157\n", - " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", - " in anonymous at task.jl:365\n", - "while loading In[13], in expression starting on line 3\n", - "15-Aug 17:04:27:DEBUG:root:120 elements found\n", - "15-Aug 17:04:27:INFO:root:Creating ELSET Body1\n", - "15-Aug 17:04:27:DEBUG:root:Found NSET section\n", - "15-Aug 17:04:28:DEBUG:root:Creating node set SUPPORT\n", - "15-Aug 17:04:28:DEBUG:root:Found NSET section\n", - "15-Aug 17:04:28:DEBUG:root:Creating node set LOAD\n", - "15-Aug 17:04:28:DEBUG:root:Found NSET section\n", - "15-Aug 17:04:28:DEBUG:root:Creating node set TOP\n" + "19-Aug 18:49:21:INFO:root:Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\"]\n", + "WARNING: beginswith is deprecated, use startswith instead.\n" ] }, { - "data": { - "text/plain": [ - "Dict{Any,Any} with 4 entries:\n", - " \"nodes\" => Dict{Any,Any}(288=>[97.5,7.5,10.0],11=>[92.5,2.5,5.0],134=>[45.0,10.0,0.0],158=>[2.5,2.5,0.0],160=>[7.5,7.5,0.0],215=>[60.0,0.0,5.0],29=>[2.5,7…\n", - " \"elements\" => Dict{Any,Any}(68=>[71,144,149,198,51,150,57,43,50,214],2=>[204,199,175,130,207,208,209,3,4,176],89=>[95,78,104,52,127,126,106,60,68,67],11=>[15…\n", - " \"elsets\" => Dict{Any,Any}(\"Body1\"=>[1,2,3,4,5,6,7,8,9,10 … 111,112,113,114,115,116,117,118,119,120])\n", - " \"nsets\" => Dict{Any,Any}(\"LOAD\"=>[82,84,87,179,197,246,249,256,257],\"SUPPORT\"=>[108,109,111,155,162,216,225,281,298],\"TOP\"=>[70,75,76,84,88,90,95,96,98,10…" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" + "ename": "LoadError", + "evalue": "LoadError: MethodError: `convert` has no method matching convert(::Type{SubString{ASCIIString}}, ::Dict{Any,Any})\nThis may have arisen from a call to the constructor SubString{ASCIIString}(...),\nsince type constructors fall back to convert methods.\nClosest candidates are:\n call{T}(::Type{T}, ::Any)\n convert{T<:AbstractString}(::Type{T<:AbstractString}, !Matched::AbstractArray{Char,1})\n convert{T<:AbstractString}(::Type{SubString{T<:AbstractString}}, !Matched::T<:AbstractString)\n ...\nwhile loading In[17], in expression starting on line 3", + "output_type": "error", + "traceback": [ + "LoadError: MethodError: `convert` has no method matching convert(::Type{SubString{ASCIIString}}, ::Dict{Any,Any})\nThis may have arisen from a call to the constructor SubString{ASCIIString}(...),\nsince type constructors fall back to convert methods.\nClosest candidates are:\n call{T}(::Type{T}, ::Any)\n convert{T<:AbstractString}(::Type{T<:AbstractString}, !Matched::AbstractArray{Char,1})\n convert{T<:AbstractString}(::Type{SubString{T<:AbstractString}}, !Matched::T<:AbstractString)\n ...\nwhile loading In[17], in expression starting on line 3", + "", + " in setindex! at dict.jl:615", + " in parse_header at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:40", + " in parse_abaqus at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:120" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", + " in beginswith at deprecated.jl:30\n", + " in parse_abaqus at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:115\n", + " in include_string at loading.jl:99\n", + " in execute_request_0x535c5df2 at /Users/jukka/.julia/v0.4/IJulia/src/execute_request.jl:157\n", + " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", + " in anonymous at task.jl:365\n", + "while loading In[17], in expression starting on line 3\n", + "WARNING: beginswith is deprecated, use startswith instead.\n", + " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", + " in beginswith at deprecated.jl:30\n", + " in parse_abaqus at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:115\n", + " in include_string at loading.jl:99\n", + " in execute_request_0x535c5df2 at /Users/jukka/.julia/v0.4/IJulia/src/execute_request.jl:157\n", + " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", + " in anonymous at task.jl:365\n", + "while loading In[17], in expression starting on line 3\n" + ] } ], "source": [ @@ -1280,6 +1204,53 @@ "JuliaFEM.xdmf.xdmf_save_model(xdoc, \"/tmp/3d_solid_model.xmf\")" ] }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "([0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],[0.0,0.0,0.0,0.0,0.0])" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "u = zeros(10)\n", + "u1 = u[1:5]\n", + "u, u1" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "([0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],[1.0,1.0,1.0,1.0,1.0])" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "u1[:] = 1\n", + "u, u1" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/src/abaqus_reader.jl b/src/abaqus_reader.jl index 4791762..3e52099 100644 --- a/src/abaqus_reader.jl +++ b/src/abaqus_reader.jl @@ -8,7 +8,9 @@ using Logging VERSION < v"0.4-" && using Docile -eldims = Dict({"C3D10" => 10}) +eldims = Dict( + "C3D10" => 10, + "C3D4" => 4) global handlers = Dict() @@ -29,7 +31,7 @@ end function parse_header(header_line) args = map(s -> strip(s), split(header_line, ",")) args[1] = strip(args[1], '*') - d = Dict({"section" => args[1]}) + d = Dict("section" => args[1]) options = Dict() for k in args[2:end] args2 = split(k, "=") diff --git a/src/math.jl b/src/math.jl index b839cb6..d3dc9bf 100644 --- a/src/math.jl +++ b/src/math.jl @@ -73,9 +73,9 @@ end """ Return partial derivatives of shape functions w.r.t X using chain rule. """ -function get_dbasisdX(el::Element, xi) - J = interpolate(el, "coordinates", xi; derivative=true) - dbasisdX = el.dbasis(xi)*inv(J') +function get_dbasisdX(el::Element, ip) + J = interpolate(el, "coordinates", ip.xi; derivative=true) + dbasisdX = el.dbasis(ip.xi)*inv(J') return dbasisdX end @@ -156,11 +156,9 @@ f::Function """ function integrate(f::Function, el::JuliaFEM.Element) target = [] - for m = 1:length(el.iweights) - w = el.iweights[m] - xi = el.ipoints[:, m] - J = JuliaFEM.interpolate(el, "coordinates", xi; derivative=true) - push!(target, w*f(el, xi)*det(J)) + for ip in el.integration_points + J = JuliaFEM.interpolate(el, "coordinates", ip.xi; derivative=true) + push!(target, ip.weight*f(el, ip)*det(J)) end return sum(target) end @@ -171,11 +169,9 @@ This version returns a function which must be operated with element e function integrate(f::Function) function integrate(el::JuliaFEM.Element) target = [] - for m = 1:length(el.iweights) - w = el.iweights[m] - xi = el.ipoints[:, m] - J = JuliaFEM.interpolate(el, "coordinates", xi; derivative=true) - push!(target, w*f(el, xi)*det(J)) + for ip in el.integration_points + J = JuliaFEM.interpolate(el, "coordinates", ip.xi; derivative=true) + push!(target, ip.weight*f(el, ip)*det(J)) end return sum(target) end @@ -188,10 +184,8 @@ This version saves results inplace to target, garbage collection free function integrate!(f::Function, el::JuliaFEM.Element, target) # set target to zero el.attributes[target][:] = 0.0 - for m = 1:length(el.iweights) - w = el.iweights[m] - xi = el.ipoints[:, m] - J = JuliaFEM.interpolate(el, "coordinates", xi; derivative=true) - el.attributes[target][:,:] += w*f(el, xi)*det(J) + for ip in el.integration_points + J = JuliaFEM.interpolate(el, "coordinates", ip.xi; derivative=true) + el.attributes[target][:,:] += ip.weight*f(el, ip)*det(J) end end diff --git a/src/types.jl b/src/types.jl index 05d38e9..68e663b 100644 --- a/src/types.jl +++ b/src/types.jl @@ -1,6 +1,22 @@ # This file is a part of JuliaFEM. # License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md +""" +Integration point + +xi :: Array{Float64, 1} + (dimensionless) coordinates of integration point +weight :: Float64 + Integration weight +attributes :: Dict{ASCIIString, Any} + This is used to save internal variables of IP needed e.g. for incremental + material models. +""" +type IntegrationPoint + xi :: Array{Float64, 1} + weight :: Float64 + attributes :: Dict{ASCIIString, Any} +end type Element id :: Int @@ -8,9 +24,10 @@ type Element node_ids :: Array{Int, 1} basis :: Function dbasis :: Function + integration_points :: Array{IntegrationPoint, 1} attributes :: Dict{ASCIIString, Any} - ipoints :: Array{Float64, 2} - iweights :: Array{Float64, 1} +# ipoints :: Array{Float64, 2} +# iweights :: Array{Float64, 1} end From a456187b0477fd7852cdce44a7d6fbe7df43a0d1 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Wed, 19 Aug 2015 22:51:44 +0300 Subject: [PATCH 22/26] 3d model visualized. --- ...2015-06-25-elasticity-solver-example.ipynb | 594 +++++++++++------- src/abaqus_reader.jl | 9 +- 2 files changed, 367 insertions(+), 236 deletions(-) diff --git a/notebooks/2015-06-25-elasticity-solver-example.ipynb b/notebooks/2015-06-25-elasticity-solver-example.ipynb index 92a818b..a6d94e7 100644 --- a/notebooks/2015-06-25-elasticity-solver-example.ipynb +++ b/notebooks/2015-06-25-elasticity-solver-example.ipynb @@ -175,16 +175,16 @@ "name": "stderr", "output_type": "stream", "text": [ - "19-Aug 18:39:44:DEBUG:root:Converged in 6 iterations.\n", - "19-Aug 18:39:44:DEBUG:root:solution vector: \n", + "19-Aug 19:15:02:DEBUG:root:Converged in 6 iterations.\n", + "19-Aug 19:15:02:DEBUG:root:solution vector: \n", " [0.0 -0.3991450609547433 -0.07228582695592461 0.0\n", " 0.0 -2.1779892317073504 -2.222244754401764 0.0]\n", - "19-Aug 18:39:44:DEBUG:root:norm of u: 3.1292483947150047\n", - "19-Aug 18:39:45:DEBUG:root:Converged in 6 iterations.\n", - "19-Aug 18:39:45:DEBUG:root:solution vector: \n", + "19-Aug 19:15:03:DEBUG:root:norm of u: 3.1292483947150047\n", + "19-Aug 19:15:03:DEBUG:root:Converged in 6 iterations.\n", + "19-Aug 19:15:03:DEBUG:root:solution vector: \n", " [0.0 0.7433248532717796 1.048521014723486 0.0\n", " 0.0 -2.085766534304891 -1.9606633242166027 0.0]\n", - "19-Aug 18:39:45:DEBUG:root:norm of u: 3.1292483947150056\n" + "19-Aug 19:15:03:DEBUG:root:norm of u: 3.1292483947150056\n" ] }, { @@ -359,27 +359,27 @@ "name": "stderr", "output_type": "stream", "text": [ - "19-Aug 18:39:46:DEBUG:root:Adding nodes to array\n", - "19-Aug 18:39:46:DEBUG:root:Starting iteration 1\n", - "19-Aug 18:39:46:DEBUG:root:Assembling\n", - "19-Aug 18:39:47:DEBUG:root:Solution norm = 3.0900221367289986\n", - "19-Aug 18:39:47:DEBUG:root:Starting iteration 2\n", - "19-Aug 18:39:47:DEBUG:root:Assembling\n", - "19-Aug 18:39:47:DEBUG:root:Solution norm = 0.3212131602153472\n", - "19-Aug 18:39:47:DEBUG:root:Starting iteration 3\n", - "19-Aug 18:39:47:DEBUG:root:Assembling\n", - "19-Aug 18:39:47:DEBUG:root:Solution norm = 0.04043178193999703\n", - "19-Aug 18:39:47:DEBUG:root:Starting iteration 4\n", - "19-Aug 18:39:47:DEBUG:root:Assembling\n", - "19-Aug 18:39:47:DEBUG:root:Solution norm = 0.0009291101052105739\n", - "19-Aug 18:39:47:DEBUG:root:Starting iteration 5\n", - "19-Aug 18:39:47:DEBUG:root:Assembling\n", - "19-Aug 18:39:47:DEBUG:root:Solution norm = 1.5638899027804743e-7\n", - "19-Aug 18:39:47:DEBUG:root:Starting iteration 6\n", - "19-Aug 18:39:47:DEBUG:root:Assembling\n", - "19-Aug 18:39:47:DEBUG:root:Solution norm = 1.0464940956129567e-14\n", - "19-Aug 18:39:47:DEBUG:root:Converged in 6 iterations.\n", - "19-Aug 18:39:47:DEBUG:root:Displacement of element = \n", + "19-Aug 19:15:05:DEBUG:root:Adding nodes to array\n", + "19-Aug 19:15:05:DEBUG:root:Starting iteration 1\n", + "19-Aug 19:15:05:DEBUG:root:Assembling\n", + "19-Aug 19:15:05:DEBUG:root:Solution norm = 3.0900221367289986\n", + "19-Aug 19:15:05:DEBUG:root:Starting iteration 2\n", + "19-Aug 19:15:05:DEBUG:root:Assembling\n", + "19-Aug 19:15:05:DEBUG:root:Solution norm = 0.3212131602153472\n", + "19-Aug 19:15:05:DEBUG:root:Starting iteration 3\n", + "19-Aug 19:15:05:DEBUG:root:Assembling\n", + "19-Aug 19:15:05:DEBUG:root:Solution norm = 0.04043178193999703\n", + "19-Aug 19:15:05:DEBUG:root:Starting iteration 4\n", + "19-Aug 19:15:05:DEBUG:root:Assembling\n", + "19-Aug 19:15:05:DEBUG:root:Solution norm = 0.0009291101052105739\n", + "19-Aug 19:15:05:DEBUG:root:Starting iteration 5\n", + "19-Aug 19:15:05:DEBUG:root:Assembling\n", + "19-Aug 19:15:05:DEBUG:root:Solution norm = 1.5638899027804743e-7\n", + "19-Aug 19:15:05:DEBUG:root:Starting iteration 6\n", + "19-Aug 19:15:05:DEBUG:root:Assembling\n", + "19-Aug 19:15:05:DEBUG:root:Solution norm = 1.0464940956129567e-14\n", + "19-Aug 19:15:05:DEBUG:root:Converged in 6 iterations.\n", + "19-Aug 19:15:06:DEBUG:root:Displacement of element = \n", "[0.0 -0.39914506095474334 -0.0722858269559246 0.0\n", " 0.0 -2.1779892317073504 -2.222244754401764 0.0]\n" ] @@ -517,7 +517,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 9, "metadata": { "collapsed": false, "scrolled": false @@ -534,53 +534,53 @@ "name": "stderr", "output_type": "stream", "text": [ - "19-Aug 18:49:12:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],1=>[1,2])\n", - "19-Aug 18:49:13:INFO:root:solve!: dofs per node: 2\n", - "19-Aug 18:49:13:DEBUG:root:Problem size = 8\n", - "19-Aug 18:49:13:DEBUG:root:Starting iteration 1\n", - "19-Aug 18:49:13:DEBUG:root:Assembling\n", - "19-Aug 18:49:13:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 18:49:13:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "19-Aug 18:49:13:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 18:49:13:DEBUG:root:Solving system of equations. Total size = 12\n", - "19-Aug 18:49:13:DEBUG:root:Solution norm du = 3.0900221367289444\n", - "19-Aug 18:49:13:DEBUG:root:Starting iteration 2\n", - "19-Aug 18:49:13:DEBUG:root:Assembling\n", - "19-Aug 18:49:13:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 18:49:13:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "19-Aug 18:49:13:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 18:49:13:DEBUG:root:Solving system of equations. Total size = 12\n", - "19-Aug 18:49:13:DEBUG:root:Solution norm du = 0.32121316021534796\n", - "19-Aug 18:49:13:DEBUG:root:Starting iteration 3\n", - "19-Aug 18:49:13:DEBUG:root:Assembling\n", - "19-Aug 18:49:13:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 18:49:13:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "19-Aug 18:49:13:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 18:49:13:DEBUG:root:Solving system of equations. Total size = 12\n", - "19-Aug 18:49:13:DEBUG:root:Solution norm du = 0.040431781940014504\n", - "19-Aug 18:49:13:DEBUG:root:Starting iteration 4\n", - "19-Aug 18:49:13:DEBUG:root:Assembling\n", - "19-Aug 18:49:13:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 18:49:13:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "19-Aug 18:49:13:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 18:49:13:DEBUG:root:Solving system of equations. Total size = 12\n", - "19-Aug 18:49:13:DEBUG:root:Solution norm du = 0.0009291101052065917\n", - "19-Aug 18:49:13:DEBUG:root:Starting iteration 5\n", - "19-Aug 18:49:13:DEBUG:root:Assembling\n", - "19-Aug 18:49:13:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 18:49:13:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "19-Aug 18:49:13:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 18:49:13:DEBUG:root:Solving system of equations. Total size = 12\n", - "19-Aug 18:49:13:DEBUG:root:Solution norm du = 1.5638899136781228e-7\n", - "19-Aug 18:49:13:DEBUG:root:Starting iteration 6\n", - "19-Aug 18:49:13:DEBUG:root:Assembling\n", - "19-Aug 18:49:13:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 18:49:13:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "19-Aug 18:49:13:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 18:49:13:DEBUG:root:Solving system of equations. Total size = 12\n", - "19-Aug 18:49:13:DEBUG:root:Solution norm du = 1.0913504694802626e-14\n", - "19-Aug 18:49:13:DEBUG:root:Converged in 6 iterations.\n", - "19-Aug 18:49:13:DEBUG:root:Displacement of element = \n", + "19-Aug 19:15:07:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],1=>[1,2])\n", + "19-Aug 19:15:07:INFO:root:solve!: dofs per node: 2\n", + "19-Aug 19:15:07:DEBUG:root:Problem size = 8\n", + "19-Aug 19:15:07:DEBUG:root:Starting iteration 1\n", + "19-Aug 19:15:07:DEBUG:root:Assembling\n", + "19-Aug 19:15:07:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 19:15:07:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "19-Aug 19:15:07:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 19:15:07:DEBUG:root:Solving system of equations. Total size = 12\n", + "19-Aug 19:15:07:DEBUG:root:Solution norm du = 3.0900221367289444\n", + "19-Aug 19:15:07:DEBUG:root:Starting iteration 2\n", + "19-Aug 19:15:07:DEBUG:root:Assembling\n", + "19-Aug 19:15:07:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 19:15:07:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "19-Aug 19:15:07:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 19:15:07:DEBUG:root:Solving system of equations. Total size = 12\n", + "19-Aug 19:15:07:DEBUG:root:Solution norm du = 0.32121316021534796\n", + "19-Aug 19:15:07:DEBUG:root:Starting iteration 3\n", + "19-Aug 19:15:08:DEBUG:root:Assembling\n", + "19-Aug 19:15:08:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 19:15:08:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "19-Aug 19:15:08:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 19:15:08:DEBUG:root:Solving system of equations. Total size = 12\n", + "19-Aug 19:15:08:DEBUG:root:Solution norm du = 0.040431781940014504\n", + "19-Aug 19:15:08:DEBUG:root:Starting iteration 4\n", + "19-Aug 19:15:08:DEBUG:root:Assembling\n", + "19-Aug 19:15:08:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 19:15:08:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "19-Aug 19:15:08:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 19:15:08:DEBUG:root:Solving system of equations. Total size = 12\n", + "19-Aug 19:15:08:DEBUG:root:Solution norm du = 0.0009291101052065917\n", + "19-Aug 19:15:08:DEBUG:root:Starting iteration 5\n", + "19-Aug 19:15:08:DEBUG:root:Assembling\n", + "19-Aug 19:15:08:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 19:15:08:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "19-Aug 19:15:08:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 19:15:08:DEBUG:root:Solving system of equations. Total size = 12\n", + "19-Aug 19:15:08:DEBUG:root:Solution norm du = 1.5638899136781228e-7\n", + "19-Aug 19:15:08:DEBUG:root:Starting iteration 6\n", + "19-Aug 19:15:08:DEBUG:root:Assembling\n", + "19-Aug 19:15:08:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 19:15:08:DEBUG:root:Added 5 Lagrange multipliers to model\n", + "19-Aug 19:15:08:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 19:15:08:DEBUG:root:Solving system of equations. Total size = 12\n", + "19-Aug 19:15:08:DEBUG:root:Solution norm du = 1.0913504694802626e-14\n", + "19-Aug 19:15:08:DEBUG:root:Converged in 6 iterations.\n", + "19-Aug 19:15:08:DEBUG:root:Displacement of element = \n", "[0.0 -0.39914506095474345 -0.07228582695592467 0.0\n", " 0.0 -2.177989231707351 -2.222244754401765 0.0]\n" ] @@ -598,7 +598,7 @@ "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 16, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -735,7 +735,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 10, "metadata": { "collapsed": false }, @@ -744,44 +744,44 @@ "name": "stderr", "output_type": "stream", "text": [ - "19-Aug 18:49:21:INFO:root:Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\"]\n", - "WARNING: beginswith is deprecated, use startswith instead.\n" - ] - }, - { - "ename": "LoadError", - "evalue": "LoadError: MethodError: `convert` has no method matching convert(::Type{SubString{ASCIIString}}, ::Dict{Any,Any})\nThis may have arisen from a call to the constructor SubString{ASCIIString}(...),\nsince type constructors fall back to convert methods.\nClosest candidates are:\n call{T}(::Type{T}, ::Any)\n convert{T<:AbstractString}(::Type{T<:AbstractString}, !Matched::AbstractArray{Char,1})\n convert{T<:AbstractString}(::Type{SubString{T<:AbstractString}}, !Matched::T<:AbstractString)\n ...\nwhile loading In[17], in expression starting on line 3", - "output_type": "error", - "traceback": [ - "LoadError: MethodError: `convert` has no method matching convert(::Type{SubString{ASCIIString}}, ::Dict{Any,Any})\nThis may have arisen from a call to the constructor SubString{ASCIIString}(...),\nsince type constructors fall back to convert methods.\nClosest candidates are:\n call{T}(::Type{T}, ::Any)\n convert{T<:AbstractString}(::Type{T<:AbstractString}, !Matched::AbstractArray{Char,1})\n convert{T<:AbstractString}(::Type{SubString{T<:AbstractString}}, !Matched::T<:AbstractString)\n ...\nwhile loading In[17], in expression starting on line 3", - "", - " in setindex! at dict.jl:615", - " in parse_header at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:40", - " in parse_abaqus at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:120" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ + "19-Aug 19:15:14:INFO:root:Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\"]\n", + "19-Aug 19:15:14:DEBUG:root:Found NODE section\n", + "19-Aug 19:15:14:DEBUG:root:Found ELEMENT section\n", + "WARNING: integer(s::AbstractString) is deprecated, use parse(Int,s) instead.\n", " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", - " in beginswith at deprecated.jl:30\n", - " in parse_abaqus at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:115\n", + " in integer at deprecated.jl:49\n", + " in map at abstractarray.jl:1251\n", + " in parse_element_section at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:60\n", + " in process_section at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:109\n", + " in parse_abaqus at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:118\n", " in include_string at loading.jl:99\n", " in execute_request_0x535c5df2 at /Users/jukka/.julia/v0.4/IJulia/src/execute_request.jl:157\n", " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", " in anonymous at task.jl:365\n", - "while loading In[17], in expression starting on line 3\n", - "WARNING: beginswith is deprecated, use startswith instead.\n", - " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", - " in beginswith at deprecated.jl:30\n", - " in parse_abaqus at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:115\n", - " in include_string at loading.jl:99\n", - " in execute_request_0x535c5df2 at /Users/jukka/.julia/v0.4/IJulia/src/execute_request.jl:157\n", - " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", - " in anonymous at task.jl:365\n", - "while loading In[17], in expression starting on line 3\n" + "while loading In[10], in expression starting on line 3\n", + "19-Aug 19:15:15:DEBUG:root:120 elements found\n", + "19-Aug 19:15:16:INFO:root:Creating ELSET Body1\n", + "19-Aug 19:15:16:DEBUG:root:Found NSET section\n", + "19-Aug 19:15:16:DEBUG:root:Creating node set SUPPORT\n", + "19-Aug 19:15:16:DEBUG:root:Found NSET section\n", + "19-Aug 19:15:16:DEBUG:root:Creating node set LOAD\n", + "19-Aug 19:15:16:DEBUG:root:Found NSET section\n", + "19-Aug 19:15:16:DEBUG:root:Creating node set TOP\n" ] + }, + { + "data": { + "text/plain": [ + "Dict{Any,Any} with 4 entries:\n", + " \"nodes\" => Dict{Any,Any}(288=>[97.5,7.5,10.0],11=>[92.5,2.5,5.0],134=>[45.0,10.0,0.0],158=>[2.5,2.5,0.0],160=>[7.5,7.5,0.0],215=>[60.0,0.0,5.0],29=>[2.5,7…\n", + " \"elements\" => Dict{Any,Any}(68=>[71,144,149,198,51,150,57,43,50,214],2=>[204,199,175,130,207,208,209,3,4,176],89=>[95,78,104,52,127,126,106,60,68,67],11=>[15…\n", + " \"elsets\" => Dict{Any,Any}(\"Body1\"=>[1,2,3,4,5,6,7,8,9,10 … 111,112,113,114,115,116,117,118,119,120])\n", + " \"nsets\" => Dict{Any,Any}(\"LOAD\"=>[82,84,87,179,197,246,249,256,257],\"SUPPORT\"=>[108,109,111,155,162,216,225,281,298],\"TOP\"=>[70,75,76,84,88,90,95,96,98,10…" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -794,7 +794,104 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 36, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "dbasis (generic function with 1 method)" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "P(xi) = [\n", + " 1\n", + " xi[1]\n", + " xi[2]\n", + " xi[3]\n", + " xi[1]^2\n", + " xi[2]^2\n", + " xi[3]^2\n", + " xi[1]*xi[2]\n", + " xi[2]*xi[3]\n", + " xi[3]*xi[1]]\n", + "dP(xi) = [\n", + " 0 0 0\n", + " 1 0 0\n", + " 0 1 0\n", + " 0 0 1\n", + " 2*xi[1] 0 0\n", + " 0 2*xi[2] 0\n", + " 0 0 2*xi[3]\n", + " xi[2] xi[1] 0\n", + " 0 xi[3] xi[2]\n", + " xi[3] 0 xi[1]\n", + "]\n", + "X = [\n", + " 0.0 0.0 0.0\n", + " 1.0 0.0 0.0\n", + " 0.0 1.0 0.0\n", + " 0.0 0.0 1.0\n", + " 0.5 0.0 0.0\n", + " 0.5 0.5 0.0\n", + " 0.0 0.5 0.0\n", + " 0.0 0.0 0.5\n", + " 0.5 0.0 0.5\n", + " 0.0 0.5 0.5]\n", + "A = zeros(10, 10)\n", + "for i=1:10\n", + " A[i,:] = P(X[i,:])\n", + "end\n", + "invA = inv(A)\n", + "basis(xi) = invA'*P(xi)\n", + "dbasis(xi) = invA'*dP(xi)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "10x10 Array{Float64,2}:\n", + " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0\n", + " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "for i=1:10\n", + " A[i,:] = basis(X[i,:])\n", + "end\n", + "A" + ] + }, + { + "cell_type": "code", + "execution_count": 54, "metadata": { "collapsed": false, "scrolled": false @@ -804,66 +901,123 @@ "name": "stderr", "output_type": "stream", "text": [ - "15-Aug 17:04:30:DEBUG:root:Creating elements\n", - "15-Aug 17:04:31:INFO:root:create_ldof2gdofmap: dofs per node: 3\n", - "15-Aug 17:04:31:INFO:root:solve!: dofs per node: 3\n", - "15-Aug 17:04:31:DEBUG:root:Problem size = 894\n", - "15-Aug 17:04:31:DEBUG:root:Starting iteration 1\n", - "15-Aug 17:04:31:DEBUG:root:Assembling\n", - "15-Aug 17:04:36:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "15-Aug 17:04:36:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "15-Aug 17:04:36:DEBUG:root:Adding Neumann boundary conditions\n", - "15-Aug 17:04:36:DEBUG:root:Solving system of equations. Total size = 921\n", - "15-Aug 17:04:36:DEBUG:root:Solution norm du = 72.87727091053921\n", - "15-Aug 17:04:36:DEBUG:root:Starting iteration 2\n", - "15-Aug 17:04:36:DEBUG:root:Assembling\n", - "15-Aug 17:04:40:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "15-Aug 17:04:40:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "15-Aug 17:04:40:DEBUG:root:Adding Neumann boundary conditions\n", - "15-Aug 17:04:40:DEBUG:root:Solving system of equations. Total size = 921\n", - "15-Aug 17:04:40:DEBUG:root:Solution norm du = 2.737285770100854\n", - "15-Aug 17:04:40:DEBUG:root:Starting iteration 3\n", - "15-Aug 17:04:40:DEBUG:root:Assembling\n", - "15-Aug 17:04:44:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "15-Aug 17:04:44:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "15-Aug 17:04:44:DEBUG:root:Adding Neumann boundary conditions\n", - "15-Aug 17:04:44:DEBUG:root:Solving system of equations. Total size = 921\n", - "15-Aug 17:04:44:DEBUG:root:Solution norm du = 0.07997112801214978\n", - "15-Aug 17:04:44:DEBUG:root:Starting iteration 4\n", - "15-Aug 17:04:44:DEBUG:root:Assembling\n", - "15-Aug 17:04:48:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "15-Aug 17:04:48:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "15-Aug 17:04:48:DEBUG:root:Adding Neumann boundary conditions\n", - "15-Aug 17:04:48:DEBUG:root:Solving system of equations. Total size = 921\n", - "15-Aug 17:04:48:DEBUG:root:Solution norm du = 6.406557430235748e-5\n", - "15-Aug 17:04:48:DEBUG:root:Starting iteration 5\n", - "15-Aug 17:04:48:DEBUG:root:Assembling\n", - "15-Aug 17:04:52:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "15-Aug 17:04:52:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "15-Aug 17:04:52:DEBUG:root:Adding Neumann boundary conditions\n", - "15-Aug 17:04:52:DEBUG:root:Solving system of equations. Total size = 921\n", - "15-Aug 17:04:52:DEBUG:root:Solution norm du = 6.870072007793185e-11\n", - "15-Aug 17:04:52:DEBUG:root:Converged in 5 iterations.\n", - "15-Aug 17:04:52:INFO:root:Maximum absolute displacement in y direction: 6.9925206227884695\n" + "19-Aug 21:11:57:DEBUG:root:Creating elements\n", + "19-Aug 21:11:57:INFO:root:solve!: dofs per node: 3\n", + "19-Aug 21:11:57:DEBUG:root:Problem size = 894\n", + "19-Aug 21:11:57:DEBUG:root:Starting iteration 1\n", + "19-Aug 21:11:57:DEBUG:root:Assembling\n", + "19-Aug 21:11:59:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 21:11:59:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "19-Aug 21:11:59:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 21:11:59:DEBUG:root:Solving system of equations. Total size = 921\n", + "19-Aug 21:11:59:DEBUG:root:Solution norm du = 550.6462282478749\n", + "19-Aug 21:11:59:DEBUG:root:Starting iteration 2\n", + "19-Aug 21:11:59:DEBUG:root:Assembling\n", + "19-Aug 21:12:02:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 21:12:02:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "19-Aug 21:12:02:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 21:12:02:DEBUG:root:Solving system of equations. Total size = 921\n", + "19-Aug 21:12:02:DEBUG:root:Solution norm du = 126.1405473091362\n", + "19-Aug 21:12:02:DEBUG:root:Starting iteration 3\n", + "19-Aug 21:12:02:DEBUG:root:Assembling\n", + "19-Aug 21:12:04:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 21:12:04:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "19-Aug 21:12:04:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 21:12:04:DEBUG:root:Solving system of equations. Total size = 921\n", + "19-Aug 21:12:04:DEBUG:root:Solution norm du = 38.94984055412649\n", + "19-Aug 21:12:04:DEBUG:root:Starting iteration 4\n", + "19-Aug 21:12:04:DEBUG:root:Assembling\n", + "19-Aug 21:12:07:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 21:12:07:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "19-Aug 21:12:07:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 21:12:07:DEBUG:root:Solving system of equations. Total size = 921\n", + "19-Aug 21:12:07:DEBUG:root:Solution norm du = 15.167069064284211\n", + "19-Aug 21:12:07:DEBUG:root:Starting iteration 5\n", + "19-Aug 21:12:07:DEBUG:root:Assembling\n", + "19-Aug 21:12:10:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 21:12:10:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "19-Aug 21:12:10:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 21:12:10:DEBUG:root:Solving system of equations. Total size = 921\n", + "19-Aug 21:12:10:DEBUG:root:Solution norm du = 9.516311535827375\n", + "19-Aug 21:12:10:DEBUG:root:Starting iteration 6\n", + "19-Aug 21:12:10:DEBUG:root:Assembling\n", + "19-Aug 21:12:12:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 21:12:12:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "19-Aug 21:12:12:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 21:12:12:DEBUG:root:Solving system of equations. Total size = 921\n", + "19-Aug 21:12:12:DEBUG:root:Solution norm du = 1.622282204776609\n", + "19-Aug 21:12:12:DEBUG:root:Starting iteration 7\n", + "19-Aug 21:12:12:DEBUG:root:Assembling\n", + "19-Aug 21:12:15:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 21:12:15:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "19-Aug 21:12:15:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 21:12:15:DEBUG:root:Solving system of equations. Total size = 921\n", + "19-Aug 21:12:15:DEBUG:root:Solution norm du = 0.09626397759398042\n", + "19-Aug 21:12:15:DEBUG:root:Starting iteration 8\n", + "19-Aug 21:12:15:DEBUG:root:Assembling\n", + "19-Aug 21:12:17:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 21:12:17:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "19-Aug 21:12:17:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 21:12:17:DEBUG:root:Solving system of equations. Total size = 921\n", + "19-Aug 21:12:18:DEBUG:root:Solution norm du = 0.0002630453729490514\n", + "19-Aug 21:12:18:DEBUG:root:Starting iteration 9\n", + "19-Aug 21:12:18:DEBUG:root:Assembling\n", + "19-Aug 21:12:20:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 21:12:20:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "19-Aug 21:12:20:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 21:12:20:DEBUG:root:Solving system of equations. Total size = 921\n", + "19-Aug 21:12:20:DEBUG:root:Solution norm du = 2.7238292530443165e-9\n", + "19-Aug 21:12:20:DEBUG:root:Starting iteration 10\n", + "19-Aug 21:12:20:DEBUG:root:Assembling\n", + "19-Aug 21:12:22:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "19-Aug 21:12:22:DEBUG:root:Added 28 Lagrange multipliers to model\n", + "19-Aug 21:12:22:DEBUG:root:Adding Neumann boundary conditions\n", + "19-Aug 21:12:22:DEBUG:root:Solving system of equations. Total size = 921\n", + "19-Aug 21:12:23:DEBUG:root:Solution norm du = 3.2746140168058266e-13\n", + "19-Aug 21:12:23:DEBUG:root:Converged in 10 iterations.\n", + "19-Aug 21:12:23:INFO:root:Maximum absolute displacement in y direction: 49.404599274553235\n" ] } ], "source": [ "function solve_3d_model()\n", " Logging.debug(\"Creating elements\")\n", - " elements = Element[]\n", + " elements = JuliaFEM.Element[]\n", " coordinates = zeros(3, 10)\n", + " \n", + " a = .585410196624969\n", + " b = .138196601125011\n", + " w = .0416666666666666666666666666666666666666666667\n", + "\n", + " integration_points = [\n", + " JuliaFEM.IntegrationPoint([a, b, b], w, Dict()),\n", + " JuliaFEM.IntegrationPoint([b, a, b], w, Dict()),\n", + " JuliaFEM.IntegrationPoint([b, b, a], w, Dict()),\n", + " JuliaFEM.IntegrationPoint([b, b, b], w, Dict())]\n", + "\n", " for (elid, node_ids) in model[\"elements\"]\n", + " coordinates[:,:] = 0.0\n", " for (i, nid) in enumerate(node_ids)\n", " coordinates[:,i] = model[\"nodes\"][nid]\n", " end\n", - " attributes = Dict(\"Young\" => 90, \"Poisson\" => 0.25)\n", - " el = Element(elid, node_ids, coordinates, attributes)\n", + "\n", + "\n", + " E = 90.0e6\n", + " nu = 0.3\n", + " mu = E/(2*(1+nu))\n", + " la = E*nu/((1+nu)*(1-2*nu))\n", + " la = 2*la*mu/(la + 2*mu)\n", + " attributes = Dict()\n", + " el = JuliaFEM.Element(elid, node_ids, basis, dbasis, integration_points, attributes)\n", + " el.attributes[\"coordinates\"] = copy(coordinates)\n", + " el.attributes[\"lambda\"] = la\n", + " el.attributes[\"mu\"] = mu\n", + " el.attributes[\"displacement\"] = zeros(3, 10)\n", " push!(elements, el)\n", " end\n", "\n", " # create \"dofmap\" so that we know how to assemble global stiffness matrix\n", - " dofmap = create_ldof2gdofmap(elements; ndofs=3)\n", + " dofmap = create_ldof2gdofmap(elements, \"displacement\")\n", "\n", " # Boundary conditions\n", "\n", @@ -880,7 +1034,7 @@ " bc_load = BC(Int64[], Float64[])\n", " for nid in model[\"nsets\"][\"LOAD\"]\n", " push!(bc_load.dofs, dofmap[nid][2])\n", - " push!(bc_load.values, -30.0)\n", + " push!(bc_load.values, -1500000.0)\n", " end\n", "\n", " #solve!(elements, [bc1], [bc2]; max_iterations=7)\n", @@ -915,7 +1069,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 55, "metadata": { "collapsed": false }, @@ -928,7 +1082,7 @@ "\n" ] }, - "execution_count": 15, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" } @@ -948,7 +1102,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 56, "metadata": { "collapsed": false }, @@ -957,8 +1111,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "15-Aug 17:04:54:INFO:root:Number of nodes in model: 298\n", - "15-Aug 17:04:54:INFO:root:Number of elements in model: 120\n" + "19-Aug 21:12:27:INFO:root:Number of nodes in model: 298\n", + "19-Aug 21:12:27:INFO:root:Number of elements in model: 120\n" ] } ], @@ -986,7 +1140,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 57, "metadata": { "collapsed": false }, @@ -997,7 +1151,7 @@ "true" ] }, - "execution_count": 17, + "execution_count": 57, "metadata": {}, "output_type": "execute_result" } @@ -1050,7 +1204,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 58, "metadata": { "collapsed": false }, @@ -1061,7 +1215,7 @@ "10435" ] }, - "execution_count": 18, + "execution_count": 58, "metadata": {}, "output_type": "execute_result" } @@ -1079,7 +1233,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 59, "metadata": { "collapsed": false }, @@ -1088,35 +1242,35 @@ "data": { "text/plain": [ "Dict{Any,Any} with 298 entries:\n", - " 288 => [-0.21784897897079505,-6.64256844921929,0.18339325827190953]\n", - " 11 => [-0.17342410820059667,-6.343125806991628,0.17544367431766225]\n", - " 158 => [-0.0007723334905839533,-0.2321904799732306,-0.03883691791045858]\n", - " 215 => [-0.03299227384130259,-4.2236276356937505,-0.0017757488281830807]\n", - " 134 => [-0.06336705102703495,-3.3332586850719337,0.06555932581531249]\n", - " 160 => [0.03205303832663507,-0.536361456950779,-0.07291283371223893]\n", - " 29 => [-0.01620524134284992,-0.19455583841608232,-0.03838421619811468]\n", - " 131 => [0.04015396763870081,-3.5101776818531523,0.10045744211179368]\n", - " 249 => [-0.2491004521409732,-6.570813533283954,0.06837890174506163]\n", - " 207 => [0.03974407267311282,-3.48588780058722,0.007971846403163977]\n", - " 173 => [-0.04472757590353555,-4.582185697159958,-0.04434348606400347]\n", - " 289 => [-0.16494613158592017,-6.360857515886982,0.33435404817411213]\n", - " 74 => [-0.03449870789750817,-3.947284664599636,0.0692691027146262]\n", - " 201 => [-0.00128347996939122,-3.8527236749372054,0.054216444201382656]\n", - " 176 => [-0.004729440266412542,-3.132546258410676,0.0036604388995965386]\n", - " 57 => [-0.021453552968802154,-4.134921994863808,0.04888988010136468]\n", - " 31 => [-0.005045439296021616,-0.3424143474221696,-0.0365148544462663]\n", - " 285 => [-0.19371941654927557,-6.446502168659889,0.18022053743770028]\n", - " 70 => [0.006277500845425116,-3.802694347992476,0.06251589929767469]\n", - " 33 => [-0.02778798411401373,-0.5091869603980016,0.03538255963543149]\n", - " 252 => [-0.11915625386204923,-1.2182594899567352,-0.025975085489623087]\n", - " 114 => [-0.14643901527350212,-0.4628626545501056,-0.0057156433415159625]\n", - " 165 => [-0.07462160313837857,-4.426674712264929,-0.04391022455570823]\n", - " 96 => [0.0541064545893336,-5.057801826440659,-0.01669155772495867]\n", - " 133 => [0.01615115174975327,-3.140610327091724,0.028951801068022566]\n", + " 288 => [-12.729409015111896,-46.984634561883446,0.00976161039328022]\n", + " 11 => [-14.785829217208498,-42.20176974427378,0.008418234114234127]\n", + " 158 => [-0.09613238427634223,-0.024925865661714005,-0.021152328599486677]\n", + " 215 => [-8.204098997513393,-20.651834887555786,0.003675944651346407]\n", + " 134 => [-0.04746289973768044,-13.917505665457258,0.05113049026250121]\n", + " 160 => [0.24815357717678405,-0.4508776021022819,0.039128388104899554]\n", + " 29 => [0.07844018461547288,-0.06270924383364974,0.004195891729593283]\n", + " 131 => [-0.044388456389593725,-13.917981456773102,-0.04387988824443422]\n", + " 249 => [-18.54080633960933,-46.66700218188128,0.008827411992911835]\n", + " 207 => [-4.743777979250225,-11.296644899155684,0.027192280490125977]\n", + " 173 => [-6.3308244019030075,-30.052183303569457,0.020872057672617197]\n", + " 289 => [-11.378151639243184,-43.542394288187026,0.006659559839321434]\n", + " 74 => [-1.0030212040100022,-18.135103544975525,0.026360938873555055]\n", + " 201 => [-6.115145748129358,-15.075793071665531,0.002993263067287828]\n", + " 176 => [-1.9275056779525068,-10.695874800497068,0.0020340066199601267]\n", + " 57 => [-4.707634597909077,-20.1431525488877,0.005778013656623472]\n", + " 31 => [-0.017918702135580025,-0.20429459029338676,-0.001244164592902111]\n", + " 285 => [-13.758654101433569,-44.588532062281566,0.009242729767727817]\n", + " 70 => [-0.6491658026068393,-16.68445815172476,-0.03677230855273996]\n", + " 33 => [-0.2031954625282471,-0.197025455475311,0.02008451861888156]\n", + " 252 => [-1.246103879230492,-1.6323762997299875,0.003005676402356407]\n", + " 114 => [0.6751013334216771,-0.8524740368899799,-0.07430557127461986]\n", + " 165 => [-10.550249918373456,-26.708598943475884,-0.018237563188812762]\n", + " 96 => [-6.47735355387718,-35.67268031983278,-0.0045879264893393095]\n", + " 133 => [0.4250714751403551,-11.347486228911386,0.003588217409561936]\n", " ⋮ => ⋮" ] }, - "execution_count": 19, + "execution_count": 59, "metadata": {}, "output_type": "execute_result" } @@ -1133,7 +1287,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 60, "metadata": { "collapsed": false }, @@ -1142,12 +1296,12 @@ "data": { "text/plain": [ "3x298 Array{Float64,2}:\n", - " -0.202475 -0.17437 0.0131267 -0.0340868 -0.0252162 0.0521758 … -0.054781 -0.169903 0.186936 0.102666 -0.0970747 -0.164397 0.0\n", - " -1.34204 -1.66404 -3.20587 -3.27673 -3.68732 -3.36789 -4.33822 -1.03943 -2.27466 -1.67467 -2.91213 -2.52353 0.0\n", - " 0.0211856 0.0324162 0.00213878 0.0377156 0.0683502 0.030081 -0.00684333 -0.035509 0.304867 0.26033 0.113802 0.152433 0.0" + " -0.328537 -0.581456 -1.94415 -2.25956 -1.65873 -1.02996 … -0.151833 -0.572535 -0.320967 -1.37494 -0.922318 0.0\n", + " -2.97468 -4.52837 -10.717 -11.9348 -14.9046 -12.2747 -1.683 -4.49601 -2.94077 -8.4008 -6.32738 0.0\n", + " -0.000439894 0.00176042 0.00267874 0.00357279 0.00431665 0.00380978 0.0048871 0.00163786 0.00332861 0.00422365 0.00304404 0.0" ] }, - "execution_count": 20, + "execution_count": 60, "metadata": {}, "output_type": "execute_result" } @@ -1162,7 +1316,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 61, "metadata": { "collapsed": false }, @@ -1173,7 +1327,7 @@ "true" ] }, - "execution_count": 21, + "execution_count": 61, "metadata": {}, "output_type": "execute_result" } @@ -1184,7 +1338,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 62, "metadata": { "collapsed": false }, @@ -1192,10 +1346,10 @@ { "data": { "text/plain": [ - "28330" + "28126" ] }, - "execution_count": 22, + "execution_count": 62, "metadata": {}, "output_type": "execute_result" } @@ -1206,49 +1360,27 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 63, "metadata": { "collapsed": false }, "outputs": [ { "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxIAAAHlCAIAAADurl0UAAAgAElEQVR4XuzdV5xdxZ0v+l+1PPfx+mHmnjlzxoGxh9BKSCAhQIDUyjnn0IqtbuXQvQGDMcZkWglJgHLOOUdQIBiTEQqNseeMPZ7PfblzHua+3XOOd92HWqFWraq11t4dUHf/vp/+SGtV1Vp7SzNo//yvWrWFlBJERERElKYkbQARERERAYxNRERERBkxNhERERFlwthERERElAljExEREVEmjE1EREREmTA2EREREWXC2ERERESUCWMTERERUSaMTURERESZMDYRERERZcLYRERERJQJYxMRERFRJoxNRERERJkwNhERERFlwthERERElAljExEREVEmjE1EREREmTA2EREREWXC2ERERESUCWMTERERUSaMTURERESZMDYRERERZcLYRERERJQJYxMRERFRJoxNRERERJkwNhERERFlwthERERElAljExEREVEmjE1EREREmTA2EREREWXC2ERERESUCWMTERERUSaMTURERESZMDYRERERZcLYRERERJQJYxMRERFRJoxNRERERJkwNhERERFlwthERERElAljExEREVEmjE1EREREmTA2EREREWXC2ERERESUCWMTERERUSaMTURERESZMDYRERERZcLYRERERJQJYxMRERFRJoxNRERERJkwNhERERFlwthERERElAljExEREVEmjE1EREREmTA2EREREWXC2ERERESUCWMTERERUSaMTURERESZMDYRERERZcLYRERERJQJYxMRERFRJoxNRERERJkwNhERERFlwthERERElAljExEREVEmjE1EREREmTA2EREREWXC2ERERESUCWMTERERUSaMTURERESZMDYRERERZcLYRERERJQJYxMRERFRJoxNRERERJkwNhERERFlwthERERElAljExEREVEmjE1EREREmTA2EREREWXC2ERERESUCWMTERERUSaMTURERESZMDYRERERZcLYRERERJQJYxMRERFRJoxNRERERJkwNhERERFlwthERERElAljExEREVEmjE1EREREmTA2EREREWXC2ERERESUCWMTERERUSaMTURERESZMDYRERERZcLYRERERJQJYxMRERFRJoxNRERERJkwNhERERFlwthERERElAljExEREVEmjE1ERERE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btsEAKiEWqrzklOhis1MFQYmIAdiEwC0l0XVlGlXU+GZqcDPlgNVE7IiNgFAO3mF07qH0wYrUIeSicyEHIhNANBmVlWTmhxV1VR5yQTkRmwCgNZShdMLa+tSONWhZFKompAPsQkAWq4Ou5rqE5iEzIQhEJsAoM1U4fT9hx9KGywRq3JoDWITALScl5weWhNXNfljIgVXTbUqmRSqJgyD2AQAnaBnpkzyZaYaBiZgeMQmAGg/VTgdWLPGu5tlV1P4c1mo7aocVROGRGwCgK6IW55LkLVqqnPJRGbC8IhNANAJqnDaPzEROKhdt2n4qqm2JRNQFGITAHSFSk7md+01sa+a6lwyKVRNKASxCQCQv2qqf2ASMhOKQ2wCgA7xCqfx1dGqKZCZ7KomVuXQNcQmAEDYif9dT85DjSiZFKomFIjYBADdogqnfStX57voQIMCE1A4YhMAdI5KTntXrDKeTViea9yqHFUTikVsAoAO0y5AkFw1NbFkIjOhcMQmAOgir3B6IFw4GaumxpVMQEmITQDQacm7mppYMilUTSgDsQkAOkoVTnvuH/eP6FVT4wKTesI+MhPKQGwCgO5SyUnd1i86UO2qXCgAWSInYQSITQCAgcJLphwZiACE2nL41wkAHecXTmIRmLLGIF5l0CbEJgDoOj02peJVA11GbAIAALAyljYAAAAAEWITAACAJWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAFWITAACAlf8D8OlU5pumssYAAAAASUVORK5CYII=", "text/plain": [ - "([0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],[0.0,0.0,0.0,0.0,0.0])" + "PyObject " ] }, - "execution_count": 17, + "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "u = zeros(10)\n", - "u1 = u[1:5]\n", - "u, u1" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "([0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],[1.0,1.0,1.0,1.0,1.0])" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "u1[:] = 1\n", - "u, u1" + "using PyCall\n", + "@pyimport IPython.display as d\n", + "d.Image(\"/tmp/3d_solid_model.png\")" ] }, { diff --git a/src/abaqus_reader.jl b/src/abaqus_reader.jl index 3e52099..6f6899e 100644 --- a/src/abaqus_reader.jl +++ b/src/abaqus_reader.jl @@ -31,13 +31,12 @@ end function parse_header(header_line) args = map(s -> strip(s), split(header_line, ",")) args[1] = strip(args[1], '*') - d = Dict("section" => args[1]) - options = Dict() + d = Dict("section" => args[1], "options" => Dict()) + options = d["options"] for k in args[2:end] args2 = split(k, "=") options[args2[1]] = args2[2] end - d["options"] = options return d end @@ -112,10 +111,10 @@ function parse_abaqus(fid) end for line in eachline(fid) - if beginswith(line, "**") + if startswith(line, "**") continue end - if beginswith(line, "*") + if startswith(line, "*") process_section(section) header = parse_header(line) Logging.debug("Found ", header["section"], " section") From 9c500aac8936fec21de5f26966fa75853e313583 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Sat, 22 Aug 2015 20:55:24 +0300 Subject: [PATCH 23/26] Updated concept of elements. --- ...2015-06-25-elasticity-solver-example.ipynb | 1622 +++++++++++------ src/JuliaFEM.jl | 3 +- src/abaqus_reader.jl | 15 +- src/math.jl | 40 +- src/types.jl | 23 +- src/xdmf.jl | 73 +- test/test_abaqus_reader.jl | 74 +- 7 files changed, 1218 insertions(+), 632 deletions(-) diff --git a/notebooks/2015-06-25-elasticity-solver-example.ipynb b/notebooks/2015-06-25-elasticity-solver-example.ipynb index a6d94e7..70230a8 100644 --- a/notebooks/2015-06-25-elasticity-solver-example.ipynb +++ b/notebooks/2015-06-25-elasticity-solver-example.ipynb @@ -89,7 +89,7 @@ "\n", "*Design principle 5*: we use 4 space indentation like in Python.\n", "\n", - "Our task is: for given $\\mathbf{u}$ calculate $\\mathbf{R}(\\mathbf{u}) = \\mathbf{T}(\\mathbf{u}) - \\mathbf{F}(\\mathbf{u})$ and it's partial derivative with respect to $\\mathbf{u}$, i.e. $\\partial \\mathbf{R}(\\mathbf{u}) / \\partial \\mathbf{u}$." + "First we construct some type for our element which contains all relevant data. We don't care a much how every element is actually implemented as long as it follows some general rules how the interface is constructed. Our element implementation for continuum 3d element is" ] }, { @@ -98,42 +98,112 @@ "metadata": { "collapsed": false }, + "outputs": [], + "source": [ + "abstract ContinuumElement <: Element\n", + "\n", + "\"\"\"\n", + "4-node bilinear plane stress element\n", + "\"\"\"\n", + "type CPS4 <: ContinuumElement\n", + " id :: Int\n", + " node_ids :: Array{Int, 1}\n", + " shape_functions :: FunctionSpace\n", + " integration_points :: Array{IntegrationPoint, 1}\n", + " attributes :: Dict{ASCIIString, Any}\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, "outputs": [ { "data": { "text/plain": [ - "jacobian (generic function with 1 method)" + "get_rhs (generic function with 1 method)" ] }, - "execution_count": 2, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "function Wint_integrand(el, ip)\n", - " xi = ip.xi\n", - " dbasisdX = JuliaFEM.get_dbasisdX(el, ip)\n", - " u = el.attributes[\"displacement\"]\n", + "function get_lhs(el::Element)\n", + " return None\n", + "end\n", + "function get_rhs(el::Element)\n", + " return None\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next we need to think a bit of interface design. We give good defaults if element is constructed like this, so user doesn't have to provide everything (although it's totally possible). Here's the implementation how to calculate internal nodal forces for some integration point in continuum elements general:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "get_lhs (generic function with 2 methods)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "Calculate internal nodal forces for continuum element.\n", + "\"\"\"\n", + "function Wint(el::ContinuumElement)\n", "\n", + " dNdX(xi) = JuliaFEM.get_dbasisdX(el, xi)\n", + " #dNdX(xi) = el.shape_functions.dbasis(xi)\n", + " # material\n", + " lambda(xi) = interpolate(el, \"lambda\", xi)\n", + " mu(xi) = interpolate(el, \"mu\", xi)\n", " # kinematics\n", - " gradu = u*dbasisdX\n", - " F = I + gradu\n", - " E = 1/2*(gradu' + gradu + gradu'*gradu)\n", - "\n", + " Grad(xi, u) = u*dNdX(xi)\n", + " F(xi, u) = I + Grad(xi, u)\n", + " E(xi, u) = 1/2*(Grad(xi, u)' + Grad(xi, u) + Grad(xi, u)'*Grad(xi, u))\n", " # constitutive equation\n", - " lambda = JuliaFEM.interpolate(el, \"lambda\", xi)\n", - " mu = JuliaFEM.interpolate(el, \"mu\", xi)\n", - " S = lambda*trace(E)*I + 2*mu*E\n", - " P = F*S\n", - " T = P*dbasisdX'\n", - " return T\n", + " S(xi, u) = lambda(xi)*trace(E(xi, u))*I + 2*mu(xi)*E(xi, u)\n", + " P(xi, u) = F(xi, u)*S(xi, u)\n", + " T(xi, u) = P(xi, u)*dNdX(xi)'\n", + "\n", + " function Wint_(el, ip)\n", + " xi = ip.xi\n", + " u = el.attributes[\"displacement\"]\n", + " return T(xi, u)\n", + " end\n", + " return integrate(Wint_, el)\n", + " #return integrate(T, el.integration_points, el.attributes[\"displacement\"])\n", "end\n", "\n", - "Wint = JuliaFEM.integrate(Wint_integrand)\n", - "\n", - "# calculate partial derivatives of R with respect to field \"displacement\"\n", - "jacobian = JuliaFEM.linearize(Wint, \"displacement\")" + "get_rhs(el::ContinuumElement) = -Wint(el)\n", + "get_lhs(el::ContinuumElement) = linearize(Wint, \"displacement\")(el)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our task is: for given $\\mathbf{u}$ calculate $\\mathbf{R}(\\mathbf{u}) = \\mathbf{T}(\\mathbf{u}) - \\mathbf{F}(\\mathbf{u})$ and it's partial derivative with respect to $\\mathbf{u}$, i.e. $\\partial \\mathbf{R}(\\mathbf{u}) / \\partial \\mathbf{u}$. Here is our $\\mathbf{T}$:" ] }, { @@ -147,7 +217,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": { "collapsed": true }, @@ -158,7 +228,66 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "get_test_element (generic function with 1 method)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function get_test_element()\n", + " # set up one linear quadrangle element\n", + " basis(xi) = [\n", + " (1-xi[1])*(1-xi[2])/4\n", + " (1+xi[1])*(1-xi[2])/4\n", + " (1+xi[1])*(1+xi[2])/4\n", + " (1-xi[1])*(1+xi[2])/4]\n", + "\n", + " dbasisdxi(xi) = [-(1-xi[2])/4.0 -(1-xi[1])/4.0\n", + " (1-xi[2])/4.0 -(1+xi[1])/4.0\n", + " (1+xi[2])/4.0 (1+xi[1])/4.0\n", + " -(1+xi[2])/4.0 (1-xi[1])/4.0]\n", + "\n", + " X = [0.0 0.0; 10.0 0.0; 10.0 1.0; 0.0 1.0]'\n", + " #J(xi) = X*dbasisdxi(xi)\n", + " #dbasisdX(xi) = dbasisdxi(xi)*inv(J(xi)')\n", + " shape_functions = FunctionSpace(basis, dbasisdxi)\n", + " integration_points = [\n", + " IntegrationPoint(1.0/sqrt(3.0)*[-1, -1], 1.0, Dict()),\n", + " IntegrationPoint(1.0/sqrt(3.0)*[ 1, -1], 1.0, Dict()),\n", + " IntegrationPoint(1.0/sqrt(3.0)*[ 1, 1], 1.0, Dict()),\n", + " IntegrationPoint(1.0/sqrt(3.0)*[-1, 1], 1.0, Dict())]\n", + " attributes = Dict()\n", + " element_id = 1\n", + " node_ids = [1, 2, 3, 4]\n", + " el = CPS4(element_id, node_ids, shape_functions, integration_points, attributes)\n", + " #el.shape_functions.dbasis(xi) = JuliaFEM.get_dbasisdX(el, xi)\n", + " E = 90.0\n", + " nu = 0.25\n", + " mu = E/(2*(1+nu))\n", + " la = E*nu/((1+nu)*(1-2*nu))\n", + " la = 2*la*mu/(la + 2*mu)\n", + " el.attributes[\"coordinates\"] = X\n", + " el.attributes[\"lambda\"] = la\n", + " el.attributes[\"mu\"] = mu\n", + " el.attributes[\"displacement\"] = [0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0]'\n", + " return el\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 7, "metadata": { "collapsed": false, "scrolled": false @@ -175,16 +304,40 @@ "name": "stderr", "output_type": "stream", "text": [ - "19-Aug 19:15:02:DEBUG:root:Converged in 6 iterations.\n", - "19-Aug 19:15:02:DEBUG:root:solution vector: \n", + "22-Aug 20:45:52:DEBUG:root:Iteration 1\n", + "22-Aug 20:46:00:DEBUG:root:Solving Ax = b\n", + "22-Aug 20:46:02:DEBUG:root:Iteration 2\n", + "22-Aug 20:46:02:DEBUG:root:Solving Ax = b\n", + "22-Aug 20:46:02:DEBUG:root:Iteration 3\n", + "22-Aug 20:46:02:DEBUG:root:Solving Ax = b\n", + "22-Aug 20:46:03:DEBUG:root:Iteration 4\n", + "22-Aug 20:46:03:DEBUG:root:Solving Ax = b\n", + "22-Aug 20:46:03:DEBUG:root:Iteration 5\n", + "22-Aug 20:46:03:DEBUG:root:Solving Ax = b\n", + "22-Aug 20:46:03:DEBUG:root:Iteration 6\n", + "22-Aug 20:46:03:DEBUG:root:Solving Ax = b\n", + "22-Aug 20:46:03:DEBUG:root:Converged in 6 iterations.\n", + "22-Aug 20:46:03:DEBUG:root:solution vector: \n", " [0.0 -0.3991450609547433 -0.07228582695592461 0.0\n", " 0.0 -2.1779892317073504 -2.222244754401764 0.0]\n", - "19-Aug 19:15:03:DEBUG:root:norm of u: 3.1292483947150047\n", - "19-Aug 19:15:03:DEBUG:root:Converged in 6 iterations.\n", - "19-Aug 19:15:03:DEBUG:root:solution vector: \n", + "22-Aug 20:46:04:DEBUG:root:norm of u: 3.1292483947150047\n", + "22-Aug 20:46:04:DEBUG:root:Iteration 1\n", + "22-Aug 20:46:04:DEBUG:root:Solving Ax = b\n", + "22-Aug 20:46:04:DEBUG:root:Iteration 2\n", + "22-Aug 20:46:04:DEBUG:root:Solving Ax = b\n", + "22-Aug 20:46:04:DEBUG:root:Iteration 3\n", + "22-Aug 20:46:04:DEBUG:root:Solving Ax = b\n", + "22-Aug 20:46:04:DEBUG:root:Iteration 4\n", + "22-Aug 20:46:04:DEBUG:root:Solving Ax = b\n", + "22-Aug 20:46:04:DEBUG:root:Iteration 5\n", + "22-Aug 20:46:04:DEBUG:root:Solving Ax = b\n", + "22-Aug 20:46:04:DEBUG:root:Iteration 6\n", + "22-Aug 20:46:04:DEBUG:root:Solving Ax = b\n", + "22-Aug 20:46:04:DEBUG:root:Converged in 6 iterations.\n", + "22-Aug 20:46:04:DEBUG:root:solution vector: \n", " [0.0 0.7433248532717796 1.048521014723486 0.0\n", " 0.0 -2.085766534304891 -1.9606633242166027 0.0]\n", - "19-Aug 19:15:03:DEBUG:root:norm of u: 3.1292483947150056\n" + "22-Aug 20:46:04:DEBUG:root:norm of u: 3.1292483947150056\n" ] }, { @@ -200,44 +353,12 @@ "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 4, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "function get_test_element()\n", - " # set up one linear quadrangle element\n", - " basis(xi) = [\n", - " (1-xi[1])*(1-xi[2])/4\n", - " (1+xi[1])*(1-xi[2])/4\n", - " (1+xi[1])*(1+xi[2])/4\n", - " (1-xi[1])*(1+xi[2])/4]\n", - " dbasis(xi) = [-(1-xi[2])/4.0 -(1-xi[1])/4.0\n", - " (1-xi[2])/4.0 -(1+xi[1])/4.0\n", - " (1+xi[2])/4.0 (1+xi[1])/4.0\n", - " -(1+xi[2])/4.0 (1-xi[1])/4.0]\n", - " integration_points = [\n", - " JuliaFEM.IntegrationPoint(1.0/sqrt(3.0)*[-1, -1], 1.0, Dict()),\n", - " JuliaFEM.IntegrationPoint(1.0/sqrt(3.0)*[ 1, -1], 1.0, Dict()),\n", - " JuliaFEM.IntegrationPoint(1.0/sqrt(3.0)*[ 1, 1], 1.0, Dict()),\n", - " JuliaFEM.IntegrationPoint(1.0/sqrt(3.0)*[-1, 1], 1.0, Dict())]\n", - " attributes = Dict()\n", - " element_id = 1\n", - " node_ids = [1, 2, 3, 4]\n", - " e = JuliaFEM.Element(element_id, node_ids, basis, dbasis, integration_points, attributes)\n", - " E = 90.0\n", - " nu = 0.25\n", - " mu = E/(2*(1+nu))\n", - " la = E*nu/((1+nu)*(1-2*nu))\n", - " la = 2*la*mu/(la + 2*mu)\n", - " e.attributes[\"coordinates\"] = [0.0 0.0; 10.0 0.0; 10.0 1.0; 0.0 1.0]'\n", - " e.attributes[\"lambda\"] = la\n", - " e.attributes[\"mu\"] = mu\n", - " e.attributes[\"displacement\"] = [0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0]'\n", - " return e\n", - "end\n", - "\n", "facts(\"test solve one element model\") do\n", "\n", " e = get_test_element()\n", @@ -247,9 +368,12 @@ "\n", " free_dofs = [3, 4, 5, 6]\n", " for i=1:10\n", - " R = Wint(e)\n", - " K = jacobian(e)\n", - " du[free_dofs] = K[free_dofs, free_dofs] \\ -(R - F)[free_dofs]\n", + " Logging.debug(\"Iteration $i\")\n", + " A = get_lhs(e)\n", + " b = get_rhs(e)\n", + " Logging.debug(\"Solving Ax = b\")\n", + " du[free_dofs] = A[free_dofs, free_dofs] \\ (b + F)[free_dofs]\n", + "\n", " e.attributes[\"displacement\"] += du\n", " if norm(du) < 1.0e-9\n", " Logging.debug(\"Converged in $i iterations.\")\n", @@ -275,9 +399,12 @@ " e.attributes[\"displacement\"] = [0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0]'\n", " du = zeros(2, 4)\n", " for i=1:10\n", - " R = Wint(e)\n", - " K = jacobian(e)\n", - " du[free_dofs] = K[free_dofs, free_dofs] \\ -(R - F)[free_dofs]\n", + " Logging.debug(\"Iteration $i\")\n", + " A = get_lhs(e)\n", + " b = get_rhs(e)\n", + " Logging.debug(\"Solving Ax = b\")\n", + " du[free_dofs] = A[free_dofs, free_dofs] \\ (b + F)[free_dofs]\n", + "\n", " e.attributes[\"displacement\"] += du\n", " if norm(du) < 1.0e-9\n", " Logging.debug(\"Converged in $i iterations.\")\n", @@ -291,9 +418,16 @@ "end" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Assembly procedure is now very general because we always just have to call `get_lhs` and `get_rhs` to get corresponding vectors and matrices from element." + ] + }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 8, "metadata": { "collapsed": false }, @@ -304,31 +438,211 @@ "assemble_element! (generic function with 1 method)" ] }, - "execution_count": 5, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "function assemble_element!(ass::JuliaFEM.Assembly, el::JuliaFEM.Element)\n", + "function assemble_element!(ass::Assembly, el::Element)\n", "\n", " gdofs = ass.gdofs[el.id]\n", - " R = Wint(el)\n", - " K = jacobian(el)\n", - " dofs = length(R)\n", "\n", - " for i=1:dofs\n", - " for j=1:dofs\n", - " push!(ass.I, gdofs[i])\n", - " push!(ass.J, gdofs[j])\n", - " push!(ass.A, K[i,j])\n", + " A = get_lhs(el)\n", + " if !(A == None)\n", + " ii, jj = size(A)\n", + " for i=1:ii\n", + " for j=1:jj\n", + " push!(ass.I, gdofs[i])\n", + " push!(ass.J, gdofs[j])\n", + " push!(ass.A, A[i,j])\n", + " end\n", + " end\n", + " end\n", + " \n", + " b = get_rhs(el)\n", + " if !(b == None)\n", + " for i=1:length(b)\n", + " push!(ass.i, gdofs[i])\n", + " push!(ass.b, b[i])\n", " end\n", - " push!(ass.i, gdofs[i])\n", - " push!(ass.b, R[i])\n", " end\n", "end" ] }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "get_field (generic function with 1 method)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function update_field(el::ContinuumElement, du)\n", + " el.attributes[\"displacement\"][:] += du\n", + "end\n", + "function get_field(el::ContinuumElement)\n", + " return el.attributes[\"displacement\"]\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We also need to construct our element in somehow \"standard\" way. My proposal is: element id and node ids (connectivity) information. Of course other fields must also be provided. Here's example for CPS4 element:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "CPS4" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function CPS4(element_id, node_ids)\n", + " basis(xi) = [\n", + " (1-xi[1])*(1-xi[2])/4\n", + " (1+xi[1])*(1-xi[2])/4\n", + " (1+xi[1])*(1+xi[2])/4\n", + " (1-xi[1])*(1+xi[2])/4]\n", + " dbasis(xi) = [-(1-xi[2])/4.0 -(1-xi[1])/4.0\n", + " (1-xi[2])/4.0 -(1+xi[1])/4.0\n", + " (1+xi[2])/4.0 (1+xi[1])/4.0\n", + " -(1+xi[2])/4.0 (1-xi[1])/4.0]\n", + " shape_functions = FunctionSpace(basis, dbasis)\n", + " integration_points = [\n", + " IntegrationPoint(1.0/sqrt(3.0)*[-1, -1], 1.0, Dict()),\n", + " IntegrationPoint(1.0/sqrt(3.0)*[ 1, -1], 1.0, Dict()),\n", + " IntegrationPoint(1.0/sqrt(3.0)*[ 1, 1], 1.0, Dict()),\n", + " IntegrationPoint(1.0/sqrt(3.0)*[-1, 1], 1.0, Dict())]\n", + " attributes = Dict(\"displacement\" => zeros(2, 4))\n", + " CPS4(element_id, node_ids, shape_functions, integration_points, attributes)\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Almost done. Also we must define interface how to set coordinates, material properties etc. for element." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "set_attribute (generic function with 1 method)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function set_attribute(el::Element, field, value)\n", + " el.attributes[field] = value\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This might look a bit cumbersome at this point, but notice that everything is very general so far. We really don't have to define all this stuff when creating new elements if we follow some general construct. To demonstrate that, we define 0-dimensional \"point force\" element. Keep in mind, we need to have some functions defined how to operate using element, but they are already defined to superclass of element. So we need to only take care of construcor, rhs and (maybe) lhs. " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "\"\"\"\n", + "1-node point force element for plane stress problems.\n", + "\"\"\"\n", + "type CPS1 <: ContinuumElement\n", + " id :: Int\n", + " node_ids :: Array{Int, 1}\n", + " attributes :: Dict{ASCIIString, Any}\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "get_lhs (generic function with 3 methods)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "Constructor of CPS1\n", + "\"\"\"\n", + "function CPS1(element_id, node_ids)\n", + " attributes = Dict(\n", + " \"displacement\" => zeros(2, 1),\n", + " \"displacement nodal load\" => zeros(2, 1))\n", + " CPS1(element_id, node_ids, attributes)\n", + "end\n", + "function get_rhs(el::CPS1)\n", + " return el.attributes[\"displacement nodal load\"]\n", + "end\n", + "function get_lhs(el::CPS1)\n", + " return None\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And that's basically everything needs to be defined. During assembling get_lhs returns nothing and does not assemble anything to stiffness matrix (of course in case of follower point force the direction depents on the normal ..) and get_rhs adds simple point force pointing to some direction." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -336,14 +650,12 @@ "Time to test again. From last test we know that correct solution is\n", "\n", " [0.0 -0.39914506095474317 -0.07228582695592449 0.0\n", - " 0.0 -2.1779892317073504 -2.222244754401764 0.0]\n", - "\n", - "This time we assemble global stiffness matrix in different order, 2 3 4 1" + " 0.0 -2.1779892317073504 -2.222244754401764 0.0]" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 14, "metadata": { "collapsed": false }, @@ -359,27 +671,26 @@ "name": "stderr", "output_type": "stream", "text": [ - "19-Aug 19:15:05:DEBUG:root:Adding nodes to array\n", - "19-Aug 19:15:05:DEBUG:root:Starting iteration 1\n", - "19-Aug 19:15:05:DEBUG:root:Assembling\n", - "19-Aug 19:15:05:DEBUG:root:Solution norm = 3.0900221367289986\n", - "19-Aug 19:15:05:DEBUG:root:Starting iteration 2\n", - "19-Aug 19:15:05:DEBUG:root:Assembling\n", - "19-Aug 19:15:05:DEBUG:root:Solution norm = 0.3212131602153472\n", - "19-Aug 19:15:05:DEBUG:root:Starting iteration 3\n", - "19-Aug 19:15:05:DEBUG:root:Assembling\n", - "19-Aug 19:15:05:DEBUG:root:Solution norm = 0.04043178193999703\n", - "19-Aug 19:15:05:DEBUG:root:Starting iteration 4\n", - "19-Aug 19:15:05:DEBUG:root:Assembling\n", - "19-Aug 19:15:05:DEBUG:root:Solution norm = 0.0009291101052105739\n", - "19-Aug 19:15:05:DEBUG:root:Starting iteration 5\n", - "19-Aug 19:15:05:DEBUG:root:Assembling\n", - "19-Aug 19:15:05:DEBUG:root:Solution norm = 1.5638899027804743e-7\n", - "19-Aug 19:15:05:DEBUG:root:Starting iteration 6\n", - "19-Aug 19:15:05:DEBUG:root:Assembling\n", - "19-Aug 19:15:05:DEBUG:root:Solution norm = 1.0464940956129567e-14\n", - "19-Aug 19:15:05:DEBUG:root:Converged in 6 iterations.\n", - "19-Aug 19:15:06:DEBUG:root:Displacement of element = \n", + "22-Aug 20:46:07:DEBUG:root:Starting iteration 1\n", + "22-Aug 20:46:07:DEBUG:root:Assembling\n", + "22-Aug 20:46:08:DEBUG:root:Solution norm = 3.0900221367289986\n", + "22-Aug 20:46:08:DEBUG:root:Starting iteration 2\n", + "22-Aug 20:46:08:DEBUG:root:Assembling\n", + "22-Aug 20:46:08:DEBUG:root:Solution norm = 0.3212131602153472\n", + "22-Aug 20:46:08:DEBUG:root:Starting iteration 3\n", + "22-Aug 20:46:08:DEBUG:root:Assembling\n", + "22-Aug 20:46:08:DEBUG:root:Solution norm = 0.04043178193999703\n", + "22-Aug 20:46:08:DEBUG:root:Starting iteration 4\n", + "22-Aug 20:46:08:DEBUG:root:Assembling\n", + "22-Aug 20:46:08:DEBUG:root:Solution norm = 0.0009291101052105739\n", + "22-Aug 20:46:08:DEBUG:root:Starting iteration 5\n", + "22-Aug 20:46:08:DEBUG:root:Assembling\n", + "22-Aug 20:46:08:DEBUG:root:Solution norm = 1.5638899027804743e-7\n", + "22-Aug 20:46:08:DEBUG:root:Starting iteration 6\n", + "22-Aug 20:46:08:DEBUG:root:Assembling\n", + "22-Aug 20:46:08:DEBUG:root:Solution norm = 1.0464940956129567e-14\n", + "22-Aug 20:46:08:DEBUG:root:Converged in 6 iterations.\n", + "22-Aug 20:46:08:DEBUG:root:Displacement of element = \n", "[0.0 -0.39914506095474334 -0.0722858269559246 0.0\n", " 0.0 -2.1779892317073504 -2.222244754401764 0.0]\n" ] @@ -397,48 +708,66 @@ "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 6, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "facts(\"one element assembly\") do\n", - " # Create model\n", - " Logging.debug(\"Adding nodes to array\")\n", - " el = get_test_element()\n", - " \n", + " # set up element 1\n", + " element_id = 1\n", + " node_ids = [1, 2, 3, 4]\n", + " el1 = CPS4(element_id, node_ids)\n", + " # assign properties to element, e.g. coordinates, material properties, ...\n", + " E = 90.0\n", + " nu = 0.25\n", + " mu = E/(2*(1+nu))\n", + " la = E*nu/((1+nu)*(1-2*nu))\n", + " la = 2*la*mu/(la + 2*mu)\n", + " set_attribute(el1, \"coordinates\", [0.0 0.0; 10.0 0.0; 10.0 1.0; 0.0 1.0]')\n", + " set_attribute(el1, \"lambda\", la)\n", + " set_attribute(el1, \"mu\", mu)\n", + "\n", + " # set up element 2\n", + " el2 = CPS1(2, [3]) # Create nodal point force element with id 2 for node 3\n", + " set_attribute(el2, \"displacement nodal load\", [0.0, -2.0])\n", + "\n", + " elements = [el1, el2]\n", + "\n", " for i=1:10\n", " Logging.debug(\"Starting iteration $i\")\n", - " ass = JuliaFEM.Assembly(Int64[], Int64[], Float64[], Int64[], Float64[], Dict{Int64,Array{Int64,1}}())\n", - " ass.gdofs[el.id] = [1, 2, 3, 4, 5, 6, 7, 8]\n", " Logging.debug(\"Assembling\")\n", - " assemble_element!(ass, el)\n", + " ass = Assembly()\n", + " ass.gdofs[el1.id] = [1, 2, 3, 4, 5, 6, 7, 8]\n", + " ass.gdofs[el2.id] = [5, 6]\n", "\n", - " # Boundary conditions\n", - " F = [0.0 0.0; 0.0 0.0; 0.0 -2.0; 0.0 0.0]'\n", - " F = F[:]\n", + " for el in elements\n", + " assemble_element!(ass, el)\n", + " end\n", + "\n", + " # (Dirichlet) boundary conditions \"handled\"\n", " free_dofs = [3, 4, 5, 6]\n", "\n", " # solution\n", - " K = sparse(ass.I, ass.J, ass.A)\n", - " R = full(sparsevec(ass.i, ass.b))\n", - " R = R - F\n", + " A = sparse(ass.I, ass.J, ass.A)\n", + " b = full(sparsevec(ass.i, ass.b))\n", " du = zeros(8)\n", - " du[free_dofs] = K[free_dofs, free_dofs] \\ -R[free_dofs]\n", + " du[free_dofs] = A[free_dofs, free_dofs] \\ b[free_dofs]\n", "\n", " Logging.debug(\"Solution norm = $(norm(du))\")\n", "\n", " # update solution back to elements\n", - " eldu = du[ass.gdofs[el.id]]\n", - " eldu = reshape(eldu, (2, round(Int, length(eldu)/2)))\n", - " el.attributes[\"displacement\"] += eldu\n", + " for el in elements\n", + " eldu = du[ass.gdofs[el.id]]\n", + " update_field(el, eldu)\n", + " end\n", " if norm(du) < 1.0e-9\n", " Logging.debug(\"Converged in $i iterations.\")\n", " break\n", " end\n", - " end\n", - " disp = el.attributes[\"displacement\"]\n", + " end \n", + " disp = get_field(el1)\n", " Logging.debug(\"Displacement of element = \\n$disp\")\n", " @fact norm(disp) --> roughly(3.1292483947150043)\n", "end" @@ -448,30 +777,56 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Seems to be working. But we still need to handle boundary conditions more \"cleverly\" and generalize assembly to several elements (which is not problem).\n", - "\n", - "First of all, essential boundary conditions are nothing more than equality constraints saying that value for some degree of freedom is fixed. Elimination is just a special case when this value equals to zero. There is couple of different strategies to handle essential boundary conditions. One option is to force them using Lagrange multipliers which can also be used to create all kind of kinematic constraints also. (For example, contact can be considered as a kinematic constraint.) Another option is to manipulate matrix such a way that constraint is satisfied.\n", - "\n", - "Because we are now going \"bottom-up\", we develop something extremely simple that however deals with the problem:" + "Seems to be working. But we still need to handle Dirichlet boundary conditions somewhat more generally. In very general form Dirichlet bc can be expressed as $\\mathbf{B}\\mathbf{u} = \\mathbf{d}$ for variational problem and $\\mathbf{B}\\mathbf{u} \\leq \\mathbf{d}$ for variational inequality problems. In contact mechanics typically nodes are divided to several sets, one with slave nodes (can be eliminated), master nodes, and all other nodes. $\\mathbf{B}$ is usually something $\\mathbf{B}=\\begin{bmatrix}\\mathbf{0} & \\mathbf{D} & -\\mathbf{M}\\end{bmatrix}^\\mathrm{T}$. In normal Dirichlet boundary condition this simplifies to something $\\mathbf{D}\\mathbf{d}_\\mathcal{S} = \\mathbf{0}$, where nodes in set $\\mathcal{S}$ are known to be slave nodes. Finally, contact is nothing more than multi point constraint. Dirichlet boundary conditions can be easily eliminated if $\\mathbf{D}$ is diagonal: $\\mathbf{D}\\mathbf{d}_\\mathcal{S} = \\mathbf{M}\\mathbf{d}_\\mathcal{M} \\Rightarrow \\mathbf{d}_\\mathcal{S} = \\mathbf{D}^{-1}\\mathbf{M}\\mathbf{d}_\\mathcal{M} = \\mathbf{P}\\mathbf{d}_\\mathcal{M}$." ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [], "source": [ - "type BC\n", - " dofs :: Array{Int64, 1}\n", - " values :: Array{Float64, 1}\n", + "type MPC\n", + " slave_dof :: Int64\n", + " slave_value :: Float64\n", + " master_dofs :: Array{Int64, 1}\n", + " master_values :: Array{Float64, 1}\n", + " constant :: Float64\n", "end" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "MPC" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "Convenient function, to set some dof=0\n", + "\"\"\"\n", + "function MPC(dof)\n", + " MPC(dof, 1.0, Int64[], Float64[], 0.0)\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 17, "metadata": { "collapsed": false }, @@ -482,7 +837,7 @@ "create_ldof2gdofmap (generic function with 1 method)" ] }, - "execution_count": 8, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -517,7 +872,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 18, "metadata": { "collapsed": false, "scrolled": false @@ -534,55 +889,49 @@ "name": "stderr", "output_type": "stream", "text": [ - "19-Aug 19:15:07:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],1=>[1,2])\n", - "19-Aug 19:15:07:INFO:root:solve!: dofs per node: 2\n", - "19-Aug 19:15:07:DEBUG:root:Problem size = 8\n", - "19-Aug 19:15:07:DEBUG:root:Starting iteration 1\n", - "19-Aug 19:15:07:DEBUG:root:Assembling\n", - "19-Aug 19:15:07:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 19:15:07:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "19-Aug 19:15:07:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 19:15:07:DEBUG:root:Solving system of equations. Total size = 12\n", - "19-Aug 19:15:07:DEBUG:root:Solution norm du = 3.0900221367289444\n", - "19-Aug 19:15:07:DEBUG:root:Starting iteration 2\n", - "19-Aug 19:15:07:DEBUG:root:Assembling\n", - "19-Aug 19:15:07:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 19:15:07:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "19-Aug 19:15:07:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 19:15:07:DEBUG:root:Solving system of equations. Total size = 12\n", - "19-Aug 19:15:07:DEBUG:root:Solution norm du = 0.32121316021534796\n", - "19-Aug 19:15:07:DEBUG:root:Starting iteration 3\n", - "19-Aug 19:15:08:DEBUG:root:Assembling\n", - "19-Aug 19:15:08:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 19:15:08:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "19-Aug 19:15:08:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 19:15:08:DEBUG:root:Solving system of equations. Total size = 12\n", - "19-Aug 19:15:08:DEBUG:root:Solution norm du = 0.040431781940014504\n", - "19-Aug 19:15:08:DEBUG:root:Starting iteration 4\n", - "19-Aug 19:15:08:DEBUG:root:Assembling\n", - "19-Aug 19:15:08:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 19:15:08:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "19-Aug 19:15:08:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 19:15:08:DEBUG:root:Solving system of equations. Total size = 12\n", - "19-Aug 19:15:08:DEBUG:root:Solution norm du = 0.0009291101052065917\n", - "19-Aug 19:15:08:DEBUG:root:Starting iteration 5\n", - "19-Aug 19:15:08:DEBUG:root:Assembling\n", - "19-Aug 19:15:08:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 19:15:08:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "19-Aug 19:15:08:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 19:15:08:DEBUG:root:Solving system of equations. Total size = 12\n", - "19-Aug 19:15:08:DEBUG:root:Solution norm du = 1.5638899136781228e-7\n", - "19-Aug 19:15:08:DEBUG:root:Starting iteration 6\n", - "19-Aug 19:15:08:DEBUG:root:Assembling\n", - "19-Aug 19:15:08:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 19:15:08:DEBUG:root:Added 5 Lagrange multipliers to model\n", - "19-Aug 19:15:08:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 19:15:08:DEBUG:root:Solving system of equations. Total size = 12\n", - "19-Aug 19:15:08:DEBUG:root:Solution norm du = 1.0913504694802626e-14\n", - "19-Aug 19:15:08:DEBUG:root:Converged in 6 iterations.\n", - "19-Aug 19:15:08:DEBUG:root:Displacement of element = \n", - "[0.0 -0.39914506095474345 -0.07228582695592467 0.0\n", - " 0.0 -2.177989231707351 -2.222244754401765 0.0]\n" + "22-Aug 20:46:09:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],1=>[1,2])\n", + "22-Aug 20:46:09:INFO:root:solve!: dofs per node: 2\n", + "22-Aug 20:46:09:DEBUG:root:Problem size = 8\n", + "22-Aug 20:46:09:DEBUG:root:Starting iteration 1\n", + "22-Aug 20:46:09:DEBUG:root:Assembling\n", + "22-Aug 20:46:09:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 20:46:10:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "22-Aug 20:46:10:DEBUG:root:Solving system of equations. Total size = 12\n", + "22-Aug 20:46:10:DEBUG:root:Solution norm du = 3.0900221367289444\n", + "22-Aug 20:46:10:DEBUG:root:Starting iteration 2\n", + "22-Aug 20:46:10:DEBUG:root:Assembling\n", + "22-Aug 20:46:10:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 20:46:10:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "22-Aug 20:46:10:DEBUG:root:Solving system of equations. Total size = 12\n", + "22-Aug 20:46:10:DEBUG:root:Solution norm du = 0.32121316021534796\n", + "22-Aug 20:46:10:DEBUG:root:Starting iteration 3\n", + "22-Aug 20:46:10:DEBUG:root:Assembling\n", + "22-Aug 20:46:10:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 20:46:10:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "22-Aug 20:46:10:DEBUG:root:Solving system of equations. Total size = 12\n", + "22-Aug 20:46:10:DEBUG:root:Solution norm du = 0.040431781940014504\n", + "22-Aug 20:46:10:DEBUG:root:Starting iteration 4\n", + "22-Aug 20:46:10:DEBUG:root:Assembling\n", + "22-Aug 20:46:10:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 20:46:10:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "22-Aug 20:46:10:DEBUG:root:Solving system of equations. Total size = 12\n", + "22-Aug 20:46:10:DEBUG:root:Solution norm du = 0.0009291101052065917\n", + "22-Aug 20:46:10:DEBUG:root:Starting iteration 5\n", + "22-Aug 20:46:10:DEBUG:root:Assembling\n", + "22-Aug 20:46:10:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 20:46:10:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "22-Aug 20:46:10:DEBUG:root:Solving system of equations. Total size = 12\n", + "22-Aug 20:46:10:DEBUG:root:Solution norm du = 1.5638899136781228e-7\n", + "22-Aug 20:46:10:DEBUG:root:Starting iteration 6\n", + "22-Aug 20:46:10:DEBUG:root:Assembling\n", + "22-Aug 20:46:10:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 20:46:10:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "22-Aug 20:46:10:DEBUG:root:Solving system of equations. Total size = 12\n", + "22-Aug 20:46:10:DEBUG:root:Solution norm du = 1.0913504694802626e-14\n", + "22-Aug 20:46:10:DEBUG:root:Converged in 6 iterations.\n", + "22-Aug 20:46:10:DEBUG:root:Displacement on upper right = \n", + "[-0.07228582695592467\n", + " -2.222244754401765]\n" ] }, { @@ -598,19 +947,19 @@ "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 9, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "function solve!(elements, dofmap, neumann_bcs, dirichlet_bcs; ndofs=2, max_iterations=10)\n", + "function solve!(elements, dofmap, dirichlet_bcs; ndofs=2, max_iterations=10)\n", "\n", " Logging.info(\"solve!: dofs per node: $ndofs\")\n", " pdim = length(dofmap)*ndofs\n", " Logging.debug(\"Problem size = $pdim\")\n", "\n", - " # Assign global dofs for elements\n", + " # Assign global dofs for element ids\n", " gdofs = Dict{Int64, Array{Int64,1}}()\n", " for el in elements\n", " gdofs[el.id] = Int64[]\n", @@ -621,74 +970,45 @@ " end\n", " end\n", "\n", - " ass = JuliaFEM.Assembly(Int64[], Int64[], Float64[], Int64[], Float64[], gdofs)\n", - "\n", " for iter=1:max_iterations\n", " Logging.debug(\"Starting iteration $iter\")\n", - " ass.I = []\n", - " ass.J = []\n", - " ass.A = []\n", - " ass.i = []\n", - " ass.b = []\n", - " \n", + " ass = JuliaFEM.Assembly(gdofs)\n", + "\n", " Logging.debug(\"Assembling\")\n", " for el in elements\n", " assemble_element!(ass, el)\n", " end\n", "\n", - " i = 1\n", + " i = 0\n", " Logging.debug(\"Adding Dirichlet boundary conditions using Lagrange multipliers\")\n", - " # Dirichlet boundary conditions\n", + " # Dirichlet boundary conditions (this leads to a saddle point problem)\n", " for bc in dirichlet_bcs\n", - " for (dof, val) in zip(bc.dofs, bc.values)\n", - " #Logging.debug(\"dof $dof => $val\")\n", - " push!(ass.I, dof)\n", - " push!(ass.J, pdim+i)\n", - " push!(ass.A, 1)\n", - " push!(ass.I, pdim+i)\n", - " push!(ass.J, dof)\n", - " push!(ass.A, 1)\n", - " push!(ass.i, pdim+i)\n", - " push!(ass.b, 0)\n", - " i += 1\n", - " end\n", + " i += 1\n", + " #Logging.debug(\"lock dof $(bc.slave_dof), matrix row $(pdim+i)\")\n", + " push!(ass.I, bc.slave_dof)\n", + " push!(ass.J, pdim+i)\n", + " push!(ass.A, bc.slave_value)\n", + " push!(ass.I, pdim+i)\n", + " push!(ass.J, bc.slave_dof)\n", + " push!(ass.A, bc.slave_value)\n", + " push!(ass.i, pdim+i)\n", + " push!(ass.b, bc.constant)\n", " end\n", " Logging.debug(\"Added $i Lagrange multipliers to model\")\n", - " i -= 1\n", - "\n", - " Logging.debug(\"Adding Neumann boundary conditions\")\n", - " F = zeros(pdim+i)\n", - " # Neumann boundary conditions\n", - " for bc in neumann_bcs\n", - " for (dof, val) in zip(bc.dofs, bc.values)\n", - " F[dof] += val\n", - " end\n", - " end\n", - "\n", " Logging.debug(\"Solving system of equations. Total size = $(pdim+i)\")\n", + "\n", " # solution\n", - " K = sparse(ass.I, ass.J, ass.A)\n", - " R = full(sparsevec(ass.i, ass.b))\n", - " R = R - F\n", + " A = sparse(ass.I, ass.J, ass.A)\n", + " b = full(sparsevec(ass.i, ass.b))\n", + " du = A \\ b\n", "\n", - " du = K \\ -R\n", - "\n", - " #du = reshape(du, 2, 6)\n", " solnorm = norm(du[1:pdim])\n", - " #Logging.debug(\"du = $du\")\n", " Logging.debug(\"Solution norm du = $solnorm\")\n", "\n", " # update solution back to elements\n", " for el in elements\n", - " #Logging.debug(\"update element $(el.id)\")\n", - " eldisp = el.attributes[\"displacement\"]\n", - " #Logging.debug(\"displacement before update $(el.id) : \\n$eldisp\")\n", " eldu = du[ass.gdofs[el.id]]\n", - " eldu = reshape(eldu, (ndofs, round(Int, length(eldu)/ndofs)))\n", - " #Logging.debug(\"eldu for element $(el.id) \\n$eldu\")\n", - " el.attributes[\"displacement\"] += eldu\n", - " eldisp = el.attributes[\"displacement\"]\n", - " #Logging.debug(\"displacement after update $(el.id) : \\n$eldisp\")\n", + " update_field(el, eldu)\n", "\n", " end\n", " if solnorm < 1.0e-9\n", @@ -702,24 +1022,40 @@ "ENV[\"COLUMNS\"] = 160\n", "\n", "facts(\"solve one element problem\") do\n", - " # Create model\n", - " el = get_test_element()\n", - " elements = [el]\n", - " # Initialize elements ready for solution\n", - " for el in elements\n", - " eldim, elnodes = size(el.attributes[\"coordinates\"])\n", - " el.attributes[\"displacement\"] = zeros(2, elnodes)\n", - " end\n", + "\n", + " # set up element 1\n", + " element_id = 1\n", + " node_ids = [1, 2, 3, 4]\n", + " el1 = CPS4(element_id, node_ids)\n", + " # assign properties to element, e.g. coordinates, material properties, ...\n", + " E = 90.0\n", + " nu = 0.25\n", + " mu = E/(2*(1+nu))\n", + " la = E*nu/((1+nu)*(1-2*nu))\n", + " la = 2*la*mu/(la + 2*mu)\n", + " set_attribute(el1, \"coordinates\", [0.0 0.0; 10.0 0.0; 10.0 1.0; 0.0 1.0]')\n", + " set_attribute(el1, \"lambda\", la)\n", + " set_attribute(el1, \"mu\", mu)\n", + "\n", + " # set up element 2\n", + " el2 = CPS1(2, [3]) # Create nodal point force element with id 2 for node 3\n", + " set_attribute(el2, \"displacement nodal load\", [0.0, -2.0])\n", + "\n", + " elements = [el1, el2]\n", + "\n", " dofmap = create_ldof2gdofmap(elements, \"displacement\")\n", " Logging.debug(dofmap)\n", " # Boundary conditions\n", - " # here we want to create nodal force for third dof, that is, node id 2, second dof\n", - " bc1 = BC([dofmap[3][2]], [-2.0])\n", " # dirichlet bc, set dx=dy=0 on support\n", - " bc2 = BC([dofmap[1][1], dofmap[1][2], dofmap[4][1], dofmap[4][2]], [0.0, 0.0, 0.0, 0.0])\n", - " solve!(elements, dofmap, [bc1], [bc2]; max_iterations=7)\n", - " disp = elements[1].attributes[\"displacement\"]\n", - " Logging.debug(\"Displacement of element = \\n$disp\")\n", + " mpc1 = MPC(dofmap[1][1]) # node 1, dx=0\n", + " mpc2 = MPC(dofmap[1][2]) # node 1, dy\n", + " mpc3 = MPC(dofmap[4][1]) # node 4, dx\n", + " mpc4 = MPC(dofmap[4][2]) # node 4, dy\n", + " dbcs = [mpc1, mpc2, mpc3, mpc4]\n", + " #bc2 = BC([dofmap[1][1], dofmap[1][2], dofmap[4][1], dofmap[4][2]], [0.0, 0.0, 0.0, 0.0])\n", + " solve!(elements, dofmap, dbcs; max_iterations=10)\n", + " Logging.debug(\"Displacement on upper right = \\n$(get_field(el2))\")\n", + " disp = get_field(el1)\n", " @fact norm(disp) --> roughly(3.1292483947150043)\n", "end\n" ] @@ -728,14 +1064,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Top-down design\n", + "# 3d simulation\n", "\n", - "Next we see this problem from \"other direction\", by parsing ABAQUS .inp file and making 3d simulation." + "We create a new C3D10 element and solve 3d problem." ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 19, "metadata": { "collapsed": false }, @@ -744,29 +1080,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "19-Aug 19:15:14:INFO:root:Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\"]\n", - "19-Aug 19:15:14:DEBUG:root:Found NODE section\n", - "19-Aug 19:15:14:DEBUG:root:Found ELEMENT section\n", - "WARNING: integer(s::AbstractString) is deprecated, use parse(Int,s) instead.\n", - " in depwarn at /Applications/Julia-0.4.0-dev-539c818c4e.app/Contents/Resources/julia/lib/julia/sys.dylib\n", - " in integer at deprecated.jl:49\n", - " in map at abstractarray.jl:1251\n", - " in parse_element_section at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:60\n", - " in process_section at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:109\n", - " in parse_abaqus at /Users/jukka/.julia/v0.4/JuliaFEM/src/abaqus_reader.jl:118\n", - " in include_string at loading.jl:99\n", - " in execute_request_0x535c5df2 at /Users/jukka/.julia/v0.4/IJulia/src/execute_request.jl:157\n", - " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:123\n", - " in anonymous at task.jl:365\n", - "while loading In[10], in expression starting on line 3\n", - "19-Aug 19:15:15:DEBUG:root:120 elements found\n", - "19-Aug 19:15:16:INFO:root:Creating ELSET Body1\n", - "19-Aug 19:15:16:DEBUG:root:Found NSET section\n", - "19-Aug 19:15:16:DEBUG:root:Creating node set SUPPORT\n", - "19-Aug 19:15:16:DEBUG:root:Found NSET section\n", - "19-Aug 19:15:16:DEBUG:root:Creating node set LOAD\n", - "19-Aug 19:15:16:DEBUG:root:Found NSET section\n", - "19-Aug 19:15:16:DEBUG:root:Creating node set TOP\n" + "22-Aug 20:46:11:INFO:root:Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\"]\n", + "22-Aug 20:46:11:DEBUG:root:Found NODE section\n", + "22-Aug 20:46:11:DEBUG:root:Found ELEMENT section\n", + "22-Aug 20:46:11:DEBUG:root:120 elements found\n", + "22-Aug 20:46:12:INFO:root:Creating ELSET Body1\n", + "22-Aug 20:46:12:DEBUG:root:Found NSET section\n", + "22-Aug 20:46:12:DEBUG:root:Creating node set SUPPORT\n", + "22-Aug 20:46:12:DEBUG:root:Found NSET section\n", + "22-Aug 20:46:12:DEBUG:root:Creating node set LOAD\n", + "22-Aug 20:46:12:DEBUG:root:Found NSET section\n", + "22-Aug 20:46:12:DEBUG:root:Creating node set TOP\n" ] }, { @@ -779,22 +1103,41 @@ " \"nsets\" => Dict{Any,Any}(\"LOAD\"=>[82,84,87,179,197,246,249,256,257],\"SUPPORT\"=>[108,109,111,155,162,216,225,281,298],\"TOP\"=>[70,75,76,84,88,90,95,96,98,10…" ] }, - "execution_count": 10, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "using JuliaFEM.abaqus_reader\n", "fid = open(\"../geometry/3d_beam/palkki.inp\")\n", - "model = JuliaFEM.abaqus_reader.parse_abaqus(fid)\n", + "model = JuliaFEM.parse_abaqus(fid)\n", "close(fid)\n", "model" ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "\"\"\"\n", + "Stress/displacement elements. 10-node quadratic tetrahedron.\n", + "\"\"\"\n", + "type C3D10 <: ContinuumElement\n", + " id :: Int\n", + " node_ids :: Array{Int, 1}\n", + " shape_functions :: FunctionSpace\n", + " integration_points :: Array{IntegrationPoint, 1}\n", + " attributes :: Dict{ASCIIString, Any}\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 21, "metadata": { "collapsed": false }, @@ -802,61 +1145,87 @@ { "data": { "text/plain": [ - "dbasis (generic function with 1 method)" + "C3D10" ] }, - "execution_count": 36, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "P(xi) = [\n", - " 1\n", - " xi[1]\n", - " xi[2]\n", - " xi[3]\n", - " xi[1]^2\n", - " xi[2]^2\n", - " xi[3]^2\n", - " xi[1]*xi[2]\n", - " xi[2]*xi[3]\n", - " xi[3]*xi[1]]\n", - "dP(xi) = [\n", - " 0 0 0\n", - " 1 0 0\n", - " 0 1 0\n", - " 0 0 1\n", - " 2*xi[1] 0 0\n", - " 0 2*xi[2] 0\n", - " 0 0 2*xi[3]\n", - " xi[2] xi[1] 0\n", - " 0 xi[3] xi[2]\n", - " xi[3] 0 xi[1]\n", - "]\n", - "X = [\n", - " 0.0 0.0 0.0\n", - " 1.0 0.0 0.0\n", - " 0.0 1.0 0.0\n", - " 0.0 0.0 1.0\n", - " 0.5 0.0 0.0\n", - " 0.5 0.5 0.0\n", - " 0.0 0.5 0.0\n", - " 0.0 0.0 0.5\n", - " 0.5 0.0 0.5\n", - " 0.0 0.5 0.5]\n", - "A = zeros(10, 10)\n", - "for i=1:10\n", - " A[i,:] = P(X[i,:])\n", - "end\n", - "invA = inv(A)\n", - "basis(xi) = invA'*P(xi)\n", - "dbasis(xi) = invA'*dP(xi)" + "function C3D10(element_id, node_ids)\n", + "\n", + " # Construct Lagrange basis\n", + " \n", + " P(xi) = [\n", + " 1\n", + " xi[1]\n", + " xi[2]\n", + " xi[3]\n", + " xi[1]^2\n", + " xi[2]^2\n", + " xi[3]^2\n", + " xi[1]*xi[2]\n", + " xi[2]*xi[3]\n", + " xi[3]*xi[1]]\n", + "\n", + " dP(xi) = [\n", + " 0 0 0\n", + " 1 0 0\n", + " 0 1 0\n", + " 0 0 1\n", + " 2*xi[1] 0 0\n", + " 0 2*xi[2] 0\n", + " 0 0 2*xi[3]\n", + " xi[2] xi[1] 0\n", + " 0 xi[3] xi[2]\n", + " xi[3] 0 xi[1]\n", + " ]\n", + "\n", + " X = [\n", + " 0.0 0.0 0.0\n", + " 1.0 0.0 0.0\n", + " 0.0 1.0 0.0\n", + " 0.0 0.0 1.0\n", + " 0.5 0.0 0.0\n", + " 0.5 0.5 0.0\n", + " 0.0 0.5 0.0\n", + " 0.0 0.0 0.5\n", + " 0.5 0.0 0.5\n", + " 0.0 0.5 0.5]\n", + "\n", + " A = zeros(10, 10)\n", + "\n", + " for i=1:10\n", + " A[i,:] = P(X[i,:])\n", + " end\n", + "\n", + " invA = inv(A)\n", + " basis(xi) = invA'*P(xi)\n", + " dbasis(xi) = invA'*dP(xi)\n", + "\n", + " shape_functions = FunctionSpace(basis, dbasis)\n", + "\n", + " a = .585410196624969\n", + " b = .138196601125011\n", + " w = .041666666666667\n", + "\n", + " integration_points = [\n", + " JuliaFEM.IntegrationPoint([a, b, b], w, Dict()),\n", + " JuliaFEM.IntegrationPoint([b, a, b], w, Dict()),\n", + " JuliaFEM.IntegrationPoint([b, b, a], w, Dict()),\n", + " JuliaFEM.IntegrationPoint([b, b, b], w, Dict())]\n", + " \n", + " attributes = Dict(\"displacement\" => zeros(3, 10))\n", + "\n", + " C3D10(element_id, node_ids, shape_functions, integration_points, attributes)\n", + "end" ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 22, "metadata": { "collapsed": false }, @@ -864,34 +1233,40 @@ { "data": { "text/plain": [ - "10x10 Array{Float64,2}:\n", - " 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0\n", - " 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0" + "get_lhs (generic function with 4 methods)" ] }, - "execution_count": 39, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "for i=1:10\n", - " A[i,:] = basis(X[i,:])\n", + "\"\"\"\n", + "1-node point force element for 3d elasticity problem.\n", + "\"\"\"\n", + "type C3D1 <: ContinuumElement\n", + " id :: Int\n", + " node_ids :: Array{Int, 1}\n", + " attributes :: Dict{ASCIIString, Any}\n", "end\n", - "A" + "function C3D1(element_id, node_ids)\n", + " attributes = Dict(\n", + " \"displacement\" => zeros(3, 1),\n", + " \"displacement nodal load\" => zeros(3, 1))\n", + " C3D1(element_id, node_ids, attributes)\n", + "end\n", + "function get_rhs(el::C3D1)\n", + " return el.attributes[\"displacement nodal load\"]\n", + "end\n", + "function get_lhs(el::C3D1)\n", + " return None\n", + "end" ] }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 23, "metadata": { "collapsed": false, "scrolled": false @@ -901,81 +1276,72 @@ "name": "stderr", "output_type": "stream", "text": [ - "19-Aug 21:11:57:DEBUG:root:Creating elements\n", - "19-Aug 21:11:57:INFO:root:solve!: dofs per node: 3\n", - "19-Aug 21:11:57:DEBUG:root:Problem size = 894\n", - "19-Aug 21:11:57:DEBUG:root:Starting iteration 1\n", - "19-Aug 21:11:57:DEBUG:root:Assembling\n", - "19-Aug 21:11:59:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 21:11:59:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "19-Aug 21:11:59:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 21:11:59:DEBUG:root:Solving system of equations. Total size = 921\n", - "19-Aug 21:11:59:DEBUG:root:Solution norm du = 550.6462282478749\n", - "19-Aug 21:11:59:DEBUG:root:Starting iteration 2\n", - "19-Aug 21:11:59:DEBUG:root:Assembling\n", - "19-Aug 21:12:02:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 21:12:02:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "19-Aug 21:12:02:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 21:12:02:DEBUG:root:Solving system of equations. Total size = 921\n", - "19-Aug 21:12:02:DEBUG:root:Solution norm du = 126.1405473091362\n", - "19-Aug 21:12:02:DEBUG:root:Starting iteration 3\n", - "19-Aug 21:12:02:DEBUG:root:Assembling\n", - "19-Aug 21:12:04:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 21:12:04:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "19-Aug 21:12:04:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 21:12:04:DEBUG:root:Solving system of equations. Total size = 921\n", - "19-Aug 21:12:04:DEBUG:root:Solution norm du = 38.94984055412649\n", - "19-Aug 21:12:04:DEBUG:root:Starting iteration 4\n", - "19-Aug 21:12:04:DEBUG:root:Assembling\n", - "19-Aug 21:12:07:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 21:12:07:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "19-Aug 21:12:07:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 21:12:07:DEBUG:root:Solving system of equations. Total size = 921\n", - "19-Aug 21:12:07:DEBUG:root:Solution norm du = 15.167069064284211\n", - "19-Aug 21:12:07:DEBUG:root:Starting iteration 5\n", - "19-Aug 21:12:07:DEBUG:root:Assembling\n", - "19-Aug 21:12:10:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 21:12:10:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "19-Aug 21:12:10:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 21:12:10:DEBUG:root:Solving system of equations. Total size = 921\n", - "19-Aug 21:12:10:DEBUG:root:Solution norm du = 9.516311535827375\n", - "19-Aug 21:12:10:DEBUG:root:Starting iteration 6\n", - "19-Aug 21:12:10:DEBUG:root:Assembling\n", - "19-Aug 21:12:12:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 21:12:12:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "19-Aug 21:12:12:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 21:12:12:DEBUG:root:Solving system of equations. Total size = 921\n", - "19-Aug 21:12:12:DEBUG:root:Solution norm du = 1.622282204776609\n", - "19-Aug 21:12:12:DEBUG:root:Starting iteration 7\n", - "19-Aug 21:12:12:DEBUG:root:Assembling\n", - "19-Aug 21:12:15:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 21:12:15:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "19-Aug 21:12:15:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 21:12:15:DEBUG:root:Solving system of equations. Total size = 921\n", - "19-Aug 21:12:15:DEBUG:root:Solution norm du = 0.09626397759398042\n", - "19-Aug 21:12:15:DEBUG:root:Starting iteration 8\n", - "19-Aug 21:12:15:DEBUG:root:Assembling\n", - "19-Aug 21:12:17:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 21:12:17:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "19-Aug 21:12:17:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 21:12:17:DEBUG:root:Solving system of equations. Total size = 921\n", - "19-Aug 21:12:18:DEBUG:root:Solution norm du = 0.0002630453729490514\n", - "19-Aug 21:12:18:DEBUG:root:Starting iteration 9\n", - "19-Aug 21:12:18:DEBUG:root:Assembling\n", - "19-Aug 21:12:20:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 21:12:20:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "19-Aug 21:12:20:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 21:12:20:DEBUG:root:Solving system of equations. Total size = 921\n", - "19-Aug 21:12:20:DEBUG:root:Solution norm du = 2.7238292530443165e-9\n", - "19-Aug 21:12:20:DEBUG:root:Starting iteration 10\n", - "19-Aug 21:12:20:DEBUG:root:Assembling\n", - "19-Aug 21:12:22:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "19-Aug 21:12:22:DEBUG:root:Added 28 Lagrange multipliers to model\n", - "19-Aug 21:12:22:DEBUG:root:Adding Neumann boundary conditions\n", - "19-Aug 21:12:22:DEBUG:root:Solving system of equations. Total size = 921\n", - "19-Aug 21:12:23:DEBUG:root:Solution norm du = 3.2746140168058266e-13\n", - "19-Aug 21:12:23:DEBUG:root:Converged in 10 iterations.\n", - "19-Aug 21:12:23:INFO:root:Maximum absolute displacement in y direction: 49.404599274553235\n" + "22-Aug 20:46:13:DEBUG:root:Creating elements\n", + "22-Aug 20:46:13:DEBUG:root:Creating elements\n", + "22-Aug 20:46:13:INFO:root:solve!: dofs per node: 3\n", + "22-Aug 20:46:13:DEBUG:root:Problem size = 894\n", + "22-Aug 20:46:13:DEBUG:root:Starting iteration 1\n", + "22-Aug 20:46:13:DEBUG:root:Assembling\n", + "22-Aug 20:46:26:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 20:46:26:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 20:46:26:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 20:46:26:DEBUG:root:Solution norm du = 550.6462282437674\n", + "22-Aug 20:46:26:DEBUG:root:Starting iteration 2\n", + "22-Aug 20:46:26:DEBUG:root:Assembling\n", + "22-Aug 20:46:39:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 20:46:39:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 20:46:39:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 20:46:39:DEBUG:root:Solution norm du = 126.14054730775176\n", + "22-Aug 20:46:39:DEBUG:root:Starting iteration 3\n", + "22-Aug 20:46:39:DEBUG:root:Assembling\n", + "22-Aug 20:46:53:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 20:46:53:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 20:46:53:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 20:46:53:DEBUG:root:Solution norm du = 38.949840553368894\n", + "22-Aug 20:46:53:DEBUG:root:Starting iteration 4\n", + "22-Aug 20:46:54:DEBUG:root:Assembling\n", + "22-Aug 20:47:06:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 20:47:06:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 20:47:06:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 20:47:06:DEBUG:root:Solution norm du = 15.167069063650652\n", + "22-Aug 20:47:06:DEBUG:root:Starting iteration 5\n", + "22-Aug 20:47:06:DEBUG:root:Assembling\n", + "22-Aug 20:47:18:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 20:47:18:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 20:47:18:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 20:47:18:DEBUG:root:Solution norm du = 9.516311534304958\n", + "22-Aug 20:47:18:DEBUG:root:Starting iteration 6\n", + "22-Aug 20:47:18:DEBUG:root:Assembling\n", + "22-Aug 20:47:31:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 20:47:31:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 20:47:31:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 20:47:31:DEBUG:root:Solution norm du = 1.6222822043785954\n", + "22-Aug 20:47:31:DEBUG:root:Starting iteration 7\n", + "22-Aug 20:47:31:DEBUG:root:Assembling\n", + "22-Aug 20:47:43:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 20:47:43:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 20:47:43:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 20:47:43:DEBUG:root:Solution norm du = 0.09626397754176579\n", + "22-Aug 20:47:43:DEBUG:root:Starting iteration 8\n", + "22-Aug 20:47:43:DEBUG:root:Assembling\n", + "22-Aug 20:47:56:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 20:47:56:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 20:47:56:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 20:47:56:DEBUG:root:Solution norm du = 0.00026304537198068307\n", + "22-Aug 20:47:56:DEBUG:root:Starting iteration 9\n", + "22-Aug 20:47:56:DEBUG:root:Assembling\n", + "22-Aug 20:48:09:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 20:48:09:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 20:48:09:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 20:48:09:DEBUG:root:Solution norm du = 2.7245126807720425e-9\n", + "22-Aug 20:48:09:DEBUG:root:Starting iteration 10\n", + "22-Aug 20:48:09:DEBUG:root:Assembling\n", + "22-Aug 20:48:22:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 20:48:22:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 20:48:22:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 20:48:22:DEBUG:root:Solution norm du = 1.0919112177573261e-13\n", + "22-Aug 20:48:22:DEBUG:root:Converged in 10 iterations.\n", + "22-Aug 20:48:22:INFO:root:Maximum absolute displacement in y direction: 49.40459927455298\n" ] } ], @@ -983,36 +1349,25 @@ "function solve_3d_model()\n", " Logging.debug(\"Creating elements\")\n", " elements = JuliaFEM.Element[]\n", - " coordinates = zeros(3, 10)\n", " \n", - " a = .585410196624969\n", - " b = .138196601125011\n", - " w = .0416666666666666666666666666666666666666666667\n", + " E = 90.0e6\n", + " nu = 0.3\n", + " mu = E/(2*(1+nu))\n", + " la = E*nu/((1+nu)*(1-2*nu))\n", + " la = 2*la*mu/(la + 2*mu)\n", "\n", - " integration_points = [\n", - " JuliaFEM.IntegrationPoint([a, b, b], w, Dict()),\n", - " JuliaFEM.IntegrationPoint([b, a, b], w, Dict()),\n", - " JuliaFEM.IntegrationPoint([b, b, a], w, Dict()),\n", - " JuliaFEM.IntegrationPoint([b, b, b], w, Dict())]\n", + " coordinates = zeros(3, 10)\n", "\n", + " Logging.debug(\"Creating elements\")\n", " for (elid, node_ids) in model[\"elements\"]\n", " coordinates[:,:] = 0.0\n", " for (i, nid) in enumerate(node_ids)\n", " coordinates[:,i] = model[\"nodes\"][nid]\n", " end\n", - "\n", - "\n", - " E = 90.0e6\n", - " nu = 0.3\n", - " mu = E/(2*(1+nu))\n", - " la = E*nu/((1+nu)*(1-2*nu))\n", - " la = 2*la*mu/(la + 2*mu)\n", - " attributes = Dict()\n", - " el = JuliaFEM.Element(elid, node_ids, basis, dbasis, integration_points, attributes)\n", - " el.attributes[\"coordinates\"] = copy(coordinates)\n", - " el.attributes[\"lambda\"] = la\n", - " el.attributes[\"mu\"] = mu\n", - " el.attributes[\"displacement\"] = zeros(3, 10)\n", + " el = C3D10(elid, node_ids)\n", + " set_attribute(el, \"coordinates\", copy(coordinates))\n", + " set_attribute(el, \"lambda\", la)\n", + " set_attribute(el, \"mu\", mu)\n", " push!(elements, el)\n", " end\n", "\n", @@ -1021,27 +1376,27 @@ "\n", " # Boundary conditions\n", "\n", - " # dirichlet bc, set dx=dy=dz for all nodes in set SUPPORT\n", - " bc_support = BC(Int64[], Float64[])\n", + " # dirichlet bc, set dx=dy=dz=0 for all nodes in set SUPPORT\n", + " dirichlet_bcs = MPC[]\n", " for nid in model[\"nsets\"][\"SUPPORT\"]\n", " for i=1:3\n", - " push!(bc_support.dofs, dofmap[nid][i])\n", - " push!(bc_support.values, 0.0)\n", + " push!(dirichlet_bcs, MPC(dofmap[nid][i]))\n", " end\n", " end\n", "\n", - " # force boundary condition, put -1 to 2nd dof for each node in set LOAD\n", - " bc_load = BC(Int64[], Float64[])\n", + " # force boundary condition, put -1500000 to 2nd dof for each node in set LOAD\n", + " elcnt = 100000\n", + " loadvec = [0.0, -1500000.0, 0.0]\n", " for nid in model[\"nsets\"][\"LOAD\"]\n", - " push!(bc_load.dofs, dofmap[nid][2])\n", - " push!(bc_load.values, -1500000.0)\n", + " # set up \"point load element\"\n", + " elcnt += 1\n", + " el = C3D1(elcnt, [nid])\n", + " set_attribute(el, \"displacement nodal load\", loadvec)\n", + " push!(elements, el)\n", " end\n", "\n", - " #solve!(elements, [bc1], [bc2]; max_iterations=7)\n", - " neumann_bcs = [bc_load]\n", - " dirichlet_bcs = [bc_support]\n", " # ndofs = dimension of unknown field in nodes\n", - " solve!(elements, dofmap, neumann_bcs, dirichlet_bcs; ndofs=3, max_iterations=10)\n", + " solve!(elements, dofmap, dirichlet_bcs; ndofs=3, max_iterations=10)\n", "\n", " # Let's pick maximum absolute displacement in y direction\n", " maxdisp = 0.0\n", @@ -1060,6 +1415,13 @@ "model, elements, dofmap = solve_3d_model();" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "22.8.2015 13-14 seconds/assembly." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1069,7 +1431,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 28, "metadata": { "collapsed": false }, @@ -1082,15 +1444,15 @@ "\n" ] }, - "execution_count": 55, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "xdoc, xmodel = JuliaFEM.xdmf.xdmf_new_model()\n", - "temporal_collection = JuliaFEM.xdmf.xdmf_new_temporal_collection(xmodel)\n", - "grid = JuliaFEM.xdmf.xdmf_new_grid(temporal_collection; time=0)" + "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)" ] }, { @@ -1102,7 +1464,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 29, "metadata": { "collapsed": false }, @@ -1111,8 +1473,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "19-Aug 21:12:27:INFO:root:Number of nodes in model: 298\n", - "19-Aug 21:12:27:INFO:root:Number of elements in model: 120\n" + "22-Aug 20:53:09:INFO:root:Number of nodes in model: 298\n", + "22-Aug 20:53:09:INFO:root:Number of elements in model: 120\n" ] } ], @@ -1140,7 +1502,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 30, "metadata": { "collapsed": false }, @@ -1151,60 +1513,18 @@ "true" ] }, - "execution_count": 57, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "using LightXML\n", - "\n", - "function xdmf_new_mesh(grid, X, elmap)\n", - " dim, nnodes = size(X)\n", - " geometry = new_child(grid, \"Geometry\")\n", - " set_attribute(geometry, \"Type\", \"XYZ\")\n", - " dataitem = new_child(geometry, \"DataItem\")\n", - " set_attribute(dataitem, \"DataType\", \"Float\")\n", - " set_attribute(dataitem, \"Dimensions\", \"$nnodes $dim\")\n", - " set_attribute(dataitem, \"Format\", \"XML\")\n", - " set_attribute(dataitem, \"Precision\", 8)\n", - " #add_text(dataitem, join(X, \" \"))\n", - " s = \"\\n\"\n", - " \n", - " for i=1:nnodes\n", - " s *= \"\\t\\t\" * join(X[:,i], \" \") * \"\\n\"\n", - " end\n", - " s *= \" \"\n", - " add_text(dataitem, s)\n", - "\n", - " elmap2 = copy(elmap)\n", - " elmap2[2:end,:] -= 1\n", - " dim, nelements = size(elmap2)\n", - "\n", - " topology = new_child(grid, \"Topology\")\n", - " #set_attribute(topology, \"Dimensions\", \"1\")\n", - " set_attribute(topology, \"TopologyType\", \"Mixed\")\n", - " set_attribute(topology, \"NumberOfElements\", nelements)\n", - " dataitem = new_child(topology, \"DataItem\")\n", - " set_attribute(dataitem, \"DataType\", \"Int\")\n", - " set_attribute(dataitem, \"Dimensions\", \"$nelements $dim\")\n", - " set_attribute(dataitem, \"Format\", \"XML\")\n", - " set_attribute(dataitem, \"Precision\", 8)\n", - " s = \"\\n\"\n", - " for i=1:nelements\n", - " s *= \"\\t\\t\" * join(elmap2[:,i], \" \") * \"\\n\"\n", - " end\n", - " add_text(dataitem, s)\n", - " #add_text(dataitem, join(elmap2, \" \"))\n", - " \n", - "end\n", - "\n", - "xdmf_new_mesh(grid, X, elmap)" + "JuliaFEM.xdmf_new_mesh(grid, X, elmap)" ] }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 31, "metadata": { "collapsed": false }, @@ -1215,13 +1535,13 @@ "10435" ] }, - "execution_count": 58, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "JuliaFEM.xdmf.xdmf_save_model(xdoc, \"/tmp/3d_solid_model.xmf\")" + "JuliaFEM.xdmf_save_model(xdoc, \"/tmp/3d_solid_model.xmf\")" ] }, { @@ -1233,7 +1553,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 32, "metadata": { "collapsed": false }, @@ -1242,35 +1562,35 @@ "data": { "text/plain": [ "Dict{Any,Any} with 298 entries:\n", - " 288 => [-12.729409015111896,-46.984634561883446,0.00976161039328022]\n", - " 11 => [-14.785829217208498,-42.20176974427378,0.008418234114234127]\n", - " 158 => [-0.09613238427634223,-0.024925865661714005,-0.021152328599486677]\n", - " 215 => [-8.204098997513393,-20.651834887555786,0.003675944651346407]\n", - " 134 => [-0.04746289973768044,-13.917505665457258,0.05113049026250121]\n", - " 160 => [0.24815357717678405,-0.4508776021022819,0.039128388104899554]\n", - " 29 => [0.07844018461547288,-0.06270924383364974,0.004195891729593283]\n", - " 131 => [-0.044388456389593725,-13.917981456773102,-0.04387988824443422]\n", - " 249 => [-18.54080633960933,-46.66700218188128,0.008827411992911835]\n", - " 207 => [-4.743777979250225,-11.296644899155684,0.027192280490125977]\n", - " 173 => [-6.3308244019030075,-30.052183303569457,0.020872057672617197]\n", - " 289 => [-11.378151639243184,-43.542394288187026,0.006659559839321434]\n", - " 74 => [-1.0030212040100022,-18.135103544975525,0.026360938873555055]\n", - " 201 => [-6.115145748129358,-15.075793071665531,0.002993263067287828]\n", - " 176 => [-1.9275056779525068,-10.695874800497068,0.0020340066199601267]\n", - " 57 => [-4.707634597909077,-20.1431525488877,0.005778013656623472]\n", - " 31 => [-0.017918702135580025,-0.20429459029338676,-0.001244164592902111]\n", - " 285 => [-13.758654101433569,-44.588532062281566,0.009242729767727817]\n", - " 70 => [-0.6491658026068393,-16.68445815172476,-0.03677230855273996]\n", - " 33 => [-0.2031954625282471,-0.197025455475311,0.02008451861888156]\n", - " 252 => [-1.246103879230492,-1.6323762997299875,0.003005676402356407]\n", - " 114 => [0.6751013334216771,-0.8524740368899799,-0.07430557127461986]\n", - " 165 => [-10.550249918373456,-26.708598943475884,-0.018237563188812762]\n", - " 96 => [-6.47735355387718,-35.67268031983278,-0.0045879264893393095]\n", - " 133 => [0.4250714751403551,-11.347486228911386,0.003588217409561936]\n", + " 288 => [-12.729409015111749,-46.9846345618832,0.009761610393284966]\n", + " 11 => [-14.785829217208345,-42.20176974427358,0.008418234114233902]\n", + " 158 => [-0.09613238427634156,-0.024925865661713818,-0.021152328599486542]\n", + " 215 => [-8.20409899751332,-20.651834887555676,0.003675944651348186]\n", + " 134 => [-0.04746289973766305,-13.917505665457174,0.05113049026250106]\n", + " 160 => [0.24815357717678269,-0.45087760210227873,0.03912838810489934]\n", + " 29 => [0.07844018461547243,-0.0627092438336493,0.004195891729593265]\n", + " 131 => [-0.044388456389576496,-13.917981456773019,-0.0438798882444338]\n", + " 249 => [-18.540806339609137,-46.66700218188106,0.008827411992911762]\n", + " 207 => [-4.7437779792501855,-11.296644899155622,0.02719228049012583]\n", + " 173 => [-6.3308244019029285,-30.052183303569294,0.02087205767261999]\n", + " 289 => [-11.37815163924305,-43.5423942881868,0.006659559839321376]\n", + " 74 => [-1.0030212040099715,-18.13510354497542,0.026360938873556356]\n", + " 201 => [-6.115145748129304,-15.075793071665448,0.0029932630672883753]\n", + " 176 => [-1.9275056779524837,-10.695874800497005,0.002034006619959744]\n", + " 57 => [-4.707634597909023,-20.14315254888759,0.005778013656624454]\n", + " 31 => [-0.017918702135579754,-0.20429459029338543,-0.001244164592902138]\n", + " 285 => [-13.758654101433423,-44.588532062281345,0.009242729767728863]\n", + " 70 => [-0.6491658026068142,-16.68445815172466,-0.03677230855273911]\n", + " 33 => [-0.20319546252824566,-0.1970254554753098,0.020084518618881362]\n", + " 252 => [-1.2461038792304833,-1.632376299729978,0.003005676402356064]\n", + " 114 => [0.6751013334216733,-0.8524740368899743,-0.0743055712746195]\n", + " 165 => [-10.550249918373362,-26.708598943475753,-0.0182375631888076]\n", + " 96 => [-6.477353553877085,-35.67268031983259,-0.004587926489339682]\n", + " 133 => [0.425071475140366,-11.347486228911315,0.003588217409561677]\n", " ⋮ => ⋮" ] }, - "execution_count": 59, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -1287,7 +1607,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 33, "metadata": { "collapsed": false }, @@ -1301,7 +1621,7 @@ " -0.000439894 0.00176042 0.00267874 0.00357279 0.00431665 0.00380978 0.0048871 0.00163786 0.00332861 0.00422365 0.00304404 0.0" ] }, - "execution_count": 60, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -1316,7 +1636,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 34, "metadata": { "collapsed": false }, @@ -1327,18 +1647,18 @@ "true" ] }, - "execution_count": 61, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "JuliaFEM.xdmf.xdmf_new_field(grid, \"Displacement\", \"nodes\", u)" + "JuliaFEM.xdmf_new_field(grid, \"Displacement\", \"nodes\", u)" ] }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 35, "metadata": { "collapsed": false }, @@ -1346,21 +1666,21 @@ { "data": { "text/plain": [ - "28126" + "28138" ] }, - "execution_count": 62, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "JuliaFEM.xdmf.xdmf_save_model(xdoc, \"/tmp/3d_solid_model.xmf\")" + "JuliaFEM.xdmf_save_model(xdoc, \"/tmp/3d_solid_model.xmf\")" ] }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 36, "metadata": { "collapsed": false }, @@ -1372,7 +1692,7 @@ "PyObject " ] }, - "execution_count": 63, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -1383,6 +1703,218 @@ "d.Image(\"/tmp/3d_solid_model.png\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Another 3d example" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "using JuliaFEM.abaqus_reader\n", + "fid = open(\"../geometry/piston/piston_45510_P1.inp\")\n", + "#fid = open(\"../geometry/piston/piston_8789_P1.inp\")\n", + "model = JuliaFEM.abaqus_reader.parse_abaqus(fid)\n", + "close(fid)\n", + "model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Construct linear Lagrange basis\n", + "P(xi) = [\n", + " 1\n", + " xi[1]\n", + " xi[2]\n", + " xi[3]]\n", + "dP(xi) = [\n", + " 0 0 0\n", + " 1 0 0\n", + " 0 1 0\n", + " 0 0 1]\n", + "X = [\n", + " 0.0 0.0 0.0\n", + " 1.0 0.0 0.0\n", + " 0.0 1.0 0.0\n", + " 0.0 0.0 1.0]\n", + "A = zeros(4, 4)\n", + "for i=1:4\n", + " A[i,:] = P(X[i,:])\n", + "end\n", + "invA = inv(A)\n", + "basis(xi) = invA'*P(xi)\n", + "dbasis(xi) = invA'*dP(xi)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "function solve_3d_model()\n", + " Logging.debug(\"Creating elements\")\n", + " elements = JuliaFEM.Element[]\n", + " coordinates = zeros(3, 4)\n", + "\n", + " integration_points = [\n", + " JuliaFEM.IntegrationPoint([0.25, 0.25, 0.25], 1/6, Dict())\n", + " ]\n", + "\n", + " for (elid, node_ids) in model[\"elements\"]\n", + " coordinates[:,:] = 0.0\n", + " for (i, nid) in enumerate(node_ids)\n", + " coordinates[:,i] = model[\"nodes\"][nid]\n", + " end\n", + "\n", + "\n", + " E = 90.0e6\n", + " nu = 0.3\n", + " mu = E/(2*(1+nu))\n", + " la = E*nu/((1+nu)*(1-2*nu))\n", + " #la = 2*la*mu/(la + 2*mu)\n", + " attributes = Dict()\n", + " el = JuliaFEM.Element(elid, node_ids, basis, dbasis, integration_points, attributes)\n", + " el.attributes[\"coordinates\"] = copy(coordinates)\n", + " el.attributes[\"lambda\"] = la\n", + " el.attributes[\"mu\"] = mu\n", + " el.attributes[\"displacement\"] = zeros(3, 4)\n", + " push!(elements, el)\n", + " end\n", + "\n", + " # create \"dofmap\" so that we know how to assemble global stiffness matrix\n", + " dofmap = create_ldof2gdofmap(elements, \"displacement\")\n", + "\n", + " # Boundary conditions\n", + "\n", + " # dirichlet bc, set dx=dy=dz for all nodes in set SUPPORT\n", + " bc_support = BC(Int64[], Float64[])\n", + " for nid in model[\"nsets\"][\"SUPPORT\"]\n", + " for i=1:3\n", + " push!(bc_support.dofs, dofmap[nid][i])\n", + " push!(bc_support.values, 0.0)\n", + " end\n", + " end\n", + "\n", + " # force boundary condition, put -1 to 2nd dof for each node in set LOAD\n", + " bc_load = BC(Int64[], Float64[])\n", + " for nid in model[\"nsets\"][\"LOAD\"]\n", + " push!(bc_load.dofs, dofmap[nid][3])\n", + " push!(bc_load.values, -1500000.0)\n", + " end\n", + "\n", + " #solve!(elements, [bc1], [bc2]; max_iterations=7)\n", + " neumann_bcs = [bc_load]\n", + " dirichlet_bcs = [bc_support]\n", + " # ndofs = dimension of unknown field in nodes\n", + " solve!(elements, dofmap, neumann_bcs, dirichlet_bcs; ndofs=3, max_iterations=10)\n", + "\n", + " # Let's pick maximum absolute displacement in y direction\n", + " maxdisp = 0.0\n", + " for el in elements\n", + " eldisp = el.attributes[\"displacement\"]\n", + " eldispy = eldisp[2,:]\n", + " maxeldisp = maximum(abs(eldispy))\n", + " if maxeldisp > maxdisp\n", + " maxdisp = maxeldisp\n", + " end\n", + " end\n", + " Logging.info(\"Maximum absolute displacement in y direction: $maxdisp\")\n", + " return model, elements, dofmap\n", + "end\n", + "\n", + "model, elements, dofmap = solve_3d_model();" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "xdoc, xmodel = JuliaFEM.xdmf.xdmf_new_model()\n", + "temporal_collection = JuliaFEM.xdmf.xdmf_new_temporal_collection(xmodel)\n", + "grid = JuliaFEM.xdmf.xdmf_new_grid(temporal_collection; time=0)\n", + "\n", + "nnodes = length(model[\"nodes\"])\n", + "Logging.info(\"Number of nodes in model: $nnodes\")\n", + "node_ids = Int64[]\n", + "for nid in keys(model[\"nodes\"])\n", + " push!(node_ids, nid)\n", + "end\n", + "sort!(node_ids)\n", + "X = zeros(3, nnodes)\n", + "for (i, nid) in enumerate(node_ids)\n", + " X[:,i] = model[\"nodes\"][nid]\n", + "end\n", + "\n", + "nelements = length(model[\"elements\"])\n", + "Logging.info(\"Number of elements in model: $nelements\")\n", + "elmap = zeros(Int64, 5, nelements)\n", + "elmap[1,:] = 0x006 # for tet4\n", + "for (i, elid) in enumerate(keys(model[\"elements\"]))\n", + " elmap[2:end, i] = model[\"elements\"][elid]\n", + "end\n", + "\n", + "xdmf_new_mesh(grid, X, elmap)\n", + "\n", + "nodaldisp = Dict()\n", + "for el in elements\n", + " for (i, nid) in enumerate(el.node_ids)\n", + " nodaldisp[nid] = el.attributes[\"displacement\"][:, i]\n", + " end\n", + "end\n", + "\n", + "u = zeros(3, nnodes)\n", + "for (i, nid) in enumerate(node_ids)\n", + " u[:,i] = nodaldisp[nid]\n", + "end\n", + "\n", + "JuliaFEM.xdmf.xdmf_new_field(grid, \"Displacement\", \"nodes\", u)\n", + "\n", + "JuliaFEM.xdmf.xdmf_save_model(xdoc, \"/tmp/piston.xmf\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "PyObject " + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d.Image(\"/tmp/piston.png\")" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/src/JuliaFEM.jl b/src/JuliaFEM.jl index 07cfebf..016f0ce 100644 --- a/src/JuliaFEM.jl +++ b/src/JuliaFEM.jl @@ -2,9 +2,10 @@ # License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md module JuliaFEM - VERSION < v"0.4-" && using Docile using Lexicon +using Logging +@Logging.configure(level=DEBUG) include("types.jl") # type definitions include("math.jl") # basic mathematical operations diff --git a/src/abaqus_reader.jl b/src/abaqus_reader.jl index 6f6899e..e4fc0b9 100644 --- a/src/abaqus_reader.jl +++ b/src/abaqus_reader.jl @@ -1,18 +1,11 @@ # This file is a part of JuliaFEM. # License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md -module abaqus_reader - -using Logging -@Logging.configure(level=DEBUG) - -VERSION < v"0.4-" && using Docile - eldims = Dict( "C3D10" => 10, "C3D4" => 4) -global handlers = Dict() +global handlers = Dict() """ Register new handler for parser @@ -57,7 +50,7 @@ function parse_element_section(model, header, data) end eldim = eldims[eltype] m = matchall(r"[0-9]+", data) - m = map(integer, m) + m = map((s) -> parse(Int, s), m) elements = create_or_get(model, "elements") m = reshape(m, eldim+1, round(Int, length(m)/(eldim+1))) nel = size(m)[2] @@ -81,7 +74,7 @@ function parse_nodeset_section(model, header, data) nset_name = header["options"]["NSET"] Logging.debug("Creating node set $nset_name") m = matchall(r"[0-9]+", data) - node_ids = map(integer, m) + node_ids = map((s) -> parse(Int, s), m) nsets = create_or_get(model, "nsets") nsets[nset_name] = Int64[] for j in node_ids @@ -132,5 +125,3 @@ add_handler("NODE", parse_node_section) add_handler("ELEMENT", parse_element_section) add_handler("NSET", parse_nodeset_section) -end - diff --git a/src/math.jl b/src/math.jl index d3dc9bf..0a962af 100644 --- a/src/math.jl +++ b/src/math.jl @@ -5,9 +5,10 @@ This module contains math stuff, including interpolation, integration, linearization, ... """ -using JuliaFEM using ForwardDiff +export interpolate, integrate, linearize + """ Interpolate field variable using basis functions f for point ip. This function tries to be as general as possible and allows interpolating @@ -59,7 +60,7 @@ function interpolate{T<:Real}(field::Array{T,2}, basis::Function, ip) return result end function interpolate(e::Element, field::ASCIIString, x::Array{Float64,1}; derivative=false) - return interpolate(e.attributes[field], derivative ? e.dbasis : e.basis, x) + return interpolate(e.attributes[field], derivative ? e.shape_functions.dbasis : e.shape_functions.basis, x) end @@ -67,15 +68,15 @@ end """ function get_basis(el::Element, xi) - return el.basis(xi) + return el.shape_functions.basis(xi) end """ Return partial derivatives of shape functions w.r.t X using chain rule. """ -function get_dbasisdX(el::Element, ip) - J = interpolate(el, "coordinates", ip.xi; derivative=true) - dbasisdX = el.dbasis(ip.xi)*inv(J') +function get_dbasisdX(el::Element, xi) + J = interpolate(el, "coordinates", xi; derivative=true) + dbasisdX = el.shape_functions.dbasis(xi)*inv(J') return dbasisdX end @@ -96,7 +97,7 @@ Array{Float64, 2} jacobian / "tangent stiffness matrix" """ -function linearize(f::Function, el::JuliaFEM.Element, field::ASCIIString) +function linearize(f::Function, el::Element, field::ASCIIString) dim, nnodes = size(el.attributes[field]) function helper!(x, y) orig = copy(el.attributes[field]) @@ -112,7 +113,7 @@ end This version returns another function which can be then evaluated against field """ function linearize(f::Function, field::ASCIIString) - function jacobian(el::JuliaFEM.Element, args...) + function jacobian(el::Element, args...) dim, nnodes = size(el.attributes[field]) function helper!(x, y) orig = copy(el.attributes[field]) @@ -129,7 +130,7 @@ end """ In-place version, no additional garbage collection. """ -function linearize!(f::Function, el::JuliaFEM.Element, field::ASCIIString, target::ASCIIString) +function linearize!(f::Function, el::Element, field::ASCIIString, target::ASCIIString) el.attributes[target][:] = 0.0 dim, nnodes = size(el.attributes[field]) function helper!(x, y) @@ -154,23 +155,31 @@ el::Element f::Function Function to integrate """ -function integrate(f::Function, el::JuliaFEM.Element) +function integrate(f::Function, el::Element) target = [] for ip in el.integration_points - J = JuliaFEM.interpolate(el, "coordinates", ip.xi; derivative=true) + J = interpolate(el, "coordinates", ip.xi; derivative=true) push!(target, ip.weight*f(el, ip)*det(J)) end return sum(target) end +#function integrate(f::Function, integration_points::Array{IntegrationPoint, 1}, Xargs...) +# target = [] +# for ip in integration_points +# J = interpolate(el, "coordinates", ip.xi; derivative=true) +# push!(target, ip.weight*f(ip, args...)*det(J)) +# end +# return sum(target) +#end """ This version returns a function which must be operated with element e """ function integrate(f::Function) - function integrate(el::JuliaFEM.Element) + function integrate(el::Element) target = [] for ip in el.integration_points - J = JuliaFEM.interpolate(el, "coordinates", ip.xi; derivative=true) + J = interpolate(el, "coordinates", ip.xi; derivative=true) push!(target, ip.weight*f(el, ip)*det(J)) end return sum(target) @@ -181,11 +190,12 @@ end """ This version saves results inplace to target, garbage collection free """ -function integrate!(f::Function, el::JuliaFEM.Element, target) +function integrate!(f::Function, el::Element, target) # set target to zero el.attributes[target][:] = 0.0 for ip in el.integration_points - J = JuliaFEM.interpolate(el, "coordinates", ip.xi; derivative=true) + J = interpolate(el, "coordinates", ip.xi; derivative=true) el.attributes[target][:,:] += ip.weight*f(el, ip)*det(J) end end + diff --git a/src/types.jl b/src/types.jl index 68e663b..bc35557 100644 --- a/src/types.jl +++ b/src/types.jl @@ -1,6 +1,8 @@ # This file is a part of JuliaFEM. # License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md +export IntegrationPoint, Element, Assembly, FunctionSpace + """ Integration point @@ -18,18 +20,21 @@ type IntegrationPoint attributes :: Dict{ASCIIString, Any} end -type Element - id :: Int -# element_type :: Int - node_ids :: Array{Int, 1} +type FunctionSpace basis :: Function dbasis :: Function - integration_points :: Array{IntegrationPoint, 1} - attributes :: Dict{ASCIIString, Any} -# ipoints :: Array{Float64, 2} -# iweights :: Array{Float64, 1} end +abstract Element + +#type Element +# id :: Int +# node_ids :: Array{Int, 1} +# shape_functions :: FunctionSpace +# integration_points :: Array{IntegrationPoint, 1} +# attributes :: Dict{ASCIIString, Any} +#end + type Assembly # LHS @@ -42,4 +47,6 @@ type Assembly # global dofs for each element gdofs :: Dict{Int64, Array{Int64, 1}} end +Assembly() = Assembly(Int64[], Int64[], Float64[], Int64[], Float64[], Dict{Int64,Array{Int64,1}}()) +Assembly(gdofs::Dict{Int64,Array{Int64,1}}) = Assembly(Int64[], Int64[], Float64[], Int64[], Float64[], gdofs) diff --git a/src/xdmf.jl b/src/xdmf.jl index 2b2eef8..a56afec 100644 --- a/src/xdmf.jl +++ b/src/xdmf.jl @@ -1,17 +1,8 @@ # This file is a part of JuliaFEM. # License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md -module xdmf - -using Logging -@Logging.configure(level=INFO) - using LightXML -VERSION < v"0.4-" && using Docile - -# i add docstrings later - # element codes: http://www.paraview.org/pipermail/paraview/2013-July/028859.html # > from ./VTK/ThirdParty/xdmf2/vtkxdmf2/libsrc/XdmfTopology.h # > @@ -75,29 +66,68 @@ function xdmf_new_grid(temporal_collection; time=0) return grid end +#function xdmf_new_mesh(grid, X, elmap) +# geometry = new_child(grid, "Geometry") +# set_attribute(geometry, "Type", "XYZ") +# dataitem = new_child(geometry, "DataItem") +# set_attribute(dataitem, "DataType", "Float") +# set_attribute(dataitem, "Dimensions", length(X)) +# set_attribute(dataitem, "Format", "XML") +# set_attribute(dataitem, "Precision", "4") +# add_text(dataitem, join(X, " ")) +# topology = new_child(grid, "Topology") +# set_attribute(topology, "Dimensions", "1") +# set_attribute(topology, "Type", "Mixed") +# dataitem = new_child(topology, "DataItem") +# set_attribute(dataitem, "DataType", "Int") +# set_attribute(dataitem, "Dimensions", length(elmap)) +# set_attribute(dataitem, "Format", "XML") +# set_attribute(dataitem, "Precision", 4) +# elmap2 = copy(elmap) +# elmap2[2:end,:] -= 1 +# add_text(dataitem, join(elmap2, " ")) +#end + function xdmf_new_mesh(grid, X, elmap) + dim, nnodes = size(X) geometry = new_child(grid, "Geometry") set_attribute(geometry, "Type", "XYZ") dataitem = new_child(geometry, "DataItem") set_attribute(dataitem, "DataType", "Float") - set_attribute(dataitem, "Dimensions", length(X)) + set_attribute(dataitem, "Dimensions", "$nnodes $dim") set_attribute(dataitem, "Format", "XML") - set_attribute(dataitem, "Precision", "4") - add_text(dataitem, join(X, " ")) + set_attribute(dataitem, "Precision", 8) + #add_text(dataitem, join(X, " ")) + s = "\n" + + for i=1:nnodes + s *= "\t\t" * join(X[:,i], " ") * "\n" + end + s *= " " + add_text(dataitem, s) - topology = new_child(grid, "Topology") - set_attribute(topology, "Dimensions", "1") - set_attribute(topology, "Type", "Mixed") - dataitem = new_child(topology, "DataItem") - set_attribute(dataitem, "DataType", "Int") - set_attribute(dataitem, "Dimensions", length(elmap)) - set_attribute(dataitem, "Format", "XML") - set_attribute(dataitem, "Precision", 4) elmap2 = copy(elmap) elmap2[2:end,:] -= 1 - add_text(dataitem, join(elmap2, " ")) + dim, nelements = size(elmap2) + + topology = new_child(grid, "Topology") + #set_attribute(topology, "Dimensions", "1") + set_attribute(topology, "TopologyType", "Mixed") + set_attribute(topology, "NumberOfElements", nelements) + dataitem = new_child(topology, "DataItem") + set_attribute(dataitem, "DataType", "Int") + set_attribute(dataitem, "Dimensions", "$nelements $dim") + set_attribute(dataitem, "Format", "XML") + set_attribute(dataitem, "Precision", 8) + s = "\n" + for i=1:nelements + s *= "\t\t" * join(elmap2[:,i], " ") * "\n" + end + add_text(dataitem, s) + #add_text(dataitem, join(elmap2, " ")) end + function xdmf_new_field(grid, name, source, data) loc = Dict("elements" => "Cell", "nodes" => "Node") @@ -140,4 +170,3 @@ function xdmf_save_model(xdoc, filename) save_file(xdoc, filename) end -end diff --git a/test/test_abaqus_reader.jl b/test/test_abaqus_reader.jl index 0aeb23c..26bf203 100644 --- a/test/test_abaqus_reader.jl +++ b/test/test_abaqus_reader.jl @@ -5,45 +5,61 @@ using FactCheck using Logging @Logging.configure(level=INFO) -using JuliaFEM.abaqus_reader: parse_abaqus, parse_element_section +#using JuliaFEM.abaqus_reader: parse_abaqus, parse_element_section +include(Pkg.dir("JuliaFEM")*"/src/abaqus_reader.jl") facts("test import abaqus model") do # FIXME: get_test_data() fid = open(Pkg.dir("JuliaFEM")*"/geometry/3d_beam/palkki.inp") model = parse_abaqus(fid) close(fid) - @fact length(model["nodes"]) => 298 - @fact length(model["elements"]) => 120 - @fact length(model["elsets"]["Body1"]) => 120 - @fact length(model["nsets"]["SUPPORT"]) => 9 - @fact length(model["nsets"]["LOAD"]) => 9 - @fact length(model["nsets"]["TOP"]) => 83 + @fact length(model["nodes"]) --> 298 + @fact length(model["elements"]) --> 120 + @fact length(model["elsets"]["Body1"]) --> 120 + @fact length(model["nsets"]["SUPPORT"]) --> 9 + @fact length(model["nsets"]["LOAD"]) --> 9 + @fact length(model["nsets"]["TOP"]) --> 83 end facts("test that reader throws error when dimension information of elemenet is missing") do -# *ELEMENT, TYPE=neverseenbefore, ELSET=Body1 - data = """ - 1, 243, 240, 191, 117, 245, 242, 244, - 1, 2, 196 - """ - model = Dict() - header = Dict("section"=>"ELEMENT", "options" => Dict("TYPE" => "neverseenbefore", "ELSET"=>"Body1")) - @fact_throws parse_element_section(model, header, data) + # *ELEMENT, TYPE=neverseenbefore, ELSET=Body1 + data = """ + 1, 243, 240, 191, 117, 245, 242, 244, + 1, 2, 196 + """ + model = Dict() + header = Dict("section"=>"ELEMENT", "options" => Dict("TYPE" => "neverseenbefore", "ELSET"=>"Body1")) + @fact_throws parse_element_section(model, header, data) +end + +facts("read element section") do + data = """ + 1, 243, 240, 191, 117, 245, 242, 244, + 1, 2, 196 + 2, 204, 199, 175, 130, 207, 208, 209, + 3, 4, 176 + """ + model = Dict() + header = Dict("section" => "ELEMENT", "options" => Dict("TYPE" => "C3D10", "ELSET" => "BEAM")) + parse_element_section(model, header, data) + @fact length(model["elements"]) --> 2 + @fact model["elements"][1] --> [243, 240, 191, 117, 245, 242, 244, 1, 2, 196] + @fact model["elements"][2] --> [204, 199, 175, 130, 207, 208, 209, 3, 4, 176] end facts("test unknown handler warning message") do - fn = tempname() - fid = open(fn, "w") - testdata = """ - *ELEMENT2, TYPE=C3D10, ELSET=Body1 - 1, 243, 240, 191, 117, 245, 242, 244, - 1, 2, 196 - """ - write(fid, testdata) - close(fid) - fid = open(fn) - model = parse_abaqus(fid) - close(fid) - # empty model expected, parser doesn't know what to do with unknown section - @fact length(model) => 0 + fn = tempname() + fid = open(fn, "w") + testdata = """ + *ELEMENT2, TYPE=C3D10, ELSET=Body1 + 1, 243, 240, 191, 117, 245, 242, 244, + 1, 2, 196 + """ + write(fid, testdata) + close(fid) + fid = open(fn) + model = parse_abaqus(fid) + close(fid) + # empty model expected, parser doesn't know what to do with unknown section + @fact length(model) --> 0 end From b3bc9dc07b4b9d90d4d484847195c2d0688243b8 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Mon, 24 Aug 2015 01:14:03 +0300 Subject: [PATCH 24/26] Broken again. --- ...2015-06-25-elasticity-solver-example.ipynb | 797 ++++++++++-------- src/JuliaFEM.jl | 5 + src/elements.jl | 92 ++ src/math.jl | 19 +- 4 files changed, 546 insertions(+), 367 deletions(-) create mode 100644 src/elements.jl diff --git a/notebooks/2015-06-25-elasticity-solver-example.ipynb b/notebooks/2015-06-25-elasticity-solver-example.ipynb index 70230a8..59e621c 100644 --- a/notebooks/2015-06-25-elasticity-solver-example.ipynb +++ b/notebooks/2015-06-25-elasticity-solver-example.ipynb @@ -41,16 +41,6 @@ "collapsed": false }, "outputs": [ - { - "data": { - "text/plain": [ - "Logger(root,DEBUG,Pipe(open, 0 bytes waiting),root)" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - }, { "name": "stderr", "output_type": "stream", @@ -69,12 +59,25 @@ " in recv_ipython at /Users/jukka/.julia/v0.4/IJulia/src/msg.jl:63\n", " in eventloop at /Users/jukka/.julia/v0.4/IJulia/src/IJulia.jl:120\n", " in anonymous at task.jl:365\n", - "while loading /Users/jukka/.julia/v0.4/IJulia/src/kernel.jl, in expression starting on line 35\n" + "while loading /Users/jukka/.julia/v0.4/IJulia/src/kernel.jl, in expression starting on line 35\n", + "24-Aug 00:56:48:INFO:root:loading types\n", + "24-Aug 00:56:48:INFO:root:loading elements\n" ] + }, + { + "data": { + "text/plain": [ + "Logger(root,DEBUG,Pipe(open, 0 bytes waiting),root)" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ "using JuliaFEM\n", + "using JuliaFEM: Assembly, Element, Quad4, get_integration_points, get_jacobian, get_basis, get_dbasisdxi, get_dbasisdX\n", "using Logging\n", "Logging.configure(level=DEBUG)" ] @@ -87,9 +90,14 @@ "\n", "*Design principle 4*: we don't use greek characters in code which is implemented to JuliaFEM. In notebooks they are ok.\n", "\n", - "*Design principle 5*: we use 4 space indentation like in Python.\n", - "\n", - "First we construct some type for our element which contains all relevant data. We don't care a much how every element is actually implemented as long as it follows some general rules how the interface is constructed. Our element implementation for continuum 3d element is" + "*Design principle 5*: we use 4 space indentation like in Python." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we construct some type for our element which contains all relevant data. We don't care a much how every element is actually implemented as long as it follows some general rules how the interface is constructed. First we define our element family and it's basis functions, derivatives of them etc. These needs to be defined for each element type only once." ] }, { @@ -98,28 +106,6 @@ "metadata": { "collapsed": false }, - "outputs": [], - "source": [ - "abstract ContinuumElement <: Element\n", - "\n", - "\"\"\"\n", - "4-node bilinear plane stress element\n", - "\"\"\"\n", - "type CPS4 <: ContinuumElement\n", - " id :: Int\n", - " node_ids :: Array{Int, 1}\n", - " shape_functions :: FunctionSpace\n", - " integration_points :: Array{IntegrationPoint, 1}\n", - " attributes :: Dict{ASCIIString, Any}\n", - "end" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, "outputs": [ { "data": { @@ -127,15 +113,41 @@ "get_rhs (generic function with 1 method)" ] }, - "execution_count": 3, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "\"\"\"\n", + "Integrate f over element using Gaussian quadrature rules.\n", + "\n", + "Parameters\n", + "----------\n", + "el::Element\n", + " well defined element\n", + "f::Function\n", + " Function to integrate\n", + "\"\"\"\n", + "function integrate(el::Element, f::Function)\n", + " target = []\n", + " for ip in get_integration_points(el)\n", + " J = get_jacobian(el, ip.xi)\n", + " push!(target, ip.weight*f(el, ip)*det(J))\n", + " end\n", + " return sum(target)\n", + "end\n", + "\n", + "\"\"\"\n", + "Return left hand side of the equation Ax = b (i.e. A)\n", + "\"\"\"\n", "function get_lhs(el::Element)\n", " return None\n", "end\n", + "\n", + "\"\"\"\n", + "Return right hand side of the equation Ax = b (i.e. b)\n", + "\"\"\"\n", "function get_rhs(el::Element)\n", " return None\n", "end" @@ -145,7 +157,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next we need to think a bit of interface design. We give good defaults if element is constructed like this, so user doesn't have to provide everything (although it's totally possible). Here's the implementation how to calculate internal nodal forces for some integration point in continuum elements general:" + "Next we define our elements for mechanical problem. Because calculating internal and external energy for several types of elements follow same procedure, we construct whole family of mechanical elements which share common functions." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#abstract Mechanical <: CG" ] }, { @@ -158,7 +181,7 @@ { "data": { "text/plain": [ - "get_lhs (generic function with 2 methods)" + "get_field (generic function with 1 method)" ] }, "execution_count": 4, @@ -166,14 +189,95 @@ "output_type": "execute_result" } ], + "source": [ + "\"\"\"\n", + "(4-node bilinear) plane stress element\n", + "\"\"\"\n", + "type CPS4 <: Quad4\n", + " id :: Int\n", + " node_ids :: Array{Int, 1}\n", + " coordinates :: Array{Float64, 2}\n", + " integration_points :: Array{IntegrationPoint, 1}\n", + " attributes :: Dict{ASCIIString, Any}\n", + "end\n", + "\n", + "function get_field(el::Quad4)\n", + " el.attributes[\"displacement\"]\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each element must provide a standard way how it's initialized. For constructor we need only unique element id and it's connectivity data." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "CPS4" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function CPS4(element_id, node_ids)\n", + " integration_points = [\n", + " IntegrationPoint(1.0/sqrt(3.0)*[-1, -1], 1.0, Dict()),\n", + " IntegrationPoint(1.0/sqrt(3.0)*[ 1, -1], 1.0, Dict()),\n", + " IntegrationPoint(1.0/sqrt(3.0)*[ 1, 1], 1.0, Dict()),\n", + " IntegrationPoint(1.0/sqrt(3.0)*[-1, 1], 1.0, Dict())]\n", + " attributes = Dict(\"displacement\" => zeros(2, 4))\n", + " coordinates = zeros(2, 4)\n", + " CPS4(element_id, node_ids, coordinates, integration_points, attributes)\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the actual basic implementation for mechanical elements\n", + "\n", + "Our task is: for given $\\mathbf{u}$ calculate $\\mathbf{R}(\\mathbf{u}) = \\mathbf{T}(\\mathbf{u}) - \\mathbf{F}(\\mathbf{u})$ and it's partial derivative with respect to $\\mathbf{u}$, i.e. $\\partial \\mathbf{R}(\\mathbf{u}) / \\partial \\mathbf{u}$. Here is our $\\mathbf{T}$:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "get_lhs (generic function with 2 methods)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "\"\"\"\n", "Calculate internal nodal forces for continuum element.\n", "\"\"\"\n", - "function Wint(el::ContinuumElement)\n", + "function Wint(el::Quad4)\n", "\n", - " dNdX(xi) = JuliaFEM.get_dbasisdX(el, xi)\n", - " #dNdX(xi) = el.shape_functions.dbasis(xi)\n", + " dNdX(xi) = get_dbasisdX(el, xi)\n", " # material\n", " lambda(xi) = interpolate(el, \"lambda\", xi)\n", " mu(xi) = interpolate(el, \"mu\", xi)\n", @@ -185,25 +289,11 @@ " S(xi, u) = lambda(xi)*trace(E(xi, u))*I + 2*mu(xi)*E(xi, u)\n", " P(xi, u) = F(xi, u)*S(xi, u)\n", " T(xi, u) = P(xi, u)*dNdX(xi)'\n", - "\n", - " function Wint_(el, ip)\n", - " xi = ip.xi\n", - " u = el.attributes[\"displacement\"]\n", - " return T(xi, u)\n", - " end\n", - " return integrate(Wint_, el)\n", - " #return integrate(T, el.integration_points, el.attributes[\"displacement\"])\n", + " integrate(el, (el, ip) -> T(ip.xi, get_field(el)))\n", "end\n", "\n", - "get_rhs(el::ContinuumElement) = -Wint(el)\n", - "get_lhs(el::ContinuumElement) = linearize(Wint, \"displacement\")(el)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our task is: for given $\\mathbf{u}$ calculate $\\mathbf{R}(\\mathbf{u}) = \\mathbf{T}(\\mathbf{u}) - \\mathbf{F}(\\mathbf{u})$ and it's partial derivative with respect to $\\mathbf{u}$, i.e. $\\partial \\mathbf{R}(\\mathbf{u}) / \\partial \\mathbf{u}$. Here is our $\\mathbf{T}$:" + "get_rhs(el::Quad4) = -Wint(el) # rhs = -R = -(T-F)\n", + "get_lhs(el::Quad4) = linearize(Wint, \"displacement\")(el)" ] }, { @@ -217,7 +307,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": { "collapsed": true }, @@ -228,7 +318,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": { "collapsed": false }, @@ -239,7 +329,7 @@ "get_test_element (generic function with 1 method)" ] }, - "execution_count": 6, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -247,47 +337,25 @@ "source": [ "function get_test_element()\n", " # set up one linear quadrangle element\n", - " basis(xi) = [\n", - " (1-xi[1])*(1-xi[2])/4\n", - " (1+xi[1])*(1-xi[2])/4\n", - " (1+xi[1])*(1+xi[2])/4\n", - " (1-xi[1])*(1+xi[2])/4]\n", - "\n", - " dbasisdxi(xi) = [-(1-xi[2])/4.0 -(1-xi[1])/4.0\n", - " (1-xi[2])/4.0 -(1+xi[1])/4.0\n", - " (1+xi[2])/4.0 (1+xi[1])/4.0\n", - " -(1+xi[2])/4.0 (1-xi[1])/4.0]\n", - "\n", - " X = [0.0 0.0; 10.0 0.0; 10.0 1.0; 0.0 1.0]'\n", - " #J(xi) = X*dbasisdxi(xi)\n", - " #dbasisdX(xi) = dbasisdxi(xi)*inv(J(xi)')\n", - " shape_functions = FunctionSpace(basis, dbasisdxi)\n", - " integration_points = [\n", - " IntegrationPoint(1.0/sqrt(3.0)*[-1, -1], 1.0, Dict()),\n", - " IntegrationPoint(1.0/sqrt(3.0)*[ 1, -1], 1.0, Dict()),\n", - " IntegrationPoint(1.0/sqrt(3.0)*[ 1, 1], 1.0, Dict()),\n", - " IntegrationPoint(1.0/sqrt(3.0)*[-1, 1], 1.0, Dict())]\n", - " attributes = Dict()\n", " element_id = 1\n", " node_ids = [1, 2, 3, 4]\n", - " el = CPS4(element_id, node_ids, shape_functions, integration_points, attributes)\n", - " #el.shape_functions.dbasis(xi) = JuliaFEM.get_dbasisdX(el, xi)\n", + " el = CPS4(element_id, node_ids)\n", + "\n", " E = 90.0\n", " nu = 0.25\n", " mu = E/(2*(1+nu))\n", " la = E*nu/((1+nu)*(1-2*nu))\n", " la = 2*la*mu/(la + 2*mu)\n", - " el.attributes[\"coordinates\"] = X\n", - " el.attributes[\"lambda\"] = la\n", - " el.attributes[\"mu\"] = mu\n", - " el.attributes[\"displacement\"] = [0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0]'\n", + " X = [0.0 0.0; 10.0 0.0; 10.0 1.0; 0.0 1.0]'\n", + " set_coordinates(el, X)\n", + " set_material(el, la, mu)\n", " return el\n", "end" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": { "collapsed": false, "scrolled": false @@ -304,40 +372,40 @@ "name": "stderr", "output_type": "stream", "text": [ - "22-Aug 20:45:52:DEBUG:root:Iteration 1\n", - "22-Aug 20:46:00:DEBUG:root:Solving Ax = b\n", - "22-Aug 20:46:02:DEBUG:root:Iteration 2\n", - "22-Aug 20:46:02:DEBUG:root:Solving Ax = b\n", - "22-Aug 20:46:02:DEBUG:root:Iteration 3\n", - "22-Aug 20:46:02:DEBUG:root:Solving Ax = b\n", - "22-Aug 20:46:03:DEBUG:root:Iteration 4\n", - "22-Aug 20:46:03:DEBUG:root:Solving Ax = b\n", - "22-Aug 20:46:03:DEBUG:root:Iteration 5\n", - "22-Aug 20:46:03:DEBUG:root:Solving Ax = b\n", - "22-Aug 20:46:03:DEBUG:root:Iteration 6\n", - "22-Aug 20:46:03:DEBUG:root:Solving Ax = b\n", - "22-Aug 20:46:03:DEBUG:root:Converged in 6 iterations.\n", - "22-Aug 20:46:03:DEBUG:root:solution vector: \n", + "24-Aug 00:57:07:DEBUG:root:Iteration 1\n", + "24-Aug 00:57:10:DEBUG:root:Solving Ax = b\n", + "24-Aug 00:57:13:DEBUG:root:Iteration 2\n", + "24-Aug 00:57:13:DEBUG:root:Solving Ax = b\n", + "24-Aug 00:57:13:DEBUG:root:Iteration 3\n", + "24-Aug 00:57:13:DEBUG:root:Solving Ax = b\n", + "24-Aug 00:57:13:DEBUG:root:Iteration 4\n", + "24-Aug 00:57:13:DEBUG:root:Solving Ax = b\n", + "24-Aug 00:57:13:DEBUG:root:Iteration 5\n", + "24-Aug 00:57:13:DEBUG:root:Solving Ax = b\n", + "24-Aug 00:57:13:DEBUG:root:Iteration 6\n", + "24-Aug 00:57:13:DEBUG:root:Solving Ax = b\n", + "24-Aug 00:57:13:DEBUG:root:Converged in 6 iterations.\n", + "24-Aug 00:57:14:DEBUG:root:solution vector: \n", " [0.0 -0.3991450609547433 -0.07228582695592461 0.0\n", " 0.0 -2.1779892317073504 -2.222244754401764 0.0]\n", - "22-Aug 20:46:04:DEBUG:root:norm of u: 3.1292483947150047\n", - "22-Aug 20:46:04:DEBUG:root:Iteration 1\n", - "22-Aug 20:46:04:DEBUG:root:Solving Ax = b\n", - "22-Aug 20:46:04:DEBUG:root:Iteration 2\n", - "22-Aug 20:46:04:DEBUG:root:Solving Ax = b\n", - "22-Aug 20:46:04:DEBUG:root:Iteration 3\n", - "22-Aug 20:46:04:DEBUG:root:Solving Ax = b\n", - "22-Aug 20:46:04:DEBUG:root:Iteration 4\n", - "22-Aug 20:46:04:DEBUG:root:Solving Ax = b\n", - "22-Aug 20:46:04:DEBUG:root:Iteration 5\n", - "22-Aug 20:46:04:DEBUG:root:Solving Ax = b\n", - "22-Aug 20:46:04:DEBUG:root:Iteration 6\n", - "22-Aug 20:46:04:DEBUG:root:Solving Ax = b\n", - "22-Aug 20:46:04:DEBUG:root:Converged in 6 iterations.\n", - "22-Aug 20:46:04:DEBUG:root:solution vector: \n", - " [0.0 0.7433248532717796 1.048521014723486 0.0\n", - " 0.0 -2.085766534304891 -1.9606633242166027 0.0]\n", - "22-Aug 20:46:04:DEBUG:root:norm of u: 3.1292483947150056\n" + "24-Aug 00:57:14:DEBUG:root:norm of u: 3.1292483947150047\n", + "24-Aug 00:57:14:DEBUG:root:Iteration 1\n", + "24-Aug 00:57:14:DEBUG:root:Solving Ax = b\n", + "24-Aug 00:57:14:DEBUG:root:Iteration 2\n", + "24-Aug 00:57:14:DEBUG:root:Solving Ax = b\n", + "24-Aug 00:57:14:DEBUG:root:Iteration 3\n", + "24-Aug 00:57:14:DEBUG:root:Solving Ax = b\n", + "24-Aug 00:57:14:DEBUG:root:Iteration 4\n", + "24-Aug 00:57:14:DEBUG:root:Solving Ax = b\n", + "24-Aug 00:57:14:DEBUG:root:Iteration 5\n", + "24-Aug 00:57:15:DEBUG:root:Solving Ax = b\n", + "24-Aug 00:57:15:DEBUG:root:Iteration 6\n", + "24-Aug 00:57:15:DEBUG:root:Solving Ax = b\n", + "24-Aug 00:57:15:DEBUG:root:Converged in 6 iterations.\n", + "24-Aug 00:57:15:DEBUG:root:solution vector: \n", + " [0.0 1.2578327758133292 1.5202505368695098 0.0\n", + " 0.0 -1.8223091343697626 -1.6224781337179326 0.0]\n", + "24-Aug 00:57:15:DEBUG:root:norm of u: 3.129248394715004\n" ] }, { @@ -353,7 +421,7 @@ "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 7, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -369,8 +437,9 @@ " free_dofs = [3, 4, 5, 6]\n", " for i=1:10\n", " Logging.debug(\"Iteration $i\")\n", - " A = get_lhs(e)\n", " b = get_rhs(e)\n", + " #Logging.debug(\"rhs = $b\")\n", + " A = get_lhs(e)\n", " Logging.debug(\"Solving Ax = b\")\n", " du[free_dofs] = A[free_dofs, free_dofs] \\ (b + F)[free_dofs]\n", "\n", @@ -389,11 +458,11 @@ " Logging.debug(\"norm of u: $(norm(u))\")\n", "\n", " # We rotate model a bit and make sure that norm remains same\n", - " phi = 30/180*pi\n", + " phi = 45/180*pi\n", " rmat = [\n", " cos(phi) -sin(phi)\n", " sin(phi) cos(phi)]\n", - " e.attributes[\"coordinates\"] = rmat*e.attributes[\"coordinates\"]\n", + " set_coordinates(e, rmat*get_coordinates(e))\n", " F = rmat*F\n", "\n", " e.attributes[\"displacement\"] = [0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0]'\n", @@ -427,7 +496,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": { "collapsed": false }, @@ -435,16 +504,16 @@ { "data": { "text/plain": [ - "assemble_element! (generic function with 1 method)" + "assemble_rhs! (generic function with 1 method)" ] }, - "execution_count": 8, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "function assemble_element!(ass::Assembly, el::Element)\n", + "function assemble_lhs!(ass::Assembly, el::Element)\n", "\n", " gdofs = ass.gdofs[el.id]\n", "\n", @@ -459,6 +528,11 @@ " end\n", " end\n", " end\n", + "end\n", + "\n", + "function assemble_rhs!(ass::Assembly, el::Element)\n", + "\n", + " gdofs = ass.gdofs[el.id]\n", " \n", " b = get_rhs(el)\n", " if !(b == None)\n", @@ -472,7 +546,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": { "collapsed": false }, @@ -480,19 +554,19 @@ { "data": { "text/plain": [ - "get_field (generic function with 1 method)" + "get_field (generic function with 2 methods)" ] }, - "execution_count": 9, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "function update_field(el::ContinuumElement, du)\n", + "function update_field(el::Element, du)\n", " el.attributes[\"displacement\"][:] += du\n", "end\n", - "function get_field(el::ContinuumElement)\n", + "function get_field(el::Element)\n", " return el.attributes[\"displacement\"]\n", "end" ] @@ -504,46 +578,6 @@ "We also need to construct our element in somehow \"standard\" way. My proposal is: element id and node ids (connectivity) information. Of course other fields must also be provided. Here's example for CPS4 element:" ] }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "CPS4" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "function CPS4(element_id, node_ids)\n", - " basis(xi) = [\n", - " (1-xi[1])*(1-xi[2])/4\n", - " (1+xi[1])*(1-xi[2])/4\n", - " (1+xi[1])*(1+xi[2])/4\n", - " (1-xi[1])*(1+xi[2])/4]\n", - " dbasis(xi) = [-(1-xi[2])/4.0 -(1-xi[1])/4.0\n", - " (1-xi[2])/4.0 -(1+xi[1])/4.0\n", - " (1+xi[2])/4.0 (1+xi[1])/4.0\n", - " -(1+xi[2])/4.0 (1-xi[1])/4.0]\n", - " shape_functions = FunctionSpace(basis, dbasis)\n", - " integration_points = [\n", - " IntegrationPoint(1.0/sqrt(3.0)*[-1, -1], 1.0, Dict()),\n", - " IntegrationPoint(1.0/sqrt(3.0)*[ 1, -1], 1.0, Dict()),\n", - " IntegrationPoint(1.0/sqrt(3.0)*[ 1, 1], 1.0, Dict()),\n", - " IntegrationPoint(1.0/sqrt(3.0)*[-1, 1], 1.0, Dict())]\n", - " attributes = Dict(\"displacement\" => zeros(2, 4))\n", - " CPS4(element_id, node_ids, shape_functions, integration_points, attributes)\n", - "end" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -553,7 +587,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": { "collapsed": false }, @@ -564,7 +598,7 @@ "set_attribute (generic function with 1 method)" ] }, - "execution_count": 11, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -584,16 +618,18 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ + "using JuliaFEM: CG\n", + "abstract Point0 <: CG\n", "\"\"\"\n", "1-node point force element for plane stress problems.\n", "\"\"\"\n", - "type CPS1 <: ContinuumElement\n", + "type CPS1 <: Point0\n", " id :: Int\n", " node_ids :: Array{Int, 1}\n", " attributes :: Dict{ASCIIString, Any}\n", @@ -602,7 +638,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": { "collapsed": false }, @@ -613,7 +649,7 @@ "get_lhs (generic function with 3 methods)" ] }, - "execution_count": 13, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -655,7 +691,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 17, "metadata": { "collapsed": false }, @@ -671,26 +707,38 @@ "name": "stderr", "output_type": "stream", "text": [ - "22-Aug 20:46:07:DEBUG:root:Starting iteration 1\n", - "22-Aug 20:46:07:DEBUG:root:Assembling\n", - "22-Aug 20:46:08:DEBUG:root:Solution norm = 3.0900221367289986\n", - "22-Aug 20:46:08:DEBUG:root:Starting iteration 2\n", - "22-Aug 20:46:08:DEBUG:root:Assembling\n", - "22-Aug 20:46:08:DEBUG:root:Solution norm = 0.3212131602153472\n", - "22-Aug 20:46:08:DEBUG:root:Starting iteration 3\n", - "22-Aug 20:46:08:DEBUG:root:Assembling\n", - "22-Aug 20:46:08:DEBUG:root:Solution norm = 0.04043178193999703\n", - "22-Aug 20:46:08:DEBUG:root:Starting iteration 4\n", - "22-Aug 20:46:08:DEBUG:root:Assembling\n", - "22-Aug 20:46:08:DEBUG:root:Solution norm = 0.0009291101052105739\n", - "22-Aug 20:46:08:DEBUG:root:Starting iteration 5\n", - "22-Aug 20:46:08:DEBUG:root:Assembling\n", - "22-Aug 20:46:08:DEBUG:root:Solution norm = 1.5638899027804743e-7\n", - "22-Aug 20:46:08:DEBUG:root:Starting iteration 6\n", - "22-Aug 20:46:08:DEBUG:root:Assembling\n", - "22-Aug 20:46:08:DEBUG:root:Solution norm = 1.0464940956129567e-14\n", - "22-Aug 20:46:08:DEBUG:root:Converged in 6 iterations.\n", - "22-Aug 20:46:08:DEBUG:root:Displacement of element = \n", + "24-Aug 01:06:39:DEBUG:root:Starting iteration 1\n", + "24-Aug 01:06:39:DEBUG:root:Assembling\n", + "24-Aug 01:06:39:DEBUG:root:Assembling element 1\n", + "24-Aug 01:06:39:DEBUG:root:Assembling element 2\n", + "24-Aug 01:06:40:DEBUG:root:Solution norm = 3.0900221367289986\n", + "24-Aug 01:06:40:DEBUG:root:Starting iteration 2\n", + "24-Aug 01:06:40:DEBUG:root:Assembling\n", + "24-Aug 01:06:40:DEBUG:root:Assembling element 1\n", + "24-Aug 01:06:40:DEBUG:root:Assembling element 2\n", + "24-Aug 01:06:40:DEBUG:root:Solution norm = 0.3212131602153472\n", + "24-Aug 01:06:40:DEBUG:root:Starting iteration 3\n", + "24-Aug 01:06:40:DEBUG:root:Assembling\n", + "24-Aug 01:06:40:DEBUG:root:Assembling element 1\n", + "24-Aug 01:06:40:DEBUG:root:Assembling element 2\n", + "24-Aug 01:06:40:DEBUG:root:Solution norm = 0.04043178193999703\n", + "24-Aug 01:06:40:DEBUG:root:Starting iteration 4\n", + "24-Aug 01:06:40:DEBUG:root:Assembling\n", + "24-Aug 01:06:40:DEBUG:root:Assembling element 1\n", + "24-Aug 01:06:40:DEBUG:root:Assembling element 2\n", + "24-Aug 01:06:40:DEBUG:root:Solution norm = 0.0009291101052105739\n", + "24-Aug 01:06:40:DEBUG:root:Starting iteration 5\n", + "24-Aug 01:06:40:DEBUG:root:Assembling\n", + "24-Aug 01:06:40:DEBUG:root:Assembling element 1\n", + "24-Aug 01:06:40:DEBUG:root:Assembling element 2\n", + "24-Aug 01:06:40:DEBUG:root:Solution norm = 1.5638899027804743e-7\n", + "24-Aug 01:06:40:DEBUG:root:Starting iteration 6\n", + "24-Aug 01:06:40:DEBUG:root:Assembling\n", + "24-Aug 01:06:40:DEBUG:root:Assembling element 1\n", + "24-Aug 01:06:40:DEBUG:root:Assembling element 2\n", + "24-Aug 01:06:40:DEBUG:root:Solution norm = 1.0464940956129567e-14\n", + "24-Aug 01:06:40:DEBUG:root:Converged in 6 iterations.\n", + "24-Aug 01:06:40:DEBUG:root:Displacement of element = \n", "[0.0 -0.39914506095474334 -0.0722858269559246 0.0\n", " 0.0 -2.1779892317073504 -2.222244754401764 0.0]\n" ] @@ -708,7 +756,7 @@ "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 14, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -725,7 +773,7 @@ " mu = E/(2*(1+nu))\n", " la = E*nu/((1+nu)*(1-2*nu))\n", " la = 2*la*mu/(la + 2*mu)\n", - " set_attribute(el1, \"coordinates\", [0.0 0.0; 10.0 0.0; 10.0 1.0; 0.0 1.0]')\n", + " set_coordinates(el1, [0.0 0.0; 10.0 0.0; 10.0 1.0; 0.0 1.0]')\n", " set_attribute(el1, \"lambda\", la)\n", " set_attribute(el1, \"mu\", mu)\n", "\n", @@ -742,8 +790,10 @@ " ass.gdofs[el1.id] = [1, 2, 3, 4, 5, 6, 7, 8]\n", " ass.gdofs[el2.id] = [5, 6]\n", "\n", - " for el in elements\n", - " assemble_element!(ass, el)\n", + " for (j, el) in enumerate(elements)\n", + " Logging.debug(\"Assembling element $j\")\n", + " assemble_lhs!(ass, el)\n", + " assemble_rhs!(ass, el)\n", " end\n", "\n", " # (Dirichlet) boundary conditions \"handled\"\n", @@ -782,13 +832,16 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [], "source": [ - "type MPC\n", + "abstract BoundaryCondition\n", + "abstract DirichletBC <: BoundaryCondition\n", + "\n", + "type MPC <: DirichletBC\n", " slave_dof :: Int64\n", " slave_value :: Float64\n", " master_dofs :: Array{Int64, 1}\n", @@ -799,7 +852,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 19, "metadata": { "collapsed": false }, @@ -810,7 +863,7 @@ "MPC" ] }, - "execution_count": 16, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -826,7 +879,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 20, "metadata": { "collapsed": false }, @@ -837,7 +890,7 @@ "create_ldof2gdofmap (generic function with 1 method)" ] }, - "execution_count": 17, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -870,9 +923,40 @@ "end" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we want to solve a _problem_. It's yet another container and if it's defined somewhat standard way default solver can solve it. Nothing stops user to write his/hers own solver." + ] + }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "type SolverParameters\n", + " max_iterations :: Int64\n", + " eps :: Float64\n", + "end\n", + "SolverParameters() = SolverParameters(10, 0.05)\n", + "\n", + "abstract Problem\n", + "abstract ElasticityProblem <: Problem\n", + "type PlaneStressProblem <: ElasticityProblem\n", + " elements :: Array{Element, 1}\n", + " dofmap :: Dict{Int64, Array{Int64,1}}() # a dict node_id : (dof1, dof2, ...)\n", + " dirichlet_bcs :: Array{BoundaryCondition, 1}\n", + " solver_parameters :: SolverParameters\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 22, "metadata": { "collapsed": false, "scrolled": false @@ -889,47 +973,53 @@ "name": "stderr", "output_type": "stream", "text": [ - "22-Aug 20:46:09:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],1=>[1,2])\n", - "22-Aug 20:46:09:INFO:root:solve!: dofs per node: 2\n", - "22-Aug 20:46:09:DEBUG:root:Problem size = 8\n", - "22-Aug 20:46:09:DEBUG:root:Starting iteration 1\n", - "22-Aug 20:46:09:DEBUG:root:Assembling\n", - "22-Aug 20:46:09:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "22-Aug 20:46:10:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "22-Aug 20:46:10:DEBUG:root:Solving system of equations. Total size = 12\n", - "22-Aug 20:46:10:DEBUG:root:Solution norm du = 3.0900221367289444\n", - "22-Aug 20:46:10:DEBUG:root:Starting iteration 2\n", - "22-Aug 20:46:10:DEBUG:root:Assembling\n", - "22-Aug 20:46:10:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "22-Aug 20:46:10:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "22-Aug 20:46:10:DEBUG:root:Solving system of equations. Total size = 12\n", - "22-Aug 20:46:10:DEBUG:root:Solution norm du = 0.32121316021534796\n", - "22-Aug 20:46:10:DEBUG:root:Starting iteration 3\n", - "22-Aug 20:46:10:DEBUG:root:Assembling\n", - "22-Aug 20:46:10:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "22-Aug 20:46:10:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "22-Aug 20:46:10:DEBUG:root:Solving system of equations. Total size = 12\n", - "22-Aug 20:46:10:DEBUG:root:Solution norm du = 0.040431781940014504\n", - "22-Aug 20:46:10:DEBUG:root:Starting iteration 4\n", - "22-Aug 20:46:10:DEBUG:root:Assembling\n", - "22-Aug 20:46:10:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "22-Aug 20:46:10:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "22-Aug 20:46:10:DEBUG:root:Solving system of equations. Total size = 12\n", - "22-Aug 20:46:10:DEBUG:root:Solution norm du = 0.0009291101052065917\n", - "22-Aug 20:46:10:DEBUG:root:Starting iteration 5\n", - "22-Aug 20:46:10:DEBUG:root:Assembling\n", - "22-Aug 20:46:10:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "22-Aug 20:46:10:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "22-Aug 20:46:10:DEBUG:root:Solving system of equations. Total size = 12\n", - "22-Aug 20:46:10:DEBUG:root:Solution norm du = 1.5638899136781228e-7\n", - "22-Aug 20:46:10:DEBUG:root:Starting iteration 6\n", - "22-Aug 20:46:10:DEBUG:root:Assembling\n", - "22-Aug 20:46:10:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "22-Aug 20:46:10:DEBUG:root:Added 4 Lagrange multipliers to model\n", - "22-Aug 20:46:10:DEBUG:root:Solving system of equations. Total size = 12\n", - "22-Aug 20:46:10:DEBUG:root:Solution norm du = 1.0913504694802626e-14\n", - "22-Aug 20:46:10:DEBUG:root:Converged in 6 iterations.\n", - "22-Aug 20:46:10:DEBUG:root:Displacement on upper right = \n", + "24-Aug 01:07:29:DEBUG:root:Dict(4=>[7,8],2=>[3,4],3=>[5,6],1=>[1,2])\n", + "24-Aug 01:07:29:INFO:root:solve!: dofs per node: 2\n", + "24-Aug 01:07:29:DEBUG:root:Problem size = 8\n", + "24-Aug 01:07:29:DEBUG:root:Starting iteration 1\n", + "24-Aug 01:07:29:DEBUG:root:Assembling lhs\n", + "24-Aug 01:07:29:DEBUG:root:Assembling rhs\n", + "24-Aug 01:07:29:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "24-Aug 01:07:29:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "24-Aug 01:07:29:DEBUG:root:Solving system of equations. Total size = 12\n", + "24-Aug 01:07:29:DEBUG:root:Solution norm du = 3.0900221367289444\n", + "24-Aug 01:07:29:DEBUG:root:Starting iteration 2\n", + "24-Aug 01:07:29:DEBUG:root:Assembling lhs\n", + "24-Aug 01:07:29:DEBUG:root:Assembling rhs\n", + "24-Aug 01:07:29:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "24-Aug 01:07:29:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "24-Aug 01:07:29:DEBUG:root:Solving system of equations. Total size = 12\n", + "24-Aug 01:07:29:DEBUG:root:Solution norm du = 0.32121316021534796\n", + "24-Aug 01:07:29:DEBUG:root:Starting iteration 3\n", + "24-Aug 01:07:29:DEBUG:root:Assembling lhs\n", + "24-Aug 01:07:29:DEBUG:root:Assembling rhs\n", + "24-Aug 01:07:29:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "24-Aug 01:07:29:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "24-Aug 01:07:29:DEBUG:root:Solving system of equations. Total size = 12\n", + "24-Aug 01:07:29:DEBUG:root:Solution norm du = 0.040431781940014504\n", + "24-Aug 01:07:29:DEBUG:root:Starting iteration 4\n", + "24-Aug 01:07:29:DEBUG:root:Assembling lhs\n", + "24-Aug 01:07:29:DEBUG:root:Assembling rhs\n", + "24-Aug 01:07:29:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "24-Aug 01:07:29:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "24-Aug 01:07:29:DEBUG:root:Solving system of equations. Total size = 12\n", + "24-Aug 01:07:29:DEBUG:root:Solution norm du = 0.0009291101052065917\n", + "24-Aug 01:07:30:DEBUG:root:Starting iteration 5\n", + "24-Aug 01:07:30:DEBUG:root:Assembling lhs\n", + "24-Aug 01:07:30:DEBUG:root:Assembling rhs\n", + "24-Aug 01:07:30:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "24-Aug 01:07:30:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "24-Aug 01:07:30:DEBUG:root:Solving system of equations. Total size = 12\n", + "24-Aug 01:07:30:DEBUG:root:Solution norm du = 1.5638899136781228e-7\n", + "24-Aug 01:07:30:DEBUG:root:Starting iteration 6\n", + "24-Aug 01:07:30:DEBUG:root:Assembling lhs\n", + "24-Aug 01:07:30:DEBUG:root:Assembling rhs\n", + "24-Aug 01:07:30:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "24-Aug 01:07:30:DEBUG:root:Added 4 Lagrange multipliers to model\n", + "24-Aug 01:07:30:DEBUG:root:Solving system of equations. Total size = 12\n", + "24-Aug 01:07:30:DEBUG:root:Solution norm du = 1.0913504694802626e-14\n", + "24-Aug 01:07:30:DEBUG:root:Converged in 6 iterations.\n", + "24-Aug 01:07:30:DEBUG:root:Displacement on upper right = \n", "[-0.07228582695592467\n", " -2.222244754401765]\n" ] @@ -947,7 +1037,7 @@ "delayed_handler (generic function with 4 methods)" ] }, - "execution_count": 18, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -974,9 +1064,13 @@ " Logging.debug(\"Starting iteration $iter\")\n", " ass = JuliaFEM.Assembly(gdofs)\n", "\n", - " Logging.debug(\"Assembling\")\n", + " Logging.debug(\"Assembling lhs\")\n", " for el in elements\n", - " assemble_element!(ass, el)\n", + " assemble_lhs!(ass, el)\n", + " end\n", + " Logging.debug(\"Assembling rhs\")\n", + " for el in elements\n", + " assemble_rhs!(ass, el)\n", " end\n", "\n", " i = 0\n", @@ -1033,7 +1127,7 @@ " mu = E/(2*(1+nu))\n", " la = E*nu/((1+nu)*(1-2*nu))\n", " la = 2*la*mu/(la + 2*mu)\n", - " set_attribute(el1, \"coordinates\", [0.0 0.0; 10.0 0.0; 10.0 1.0; 0.0 1.0]')\n", + " set_coordinates(el1, [0.0 0.0; 10.0 0.0; 10.0 1.0; 0.0 1.0]')\n", " set_attribute(el1, \"lambda\", la)\n", " set_attribute(el1, \"mu\", mu)\n", "\n", @@ -1071,7 +1165,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 23, "metadata": { "collapsed": false }, @@ -1080,17 +1174,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "22-Aug 20:46:11:INFO:root:Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\"]\n", - "22-Aug 20:46:11:DEBUG:root:Found NODE section\n", - "22-Aug 20:46:11:DEBUG:root:Found ELEMENT section\n", - "22-Aug 20:46:11:DEBUG:root:120 elements found\n", - "22-Aug 20:46:12:INFO:root:Creating ELSET Body1\n", - "22-Aug 20:46:12:DEBUG:root:Found NSET section\n", - "22-Aug 20:46:12:DEBUG:root:Creating node set SUPPORT\n", - "22-Aug 20:46:12:DEBUG:root:Found NSET section\n", - "22-Aug 20:46:12:DEBUG:root:Creating node set LOAD\n", - "22-Aug 20:46:12:DEBUG:root:Found NSET section\n", - "22-Aug 20:46:12:DEBUG:root:Creating node set TOP\n" + "24-Aug 01:07:34:INFO:root:Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\"]\n", + "24-Aug 01:07:34:DEBUG:root:Found NODE section\n", + "24-Aug 01:07:35:DEBUG:root:Found ELEMENT section\n", + "24-Aug 01:07:35:DEBUG:root:120 elements found\n", + "24-Aug 01:07:35:INFO:root:Creating ELSET Body1\n", + "24-Aug 01:07:35:DEBUG:root:Found NSET section\n", + "24-Aug 01:07:35:DEBUG:root:Creating node set SUPPORT\n", + "24-Aug 01:07:35:DEBUG:root:Found NSET section\n", + "24-Aug 01:07:35:DEBUG:root:Creating node set LOAD\n", + "24-Aug 01:07:35:DEBUG:root:Found NSET section\n", + "24-Aug 01:07:35:DEBUG:root:Creating node set TOP\n" ] }, { @@ -1103,7 +1197,7 @@ " \"nsets\" => Dict{Any,Any}(\"LOAD\"=>[82,84,87,179,197,246,249,256,257],\"SUPPORT\"=>[108,109,111,155,162,216,225,281,298],\"TOP\"=>[70,75,76,84,88,90,95,96,98,10…" ] }, - "execution_count": 19, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -1123,13 +1217,15 @@ }, "outputs": [], "source": [ + "abstract Tet10 <: CG\n", + "\n", "\"\"\"\n", "Stress/displacement elements. 10-node quadratic tetrahedron.\n", "\"\"\"\n", - "type C3D10 <: ContinuumElement\n", + "type C3D10 <: Tet10\n", " id :: Int\n", " node_ids :: Array{Int, 1}\n", - " shape_functions :: FunctionSpace\n", + " coordinates :: Array{Float64, 2}\n", " integration_points :: Array{IntegrationPoint, 1}\n", " attributes :: Dict{ASCIIString, Any}\n", "end" @@ -1266,7 +1362,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 40, "metadata": { "collapsed": false, "scrolled": false @@ -1276,72 +1372,82 @@ "name": "stderr", "output_type": "stream", "text": [ - "22-Aug 20:46:13:DEBUG:root:Creating elements\n", - "22-Aug 20:46:13:DEBUG:root:Creating elements\n", - "22-Aug 20:46:13:INFO:root:solve!: dofs per node: 3\n", - "22-Aug 20:46:13:DEBUG:root:Problem size = 894\n", - "22-Aug 20:46:13:DEBUG:root:Starting iteration 1\n", - "22-Aug 20:46:13:DEBUG:root:Assembling\n", - "22-Aug 20:46:26:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "22-Aug 20:46:26:DEBUG:root:Added 27 Lagrange multipliers to model\n", - "22-Aug 20:46:26:DEBUG:root:Solving system of equations. Total size = 921\n", - "22-Aug 20:46:26:DEBUG:root:Solution norm du = 550.6462282437674\n", - "22-Aug 20:46:26:DEBUG:root:Starting iteration 2\n", - "22-Aug 20:46:26:DEBUG:root:Assembling\n", - "22-Aug 20:46:39:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "22-Aug 20:46:39:DEBUG:root:Added 27 Lagrange multipliers to model\n", - "22-Aug 20:46:39:DEBUG:root:Solving system of equations. Total size = 921\n", - "22-Aug 20:46:39:DEBUG:root:Solution norm du = 126.14054730775176\n", - "22-Aug 20:46:39:DEBUG:root:Starting iteration 3\n", - "22-Aug 20:46:39:DEBUG:root:Assembling\n", - "22-Aug 20:46:53:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "22-Aug 20:46:53:DEBUG:root:Added 27 Lagrange multipliers to model\n", - "22-Aug 20:46:53:DEBUG:root:Solving system of equations. Total size = 921\n", - "22-Aug 20:46:53:DEBUG:root:Solution norm du = 38.949840553368894\n", - "22-Aug 20:46:53:DEBUG:root:Starting iteration 4\n", - "22-Aug 20:46:54:DEBUG:root:Assembling\n", - "22-Aug 20:47:06:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "22-Aug 20:47:06:DEBUG:root:Added 27 Lagrange multipliers to model\n", - "22-Aug 20:47:06:DEBUG:root:Solving system of equations. Total size = 921\n", - "22-Aug 20:47:06:DEBUG:root:Solution norm du = 15.167069063650652\n", - "22-Aug 20:47:06:DEBUG:root:Starting iteration 5\n", - "22-Aug 20:47:06:DEBUG:root:Assembling\n", - "22-Aug 20:47:18:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "22-Aug 20:47:18:DEBUG:root:Added 27 Lagrange multipliers to model\n", - "22-Aug 20:47:18:DEBUG:root:Solving system of equations. Total size = 921\n", - "22-Aug 20:47:18:DEBUG:root:Solution norm du = 9.516311534304958\n", - "22-Aug 20:47:18:DEBUG:root:Starting iteration 6\n", - "22-Aug 20:47:18:DEBUG:root:Assembling\n", - "22-Aug 20:47:31:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "22-Aug 20:47:31:DEBUG:root:Added 27 Lagrange multipliers to model\n", - "22-Aug 20:47:31:DEBUG:root:Solving system of equations. Total size = 921\n", - "22-Aug 20:47:31:DEBUG:root:Solution norm du = 1.6222822043785954\n", - "22-Aug 20:47:31:DEBUG:root:Starting iteration 7\n", - "22-Aug 20:47:31:DEBUG:root:Assembling\n", - "22-Aug 20:47:43:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "22-Aug 20:47:43:DEBUG:root:Added 27 Lagrange multipliers to model\n", - "22-Aug 20:47:43:DEBUG:root:Solving system of equations. Total size = 921\n", - "22-Aug 20:47:43:DEBUG:root:Solution norm du = 0.09626397754176579\n", - "22-Aug 20:47:43:DEBUG:root:Starting iteration 8\n", - "22-Aug 20:47:43:DEBUG:root:Assembling\n", - "22-Aug 20:47:56:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "22-Aug 20:47:56:DEBUG:root:Added 27 Lagrange multipliers to model\n", - "22-Aug 20:47:56:DEBUG:root:Solving system of equations. Total size = 921\n", - "22-Aug 20:47:56:DEBUG:root:Solution norm du = 0.00026304537198068307\n", - "22-Aug 20:47:56:DEBUG:root:Starting iteration 9\n", - "22-Aug 20:47:56:DEBUG:root:Assembling\n", - "22-Aug 20:48:09:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "22-Aug 20:48:09:DEBUG:root:Added 27 Lagrange multipliers to model\n", - "22-Aug 20:48:09:DEBUG:root:Solving system of equations. Total size = 921\n", - "22-Aug 20:48:09:DEBUG:root:Solution norm du = 2.7245126807720425e-9\n", - "22-Aug 20:48:09:DEBUG:root:Starting iteration 10\n", - "22-Aug 20:48:09:DEBUG:root:Assembling\n", - "22-Aug 20:48:22:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", - "22-Aug 20:48:22:DEBUG:root:Added 27 Lagrange multipliers to model\n", - "22-Aug 20:48:22:DEBUG:root:Solving system of equations. Total size = 921\n", - "22-Aug 20:48:22:DEBUG:root:Solution norm du = 1.0919112177573261e-13\n", - "22-Aug 20:48:22:DEBUG:root:Converged in 10 iterations.\n", - "22-Aug 20:48:22:INFO:root:Maximum absolute displacement in y direction: 49.40459927455298\n" + "22-Aug 21:35:10:DEBUG:root:Creating elements\n", + "22-Aug 21:35:10:DEBUG:root:Creating elements\n", + "22-Aug 21:35:10:INFO:root:solve!: dofs per node: 3\n", + "22-Aug 21:35:10:DEBUG:root:Problem size = 894\n", + "22-Aug 21:35:10:DEBUG:root:Starting iteration 1\n", + "22-Aug 21:35:10:DEBUG:root:Assembling lhs\n", + "22-Aug 21:35:23:DEBUG:root:Assembling rhs\n", + "22-Aug 21:35:23:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 21:35:23:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 21:35:23:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 21:35:23:DEBUG:root:Solution norm du = 550.6462282437674\n", + "22-Aug 21:35:23:DEBUG:root:Starting iteration 2\n", + "22-Aug 21:35:23:DEBUG:root:Assembling lhs\n", + "22-Aug 21:35:36:DEBUG:root:Assembling rhs\n", + "22-Aug 21:35:36:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 21:35:36:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 21:35:36:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 21:35:36:DEBUG:root:Solution norm du = 126.14054730775176\n", + "22-Aug 21:35:36:DEBUG:root:Starting iteration 3\n", + "22-Aug 21:35:36:DEBUG:root:Assembling lhs\n", + "22-Aug 21:35:49:DEBUG:root:Assembling rhs\n", + "22-Aug 21:35:49:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 21:35:49:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 21:35:49:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 21:35:49:DEBUG:root:Solution norm du = 38.949840553368894\n", + "22-Aug 21:35:49:DEBUG:root:Starting iteration 4\n", + "22-Aug 21:35:49:DEBUG:root:Assembling lhs\n", + "22-Aug 21:36:03:DEBUG:root:Assembling rhs\n", + "22-Aug 21:36:04:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 21:36:04:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 21:36:04:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 21:36:04:DEBUG:root:Solution norm du = 15.167069063650652\n", + "22-Aug 21:36:04:DEBUG:root:Starting iteration 5\n", + "22-Aug 21:36:04:DEBUG:root:Assembling lhs\n", + "22-Aug 21:36:17:DEBUG:root:Assembling rhs\n", + "22-Aug 21:36:17:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 21:36:17:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 21:36:17:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 21:36:17:DEBUG:root:Solution norm du = 9.516311534304958\n", + "22-Aug 21:36:17:DEBUG:root:Starting iteration 6\n", + "22-Aug 21:36:17:DEBUG:root:Assembling lhs\n", + "22-Aug 21:36:32:DEBUG:root:Assembling rhs\n", + "22-Aug 21:36:32:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 21:36:32:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 21:36:32:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 21:36:32:DEBUG:root:Solution norm du = 1.6222822043785954\n", + "22-Aug 21:36:32:DEBUG:root:Starting iteration 7\n", + "22-Aug 21:36:32:DEBUG:root:Assembling lhs\n", + "22-Aug 21:36:46:DEBUG:root:Assembling rhs\n", + "22-Aug 21:36:48:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 21:36:48:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 21:36:48:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 21:36:48:DEBUG:root:Solution norm du = 0.09626397754176579\n", + "22-Aug 21:36:48:DEBUG:root:Starting iteration 8\n", + "22-Aug 21:36:48:DEBUG:root:Assembling lhs\n", + "22-Aug 21:37:07:DEBUG:root:Assembling rhs\n", + "22-Aug 21:37:07:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 21:37:07:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 21:37:07:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 21:37:07:DEBUG:root:Solution norm du = 0.00026304537198068307\n", + "22-Aug 21:37:07:DEBUG:root:Starting iteration 9\n", + "22-Aug 21:37:07:DEBUG:root:Assembling lhs\n", + "22-Aug 21:37:22:DEBUG:root:Assembling rhs\n", + "22-Aug 21:37:22:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 21:37:22:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 21:37:22:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 21:37:22:DEBUG:root:Solution norm du = 2.7245126807720425e-9\n", + "22-Aug 21:37:22:DEBUG:root:Starting iteration 10\n", + "22-Aug 21:37:22:DEBUG:root:Assembling lhs\n", + "22-Aug 21:37:35:DEBUG:root:Assembling rhs\n", + "22-Aug 21:37:35:DEBUG:root:Adding Dirichlet boundary conditions using Lagrange multipliers\n", + "22-Aug 21:37:35:DEBUG:root:Added 27 Lagrange multipliers to model\n", + "22-Aug 21:37:35:DEBUG:root:Solving system of equations. Total size = 921\n", + "22-Aug 21:37:35:DEBUG:root:Solution norm du = 1.0919112177573261e-13\n", + "22-Aug 21:37:35:DEBUG:root:Converged in 10 iterations.\n", + "22-Aug 21:37:35:INFO:root:Maximum absolute displacement in y direction: 49.40459927455298\n" ] } ], @@ -1914,15 +2020,6 @@ "source": [ "d.Image(\"/tmp/piston.png\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/src/JuliaFEM.jl b/src/JuliaFEM.jl index 016f0ce..4e12f3a 100644 --- a/src/JuliaFEM.jl +++ b/src/JuliaFEM.jl @@ -7,7 +7,10 @@ using Lexicon using Logging @Logging.configure(level=DEBUG) +Logging.info("loading types") include("types.jl") # type definitions +Logging.info("loading elements") +include("elements.jl") # elements include("math.jl") # basic mathematical operations include("elasticity_solver.jl") @@ -15,4 +18,6 @@ include("xdmf.jl") include("abaqus_reader.jl") include("interfaces.jl") +export set_coordinates, get_coordinates, set_material + end # module diff --git a/src/elements.jl b/src/elements.jl new file mode 100644 index 0000000..2eaef9c --- /dev/null +++ b/src/elements.jl @@ -0,0 +1,92 @@ +# This file is a part of JuliaFEM. +# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md + +abstract CG <: Element # Lagrange element family +abstract Quad4 <: CG # 4 node quadrangle elements + + +""" +Evaluate basis functions in point xi. +""" +function get_basis(el::Quad4) + (xi) -> [(1-xi[1])*(1-xi[2])/4 + (1+xi[1])*(1-xi[2])/4 + (1+xi[1])*(1+xi[2])/4 + (1-xi[1])*(1+xi[2])/4] +end +function get_basis(el::Quad4, xi) + get_basis(el)(xi) +end + +""" +Evaluate partial derivatives of basis function w.r.t +dimensionless coordinate xi, i.e. dbasis/dxi +""" +function get_dbasisdxi(el::Quad4) + (xi) -> [-(1-xi[2])/4.0 -(1-xi[1])/4.0 + (1-xi[2])/4.0 -(1+xi[1])/4.0 + (1+xi[2])/4.0 (1+xi[1])/4.0 + -(1+xi[2])/4.0 (1-xi[1])/4.0] +end +function get_dbasisdxi(el::Quad4, xi) + get_dbasisdxi(el)(xi) +end + + + +""" +Get jacobian of element evaluated at point xi +""" +function get_jacobian(el::Element, xi) + dbasisdxi = get_dbasisdxi(el) + X = get_coordinates(el) + J = interpolate(X, dbasisdxi, xi)' + return J +end + +""" +Evaluate partial derivatives of basis function w.r.t +material description X, i.e. dbasis/dX +""" +function get_dbasisdX(el::CG) + function get_dbasisdX_(xi) + dbasisdxi = get_dbasisdxi(el, xi) + J = get_jacobian(el, xi) + dbasisdxi*inv(J) + end +end +function get_dbasisdX(el::CG, xi) + get_dbasisdX(el)(xi) +end + +""" +Return coordinates of element in array of size dim x nnodes +""" +function get_coordinates(el::Element) + # Make sure you define at least this field to your element if you want + # to build everything yourself + el.coordinates +end + +function set_coordinates(el::Element, coordinates) + el.coordinates = coordinates +end + +function set_material(el::Element, lambda, mu) + el.attributes["lambda"] = lambda + el.attributes["mu"] = mu +end + +""" +Get element id +""" +function get_element_id(el::Element) + el.id +end + +function get_integration_points(el::Element) + el.integration_points +end + + + diff --git a/src/math.jl b/src/math.jl index 0a962af..ba0ad99 100644 --- a/src/math.jl +++ b/src/math.jl @@ -60,26 +60,11 @@ function interpolate{T<:Real}(field::Array{T,2}, basis::Function, ip) return result end function interpolate(e::Element, field::ASCIIString, x::Array{Float64,1}; derivative=false) - return interpolate(e.attributes[field], derivative ? e.shape_functions.dbasis : e.shape_functions.basis, x) + basis = derivative ? get_dbasisdxi(e) : get_basis(e) + return interpolate(e.attributes[field], basis, x) end -""" - -""" -function get_basis(el::Element, xi) - return el.shape_functions.basis(xi) -end - -""" -Return partial derivatives of shape functions w.r.t X using chain rule. -""" -function get_dbasisdX(el::Element, xi) - J = interpolate(el, "coordinates", xi; derivative=true) - dbasisdX = el.shape_functions.dbasis(xi)*inv(J') - return dbasisdX -end - """ Linearize function f w.r.t some given field, i.e. calculate dR/du From aec8396c292b12e80ceadc58d644c479b14094b1 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Tue, 25 Aug 2015 00:21:05 +0300 Subject: [PATCH 25/26] Update elements --- src/elements.jl | 245 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 194 insertions(+), 51 deletions(-) diff --git a/src/elements.jl b/src/elements.jl index 2eaef9c..9f3f2de 100644 --- a/src/elements.jl +++ b/src/elements.jl @@ -1,44 +1,13 @@ # This file is a part of JuliaFEM. # License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md -abstract CG <: Element # Lagrange element family -abstract Quad4 <: CG # 4 node quadrangle elements - - -""" -Evaluate basis functions in point xi. -""" -function get_basis(el::Quad4) - (xi) -> [(1-xi[1])*(1-xi[2])/4 - (1+xi[1])*(1-xi[2])/4 - (1+xi[1])*(1+xi[2])/4 - (1-xi[1])*(1+xi[2])/4] -end -function get_basis(el::Quad4, xi) - get_basis(el)(xi) -end - -""" -Evaluate partial derivatives of basis function w.r.t -dimensionless coordinate xi, i.e. dbasis/dxi -""" -function get_dbasisdxi(el::Quad4) - (xi) -> [-(1-xi[2])/4.0 -(1-xi[1])/4.0 - (1-xi[2])/4.0 -(1+xi[1])/4.0 - (1+xi[2])/4.0 (1+xi[1])/4.0 - -(1+xi[2])/4.0 (1-xi[1])/4.0] -end -function get_dbasisdxi(el::Quad4, xi) - get_dbasisdxi(el)(xi) -end - - +abstract Element """ Get jacobian of element evaluated at point xi """ function get_jacobian(el::Element, xi) - dbasisdxi = get_dbasisdxi(el) + dbasisdxi(xi) = get_dbasisdxi(el, xi) X = get_coordinates(el) J = interpolate(X, dbasisdxi, xi)' return J @@ -48,35 +17,26 @@ end Evaluate partial derivatives of basis function w.r.t material description X, i.e. dbasis/dX """ -function get_dbasisdX(el::CG) - function get_dbasisdX_(xi) - dbasisdxi = get_dbasisdxi(el, xi) - J = get_jacobian(el, xi) - dbasisdxi*inv(J) - end -end -function get_dbasisdX(el::CG, xi) - get_dbasisdX(el)(xi) +function get_dbasisdX(el::Element, xi) + dbasisdxi = get_dbasisdxi(el, xi) + J = get_jacobian(el, xi) + dbasisdxi*inv(J) end """ Return coordinates of element in array of size dim x nnodes """ function get_coordinates(el::Element) - # Make sure you define at least this field to your element if you want - # to build everything yourself el.coordinates end +""" +Set coordinates for element +""" function set_coordinates(el::Element, coordinates) el.coordinates = coordinates end -function set_material(el::Element, lambda, mu) - el.attributes["lambda"] = lambda - el.attributes["mu"] = mu -end - """ Get element id """ @@ -84,9 +44,192 @@ function get_element_id(el::Element) el.id end -function get_integration_points(el::Element) - el.integration_points + + +### Lagrange family ### + +abstract CG <: Element # Lagrange element family + +""" +Create new Lagrange element + +FIXME: this is not working + +LoadError: error compiling anonymous: type definition not allowed inside a local scope + +It's the for loop which is causing problems. See +https://github.com/JuliaLang/julia/issues/10555 + +""" +function create_lagrange_element(element_name, X, P, dP) + + @eval begin + + nnodes, dim = size(X) + A = zeros(nnodes, nnodes) + for i=1:nnodes + A[i,:] = P(X[i,:]) + end + invA = inv(A)' + + type $element_name + element_id :: Int + node_ids :: Array{Int, 1} + coordinates :: Array{Float64, 2} + fields :: Dict{ASCIIString, Any} + end + + function $element_name(element_id, node_ids) + coordinates = zeros(dim, nnodes) + fields = Dict{ASCIIString, Any}() + $element_name(element_id, node_ids, coordinates, fields) + end + + function $element_name(element_id, node_ids, coordinates) + fields = Dict{ASCIIString, Any}() + $element_name(element_id, node_ids, coordinates, fields) + end + + function get_basis(el::$element_name, xi) + invA*P(xi) + end + + function get_dbasisdxi(el::$element_name, xi) + invA*dP(xi) + end + + $element_name + + end + end +# 0d Lagrange elements +""" +1 node point element +""" +type Point1 <: CG + element_id :: Int + node_ids :: Array{Int, 1} + coordinates :: Array{Float64, 2} + fields :: Dict{ASCIIString, Any} +end +# 1d Lagrange elements + +""" +2 node linear line element +""" +type Seg2 <: CG + element_id :: Int + node_ids :: Array{Int, 1} + coordinates :: Array{Float64, 2} + fields :: Dict{ASCIIString, Any} +end + +# X = [-1.0 1.0]' +# P = (xi) -> [1.0 xi[1]]' +# dP = (xi) -> [0.0 1.0]' +# create_lagrange_element(:Seg2, X, P, dP) + +""" +3 node quadratic line element +""" +type Seg2 <: CG + element_id :: Int + node_ids :: Array{Int, 1} + coordinates :: Array{Float64, 2} + fields :: Dict{ASCIIString, Any} +end +#X = [-1.0 1.0 0.0]' +#P = (xi) -> [1.0 xi[1] xi[1]^2]' +#dP = (xi) -> [0.0 1.0 2*xi[1]]' +#create_lagrange_element(:Seg3, X, P, dP) + +# 2d Lagrange elements + +""" +4 node bilinear quadrangle element +""" +type Quad4 <: CG + element_id :: Int + node_ids :: Array{Int, 1} + coordinates :: Array{Float64, 2} + fields :: Dict{ASCIIString, Any} +end +function get_basis(el::Quad4, xi) + [(1-xi[1])*(1-xi[2])/4 + (1+xi[1])*(1-xi[2])/4 + (1+xi[1])*(1+xi[2])/4 + (1-xi[1])*(1+xi[2])/4] +end +function get_dbasisdxi(el::Quad4, xi) + [-(1-xi[2])/4.0 -(1-xi[1])/4.0 + (1-xi[2])/4.0 -(1+xi[1])/4.0 + (1+xi[2])/4.0 (1+xi[1])/4.0 + -(1+xi[2])/4.0 (1-xi[1])/4.0] +end +#X = [ +# -1.0 -1.0 +# 1.0 -1.0 +# 1.0 1.0 +# -1.0 1.0] +#P = (xi) -> [ +# 1.0 +# xi[1] +# xi[2] +# xi[1]*xi[2]] +#dP = (xi) -> [ +# 0.0 0.0 +# 1.0 0.0 +# 0.0 1.0 +# xi[2] xi[1]] +#create_lagrange_element(:Quad4, X, P, dP) + +# 3d Lagrange elements + +""" +10 node quadratic tethahedron +""" +type Tet10 <: CG + element_id :: Int + node_ids :: Array{Int, 1} + coordinates :: Array{Float64, 2} + fields :: Dict{ASCIIString, Any} +end +# X = [ +# 0.0 0.0 0.0 +# 1.0 0.0 0.0 +# 0.0 1.0 0.0 +# 0.0 0.0 1.0 +# 0.5 0.0 0.0 +# 0.5 0.5 0.0 +# 0.0 0.5 0.0 +# 0.0 0.0 0.5 +# 0.5 0.0 0.5 +# 0.0 0.5 0.5] +# P(xi) = [ +# 1 +# xi[1] +# xi[2] +# xi[3] +# xi[1]^2 +# xi[2]^2 +# xi[3]^2 +# xi[1]*xi[2] +# xi[2]*xi[3] +# xi[3]*xi[1]] +# dP(xi) = [ +# 0 0 0 +# 1 0 0 +# 0 1 0 +# 0 0 1 +# 2*xi[1] 0 0 +# 0 2*xi[2] 0 +# 0 0 2*xi[3] +# xi[2] xi[1] 0 +# 0 xi[3] xi[2] +# xi[3] 0 xi[1] +# ] +#create_lagrange_element(:Tet10, X, P, dP) From 9e7280c53b232fc3bf6cafdf2d04f7da86e5b9d4 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Tue, 25 Aug 2015 19:00:54 +0300 Subject: [PATCH 26/26] Interpolation of field variables. --- ...-25-interpolation-of-field-variables.ipynb | 362 ++++++++++++++++++ 1 file changed, 362 insertions(+) create mode 100644 notebooks/2015-08-25-interpolation-of-field-variables.ipynb diff --git a/notebooks/2015-08-25-interpolation-of-field-variables.ipynb b/notebooks/2015-08-25-interpolation-of-field-variables.ipynb new file mode 100644 index 0000000..61be7cd --- /dev/null +++ b/notebooks/2015-08-25-interpolation-of-field-variables.ipynb @@ -0,0 +1,362 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Interpolation of field variables\n", + "\n", + "Author(s): Jukka Aho\n", + "\n", + "Abstract: Let's interpolate and visualize a scalar field from 4 element model." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "using JuliaFEM: Element, Quad4, get_basis, set_field, get_field, get_dbasisdxi" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "coordinates = [0.0 2.0; 1.0 2.0; 2.0 2.0; 0.0 1.0; 1.0 1.0; 2.0 1.0; 0.0 0.0; 1.0 0.0; 2.0 0.0]'\n", + "temperature = [0.0 140.0 190.0 0.0 155.0 310.0 0.0 170.0 430.0]\n", + "\n", + "elements = Element[\n", + " Quad4([4, 5, 2, 1]),\n", + " Quad4([5, 6, 3, 2]),\n", + " Quad4([7, 8, 5, 4]),\n", + " Quad4([8, 9, 6, 5])]\n", + "\n", + "for el in elements\n", + " set_field(el, \"coordinates\", coordinates[:, el.node_ids])\n", + " set_field(el, \"temperature\", temperature[:, el.node_ids])\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Basic interpolation wrt local coordinates $\\xi$:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "([430.0],[0.5,1.5])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "Evaluate field in point xi using basis functions.\n", + "\"\"\"\n", + "function interpolate(el::Element, field::ASCIIString, xi::Array{Float64,1})\n", + " f = get_field(el, field)\n", + " basis = get_basis(el, xi)\n", + " dim, nnodes = size(f)\n", + " result = zeros(dim)\n", + " for i=1:nnodes\n", + " result += basis[i]*f[:,i]\n", + " end\n", + " return result\n", + "end\n", + "\n", + "interpolate(elements[4], \"temperature\", [1.0, -1.0]), interpolate(elements[1], \"coordinates\", [0.0, 0.0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Find local coordinate $\\xi$ where field equals to some given value:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1.0,-1.0]\n" + ] + }, + { + "data": { + "text/plain": [ + "2-element Array{Float64,1}:\n", + " 1.0\n", + " 1.0" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function get_xi(el::Element, field::ASCIIString, value::Vector)\n", + " fld = get_field(el, field)\n", + " dbasisdxi(xi) = get_dbasisdxi(el, xi)\n", + " rhs(xi) = interpolate(el, field, xi) - value\n", + " lhs(xi) = fld*dbasisdxi(xi)\n", + " xi = zeros(length(value))\n", + " for i=1:5\n", + " A = rhs(xi)\n", + " b = lhs(xi)\n", + " #println(\"$A, $b\")\n", + " dxi = lhs(xi) \\ rhs(xi)\n", + " xi -= dxi\n", + " if norm(dxi) < 1.0e-9\n", + " break\n", + " end\n", + " end\n", + " return xi[:]\n", + "end\n", + "\n", + "xi0 = get_xi(elements[4], \"coordinates\", [2.0, 0.0])\n", + "println(\"$xi0\")\n", + "interpolate(elements[1], \"coordinates\", xi0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test if point is inside element:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "point_inside_element (generic function with 1 method)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function point_inside_element(el::Quad4, pnt)\n", + " all(-1 .<= get_xi(el, \"coordinates\", pnt) .<= 1)\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(false,true)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "point_inside_element(elements[1], [0.8, 2.01]), point_inside_element(elements[4], [2.0, 0.0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Interpolate field variable from set of elements" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "interpolate (generic function with 3 methods)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "function interpolate(elements::Array{Element,1}, field::ASCIIString, pnt::Array{Float64,1}, nullval=0.0)\n", + " elements = filter((el) -> point_inside_element(el, pnt), elements)\n", + " if length(elements) == 0\n", + " # outside of region\n", + " return nullval\n", + " end\n", + " xi = get_xi(elements[1], \"coordinates\", pnt)\n", + " return interpolate(elements[1], field, xi)\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1-element Array{Float64,1}:\n", + " 430.0" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "interpolate(elements, \"temperature\", [2.0, 0.0])" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "y = linspace(0,2,100)\n", + "x = y'\n", + "T = zeros(length(x), length(y))\n", + "for i=1:length(x)\n", + " for j=1:length(y)\n", + " T[i,j] = interpolate(elements, \"temperature\", [x[i], y[j]])[1]\n", + " end\n", + "end\n", + "T = T';" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "using PyPlot" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "PyPlot.Figure(PyObject )" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "(-0.1,2.1,-0.1,2.1)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "figure(figsize=(6, 6))\n", + "levels = [10, 50, 100, 140, 155, 170, 190, 250, 310, 350]\n", + "cs = contour(x, y, T, levels, colors=\"k\")\n", + "clabel(cs, fontsize=9, inline=1)\n", + "for el in elements\n", + " p1 = interpolate(el, \"coordinates\", [-1.0, -1.0])\n", + " p2 = interpolate(el, \"coordinates\", [ 1.0, -1.0])\n", + " p3 = interpolate(el, \"coordinates\", [ 1.0, 1.0])\n", + " p4 = interpolate(el, \"coordinates\", [-1.0, 1.0])\n", + " pts = [p1 p2 p3 p4 p1]\n", + " plot(pts[1,:]', pts[2,:]', \"-ko\")\n", + "end\n", + "xlim(-0.1, 2.1)\n", + "ylim(-0.1, 2.1)\n", + "axis(\"off\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 0.4.0-dev", + "language": "julia", + "name": "julia-0.4" + }, + "language_info": { + "name": "julia", + "version": "0.4.0" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}