From a456187b0477fd7852cdce44a7d6fbe7df43a0d1 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Wed, 19 Aug 2015 22:51:44 +0300 Subject: [PATCH] 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")