In [1]:
using JuliaFEM
using JuliaFEM.Preprocess: parse_aster_med_file
using JuliaFEM.Core: LinearElasticityProblem, DirichletProblem, get_connectivity, Quad4, Hex8, DirectSolver
In [2]:
mesh = parse_aster_med_file(Pkg.dir("JuliaFEM")*"/geometry/unit_box/mesh.med")
#mesh = parse_aster_med_file(Pkg.dir("JuliaFEM")*"/geometry/unit_box/twoelem_box.med")
Out[2]:
In [5]:
# interior elements are of type HE8
field_problem = LinearElasticityProblem()
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
eltype == :HE8 || continue
element = Hex8(elcon)
element["geometry"] = Vector{Float64}[mesh["nodes"][i] for i in get_connectivity(element)]
element["youngs modulus"] = 900.0
element["poissons ratio"] = 0.25
push!(field_problem, element)
end
# Neumann boundary condition, traction force -100 on Z direction for element set LOAD
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
(eltype == :QU4) && (elset == :LOAD) || continue
element = Quad4(elcon)
element["geometry"] = Vector{Float64}[mesh["nodes"][i] for i in get_connectivity(element)]
element["displacement traction force"] = Vector{Float64}[[0.0, 0.0, -100.0] for i=1:4]
push!(field_problem, element)
end
info("created $(length(field_problem.elements)) elements.")
In [6]:
# boundary conditions
boundary_problem = DirichletProblem("displacement", 3)
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
(eltype == :QU4) && (elset in [:SYM23, :SYM12, :SYM13]) || continue
element = Quad4(elcon)
element["geometry"] = Vector{Float64}[mesh["nodes"][i] for i in get_connectivity(element)]
if elset == :SYM23
element["displacement 1"] = 0.0
elseif elset == :SYM12
element["displacement 3"] = 0.0
elseif elset == :SYM13
element["displacement 2"] = 0.0
end
push!(boundary_problem, element)
end
info("created $(length(boundary_problem.elements)) boundary elements.")
In [7]:
solver = DirectSolver()
solver.name = "block"
solver.nonlinear_problem = false
#solver.method = :UMFPACK
solver.dump_matrices = true
push!(solver, field_problem)
push!(solver, boundary_problem)
call(solver, 0.0)
Out[7]:
In [8]:
nid = 0
for (nid, coords) in mesh["nodes"]
if isapprox(coords, [1.0, 1.0, 1.0])
info("nid near corner = $nid")
break
end
end
nid
Out[8]:
In [9]:
using JuliaFEM.Test
known_value = [1/36, 1/36, -1/9]
for element in field_problem.elements
i = indexin([nid], get_connectivity(element))[1]
i != 0 || continue
X = element("geometry", 0.0)
u = element("displacement", 0.0)
info("displacement X = $(X[i]), u = $(u[i])")
@test isapprox(u[i], known_value)
end
In [10]:
xdoc, xmodel = JuliaFEM.Postprocess.xdmf_new_model()
coll = JuliaFEM.Postprocess.xdmf_new_temporal_collection(xmodel)
grid = JuliaFEM.Postprocess.xdmf_new_grid(coll; time=0.0)
Xg = Dict{Int64, Vector{Float64}}()
ug = Dict{Int64, Vector{Float64}}()
for element in field_problem.elements
conn = get_connectivity(element)
X = element("geometry", 0.0)
u = element("displacement", 0.0)
for (i, c) in enumerate(conn)
Xg[c] = X[i]
ug[c] = u[i]
end
end
perm = sort(collect(keys(Xg)))
nodes = Vector{Float64}[Xg[i] for i in perm]
disp = Vector{Float64}[ug[i] for i in perm]
elements = []
for el in field_problem.elements
isa(el, JuliaFEM.Core.Element{JuliaFEM.Core.Hex8}) || continue
push!(elements, (:Hex8, get_connectivity(el)))
end
#elements
JuliaFEM.Postprocess.xdmf_new_mesh!(grid, nodes, elements)
JuliaFEM.Postprocess.xdmf_new_nodal_field!(grid, "displacement", disp)
JuliaFEM.Postprocess.xdmf_save_model(xdoc, "/tmp/foobar2.xmf");
In [1]:
using JuliaFEM
using JuliaFEM.Preprocess: parse_aster_med_file
using JuliaFEM.Core: LinearElasticityProblem, DirichletProblem, get_connectivity,
Quad4, Hex8, LinearSolver, update
mesh = parse_aster_med_file(Pkg.dir("JuliaFEM")*"/geometry/unit_box/BLOCKS.med")
Out[1]:
In [2]:
# interior elements are of type HE8
field_problem = LinearElasticityProblem()
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
eltype == :HE8 || continue
element = Hex8(elcon)
update(element, "geometry", mesh["nodes"])
element["youngs modulus"] = 900.0
element["poissons ratio"] = 0.25
#info("lower: add element with connectivity $elcon")
push!(field_problem, element)
end
# Neumann boundary condition, traction force -100 on Z direction for element set LOAD
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
(eltype == :QU4) && (elset == :LOAD) || continue
element = Quad4(elcon)
update(element, "geometry", mesh["nodes"])
element["displacement traction force 3"] = -100.0
push!(field_problem, element)
end
info("created $(length(field_problem.elements)) elements.")
# boundary conditions
boundary_problem = DirichletProblem("displacement", 3)
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
(eltype == :QU4) && (elset in [:SYM23, :SYM12, :SYM13]) || continue
element = Quad4(elcon)
update(element, "geometry", mesh["nodes"])
if elset == :SYM23
element["displacement 1"] = 0.0
elseif elset == :SYM12
element["displacement 3"] = 0.0
elseif elset == :SYM13
element["displacement 2"] = 0.0
end
push!(boundary_problem, element)
end
info("created $(length(boundary_problem.elements)) boundary elements.")
In [3]:
using JuliaFEM.Core: Element, MortarProblem, calculate_normal_tangential_coordinates!
using PyPlot
#mortar_surface = :LOWER_TO_UPPER
#slave_surface = :UPPER_TO_LOWER
mortar_surface = :UPPER_TO_LOWER
slave_surface = :LOWER_TO_UPPER
fig1 = figure(figsize=(5, 5))
master_elements = JuliaFEM.Core.Element[]
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
(eltype == :QU4) && (elset == mortar_surface) || continue
element = Quad4(elcon)
update(element, "geometry", mesh["nodes"])
X = element("geometry", 0.0)
x = [X[mod(i, 4)+1][1] for i=1:5]
y = [X[mod(i, 4)+1][2] for i=1:5]
plot(x, y, "-bo", alpha=0.5)
push!(master_elements, element)
end
contact_problem = MortarProblem("displacement", 3)
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
(eltype == :QU4) && (elset == slave_surface) || continue
element = Quad4(reverse(elcon))
update(element, "geometry", mesh["nodes"])
element["master elements"] = master_elements
X = element("geometry", 0.0)
x = [X[mod(i, 4)+1][1] for i=1:5]
y = [X[mod(i, 4)+1][2] for i=1:5]
plot(x, y, "-ro", alpha=0.5)
calculate_normal_tangential_coordinates!(element, 0.0)
push!(contact_problem, element)
end
xlim(-0.1, 1.1)
ylim(-0.1, 1.1)
Out[3]:
In [4]:
using JuliaFEM.Core: DirectSolver
solver = DirectSolver()
solver.name = "tie_contact_3d"
solver.method = :UMFPACK
solver.nonlinear_problem = false
solver.max_iterations = 1
solver.dump_matrices = true
push!(solver, field_problem)
push!(solver, boundary_problem)
push!(solver, contact_problem)
call(solver, 0.0)
using JuliaFEM.Test
nid = 0
for (nid, coords) in mesh["nodes"]
if isapprox(coords, [1.0, 1.0, 1.0])
info("nid near corner = $nid")
break
end
end
nid
known_value = [1/36, 1/36, -1/9]
for element in field_problem.elements
i = indexin([nid], get_connectivity(element))[1]
i != 0 || continue
X = element("geometry", 0.0)
u = element("displacement", 0.0)
info("displacement X = $(X[i]), u = $(u[i])")
@test isapprox(u[i], known_value)
end
In [5]:
xdoc, xmodel = JuliaFEM.Postprocess.xdmf_new_model()
coll = JuliaFEM.Postprocess.xdmf_new_temporal_collection(xmodel)
grid = JuliaFEM.Postprocess.xdmf_new_grid(coll; time=0.0)
Xg = Dict{Int64, Vector{Float64}}()
ug = Dict{Int64, Vector{Float64}}()
for element in field_problem.elements
conn = get_connectivity(element)
X = element("geometry", 0.0)
u = element("displacement", 0.0)
for (i, c) in enumerate(conn)
Xg[c] = X[i]
ug[c] = u[i]
end
end
perm = sort(collect(keys(Xg)))
nodes = Vector{Float64}[Xg[i] for i in perm]
disp = Vector{Float64}[ug[i] for i in perm]
elements = []
for el in field_problem.elements
isa(el, JuliaFEM.Core.Element{JuliaFEM.Core.Hex8}) || continue
push!(elements, (:Hex8, get_connectivity(el)))
end
#elements
JuliaFEM.Postprocess.xdmf_new_mesh!(grid, nodes, elements)
JuliaFEM.Postprocess.xdmf_new_nodal_field!(grid, "displacement", disp)
JuliaFEM.Postprocess.xdmf_save_model(xdoc, "/tmp/blocks.xmf");
In [1]:
using JuliaFEM
using JuliaFEM.Preprocess: parse_aster_med_file
using JuliaFEM.Core: LinearElasticityProblem, DirichletProblem, get_connectivity, Tri3, Tet4, LinearSolver, update
In [2]:
mesh = parse_aster_med_file(Pkg.dir("JuliaFEM")*"/geometry/unit_box/BLOCKS_TET4.med")
#med = JuliaFEM.Preprocess.MEDFile(Pkg.dir("JuliaFEM")*"/geometry/unit_box/BLOCKS_TET4.med")
Out[2]:
In [3]:
# interior elements are of type HE8
field_problem = LinearElasticityProblem()
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
eltype == :TE4 || continue
element = Tet4(elcon)
update(element, "geometry", mesh["nodes"])
element["youngs modulus"] = 900.0
element["poissons ratio"] = 0.25
#info("lower: add element with connectivity $elcon")
push!(field_problem, element)
end
# Neumann boundary condition, traction force -100 on Z direction for element set LOAD
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
(eltype == :TR3) && (elset == :LOAD) || continue
element = Tri3(elcon)
update(element, "geometry", mesh["nodes"])
element["displacement traction force 3"] = -100.0
push!(field_problem, element)
end
info("created $(length(field_problem.elements)) elements.")
# boundary conditions
boundary_problem = DirichletProblem("displacement", 3)
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
(eltype == :TR3) && (elset in [:SYM23, :SYM12, :SYM13]) || continue
element = Tri3(elcon)
update(element, "geometry", mesh["nodes"])
if elset == :SYM23
element["displacement 1"] = 0.0
elseif elset == :SYM12
element["displacement 3"] = 0.0
elseif elset == :SYM13
element["displacement 2"] = 0.0
end
push!(boundary_problem, element)
end
info("created $(length(boundary_problem.elements)) boundary elements.")
In [4]:
using JuliaFEM.Core: Element, MortarProblem, calculate_normal_tangential_coordinates!
using PyPlot
#mortar_surface = :LOWER_TO_UPPER
#slave_surface = :UPPER_TO_LOWER
mortar_surface = :UPPER_TO_LOWER
slave_surface = :LOWER_TO_UPPER
fig1 = figure(figsize=(5, 5))
master_elements = JuliaFEM.Core.Element[]
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
(eltype == :TR3) && (elset == mortar_surface) || continue
element = Tri3(elcon)
update(element, "geometry", mesh["nodes"])
X = element("geometry", 0.0)
x = [X[mod(i, 3)+1][1] for i=1:4]
y = [X[mod(i, 3)+1][2] for i=1:4]
plot(x, y, "-bo", alpha=0.5)
push!(master_elements, element)
end
contact_problem = MortarProblem("displacement", 3)
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
(eltype == :TR3) && (elset == slave_surface) || continue
element = Tri3(reverse(elcon))
update(element, "geometry", mesh["nodes"])
element["master elements"] = master_elements
X = element("geometry", 0.0)
x = [X[mod(i, 3)+1][1] for i=1:4]
y = [X[mod(i, 3)+1][2] for i=1:4]
plot(x, y, "-ro", alpha=0.5)
calculate_normal_tangential_coordinates!(element, 0.0)
push!(contact_problem, element)
end
xlim(-0.1, 1.1)
ylim(-0.1, 1.1)
Out[4]:
In [5]:
using JuliaFEM.Core: DirectSolver
solver = DirectSolver()
solver.name = "tie_contact_3d"
solver.method = :UMFPACK
solver.nonlinear_problem = false
solver.max_iterations = 1
solver.dump_matrices = true
push!(solver, field_problem)
push!(solver, boundary_problem)
push!(solver, contact_problem)
call(solver, 0.0)
using JuliaFEM.Test
nid = 0
for (nid, coords) in mesh["nodes"]
if isapprox(coords, [1.0, 1.0, 1.0])
info("nid near corner = $nid")
break
end
end
nid
known_value = [1/36, 1/36, -1/9]
for element in field_problem.elements
i = indexin([nid], get_connectivity(element))[1]
i != 0 || continue
X = element("geometry", 0.0)
u = element("displacement", 0.0)
info("displacement X = $(X[i]), u = $(u[i])")
@test isapprox(u[i], known_value, atol=1.0e-5)
end
In [6]:
xdoc, xmodel = JuliaFEM.Postprocess.xdmf_new_model()
coll = JuliaFEM.Postprocess.xdmf_new_temporal_collection(xmodel)
grid = JuliaFEM.Postprocess.xdmf_new_grid(coll; time=0.0)
Xg = Dict{Int64, Vector{Float64}}()
ug = Dict{Int64, Vector{Float64}}()
for element in field_problem.elements
conn = get_connectivity(element)
X = element("geometry", 0.0)
u = element("displacement", 0.0)
for (i, c) in enumerate(conn)
Xg[c] = X[i]
ug[c] = u[i]
end
end
perm = sort(collect(keys(Xg)))
nodes = Vector{Float64}[Xg[i] for i in perm]
disp = Vector{Float64}[ug[i] for i in perm]
elements = []
for el in field_problem.elements
isa(el, JuliaFEM.Core.Element{JuliaFEM.Core.Tet4}) || continue
push!(elements, (:Tet4, get_connectivity(el)))
end
#elements
JuliaFEM.Postprocess.xdmf_new_mesh!(grid, nodes, elements)
JuliaFEM.Postprocess.xdmf_new_nodal_field!(grid, "displacement", disp)
JuliaFEM.Postprocess.xdmf_save_model(xdoc, "/tmp/blocks_tet4.xmf");
In [1]:
using JuliaFEM
using JuliaFEM.Preprocess: parse_aster_med_file
using JuliaFEM.Core: LinearElasticityProblem, DirichletProblem, get_connectivity, Tri3, Tet4, LinearSolver, update
mesh = parse_aster_med_file(Pkg.dir("JuliaFEM")*"/geometry/unit_box/SUPERBLOCK.med")
Out[1]:
In [2]:
# interior elements are of type HE8
field_problem = LinearElasticityProblem()
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
eltype == :TE4 || continue
element = Tet4(elcon)
update(element, "geometry", mesh["nodes"])
element["youngs modulus"] = 900.0
element["poissons ratio"] = 0.25
#info("lower: add element with connectivity $elcon")
push!(field_problem, element)
end
# Neumann boundary condition, traction force -100 on Z direction for element set LOAD
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
(eltype == :TR3) && (elset == :LOAD) || continue
element = Tri3(elcon)
update(element, "geometry", mesh["nodes"])
element["displacement traction force 3"] = -100.0
push!(field_problem, element)
end
info("created $(length(field_problem.elements)) elements.")
# boundary conditions
boundary_problem = DirichletProblem("displacement", 3)
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
(eltype == :TR3) && (elset in [:SYM23, :SYM12, :SYM13]) || continue
element = Tri3(elcon)
update(element, "geometry", mesh["nodes"])
if elset == :SYM23
element["displacement 1"] = 0.0
elseif elset == :SYM12
element["displacement 3"] = 0.0
elseif elset == :SYM13
element["displacement 2"] = 0.0
end
push!(boundary_problem, element)
end
info("created $(length(boundary_problem.elements)) boundary elements.")
Contact pairs: BLOCK1 <-> BLOCK3, BLOCK1 <-> BLOCK2, BLOCK2 <-> BLOCK4, BLOCK3 <-> BLOCK4
In [3]:
using JuliaFEM.Core: Element, MortarProblem, calculate_normal_tangential_coordinates!
function create_contact(master_surface, slave_surface)
master_elements = JuliaFEM.Core.Element[]
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
(eltype == :TR3) && (elset == master_surface) || continue
element = Tri3(elcon)
update(element, "geometry", mesh["nodes"])
push!(master_elements, element)
end
contact_problem = MortarProblem("displacement", 3)
for (elid, (eltype, elset, elcon)) in mesh["connectivity"]
(eltype == :TR3) && (elset == slave_surface) || continue
element = Tri3(reverse(elcon))
update(element, "geometry", mesh["nodes"])
element["master elements"] = master_elements
calculate_normal_tangential_coordinates!(element, 0.0)
push!(contact_problem, element)
end
return contact_problem
end
tie1 = create_contact(:BLOCK1_TO_BLOCK3, :BLOCK3_TO_BLOCK1)
tie2 = create_contact(:BLOCK1_TO_BLOCK2, :BLOCK2_TO_BLOCK1)
tie3 = create_contact(:BLOCK2_TO_BLOCK4, :BLOCK4_TO_BLOCK2)
tie4 = create_contact(:BLOCK3_TO_BLOCK4, :BLOCK4_TO_BLOCK3);
In [4]:
using JuliaFEM.Core: DirectSolver
solver = DirectSolver()
solver.name = "tie_contact_3d"
solver.method = :UMFPACK
solver.nonlinear_problem = false
solver.max_iterations = 1
solver.dump_matrices = true
push!(solver, field_problem)
push!(solver, boundary_problem)
push!(solver, tie1, tie2, tie3, tie4)
call(solver, 0.0)
using JuliaFEM.Test
nid = 0
for (nid, coords) in mesh["nodes"]
if isapprox(coords, [1.0, 1.0, 1.0])
info("nid near corner = $nid")
break
end
end
nid
known_value = [1/36, 1/36, -1/9]
for element in field_problem.elements
i = indexin([nid], get_connectivity(element))[1]
i != 0 || continue
X = element("geometry", 0.0)
u = element("displacement", 0.0)
info("displacement X = $(X[i]), u = $(u[i])")
@test isapprox(u[i], known_value, atol=1.0e-3)
end
In [5]:
xdoc, xmodel = JuliaFEM.Postprocess.xdmf_new_model()
coll = JuliaFEM.Postprocess.xdmf_new_temporal_collection(xmodel)
grid = JuliaFEM.Postprocess.xdmf_new_grid(coll; time=0.0)
Xg = Dict{Int64, Vector{Float64}}()
ug = Dict{Int64, Vector{Float64}}()
for element in field_problem.elements
conn = get_connectivity(element)
X = element("geometry", 0.0)
u = element("displacement", 0.0)
for (i, c) in enumerate(conn)
Xg[c] = X[i]
ug[c] = u[i]
end
end
perm = sort(collect(keys(Xg)))
nodes = Vector{Float64}[Xg[i] for i in perm]
disp = Vector{Float64}[ug[i] for i in perm]
elements = []
for el in field_problem.elements
isa(el, JuliaFEM.Core.Element{JuliaFEM.Core.Tet4}) || continue
push!(elements, (:Tet4, get_connectivity(el)))
end
#elements
JuliaFEM.Postprocess.xdmf_new_mesh!(grid, nodes, elements)
JuliaFEM.Postprocess.xdmf_new_nodal_field!(grid, "displacement", disp)
JuliaFEM.Postprocess.xdmf_save_model(xdoc, "/tmp/superblock.xmf");
In [ ]: