mirror of
https://github.com/JuliaFEM/JuliaFEM.jl.git
synced 2026-09-18 09:41:31 +00:00
83 lines
2.7 KiB
Julia
83 lines
2.7 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
|
|
using JuliaFEM.Test
|
|
|
|
function JuliaFEM.get_model(::Type{Val{Symbol("1x1 plane stress quad4 block")}})
|
|
|
|
X = Dict{Int, Vector{Float64}}(
|
|
1 => [0.0, 0.0],
|
|
2 => [1.0, 0.0],
|
|
3 => [1.0, 1.0],
|
|
4 => [0.0, 1.0])
|
|
|
|
body = Problem(Elasticity, "body", 2)
|
|
body.properties.formulation = :plane_stress
|
|
body.elements = [Element(Quad4, [1, 2, 3, 4])]
|
|
update!(body.elements, "geometry", X)
|
|
update!(body.elements, "youngs modulus", 288.0)
|
|
update!(body.elements, "poissons ratio", 1/3)
|
|
|
|
# boundary conditions
|
|
bc_13 = Problem(Dirichlet, "symmetry 13", 2, "displacement")
|
|
bc_13.properties.dual_basis = true
|
|
bc_13.elements = [Element(Seg2, [1, 2])]
|
|
update!(bc_13.elements, "geometry", X)
|
|
update!(bc_13.elements, "displacement 2", 0.0)
|
|
|
|
bc_23 = Problem(Dirichlet, "symmetry 23", 2, "displacement")
|
|
bc_23.properties.dual_basis = true
|
|
bc_23.elements = [Element(Seg2, [4, 1])]
|
|
update!(bc_23.elements, "geometry", X)
|
|
update!(bc_23, "displacement 1", 0.0)
|
|
|
|
solver = Solver(Nonlinear, "1x1 plane stress quad4 block")
|
|
push!(solver, body, bc_13, bc_23)
|
|
|
|
return solver
|
|
end
|
|
|
|
@testset "test dirichlet spc in point" begin
|
|
X = Dict{Int, Vector{Float64}}(
|
|
1 => [0.0, 0.0],
|
|
2 => [1.0, 0.0],
|
|
3 => [1.0, 1.0],
|
|
4 => [0.0, 1.0])
|
|
solver = get_model("1x1 plane stress quad4 block")
|
|
update!(solver["symmetry 13"], "displacement 1", 0.0)
|
|
update!(solver["symmetry 23"], "displacement 2", 0.0)
|
|
nodal_bc = Problem(Dirichlet, "dx=0.5", 2, "displacement")
|
|
nodal_bc.elements = [Element(Poi1, [3])]
|
|
update!(nodal_bc, "geometry", X)
|
|
update!(nodal_bc, "displacement 1", 0.5)
|
|
update!(nodal_bc, "displacement 2", 0.0)
|
|
push!(solver, nodal_bc)
|
|
call(solver)
|
|
pel = nodal_bc.elements[1]
|
|
la = pel("reaction force", [0.0], 0.0)
|
|
info("reaction force: $la")
|
|
info(solver["body"].assembly.u)
|
|
@test isapprox(pel("displacement", [], 0.0), [0.5, 0.0])
|
|
end
|
|
|
|
@testset "test nodal point force" begin
|
|
X = Dict{Int, Vector{Float64}}(
|
|
1 => [0.0, 0.0],
|
|
2 => [1.0, 0.0],
|
|
3 => [1.0, 1.0],
|
|
4 => [0.0, 1.0])
|
|
solver = get_model("1x1 plane stress quad4 block")
|
|
update!(solver["symmetry 13"], "displacement 1", 0.0)
|
|
update!(solver["symmetry 23"], "displacement 2", 0.0)
|
|
point_load = Element(Poi1, [3])
|
|
update!(point_load, "geometry", X)
|
|
update!(point_load, "displacement traction force 1", 72.0)
|
|
update!(point_load, "displacement traction force 2", 27.0)
|
|
push!(solver["body"], point_load)
|
|
call(solver)
|
|
@test isapprox(point_load("displacement", [], 0.0), [0.5, 0.0])
|
|
end
|
|
|