2016-07-03 05:00:01 +03:00
|
|
|
# This file is a part of JuliaFEM.
|
|
|
|
|
# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md
|
|
|
|
|
|
|
|
|
|
using JuliaFEM
|
2016-07-10 04:26:21 +03:00
|
|
|
using JuliaFEM.Testing
|
2016-07-03 05:00:01 +03:00
|
|
|
|
|
|
|
|
ALL_ELEMENTS = [
|
|
|
|
|
Seg2, Seg3,
|
2016-07-10 04:26:21 +03:00
|
|
|
Tri3, Tri6, Tri7,
|
|
|
|
|
Quad4, Quad8, Quad9,
|
|
|
|
|
Tet4, Tet10,
|
|
|
|
|
Wedge6,
|
|
|
|
|
Hex8, Hex20, Hex27
|
2016-07-03 05:00:01 +03:00
|
|
|
]
|
|
|
|
|
|
2017-01-30 12:28:33 +02:00
|
|
|
info("basic data for elements implemented so far:")
|
|
|
|
|
for element_type in [Poi1; ALL_ELEMENTS]
|
|
|
|
|
element = Element(element_type, Int[])
|
|
|
|
|
element_length = length(element)
|
|
|
|
|
element_size = size(element)
|
|
|
|
|
element_description = description(element)
|
|
|
|
|
info("Element $element_type, description = $element_description, length = $element_length, size = $element_size")
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
2017-01-03 22:11:27 +02:00
|
|
|
ALL_ELEMENTS_NODES = [
|
|
|
|
|
[1,2], [1,2,3],
|
|
|
|
|
[1,2,3], [1,2,3,4,5,6], [1,2,3,4,5,6,7],
|
|
|
|
|
[1,2,3,4], [1,2,3,4,5,6,7,8], [1,2,3,4,5,6,7,8,9],
|
|
|
|
|
[1,2,3,4], [1,2,3,4,5,6,7,8,9,10],
|
|
|
|
|
[1,2,3,4,5,6],
|
|
|
|
|
[1,2,3,4,5,6,7,8],
|
|
|
|
|
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,15,17,18,19,20],
|
|
|
|
|
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,15,17,18,19,20,
|
|
|
|
|
21,22,23,24,25,26,27]
|
|
|
|
|
]
|
|
|
|
|
|
2016-07-03 05:00:01 +03:00
|
|
|
@testset "Evaluating basis" begin
|
2017-01-03 22:11:27 +02:00
|
|
|
for (T, nod) in zip(ALL_ELEMENTS,ALL_ELEMENTS_NODES)
|
|
|
|
|
el = Element(T,nod)
|
2016-07-03 05:00:01 +03:00
|
|
|
nnodes = length(el)
|
|
|
|
|
for (i, X) in enumerate(get_reference_coordinates(T))
|
|
|
|
|
Ni = vec(el(X))
|
|
|
|
|
expected = zeros(nnodes)
|
|
|
|
|
expected[i] = 1.0
|
|
|
|
|
@test isapprox(Ni, expected)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2017-01-03 22:11:27 +02:00
|
|
|
function get_volume{T<:AbstractElement}(::Type{T},nodes)
|
2016-07-03 05:00:01 +03:00
|
|
|
X = get_reference_coordinates(T)
|
2017-01-03 22:11:27 +02:00
|
|
|
element = Element(T,nodes)
|
2016-07-03 05:00:01 +03:00
|
|
|
update!(element, "geometry", X)
|
|
|
|
|
V = 0.0
|
|
|
|
|
for ip in get_integration_points(element)
|
|
|
|
|
V += ip.weight*element(ip, 0.0, Val{:detJ})
|
|
|
|
|
end
|
|
|
|
|
return V
|
|
|
|
|
end
|
|
|
|
|
|
2017-01-03 22:11:27 +02:00
|
|
|
RESULTS = [2.0, 2.0, 0.5, 0.5, 0.5, 2.0^2, 2.0^2,
|
|
|
|
|
2.0^2, 1/6, 1/6, 1.0, 2.0^3, 2.0^3, 2.0^3,]
|
|
|
|
|
|
2016-07-03 05:00:01 +03:00
|
|
|
@testset "Calculate reference element length/area/volume" begin
|
2017-01-03 22:11:27 +02:00
|
|
|
for (T, nod, res) in zip(ALL_ELEMENTS,ALL_ELEMENTS_NODES,
|
|
|
|
|
RESULTS)
|
|
|
|
|
@test isapprox(get_volume(T,nod), res)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
SIZES = [(1,2), (1,3), (2,3), (2,6), (2,7), (2,4),
|
2017-01-03 22:38:32 +02:00
|
|
|
(2,8), (2,9), (3,4), (3,10), (3,6), (3,8),
|
|
|
|
|
(3,20), (3,27)]
|
2017-01-03 22:11:27 +02:00
|
|
|
|
|
|
|
|
@testset "element size" begin
|
|
|
|
|
for (T, nod, res) in zip(ALL_ELEMENTS,ALL_ELEMENTS_NODES, SIZES)
|
|
|
|
|
@test size(Element(T,nod)) == res
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
@testset "element length" begin
|
|
|
|
|
for i in 1:length(ALL_ELEMENTS)
|
|
|
|
|
typ = ALL_ELEMENTS[i]
|
|
|
|
|
vec = ALL_ELEMENTS_NODES[i]
|
|
|
|
|
el = Element(typ,vec)
|
|
|
|
|
@test length(el) == length(vec)
|
|
|
|
|
end
|
2016-07-03 05:00:01 +03:00
|
|
|
end
|