diff --git a/notebooks/2015-06-25-elasticity-solver-example.ipynb b/notebooks/2015-06-25-elasticity-solver-example.ipynb index 04ef7d5..3099190 100644 --- a/notebooks/2015-06-25-elasticity-solver-example.ipynb +++ b/notebooks/2015-06-25-elasticity-solver-example.ipynb @@ -59,11 +59,14 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": false + "collapsed": true }, "outputs": [], "source": [ - "using JuliaFEM" + "using JuliaFEM.API: Model, Material, add_material!, LoadCase, add_element_set!, ForceBC, DisplacementBC\n", + "using JuliaFEM.API: add_boundary_condition!, add_load_case!, add_solver!\n", + "using JuliaFEM.Interfaces: solve!\n", + "using JuliaFEM.Preprocess: parse_abaqus" ] }, { @@ -72,57 +75,16 @@ "metadata": { "collapsed": false }, - "outputs": [], - "source": [ - "addprocs(7)'\n", - "@everywhere using JuliaFEM" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "using JuliaFEM.Core: Element, Tri3, Tet4, Tri6, Tet10\n", - "using JuliaFEM.Core: ElasticityProblem, DirichletProblem\n", - "using JuliaFEM.Core: DirectSolver" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "INFO: Registered handlers: Any[\"ELEMENT\",\"NODE\",\"NSET\",\"ELSET\"]\n", - "INFO: Parsing elements\n", - "INFO: 62454 elements found\n", - "INFO: Creating ELSET PISTON\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " " - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Parsing elements\n", - "INFO: 3494 elements found\n", - "INFO: Creating element set BC1\n", - "INFO: Creating element set BC2\n", + "INFO: Parsing nodes\n", + "INFO: Parsing elements. Type: Tet10\n", + "INFO: Parsing elements. Type: Tri6\n", + "INFO: Creating elset BC1\n", + "INFO: Creating elset BC2\n", "INFO: model loaded.\n" ] }, @@ -130,7 +92,7 @@ "name": "stdout", "output_type": "stream", "text": [ - " 2.269207 seconds (14.52 M allocations: 433.635 MB, 13.38% gc time)\n" + " 4.209444 seconds (19.12 M allocations: 565.872 MB, 11.55% gc time)\n" ] } ], @@ -147,13 +109,74 @@ " # Quadratic models\n", " #model = open(JuliaFEM.Core.parse_abaqus, \"../geometry/piston/piston_19611_P2.inp\")\n", " #model = open(JuliaFEM.Core.parse_abaqus, \"../geometry/piston/piston_55950_P2.inp\")\n", - " model = open(JuliaFEM.Core.parse_abaqus, \"/Temp/piston_107168_P2.inp\")\n", + " #model = open(JuliaFEM.Core.parse_abaqus, \"/Temp/piston_107168_P2.inp\")\n", " #model = open(JuliaFEM.Core.parse_abaqus, \"../geometry/piston/piston_345757_P2.inp\")\n", "\n", + " mesh = open(parse_abaqus, \"/Temp/piston_107168_P2.inp\")\n", + " model = Model(\"piston model\", mesh)\n", " info(\"model loaded.\")\n", "end" ] }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "JuliaFEM.API.Material(\"steel\",Dict(\"poissons ratio\"=>0.3,\"youngs modulus\"=>210000.0))" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mat = Material(\"steel\")\n", + "mat[\"youngs modulus\"] = 210.0e3\n", + "mat[\"poissons ratio\"] = 0.3\n", + "add_material!(model, \"PISTON\", mat)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1-element Array{ASCIIString,1}:\n", + " \"PISTON\"" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simulation = LoadCase(:ElasticityProblem)\n", + "\n", + "# simulation = Simulation(:ElasticityProblem, \"elasticity equations\")\n", + "# add_element_set!(simulation, \"PISTON\")\n", + "# add_boundary_condition!(simulation, bc1, bc2)\n", + "# add_simulation!(model, simulation)\n", + "# add_solver!(simulation, :DirectSolver)\n", + "# solve!(model, \"elasticity equations\", 0.0)\n", + "# solve!(model, \"heat equations\", 0.0)\n", + "# solve!(model, \"solve equations 3\", 0.0)\n", + "\n", + "add_element_set!(simulation, \"PISTON\")" + ] + }, { "cell_type": "code", "execution_count": 5, @@ -162,75 +185,124 @@ }, "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: 65948 elements created.\n", - "INFO: all ready for solver\n" - ] + "data": { + "text/plain": [ + "1-element Array{JuliaFEM.API.DirichletBC,1}:\n", + " JuliaFEM.API.DirichletBC(\"BC2\",\"displacement\"=>0.0)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "perm = Dict{Int64, Int64}()\n", - "for (i, nid) in enumerate(keys(model[\"nodes\"]))\n", - " perm[nid] = i\n", - "end\n", - "\n", - "elements = Dict{Int64, Element}()\n", - "for (elid, node_ids) in model[\"elements\"]\n", - " connectivity = Int64[perm[nid] for nid in node_ids]\n", - " coords = Vector{Float64}[model[\"nodes\"][nid] for nid in node_ids]\n", - " elmap = Dict(3 => Tri3, 4 => Tet4, 6 => Tri6, 10 => Tet10)\n", - " for (dim, eltype) in elmap\n", - " if length(coords) == dim\n", - " element = eltype(connectivity)\n", - " element[\"geometry\"] = coords\n", - " element[\"id\"] = elid\n", - " elements[elid] = element\n", - " end\n", - " end\n", - "end\n", - "\n", - "info(\"$(length(elements)) elements created.\")\n", - "\n", - "problem = ElasticityProblem()\n", - "#for elid in model[\"elsets\"][\"WRENCH\"]\n", - "for elid in model[\"elsets\"][\"PISTON\"]\n", - " elements[elid][\"youngs modulus\"] = 210.0e3\n", - " elements[elid][\"poissons ratio\"] = 0.3\n", - " push!(problem, elements[elid])\n", - "end\n", - "\n", "traction = Vector{Float64}[[0.0, 0.0, -10.0] for i in 1:6]\n", - "#traction = Vector{Float64}[[100.0, 100.0, 100.0] for i in 1:3]\n", - "#traction = Vector{Float64}[[0.0, -100.0, 20.0] for i in 1:3]\n", - "for elid in model[\"elsets\"][\"BC1\"]\n", - " elements[elid][\"displacement traction force\"] = traction\n", - " push!(problem, elements[elid])\n", - "end\n", + "bc1 = ForceBC(\"BC1\", \"displacement traction force\" => traction)\n", + "bc2 = DisplacementBC(\"BC2\", \"displacement\" => 0.0)\n", "\n", - "bc = DirichletProblem(\"displacement\", 3)\n", - "for elid in model[\"elsets\"][\"BC2\"]\n", - " elements[elid][\"displacement\"] = 0.0\n", - " push!(bc, elements[elid])\n", - "end\n", - "\n", - "solver = DirectSolver()\n", - "push!(solver, problem)\n", - "push!(solver, bc)\n", - "info(\"all ready for solver\")" + "# JuliaFEM.API.add_boundary_condition!(prob, bc1, bc2)\n", + "add_boundary_condition!(simulation, bc1)\n", + "add_boundary_condition!(simulation, bc2)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": true + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "JuliaFEM.API.LoadCase(:ElasticityProblem,[JuliaFEM.API.NeumannBC(\"BC1\",\"displacement traction force\"=>[[0.0,0.0,-10.0],[0.0,0.0,-10.0],[0.0,0.0,-10.0],[0.0,0.0,-10.0],[0.0,0.0,-10.0],[0.0,0.0,-10.0]])],[JuliaFEM.API.DirichletBC(\"BC2\",\"displacement\"=>0.0)],:DirectSolver,ASCIIString[\"PISTON\"])" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add_solver!(simulation, :DirectSolver)\n", + "add_load_case!(model, \"elasticity equations\", simulation)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false }, "outputs": [], "source": [ - "empty!(model)\n", - "gc()" + "solver = JuliaFEM.Interfaces.get_solver(model, \"elasticity equations\", 0.0);" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "JuliaFEM.Core.Element{JuliaFEM.Core.Tet10}([1,2,3,4,5,6,7,8,9,10],Dict{ASCIIString,JuliaFEM.Core.Field{A<:Union{JuliaFEM.Core.Continuous,JuliaFEM.Core.Discrete},B<:Union{JuliaFEM.Core.Constant,JuliaFEM.Core.Variable},C<:Union{JuliaFEM.Core.TimeInvariant,JuliaFEM.Core.TimeVariant}}}(\"poissons ratio\"=>JuliaFEM.Core.Field{JuliaFEM.Core.Discrete,JuliaFEM.Core.Constant,JuliaFEM.Core.TimeInvariant}(0.3),\"geometry\"=>JuliaFEM.Core.Field{JuliaFEM.Core.Discrete,JuliaFEM.Core.Variable,JuliaFEM.Core.TimeInvariant}([[13.96894,1.54855,-2.99382],[15.71724,2.88794,-2.79243],[14.76115,1.1419,-1.23125],[15.93754,1.0623,-2.82067],[14.84309,2.21825,-2.89313],[15.2392,2.01492,-2.01184],[14.36505,1.34523,-2.11254],[14.95324,1.30543,-2.90725],[15.82739,1.97512,-2.80655],[15.34935,1.1021,-2.02596]]),\"youngs modulus\"=>JuliaFEM.Core.Field{JuliaFEM.Core.Discrete,JuliaFEM.Core.Constant,JuliaFEM.Core.TimeInvariant}(210000.0)))" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "celements = solver.field_problems[1].elements;\n", + "celements[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO: 0 surface elements\n" + ] + } + ], + "source": [ + "surface_elements = filter((e) -> isa(e, JuliaFEM.Core.Element{JuliaFEM.Core.Tri6}), celements)\n", + "info(\"$(length(surface_elements)) surface elements\")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "62454" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "length(celements)" ] }, { @@ -247,369 +319,48 @@ "INFO: # of field problems: 1\n", "INFO: # of boundary problems: 1\n", "INFO: Starting iteration 1\n", - "INFO: Assembling boundary problems...\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 100 % done\n", - "INFO: # of interface dofs: 8568\n", "INFO: Assembling field problems...\n", "INFO: Assembling body 1...\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: # of dofs in problem 1: 321504\n", - "INFO: Solving system\n", - "INFO: Solved, calculating interior dofs...\n", - "INFO: Problem solved. solution norm: 11.391177449683427\n", - "INFO: timing info for non-linear iteration:\n", - "INFO: boundary assembly : 3.686000108718872\n", - "INFO: field assembly : 162.32500004768372\n", - "INFO: reduce stiffness matrix : 5.069999933242798\n", - "INFO: create sparse matrices : 0.1399998664855957\n", - "INFO: dump matrices to disk : 0.0\n", - "INFO: solve problem : 29.73900008201599\n", - "INFO: back substitute : 0.0\n", - "INFO: update element data : 1.621999979019165\n", - "INFO: non-linear iteration : 204.1119999885559\n", - "INFO: Starting iteration 2\n", + "INFO: Assembly: 10.0 % done. \n", + "INFO: Assembly: 20.0 % done. \n", + "INFO: Assembly: 30.0 % done. \n", + "INFO: Assembly: 40.0 % done. \n", + "INFO: Assembly: 50.0 % done. \n", + "INFO: Assembly: 60.0 % done. \n", + "INFO: Assembly: 70.0 % done. \n", + "INFO: Assembly: 80.0 % done. \n", + "INFO: Assembly: 90.0 % done. \n", + "INFO: Assembly: 100.0 % done. \n", "INFO: Assembling boundary problems...\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 100 % done\n", - "INFO: # of interface dofs: 8568\n", - "INFO: Assembling field problems...\n", - "INFO: Assembling body 1...\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: # of dofs in problem 1: 321504\n", + "INFO: Assembling boundary 1...\n", + "INFO: Assembly: 10.0 % done. \n", + "INFO: Assembly: 20.0 % done. \n", + "INFO: Assembly: 30.0 % done. \n", + "INFO: Assembly: 40.0 % done. \n", + "INFO: Assembly: 50.0 % done. \n", + "INFO: Assembly: 60.0 % done. \n", + "INFO: Assembly: 70.0 % done. \n", + "INFO: Assembly: 80.0 % done. \n", + "INFO: Assembly: 90.0 % done. \n", + "INFO: Assembly: 100.0 % done. \n", "INFO: Solving system\n", - "INFO: Solved, calculating interior dofs...\n", - "INFO: Problem solved. solution norm: 0.11391526987712108\n", - "INFO: timing info for non-linear iteration:\n", - "INFO: boundary assembly : 1.9660000801086426\n", - "INFO: field assembly : 160.2829999923706\n", - "INFO: reduce stiffness matrix : 5.057999849319458\n", - "INFO: create sparse matrices : 0.1420001983642578\n", - "INFO: dump matrices to disk : 0.0\n", - "INFO: solve problem : 60.674999952316284\n", - "INFO: back substitute : 0.0\n", - "INFO: update element data : 1.6159999370574951\n", - "INFO: non-linear iteration : 231.24799990653992\n", - "INFO: Starting iteration 3\n", - "INFO: Assembling boundary problems...\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 100 % done\n", - "INFO: # of interface dofs: 8568\n", - "INFO: Assembling field problems...\n", - "INFO: Assembling body 1...\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: # of dofs in problem 1: 321504\n", - "INFO: Solving system\n", - "INFO: Solved, calculating interior dofs...\n", - "INFO: Problem solved. solution norm: 0.0004840672223822576\n", - "INFO: timing info for non-linear iteration:\n", - "INFO: boundary assembly : 2.003999948501587\n", - "INFO: field assembly : 168.06199979782104\n", - "INFO: reduce stiffness matrix : 5.039999961853027\n", - "INFO: create sparse matrices : 0.14100003242492676\n", - "INFO: dump matrices to disk : 0.0\n", - "INFO: solve problem : 60.27800011634827\n", - "INFO: back substitute : 0.0\n", - "INFO: update element data : 1.61899995803833\n", - "INFO: non-linear iteration : 238.61800003051758\n", - "INFO: Starting iteration 4\n", - "INFO: Assembling boundary problems...\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 100 % done\n", - "INFO: # of interface dofs: 8568\n", - "INFO: Assembling field problems...\n", - "INFO: Assembling body 1...\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: # of dofs in problem 1: 321504\n", - "INFO: Solving system\n", - "INFO: Solved, calculating interior dofs...\n", - "INFO: Problem solved. solution norm: 5.318293313386342e-10\n" + "INFO: all dofs = 321504\n", + "INFO: interior dofs = 312936\n", + "INFO: boundary dofs = 8568\n", + "INFO: preparation in 3.385999917984009 seconds\n", + "INFO: displacement on boundary solved.\n", + "INFO: norm[u_boundary_dofs] = 0.0\n", + "INFO: homogeneous dirichlet boundary\n", + "INFO: solve boundary = 0.42100000381469727\n", + "INFO: factorizations done in 14.133000135421753 seconds\n", + "INFO: solved interior in 0.2969999313354492 seconds. norm = 0.0\n", + "INFO: timing info for non-linear iteration:\n" ] }, { "data": { "text/plain": [ - "(4,true)" + "(1,true)" ] }, "execution_count": 7, @@ -620,311 +371,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "INFO: timing info for non-linear iteration:\n", - "INFO: boundary assembly : 2.0319998264312744\n", - "INFO: field assembly : 166.31699991226196\n", - "INFO: reduce stiffness matrix : 5.141999959945679\n", - "INFO: create sparse matrices : 0.1419999599456787\n", + "INFO: boundary assembly : 2.1679999828338623\n", + "INFO: field assembly : 279.9069998264313\n", "INFO: dump matrices to disk : 0.0\n", - "INFO: solve problem : 60.019999980926514\n", - "INFO: back substitute : 0.0\n", - "INFO: update element data : 1.621999979019165\n", - "INFO: non-linear iteration : 236.77899980545044\n", - "INFO: solver finished in 912.1029999256134 seconds.\n" + "INFO: solve problem : 19.37600016593933\n", + "INFO: update element data : 1.6999998092651367\n", + "INFO: non-linear iteration : 303.1509997844696\n", + "INFO: solver finished in 304.5089998245239 seconds.\n" ] } ], "source": [ - "solver.reduce_stiffness_matrix = false\n", - "#solver.dump_matrices = true\n", - "call(solver, 0.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 100 % done\n", - "INFO: 1350 boundary dofs\n", - "INFO: Assemble: 10 % done\n", - "INFO: Assemble: 20 % done\n", - "INFO: Assemble: 30 % done\n", - "INFO: Assemble: 40 % done\n", - "INFO: Assemble: 50 % done\n", - "INFO: Assemble: 60 % done\n", - "INFO: Assemble: 70 % done\n", - "INFO: Assemble: 80 % done\n", - "INFO: Assemble: 90 % done\n", - "INFO: Assemble: 100 % done\n", - "INFO: 26367 field dofs\n", - "INFO: 25017 interior dofs\n", - "INFO: Assembly: 17.84435486793518\n", - "INFO: det = Inf\n", - "INFO: Factorization: 1.87113618850708\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 19.775338 seconds (152.31 M allocations: 8.037 GB, 10.16% gc time)\n" - ] - } - ], - "source": [ - "using JuliaFEM.Core: assemble\n", - "\n", - "for elid in model[\"elsets\"][\"PISTON\"]\n", - " elements[elid][\"displacement\"] = (0.0 => Vector{Float64}[zeros(Float64, 3) for i = 1:4])\n", - "end\n", - "\n", - "function do_assembly()\n", - " t0 = time()\n", - " boundary_assembly = sum(map((p)->assemble(p, 0.0), solver.boundary_problems))\n", - " boundary_dofs = unique(boundary_assembly.stiffness_matrix.I)\n", - " info(\"$(length(boundary_dofs)) boundary dofs\")\n", - " field_assembly = sum(map((p)->assemble(p, 0.0), solver.field_problems))\n", - " field_dofs = unique(field_assembly.stiffness_matrix.I)\n", - " info(\"$(length(field_dofs)) field dofs\")\n", - " interior_dofs = setdiff(field_dofs, boundary_dofs)\n", - " info(\"$(length(interior_dofs)) interior dofs\")\n", - " info(\"Assembly: \", time()-t0)\n", - "\n", - " t0 = time()\n", - " K = sparse(field_assembly.stiffness_matrix)\n", - " f = sparse(field_assembly.force_vector)\n", - " @assert maximum(abs(1/2*(K + K') - K)) < 1.0e-6\n", - " K = 1/2*(K + K')\n", - " Kii = K[interior_dofs, interior_dofs]\n", - " info(\"det = \", det(Kii))\n", - " F = cholfact(Kii)\n", - " Kbb = K[boundary_dofs, boundary_dofs]\n", - " Kib = K[interior_dofs, boundary_dofs]\n", - " fi = f[interior_dofs]\n", - " info(\"Factorization: \", time()-t0)\n", - " dim = size(K, 1)\n", - " return dim, F, Kbb, Kib, fi, boundary_dofs, interior_dofs\n", - "end\n", - "\n", - "@time dim, F, Kbb, Kib, fi, boundary_dofs, interior_dofs = do_assembly();" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "58833x1 sparse matrix with 0 Float64 entries:" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Kc = spzeros(dim, dim)\n", - "fc = spzeros(dim, 1)" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: 10 % done.\n", - "INFO: 20 % done.\n", - "INFO: 30 % done.\n", - "INFO: 40 % done.\n", - "INFO: 50 % done.\n", - "INFO: 60 % done.\n", - "INFO: 70 % done.\n", - "INFO: 80 % done.\n", - "INFO: 90 % done.\n", - "INFO: 100 % done.\n", - "INFO: norm(2) = 535881.6985084609\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 20.500665 seconds (13.36 M allocations: 3.063 GB, 3.34% gc time)\n" - ] - } - ], - "source": [ - "@time begin\n", - " nb = length(boundary_dofs)\n", - " p = round(Int, nb/10)\n", - " Kd = zeros(nb, nb)\n", - " Vd = zeros(nb)\n", - " for bi in 1:nb\n", - " mod(bi, p) == 0 && info(round(Int, bi/nb*100), \" % done.\")\n", - " C = full(F \\ Kib[:, bi])\n", - " fill!(Vd, 0.0)\n", - " for bj in bi:nb\n", - " d = Kib[:, bj]\n", - " Kd[bj,bi] = dot(C[rowvals(d)], nonzeros(d))\n", - " Vd[bj] = dot(C[rowvals(d)], nonzeros(d))\n", - " end\n", - " Kd[:, bi] = Vd\n", - " end\n", - " Kd += tril(Kd, -1)'\n", - " Kc = spzeros(dim, dim)\n", - " Kc[boundary_dofs, boundary_dofs] = Kbb - Kd\n", - " info(\"norm(2) = \", norm(Kd))\n", - " @assert isapprox(norm(Kd), 535881.698508461)\n", - "end" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "79868.97400906119" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "maximum(abs(1/2*(Kd + Kd') - Kd))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "30% memory usage before start. 100% CPU usage. 85 % maximum memory usage." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "get_slices (generic function with 1 method)" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "function get_slices(nb, n)\n", - "# n = 3\n", - "# nb = 25\n", - " kk = round(Int, collect(linspace(0, nb, n+1)))\n", - " return [kk[j]+1:kk[j+1] for j=1:length(kk)-1]\n", - "end" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: 10.0 % done\n", - "INFO: 20.0 % done\n", - "INFO: 30.0 % done\n", - "INFO: 40.0 % done\n", - "INFO: 50.0 % done\n", - "INFO: 60.0 % done\n", - "INFO: 70.0 % done\n", - "INFO: 80.0 % done\n", - "INFO: 90.0 % done\n", - "INFO: 100.0 % done\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " 47" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO: 3.525162568997601e6\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - ".470587 seconds (251.48 k allocations: 10.678 GB, 5.06% gc time)\n" - ] - } - ], - "source": [ - "@time begin\n", - " chunks = 10\n", - " nb = length(boundary_dofs)\n", - " kk = round(Int, collect(linspace(0, nb, chunks+1)))\n", - " sl = [kk[j]+1:kk[j+1] for j=1:length(kk)-1]\n", - " Kc = spzeros(dim, dim)\n", - " for (k, sli) in enumerate(sl)\n", - " b1 = boundary_dofs[sli]\n", - " Sc = F \\ Kib[:,sli]\n", - " for slj in sl\n", - " b2 = boundary_dofs[slj]\n", - " Kc[b2,b1] = Kbb[slj,sli] - Kib[:,slj]'*Sc\n", - " end\n", - " info(round(k/chunks*100, 0), \" % done\")\n", - " end\n", - "end\n", - "info(norm(Kc, 1))\n", - "@assert isapprox(norm(Kc, 1), 3.525162568997601e6)" + "solve!(model, \"elasticity equations\", 0.0)" ] }, { diff --git a/src/abaqus_reader.jl b/src/abaqus_reader.jl index ba0b366..4193599 100644 --- a/src/abaqus_reader.jl +++ b/src/abaqus_reader.jl @@ -17,6 +17,9 @@ element_has_nodes(::Type{Val{:C3D20E}}) = 20 element_has_nodes(::Type{Val{:S3}}) = 3 element_has_type( ::Type{Val{:S3}}) = :Seg3 +element_has_nodes(::Type{Val{:STRI65}}) = 6 +element_has_type(::Type{Val{:STRI65}}) = :Tri6 + """ Checks for if line is a comment line or just empty """ diff --git a/src/interfaces.jl b/src/interfaces.jl index aad865f..f134993 100644 --- a/src/interfaces.jl +++ b/src/interfaces.jl @@ -7,7 +7,7 @@ using JuliaFEM.API: Model """ This needs this a bit honing ... """ -function solve!(model::Model, case_name::ASCIIString, time::Float64) +function get_solver(model::Model, case_name::ASCIIString, time::Float64) element_ids = keys(model.elements) all_elements = model.elements case = model.load_cases[case_name] @@ -71,9 +71,17 @@ function solve!(model::Model, case_name::ASCIIString, time::Float64) end # Creating the solver - solver = JuliaFEM.Core.(case.solver)(field_problem, dirile_arr...) + #solver = JuliaFEM.Core.(case.solver)(field_problem, dirile_arr...) + solver = JuliaFEM.Core.(case.solver)() + push!(solver, field_problem) + for d in dirile_arr + push!(solver, d) + end + return solver +end +function solve!(model::Model, case_name::ASCIIString, time::Float64) + solver = get_solver(model, case_name, time) # Solving solver(time) - end - +end