Files
JuliaFEM.jl/test/test_mortar_2d_mesh_tie.jl
T
Jukka Aho ca7e2904cf Fix tests
* Fix deprecation warnings from tests
* Refactor tests so that ´@testset` is usually called in master file
  `runtests.jl`, not inside test file. Later on we can convert tests
  to examples.
* Syntax of tests now follow more closely syntax used currently in
  JuliaFEM. We have had earlier studies with different kind of syntaxes,
  now we have kind of explicit way to do things.
2018-09-06 13:34:26 +03:00

167 lines
6.2 KiB
Julia

# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md
using JuliaFEM, Test
function get_test_model()
X = Dict(
1 => [0.0, 0.0],
2 => [1.0, 0.0],
3 => [1.0, 0.5],
4 => [0.0, 0.5],
5 => [0.0, 0.6],
6 => [1.0, 0.6],
7 => [1.0, 1.1],
8 => [0.0, 1.1])
el1 = Element(Quad4, (1, 2, 3, 4))
el2 = Element(Quad4, (5, 6, 7, 8))
el3 = Element(Seg2, (1, 2))
el4 = Element(Seg2, (7, 8))
el5 = Element(Seg2, (4, 3))
el6 = Element(Seg2, (5, 6))
update!((el1, el2, el3, el4, el5, el6), "geometry", X)
update!((el1, el2), "youngs modulus", 96.0)
update!((el1, el2), "poissons ratio", 1/3)
update!(el3, "displacement 1", 0.0)
update!(el3, "displacement 2", 0.0)
update!(el4, "displacement 1", 0.0)
update!(el4, "displacement 2", 0.0)
update!(el6, "master elements", [el5])
p1 = Problem(Elasticity, "body1", 2)
p2 = Problem(Elasticity, "body2", 2)
p3 = Problem(Dirichlet, "fixed", 2, "displacement")
p4 = Problem(Mortar2D, "interface", 2, "displacement")
add_elements!(p1, el1)
add_elements!(p2, el2)
add_elements!(p3, el3, el4)
add_elements!(p4, el5, el6)
return p1, p2, p3, p4
end
## test adjust setting in 2d tie contact
p1, p2, p3, p4 = get_test_model()
p1.properties.formulation = :plane_stress
p2.properties.formulation = :plane_stress
#p4.properties.adjust = true
#p4.properties.rotate_normals = false
analysis = Analysis(Linear)
add_problems!(analysis, p1, p2, p3, p4)
run!(analysis)
el5 = first(get_elements(p4))
xi, time = (0.0, ), 0.0
u = el5("displacement", xi, time)
@debug("u = $u")
@test_broken isapprox(u, [0.0, 0.05])
## test that interface transfers constant field without error
meshfile = @__DIR__() * "/testdata/block_2d.med"
mesh = aster_read_mesh(meshfile)
upper = Problem(PlaneHeat, "upper", 1)
upper_elements = create_elements(mesh, "UPPER")
update!(upper_elements, "thermal conductivity", 1.0)
add_elements!(upper, upper_elements)
lower = Problem(PlaneHeat, "lower", 1)
lower_elements = create_elements(mesh, "LOWER")
update!(lower_elements, "thermal conductivity", 1.0)
add_elements!(lower, lower_elements)
bc_upper = Problem(Dirichlet, "upper boundary", 1, "temperature")
bc_upper_elements = create_elements(mesh, "UPPER_TOP")
update!(bc_upper_elements, "temperature 1", 0.0)
add_elements!(bc_upper, bc_upper_elements)
bc_lower = Problem(Dirichlet, "lower boundary", 1, "temperature")
bc_lower_elements = create_elements(mesh, "LOWER_BOTTOM")
update!(bc_lower_elements, "temperature 1", 1.0)
add_elements!(bc_lower, bc_lower_elements)
interface = Problem(Mortar2D, "interface between upper and lower block", 1, "temperature")
interface_slave_elements = create_elements(mesh, "LOWER_TOP")
interface_master_elements = create_elements(mesh, "UPPER_BOTTOM")
add_master_elements!(interface, interface_master_elements)
add_slave_elements!(interface, interface_slave_elements)
analysis = Analysis(Linear)
add_problems!(analysis, upper, lower, bc_upper, bc_lower, interface)
run!(analysis)
#interface_norm = norm(interface.assembly)
# for bi-orthogonal:
#interface_norm_expected = [0.0, 0.0, 0.0, 0.0, 0.0, 0.44870723441585775, 0.44870723441585775, 0.0, 0.0, 0.0]
#interface_norm_expected = [0.0, 0.0, 0.0, 0.0, 0.0, 0.39361633468943247, 0.39361633468943247, 0.0, 0.0, 0.0]
#@info("Interface norm: $interface_norm")
#@info("Interface norm expected: $interface_norm_expected")
#@test isapprox(interface_norm, interface_norm_expected)
xi, time = (0.0, ), 0.0
T_upper = first(bc_upper_elements)("temperature", xi, time)
T_lower = first(bc_lower_elements)("temperature", xi, time)
T_middle = first(interface_slave_elements)("temperature", xi, time)
@debug("T upper: $T_upper, T lower: $T_lower, T interface: $T_middle")
node_ids, temperature = get_nodal_vector(interface_slave_elements, "temperature", 0.0)
T = [t[1] for t in temperature]
minT = minimum(T)
maxT = maximum(T)
@debug("minT = $minT, maxT = $maxT")
@test isapprox(minT, 0.5)
@test isapprox(maxT, 0.5)
## test mesh tie with splitted block and plane stress elasticity
meshfile = @__DIR__() * "/testdata/block_2d.med"
mesh = aster_read_mesh(meshfile)
upper = Problem(Elasticity, "upper", 2)
upper.properties.formulation = :plane_stress
upper_elements = create_elements(mesh, "UPPER")
update!(upper_elements, "youngs modulus", 100.0)
update!(upper_elements, "poissons ratio", 1/3)
add_elements!(upper, upper_elements)
lower = Problem(Elasticity, "lower", 2)
lower.properties.formulation = :plane_stress
lower_elements = create_elements(mesh, "LOWER")
update!(lower_elements, "youngs modulus", 100.0)
update!(lower_elements, "poissons ratio", 1/3)
add_elements!(lower, lower_elements)
bc_upper = Problem(Dirichlet, "upper boundary", 2, "displacement")
bc_upper_elements = create_elements(mesh, "UPPER_TOP")
# update!(bc_upper.elements, "displacement 1", 0.1)
update!(bc_upper_elements, "displacement 2", -0.1)
add_elements!(bc_upper, bc_upper_elements)
bc_lower = Problem(Dirichlet, "lower boundary", 2, "displacement")
bc_lower_elements = create_elements(mesh, "LOWER_BOTTOM")
# update!(bc_lower.elements, "displacement 1", 0.0)
update!(bc_lower_elements, "displacement 2", 0.0)
add_elements!(bc_lower, bc_lower_elements)
bc_corner = Problem(Dirichlet, "fix model from lower left corner to prevent singularity", 2, "displacement")
node_ids = find_nearest_nodes(mesh, [0.0, 0.0])
bc_corner_elements = [Element(Poi1, node_ids)]
update!(bc_corner_elements, "geometry", mesh.nodes)
update!(bc_corner_elements, "displacement 1", 0.0)
add_elements!(bc_corner, bc_corner_elements)
interface = Problem(Mortar2D, "interface between upper and lower block", 2, "displacement")
interface_slave_elements = create_elements(mesh, "LOWER_TOP")
interface_master_elements = create_elements(mesh, "UPPER_BOTTOM")
add_master_elements!(interface, interface_master_elements)
add_slave_elements!(interface, interface_slave_elements)
analysis = Analysis(Linear)
add_problems!(analysis, upper, lower, bc_upper, bc_lower, interface, bc_corner)
run!(analysis)
slave_elements = get_slave_elements(interface)
node_ids, la = get_nodal_vector(slave_elements, "lambda", 0.0)
for lai in la
@test isapprox(lai, [0.0, 10.0])
end