Files
JuliaFEM.jl/test/test_virtual_work.jl
T

70 lines
2.1 KiB
Julia
Raw Normal View History

2015-11-11 00:52:16 +02:00
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md
2016-07-03 21:16:03 +03:00
using JuliaFEM
2015-11-11 00:52:16 +02:00
using JuliaFEM.Test
2015-11-27 10:10:00 +02:00
abstract PlaneStressElasticityProblem <: AbstractProblem
function PlaneStressElasticityProblem(dim::Int=2, elements=[])
return Problem{PlaneStressElasticityProblem}(dim, elements)
end
2015-11-30 23:00:21 +02:00
function get_unknown_field_name{P<:PlaneStressElasticityProblem}(::Type{P})
return "displacement"
2015-11-11 00:52:16 +02:00
end
2015-11-30 23:00:21 +02:00
function get_unknown_field_type{P<:PlaneStressElasticityProblem}(::Type{P})
2015-11-27 10:10:00 +02:00
return Vector{Float64}
2015-11-11 00:52:16 +02:00
end
2016-07-03 21:16:03 +03:00
function get_residual_vector(problem::Problem{PlaneStressElasticityProblem}, element::Element, ip::IntegrationPoint, time::Number; variation=nothing)
2015-11-11 00:52:16 +02:00
2015-11-27 10:10:00 +02:00
basis = element(ip, time)
dbasis = element(ip, time, Val{:grad})
2015-11-11 00:52:16 +02:00
# material parameters
2015-11-27 10:10:00 +02:00
E = element("youngs modulus", ip, time)
nu = element("poissons ratio", ip, time)
2015-11-11 00:52:16 +02:00
mu = E/(2*(1+nu))
la = E*nu/((1+nu)*(1-2*nu))
la = 2*la*mu/(la + 2*mu) # <- correction for 2d
# elasticity formulation
2015-11-27 10:10:00 +02:00
u = element("displacement", ip, time, variation)
gradu = element("displacement", ip, time, Val{:grad}, variation)
2015-11-11 00:52:16 +02:00
F = I + gradu
2015-11-27 10:10:00 +02:00
2015-11-11 00:52:16 +02:00
E = 1/2*(F'*F - I)
S = la*trace(E)*I + 2*mu*E
2015-11-27 10:10:00 +02:00
r = F*S*dbasis
b = element("displacement volume load", ip, time)
r -= b*basis
2015-11-11 00:52:16 +02:00
return vec(r)
end
function test_residual_form()
# create model -- start
element = Quad4([1, 2, 3, 4])
element["geometry"] = Vector[[0.0,0.0], [10.0,0.0], [10.0,1.0], [0.0,1.0]]
element["youngs modulus"] = 500.0
element["poissons ratio"] = 0.3
element["displacement volume load"] = Vector[[0.0,-10.0], [0.0,-10.0], [0.0,-10.0], [0.0,-10.0]]
2015-11-27 10:10:00 +02:00
element["displacement"] = (0.0 => Vector{Float64}[zeros(2) for i=1:length(element)])
problem = PlaneStressElasticityProblem()
push!(problem, element)
2015-11-11 00:52:16 +02:00
# create model -- end
free_dofs = [3, 4, 5, 6]
2015-11-27 10:10:00 +02:00
solve!(problem, free_dofs, 0.0) # launch a newton solver for single element
disp = element("displacement", [1.0, 1.0], 0.0)
info("displacement at tip: $disp")
2015-11-11 00:52:16 +02:00
# verified using Code Aster.
2015-11-27 10:10:00 +02:00
@test isapprox(disp[2], -8.77303119819776E+00)
2015-11-11 00:52:16 +02:00
end