Files
JuliaFEM.jl/notebooks/2015-12-13-3d-tie-contact.ipynb
T

926 lines
57 KiB
Plaintext
Raw Normal View History

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Tie contact 3d\n",
"\n",
"Author(s): Jukka Aho"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Solid block\n",
"\n",
2015-12-14 17:49:36 +02:00
"Geometry and mesh:\n",
"\n",
"<div class=\"main_block\" style=\"max-width: 800px;\">\n",
" <div class=\"inner_block\" style=\"display: inline-block; float:left; width:50%;\">\n",
" <img src=\"http://results.juliafem.org/2015-12-13-box_geom.png\"\n",
" style=\"width:100%; height:auto; vertical-align:middle;\">\n",
" </div>\n",
" <div class=\"inner_block\" style=\"display: inline-block; float:left; width:50%;\">\n",
" <img src=\"http://results.juliafem.org/2015-12-13-box_bcs.png\"\n",
" style=\"width:100%; height:auto; vertical-align:middle;\">\n",
" </div>\n",
"</div>"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"using JuliaFEM\n",
"using JuliaFEM.Preprocess: parse_aster_med_file\n",
2015-12-14 17:49:36 +02:00
"using JuliaFEM.Core: LinearElasticityProblem, DirichletProblem, get_connectivity, Quad4, Hex8, DirectSolver"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO: Found 4 element sets: SYM23, SYM12, SYM13, LOAD\n"
]
},
{
"data": {
"text/plain": [
"Dict{ASCIIString,Any} with 2 entries:\n",
" \"nodes\" => Dict(2=>[0.0,0.0,0.0],11=>[0.0,0.3333333333333333,1.0],39=>…\n",
" \"connectivity\" => Dict(68=>(:QU4,:OTHER,[45,47,48,46]),2=>(:SE2,:OTHER,[9,10]…"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mesh = parse_aster_med_file(Pkg.dir(\"JuliaFEM\")*\"/geometry/unit_box/mesh.med\")\n",
"#mesh = parse_aster_med_file(Pkg.dir(\"JuliaFEM\")*\"/geometry/unit_box/twoelem_box.med\")"
]
},
{
"cell_type": "code",
2015-12-14 17:49:36 +02:00
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO: created 36 elements.\n"
]
}
],
"source": [
"# interior elements are of type HE8\n",
"field_problem = LinearElasticityProblem()\n",
"for (elid, (eltype, elset, elcon)) in mesh[\"connectivity\"]\n",
" eltype == :HE8 || continue\n",
" element = Hex8(elcon)\n",
" element[\"geometry\"] = Vector{Float64}[mesh[\"nodes\"][i] for i in get_connectivity(element)]\n",
" element[\"youngs modulus\"] = 900.0\n",
" element[\"poissons ratio\"] = 0.25\n",
" push!(field_problem, element)\n",
"end\n",
"# Neumann boundary condition, traction force -100 on Z direction for element set LOAD\n",
"for (elid, (eltype, elset, elcon)) in mesh[\"connectivity\"]\n",
" (eltype == :QU4) && (elset == :LOAD) || continue\n",
" element = Quad4(elcon)\n",
" element[\"geometry\"] = Vector{Float64}[mesh[\"nodes\"][i] for i in get_connectivity(element)]\n",
" element[\"displacement traction force\"] = Vector{Float64}[[0.0, 0.0, -100.0] for i=1:4]\n",
" push!(field_problem, element)\n",
"end\n",
"info(\"created $(length(field_problem.elements)) elements.\")"
]
},
{
"cell_type": "code",
2015-12-14 17:49:36 +02:00
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO: created 27 boundary elements.\n"
]
}
],
"source": [
"# boundary conditions\n",
"boundary_problem = DirichletProblem(\"displacement\", 3)\n",
"for (elid, (eltype, elset, elcon)) in mesh[\"connectivity\"]\n",
" (eltype == :QU4) && (elset in [:SYM23, :SYM12, :SYM13]) || continue\n",
" element = Quad4(elcon)\n",
" element[\"geometry\"] = Vector{Float64}[mesh[\"nodes\"][i] for i in get_connectivity(element)]\n",
" if elset == :SYM23\n",
" element[\"displacement 1\"] = 0.0\n",
" elseif elset == :SYM12\n",
" element[\"displacement 3\"] = 0.0\n",
" elseif elset == :SYM13\n",
" element[\"displacement 2\"] = 0.0\n",
" end\n",
" push!(boundary_problem, element)\n",
"end\n",
"info(\"created $(length(boundary_problem.elements)) boundary elements.\")"
]
},
{
"cell_type": "code",
2015-12-14 17:49:36 +02:00
"execution_count": 7,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
2015-12-14 17:49:36 +02:00
"INFO: # of field problems: 1\n",
"INFO: # of boundary problems: 1\n",
"INFO: Starting iteration 1\n",
"INFO: Assembling field problems...\n",
"INFO: Assembling body 1...\n",
"INFO: dim = 192\n",
"INFO: Assembling boundary problems...\n",
"INFO: Assembling boundary 1...\n",
"INFO: dumping matrices to disk, file = matrices_block_host_1_iteration_1.jld\n",
"INFO: Solving system\n",
"INFO: CHOLMOD: all dofs = 192\n",
"INFO: CHOLMOD: interior dofs = 144\n",
"INFO: CHOLMOD: boundary dofs = 48\n",
"INFO: CHOLMOD: displacement on boundary solved.\n",
"INFO: CHOLMOD: homogeneous dirichlet boundary\n",
"INFO: CHOLMOD: LDLt factorization done in 0.0012049674987792969 seconds\n",
"INFO: CHOLMOD: solved in 0.05479288101196289 seconds. norm = 0.5879447357921324\n",
"INFO: timing info for iteration:\n",
"INFO: boundary assembly : 0.09608697891235352\n"
]
},
{
"data": {
"text/plain": [
2015-12-14 17:49:36 +02:00
"(1,true)"
]
},
2015-12-14 17:49:36 +02:00
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
2015-12-14 17:49:36 +02:00
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO: field assembly : 1.0157549381256104\n",
"INFO: dump matrices to disk : 0.9569120407104492\n",
"INFO: solve problem : 0.48387885093688965\n",
"INFO: update element data : 0.01578807830810547\n",
"INFO: non-linear iteration : 2.568441867828369\n",
"INFO: solver finished in 2.7200798988342285 seconds.\n"
]
}
],
"source": [
2015-12-14 17:49:36 +02:00
"solver = DirectSolver()\n",
"solver.name = \"block\"\n",
"solver.nonlinear_problem = false\n",
"#solver.method = :UMFPACK\n",
"solver.dump_matrices = true\n",
"push!(solver, field_problem)\n",
"push!(solver, boundary_problem)\n",
"call(solver, 0.0)"
]
},
{
"cell_type": "code",
2015-12-14 17:49:36 +02:00
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO: nid near corner = 7\n"
]
},
{
"data": {
"text/plain": [
"7"
]
},
2015-12-14 17:49:36 +02:00
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nid = 0\n",
"for (nid, coords) in mesh[\"nodes\"]\n",
" if isapprox(coords, [1.0, 1.0, 1.0])\n",
" info(\"nid near corner = $nid\")\n",
" break\n",
" end\n",
"end\n",
"nid"
]
},
{
"cell_type": "code",
2015-12-14 17:49:36 +02:00
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
2015-12-14 17:49:36 +02:00
"INFO: displacement X = [1.0,1.0,1.0], u = [0.027777777777777794,0.02777777777777784,-0.11111111111111129]\n",
"INFO: displacement X = [1.0,1.0,1.0], u = [0.027777777777777794,0.02777777777777784,-0.11111111111111129]\n"
]
}
],
"source": [
"using JuliaFEM.Test\n",
"known_value = [1/36, 1/36, -1/9]\n",
"for element in field_problem.elements\n",
" i = indexin([nid], get_connectivity(element))[1]\n",
" i != 0 || continue\n",
" X = element(\"geometry\", 0.0)\n",
" u = element(\"displacement\", 0.0)\n",
" info(\"displacement X = $(X[i]), u = $(u[i])\")\n",
2015-12-14 17:49:36 +02:00
" @test isapprox(u[i], known_value)\n",
"end"
]
},
{
"cell_type": "code",
2015-12-14 17:49:36 +02:00
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO: XDFM: ndim = 192\n"
]
}
],
"source": [
"xdoc, xmodel = JuliaFEM.Postprocess.xdmf_new_model()\n",
"coll = JuliaFEM.Postprocess.xdmf_new_temporal_collection(xmodel)\n",
"grid = JuliaFEM.Postprocess.xdmf_new_grid(coll; time=0.0)\n",
"\n",
"Xg = Dict{Int64, Vector{Float64}}()\n",
"ug = Dict{Int64, Vector{Float64}}()\n",
"for element in field_problem.elements\n",
" conn = get_connectivity(element)\n",
" X = element(\"geometry\", 0.0)\n",
" u = element(\"displacement\", 0.0)\n",
" for (i, c) in enumerate(conn)\n",
" Xg[c] = X[i]\n",
" ug[c] = u[i]\n",
" end\n",
"end\n",
"perm = sort(collect(keys(Xg)))\n",
"nodes = Vector{Float64}[Xg[i] for i in perm]\n",
"disp = Vector{Float64}[ug[i] for i in perm]\n",
"elements = []\n",
"for el in field_problem.elements\n",
" isa(el, JuliaFEM.Core.Element{JuliaFEM.Core.Hex8}) || continue\n",
" push!(elements, (:Hex8, get_connectivity(el)))\n",
"end\n",
"#elements\n",
"JuliaFEM.Postprocess.xdmf_new_mesh!(grid, nodes, elements)\n",
"JuliaFEM.Postprocess.xdmf_new_nodal_field!(grid, \"displacement\", disp)\n",
"JuliaFEM.Postprocess.xdmf_save_model(xdoc, \"/tmp/foobar2.xmf\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src=\"http://results.juliafem.org/2015-12-13-box_results.png\" width=300px style=\"float:left\">"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Block divived to two parts\n",
"\n",
2015-12-14 17:49:36 +02:00
"Block is now divided to two parts and meshes are tied using mortar method.\n",
"\n",
"<div class=\"main_block\" style=\"max-width: 800px;\">\n",
" <div class=\"inner_block\" style=\"display: inline-block; float:left; width:50%;\">\n",
" <img src=\"http://results.juliafem.org/2015-12-13-divided-block-geometry.png\"\n",
" style=\"width:100%; height:auto; vertical-align:middle;\">\n",
" </div>\n",
" <div class=\"inner_block\" style=\"display: inline-block; float:left; width:50%;\">\n",
" <img src=\"http://results.juliafem.org/2015-12-13-divided-block-both-parts.png\"\n",
" style=\"width:100%; height:auto; vertical-align:middle;\">\n",
" </div>\n",
"</div>"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
2015-12-17 15:33:51 +02:00
"INFO: Found 6 element sets: SYM23, SYM12, UPPER_TO_LOWER, LOAD, SYM13, LOWER_TO_UPPER\n"
]
},
{
"data": {
"text/plain": [
"Dict{ASCIIString,Any} with 2 entries:\n",
2015-12-17 15:33:51 +02:00
" \"nodes\" => Dict(68=>[1.0,0.0,0.5],2=>[0.0,0.0,0.16666666666666666],89=…\n",
" \"connectivity\" => Dict(11=>(:SE2,:OTHER,[4,13]),158=>(:QU4,:UPPER_TO_LOWER,[8…"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"using JuliaFEM\n",
"using JuliaFEM.Preprocess: parse_aster_med_file\n",
2015-12-17 15:33:51 +02:00
"using JuliaFEM.Core: LinearElasticityProblem, DirichletProblem, get_connectivity,\n",
" Quad4, Hex8, LinearSolver, update\n",
"#mesh_lower = parse_aster_med_file(Pkg.dir(\"JuliaFEM\")*\"/geometry/unit_box/LOWER_BLOCK.med\")\n",
"#mesh_upper = parse_aster_med_file(Pkg.dir(\"JuliaFEM\")*\"/geometry/unit_box/UPPER_BLOCK.med\")\n",
"#mesh_lower = parse_aster_med_file(Pkg.dir(\"JuliaFEM\")*\"/geometry/unit_box/BLOCK_TWOELEM.med\", \"LOWER_BLOCK_SPARSE\")\n",
"#mesh_upper = parse_aster_med_file(Pkg.dir(\"JuliaFEM\")*\"/geometry/unit_box/BLOCK_TWOELEM.med\", \"UPPER_BLOCK_SPARSE\")\n",
"#mesh1 = parse_aster_med_file(Pkg.dir(\"JuliaFEM\")*\"/geometry/unit_box/BLOCK_SPARSE.med\", \"LOWER_BLOCK_SPARSE\")\n",
"#mesh2 = parse_aster_med_file(Pkg.dir(\"JuliaFEM\")*\"/geometry/unit_box/BLOCK_SPARSE.med\", \"UPPER_BLOCK_SPARSE\")\n",
"mesh = parse_aster_med_file(Pkg.dir(\"JuliaFEM\")*\"/geometry/unit_box/BLOCKS.med\")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
2015-12-17 15:33:51 +02:00
"INFO: created 39 elements.\n"
]
}
],
"source": [
"# interior elements are of type HE8\n",
"field_problem = LinearElasticityProblem()\n",
"\n",
2015-12-17 15:33:51 +02:00
"for (elid, (eltype, elset, elcon)) in mesh[\"connectivity\"]\n",
" eltype == :HE8 || continue\n",
" element = Hex8(elcon)\n",
2015-12-17 15:33:51 +02:00
" update(element, \"geometry\", mesh[\"nodes\"])\n",
" element[\"youngs modulus\"] = 900.0\n",
" element[\"poissons ratio\"] = 0.25\n",
2015-12-14 17:49:36 +02:00
" #info(\"lower: add element with connectivity $elcon\")\n",
" push!(field_problem, element)\n",
"end\n",
"\n",
"# Neumann boundary condition, traction force -100 on Z direction for element set LOAD\n",
2015-12-17 15:33:51 +02:00
"for (elid, (eltype, elset, elcon)) in mesh[\"connectivity\"]\n",
" (eltype == :QU4) && (elset == :LOAD) || continue\n",
" element = Quad4(elcon)\n",
2015-12-17 15:33:51 +02:00
" update(element, \"geometry\", mesh[\"nodes\"])\n",
" element[\"displacement traction force 3\"] = -100.0\n",
" push!(field_problem, element)\n",
"end\n",
"info(\"created $(length(field_problem.elements)) elements.\")"
]
},
{
"cell_type": "code",
2015-12-17 15:33:51 +02:00
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
2015-12-17 15:33:51 +02:00
"INFO: created 35 boundary elements.\n"
]
}
],
"source": [
"# boundary conditions\n",
"boundary_problem = DirichletProblem(\"displacement\", 3)\n",
"\n",
2015-12-17 15:33:51 +02:00
"for (elid, (eltype, elset, elcon)) in mesh[\"connectivity\"]\n",
" (eltype == :QU4) && (elset in [:SYM23, :SYM12, :SYM13]) || continue\n",
" element = Quad4(elcon)\n",
2015-12-17 15:33:51 +02:00
" update(element, \"geometry\", mesh[\"nodes\"])\n",
" if elset == :SYM23\n",
" element[\"displacement 1\"] = 0.0\n",
2015-12-17 15:33:51 +02:00
" elseif elset == :SYM12\n",
" element[\"displacement 3\"] = 0.0\n",
2015-12-17 15:33:51 +02:00
" elseif elset == :SYM13\n",
" element[\"displacement 2\"] = 0.0\n",
" end\n",
" push!(boundary_problem, element)\n",
"end\n",
"info(\"created $(length(boundary_problem.elements)) boundary elements.\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Creating tie contact\n",
"- define slave element surface (the one where integration happend)\n",
"- define potential master elements for slave elements"
]
},
{
"cell_type": "code",
2015-12-17 15:33:51 +02:00
"execution_count": 4,
"metadata": {
"collapsed": false
},
2015-12-17 15:33:51 +02:00
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING: using PyPlot.mesh in module Main conflicts with an existing identifier.\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"PyPlot.Figure(PyObject <matplotlib.figure.Figure object at 0x7fcb586ad2d0>)"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"PyPlot.Figure(PyObject <matplotlib.figure.Figure object at 0x7fcb565ff610>)"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"(-0.1,1.1)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"using JuliaFEM.Core: Element, MortarProblem, calculate_normal_tangential_coordinates!\n",
"\n",
2015-12-17 15:33:51 +02:00
"using PyPlot\n",
"\n",
2015-12-17 15:33:51 +02:00
"mortar_surface = :LOWER_TO_UPPER\n",
"slave_surface = :UPPER_TO_LOWER\n",
"\n",
"fig1 = figure(figsize=(5, 5))\n",
"master_elements = JuliaFEM.Core.Element[]\n",
2015-12-17 15:33:51 +02:00
"for (elid, (eltype, elset, elcon)) in mesh[\"connectivity\"]\n",
" (eltype == :QU4) && (elset == mortar_surface) || continue\n",
" element = Quad4(elcon)\n",
2015-12-17 15:33:51 +02:00
" update(element, \"geometry\", mesh[\"nodes\"])\n",
" X = element(\"geometry\", 0.0)\n",
" x = [X[mod(i, 4)+1][1] for i=1:5]\n",
" y = [X[mod(i, 4)+1][2] for i=1:5]\n",
" plot(x, y, \"-bo\")\n",
" push!(master_elements, element)\n",
"end\n",
"\n",
2015-12-17 15:33:51 +02:00
"xlim(-0.1, 1.1)\n",
"ylim(-0.1, 1.1)\n",
"\n",
"fig1 = figure(figsize=(5, 5))\n",
"contact_problem = MortarProblem(\"displacement\", 3)\n",
2015-12-17 15:33:51 +02:00
"for (elid, (eltype, elset, elcon)) in mesh[\"connectivity\"]\n",
" (eltype == :QU4) && (elset == slave_surface) || continue\n",
" element = Quad4(elcon)\n",
2015-12-17 15:33:51 +02:00
" update(element, \"geometry\", mesh[\"nodes\"])\n",
" element[\"master elements\"] = master_elements\n",
2015-12-17 15:33:51 +02:00
" X = element(\"geometry\", 0.0)\n",
" x = [X[mod(i, 4)+1][1] for i=1:5]\n",
" y = [X[mod(i, 4)+1][2] for i=1:5]\n",
" plot(x, y, \"-ro\")\n",
" calculate_normal_tangential_coordinates!(element, 0.0)\n",
" push!(contact_problem, element)\n",
2015-12-17 15:33:51 +02:00
"end\n",
"xlim(-0.1, 1.1)\n",
"ylim(-0.1, 1.1)"
]
},
{
"cell_type": "code",
2015-12-17 15:33:51 +02:00
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO: # of field problems: 1\n",
"INFO: # of boundary problems: 2\n",
"INFO: Starting iteration 1\n",
"INFO: Assembling field problems...\n",
"INFO: Assembling body 1...\n",
2015-12-17 15:33:51 +02:00
"INFO: dim = 273\n",
"INFO: Assembling boundary problems...\n",
"INFO: Assembling boundary 1...\n",
"INFO: Assembling boundary 2...\n",
"INFO: dumping matrices to disk, file = matrices_tie_contact_3d_host_1_iteration_1.jld\n",
"INFO: Solving system\n",
2015-12-17 15:33:51 +02:00
"INFO: UMFPACK: solved in 0.21015095710754395 seconds. norm = 0.5778929077881374\n",
2015-12-14 17:49:36 +02:00
"INFO: timing info for iteration:\n"
]
},
{
"data": {
"text/plain": [
2015-12-14 17:49:36 +02:00
"(1,true)"
]
},
2015-12-17 15:33:51 +02:00
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
2015-12-17 15:33:51 +02:00
"INFO: boundary assembly : 1.677372932434082\n",
"INFO: field assembly : 1.1189799308776855\n",
"INFO: dump matrices to disk : 1.127087116241455\n",
"INFO: solve problem : 0.3656301498413086\n",
"INFO: update element data : 0.024611949920654297\n",
"INFO: non-linear iteration : 4.313704013824463\n",
"INFO: solver finished in 4.458410978317261 seconds.\n"
]
}
],
"source": [
"using JuliaFEM.Core: DirectSolver\n",
"solver = DirectSolver()\n",
"solver.name = \"tie_contact_3d\"\n",
"solver.method = :UMFPACK\n",
2015-12-14 17:49:36 +02:00
"solver.nonlinear_problem = false\n",
"solver.max_iterations = 1\n",
"solver.dump_matrices = true\n",
"push!(solver, field_problem)\n",
"push!(solver, boundary_problem)\n",
"push!(solver, contact_problem)\n",
"call(solver, 0.0)"
]
},
{
"cell_type": "code",
2015-12-17 15:33:51 +02:00
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 84 1.000000 0.500000 0.500000\n",
"2 89 0.500000 0.500000 0.500000\n",
"3 69 0.500000 0.000000 0.500000\n",
"4 68 1.000000 0.000000 0.500000\n"
]
}
],
"source": [
"prob = MortarProblem(\"temperature\", 1)\n",
"ENV[\"COLUMNS\"] = 160\n",
"ass = JuliaFEM.Core.Assembly()\n",
"el = contact_problem.elements[1]\n",
"push!(prob, el)\n",
"JuliaFEM.Core.assemble!(ass, prob, el, 0.0)\n",
"for (i, X) in enumerate(el(\"geometry\", 0.0))\n",
" ci = JuliaFEM.Core.get_connectivity(el)[i]\n",
" @printf \"%d %d %f %f %f\\n\" [i; ci; X]...\n",
"end\n",
"C = sparse(ass.stiffness_matrix)*46656\n",
"nz1 = sort(unique(rowvals(C)))\n",
"nz2 = sort(unique(rowvals(C')))\n",
"C = C[nz1,nz2]\n",
"CC = full(C);"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO: win\n",
"INFO: win\n",
"INFO: win\n",
"INFO: win\n",
"INFO: win\n",
"INFO: win\n",
"INFO: win\n",
"INFO: win\n",
"INFO: win\n"
]
}
],
"source": [
"for me in el[\"master elements\"]\n",
" \n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"JuliaFEM.Core.Field{JuliaFEM.Core.Discrete,JuliaFEM.Core.Variable,JuliaFEM.Core.TimeInvariant}(Array{T,2}[\n",
"3x3 Array{Float64,2}:\n",
" 0.0 1.0 0.0\n",
" 0.0 0.0 1.0\n",
" 1.0 0.0 0.0,\n",
"\n",
"3x3 Array{Float64,2}:\n",
" 0.0 1.0 0.0\n",
" 0.0 0.0 1.0\n",
" 1.0 0.0 0.0,\n",
"\n",
"3x3 Array{Float64,2}:\n",
" 0.0 1.0 0.0\n",
" 0.0 0.0 1.0\n",
" 1.0 0.0 0.0,\n",
"\n",
"3x3 Array{Float64,2}:\n",
" 0.0 1.0 0.0\n",
" 0.0 0.0 1.0\n",
" 1.0 0.0 0.0])"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"el(\"normal-tangential coordinates\", 0.0)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"4x13 Array{Float64,2}:\n",
" -784.0 -700.0 -28.0 -700.0 -28.0 -23.7 -0.5 -622.1 -23.7 1295.91 647.289 647.289 319.511\n",
" -224.0 -1064.0 -224.0 -200.0 -8.0 -180.6 -2.2 -919.6 -27.6 647.289 1285.51 319.511 597.689\n",
" -224.0 -200.0 -8.0 -1064.0 -224.0 -27.6 -2.2 -919.6 -180.6 647.289 319.511 1285.51 597.689\n",
" -64.0 -304.0 -64.0 -304.0 -64.0 -186.6 -8.6 -1224.2 -186.6 319.511 597.689 597.689 891.111"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"CC"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
2015-12-17 15:33:51 +02:00
"INFO: nid near corner = 73\n",
"INFO: displacement X = [1.0,1.0,1.0], u = [0.027468071147715937,0.02746807114771595,-0.11069400634503247]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Test Failed\n",
" Expression: "
]
},
{
"ename": "LoadError",
2015-12-17 15:33:51 +02:00
"evalue": "LoadError: There was an error during testing\nwhile loading In[24], in expression starting on line 14",
"output_type": "error",
"traceback": [
2015-12-17 15:33:51 +02:00
"LoadError: There was an error during testing\nwhile loading In[24], in expression starting on line 14",
"",
2015-12-17 15:33:51 +02:00
" in record at /home/jukka/.julia/v0.4/BaseTestNext/src/BaseTestNext.jl:290",
" in do_test at /home/jukka/.julia/v0.4/BaseTestNext/src/BaseTestNext.jl:192",
" [inlined code] from In[24]:20",
" in anonymous at no file:0"
]
2015-12-17 15:33:51 +02:00
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"isapprox(u[i],known_value)\n"
]
}
],
"source": [
"using JuliaFEM.Test\n",
"\n",
"nid = 0\n",
2015-12-17 15:33:51 +02:00
"for (nid, coords) in mesh[\"nodes\"]\n",
" if isapprox(coords, [1.0, 1.0, 1.0])\n",
" info(\"nid near corner = $nid\")\n",
" break\n",
" end\n",
"end\n",
"nid\n",
"\n",
"known_value = [1/36, 1/36, -1/9]\n",
"\n",
"for element in field_problem.elements\n",
" i = indexin([nid], get_connectivity(element))[1]\n",
" i != 0 || continue\n",
" X = element(\"geometry\", 0.0)\n",
" u = element(\"displacement\", 0.0)\n",
" info(\"displacement X = $(X[i]), u = $(u[i])\")\n",
2015-12-17 15:33:51 +02:00
" @test isapprox(u[i], known_value)\n",
"end"
]
},
{
"cell_type": "code",
2015-12-17 15:33:51 +02:00
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"3-element Array{Float64,1}:\n",
" 0.0274681\n",
" 0.0274681\n",
" -0.110694 "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[0.02952918548952522,0.0295291854895252,-0.11404135697110807]\n",
"[0.027468071147715937,0.02746807114771595,-0.11069400634503247]"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
2015-12-17 15:33:51 +02:00
"INFO: XDFM: ndim = 273\n"
]
}
],
"source": [
"xdoc, xmodel = JuliaFEM.Postprocess.xdmf_new_model()\n",
"coll = JuliaFEM.Postprocess.xdmf_new_temporal_collection(xmodel)\n",
"grid = JuliaFEM.Postprocess.xdmf_new_grid(coll; time=0.0)\n",
"\n",
"Xg = Dict{Int64, Vector{Float64}}()\n",
"ug = Dict{Int64, Vector{Float64}}()\n",
"for element in field_problem.elements\n",
" conn = get_connectivity(element)\n",
" X = element(\"geometry\", 0.0)\n",
" u = element(\"displacement\", 0.0)\n",
" for (i, c) in enumerate(conn)\n",
" Xg[c] = X[i]\n",
" ug[c] = u[i]\n",
" end\n",
"end\n",
"perm = sort(collect(keys(Xg)))\n",
"nodes = Vector{Float64}[Xg[i] for i in perm]\n",
"disp = Vector{Float64}[ug[i] for i in perm]\n",
"elements = []\n",
"for el in field_problem.elements\n",
" isa(el, JuliaFEM.Core.Element{JuliaFEM.Core.Hex8}) || continue\n",
" push!(elements, (:Hex8, get_connectivity(el)))\n",
"end\n",
"#elements\n",
"JuliaFEM.Postprocess.xdmf_new_mesh!(grid, nodes, elements)\n",
"JuliaFEM.Postprocess.xdmf_new_nodal_field!(grid, \"displacement\", disp)\n",
2015-12-17 15:33:51 +02:00
"JuliaFEM.Postprocess.xdmf_save_model(xdoc, \"/tmp/blocks.xmf\");"
]
},
{
2015-12-14 17:49:36 +02:00
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
2015-12-14 17:49:36 +02:00
"source": [
"<img src=\"http://results.juliafem.org/2015-12-14-divided-block-results.png\"\n",
" style=\"width:30%; height:auto; vertical-align:middle;\">"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 0.4.2",
"language": "julia",
"name": "julia-0.4"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "0.4.2"
}
},
"nbformat": 4,
"nbformat_minor": 0
}