diff --git a/test/test_lagrange.jl b/test/test_lagrange.jl index e2a377f..3939463 100644 --- a/test/test_lagrange.jl +++ b/test/test_lagrange.jl @@ -3,6 +3,7 @@ using JuliaFEM using JuliaFEM.Testing +using JuliaFEM: description ALL_ELEMENTS = [ Seg2, Seg3, @@ -13,9 +14,21 @@ ALL_ELEMENTS = [ Hex8, Hex20, Hex27 ] +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] +] + @testset "Evaluating basis" begin - for T in ALL_ELEMENTS - el = Element(T) + for (T, nod) in zip(ALL_ELEMENTS,ALL_ELEMENTS_NODES) + el = Element(T,nod) nnodes = length(el) for (i, X) in enumerate(get_reference_coordinates(T)) Ni = vec(el(X)) @@ -26,9 +39,9 @@ ALL_ELEMENTS = [ end end -function get_volume{T<:AbstractElement}(::Type{T}) +function get_volume{T<:AbstractElement}(::Type{T},nodes) X = get_reference_coordinates(T) - element = Element(T) + element = Element(T,nodes) update!(element, "geometry", X) V = 0.0 for ip in get_integration_points(element) @@ -37,20 +50,44 @@ function get_volume{T<:AbstractElement}(::Type{T}) return V end +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,] + @testset "Calculate reference element length/area/volume" begin - @test isapprox(get_volume(Seg2), 2.0) - @test isapprox(get_volume(Seg3), 2.0) - @test isapprox(get_volume(Tri3), 0.5) - @test isapprox(get_volume(Tri6), 0.5) - @test isapprox(get_volume(Tri7), 0.5) - @test isapprox(get_volume(Quad4), 2.0^2) - @test isapprox(get_volume(Quad8), 2.0^2) - @test isapprox(get_volume(Quad9), 2.0^2) - @test isapprox(get_volume(Tet4), 1/6) - @test isapprox(get_volume(Tet10), 1/6) - @test isapprox(get_volume(Wedge6), 1.0) - @test isapprox(get_volume(Hex8), 2.0^3) - @test isapprox(get_volume(Hex20), 2.0^3) - @test isapprox(get_volume(Hex27), 2.0^3) + 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), + (2,8), (2,9), (3,4), (3,10), (3,6)] + +@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 +end + +DESC = ["2 node segment", "3 node segment", "3 node triangle", + "6 node triangle", "7 node triangle", "4 node quadrangle", + "8 node Serendip quadrangle", "9 node quadrangle", + "4 node tetrahedral element", "10 node tetrahedral element", + "6 node prismatic element (wedge)", + "8 node hexahedral element", "20 node hexahedral element", + "27 node hexahedral element"] + +@testset "element description" begin + for (T, res) in zip(ALL_ELEMENTS, DESC) + @test description(Type(T)) == res + end +end