Files
JuliaFEM.jl/test/test_potential_energy.jl
T

100 lines
3.3 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-27 10:10:00 +02:00
using JuliaFEM.Test
2015-11-11 00:52:16 +02:00
2015-11-27 10:10:00 +02:00
abstract HeatProblem <: AbstractProblem
2015-11-11 00:52:16 +02:00
2015-11-27 10:10:00 +02:00
function HeatProblem(dim::Int=1, elements=[])
return Problem{HeatProblem}(dim, elements)
2015-11-21 18:23:41 +02:00
end
2015-11-30 23:00:21 +02:00
function get_unknown_field_name{P<:HeatProblem}(::Type{P})
2015-11-27 10:10:00 +02:00
return "temperature"
2015-11-21 18:23:41 +02:00
end
2015-11-30 23:00:21 +02:00
function get_unknown_field_type{P<:HeatProblem}(::Type{P})
2015-11-27 10:10:00 +02:00
return Float64
2015-11-11 00:52:16 +02:00
end
""" Calculate a potential Π = Wint - Wext of system. """
2015-11-30 23:00:21 +02:00
function get_potential_energy(problem::Problem{HeatProblem}, element::Element{Quad4}, ip::IntegrationPoint, time::Number; variation=nothing)
2015-11-27 10:10:00 +02:00
k = element("temperature thermal conductivity", ip, time)
f = element("temperature load", ip, time)
T = element("temperature", ip, time, variation)
c = element("temperature nonlinearity coefficient", ip, time)
gradT = element("temperature", ip, time, Val{:grad}, variation)
2015-11-11 00:52:16 +02:00
Wint = (k + c*T) * 1/2*vecdot(gradT, gradT)
Wext = f*T
W = Wint - Wext
J = get_jacobian(element, ip, time)
return W*det(J)
2015-11-11 00:52:16 +02:00
end
2015-11-30 23:00:21 +02:00
function get_potential_energy(problem::Problem{HeatProblem}, element::Element{Seg2}, ip::IntegrationPoint, time::Number; variation=nothing)
2015-11-27 10:10:00 +02:00
T = element("temperature", ip, time, variation)[1]
T_ext = element("temperature external", ip, time)[1]
coeff = element("temperature coefficient", ip, time)[1]
q0 = coeff*(T_ext^4 - T^4)
Wint = 0.0
2015-11-11 00:52:16 +02:00
Wext = q0*T
W = Wint - Wext
J = get_jacobian(element, ip, time)
return W*norm(J)
2015-11-11 00:52:16 +02:00
end
function test_potential_energy_method()
# create model -- start
element = Quad4([1, 2, 3, 4])
element["geometry"] = Vector[[0.0,0.0], [1.0,0.0], [1.0,1.0], [0.0,1.0]]
element["temperature thermal conductivity"] = 6.0
element["temperature load"] = [0.0, 0.0, 0.0, 0.0]
element["temperature nodal load"] = [3.0, 3.0, 0.0, 0.0]
element["temperature nonlinearity coefficient"] = 6.0
2015-11-27 10:10:00 +02:00
element["temperature"] = (0.0 => zeros(Float64, 4))
problem = HeatProblem()
push!(problem, element)
2015-11-11 00:52:16 +02:00
# create model -- end
2015-11-27 10:10:00 +02:00
solve!(problem, [1, 2], 0.0)
temp = element("temperature", [0.0, -1.0], 0.0)
2015-11-21 18:23:41 +02:00
err = temp - 2/3
2015-11-11 00:52:16 +02:00
info("error: $err")
@test isapprox(err, 0.0)
end
2015-11-11 00:52:16 +02:00
function test_potential_energy_method_2()
# create model -- start
N = Vector[[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0]]
element1 = Quad4([1, 2, 3, 4])
element1["geometry"] = Vector[N[1], N[2], N[3], N[4]]
element1["temperature thermal conductivity"] = 6.0
element1["temperature load"] = [0.0, 0.0, 0.0, 0.0]
element1["temperature nonlinearity coefficient"] = [0.0, 0.0, 0.0, 0.0]
2015-11-27 10:10:00 +02:00
element1["temperature"] = (0.0 => zeros(Float64, 4))
element2 = Seg2([1, 2])
element2["geometry"] = Vector[N[1], N[2]]
element2["temperature coefficient"] = 3.0e-8 # ~ 5.7e-8 * 0.5
element2["temperature external"] = 100.0
2015-11-27 10:10:00 +02:00
element2["temperature"] = (0.0 => zeros(Float64, 2))
2015-11-11 00:52:16 +02:00
# create model -- end
2015-11-21 18:23:41 +02:00
2015-11-27 10:10:00 +02:00
problem = HeatProblem()
2015-11-21 18:23:41 +02:00
push!(problem, element1)
push!(problem, element2)
solve!(problem, [1, 2], 0.0)
2015-11-27 10:10:00 +02:00
temp = element1("temperature", [0.0, -1.0], 0.0)
2015-11-21 18:23:41 +02:00
err = temp - 0.5
info("error: $err")
2015-11-21 18:23:41 +02:00
@test isapprox(err, 0.0, atol=1.0e-6)
# @test isapprox(temp, 2.93509690572300E+00) # tested using Code Aster
2015-11-11 00:52:16 +02:00
end