# 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 #= In [36]: C = Matrix([[0], [30], [15]]) # node coordinates In [37]: A = Matrix([P.subs({x: C[i,0]}).T for i in range(len(P))]) In [38]: N = P.T*A.inv() In [39]: Me = integrate(N.T*N, (x, 0, 30)) In [40]: De = diag(*integrate(N, (x, 0, 30))) In [41]: Me Out[41]: Matrix([ [ 4, -1, 2], [-1, 4, 2], [ 2, 2, 16]]) In [42]: De Out[42]: Matrix([ [5, 0, 0], [0, 5, 0], [0, 0, 20]]) =# @testset "dirichlet problem in 1 dimension" begin element = Element(Seg2, [1, 2]) element["geometry"] = Vector{Float64}[[0.0, 0.0], [6.0, 0.0]] element["temperature 1"] = 0.0 p1 = Problem(Dirichlet, "test problem 1", 1, "temperature") p1.properties.dual_basis = false p2 = Problem(Dirichlet, "test problem 2", 1, "temperature") assemble!(p1, element) assemble!(p2, element) C1 = full(p1.assembly.C1) C2 = full(p1.assembly.C2) @test isapprox(C1, C2) @test isapprox(C1, [2.0 1.0; 1.0 2.0]) C1 = full(p2.assembly.C1) C2 = full(p2.assembly.C2) @test isapprox(C1, C2) @test isapprox(C1, [3.0 0.0; 0.0 3.0]) element = Element(Seg3, [1, 2, 3]) element["geometry"] = Vector{Float64}[[0.0, 0.0], [30.0, 0.0], [15.0, 0.0]] element["temperature 1"] = 0.0 p1 = Problem(Dirichlet, "quadratic 1", 1, "temperature") p1.properties.dual_basis = false p2 = Problem(Dirichlet, "quadratic 1", 1, "temperature") assemble!(p1, element) assemble!(p2, element) C1 = full(p1.assembly.C1) C2 = full(p1.assembly.C2) @test isapprox(C1, C2) @test isapprox(C1, [4.0 -1.0 2.0; -1.0 4.0 2.0; 2.0 2.0 16.0]) C1 = full(p2.assembly.C1) C2 = full(p2.assembly.C2) @test isapprox(C1, C2) @test isapprox(C1, [5.0 0.0 0.0; 0.0 5.0 0.0; 0.0 0.0 20.0]) end #= @testset "dirichlet problem using tri3 surface element" begin element = Tri3([1, 2, 3]) element["geometry"] = Node[[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]] element["temperature"] = 0.0 problem = Problem(Dirichlet, "test problem", 1, "temperature") push!(problem, element) assemble!(problem, 0.0) C1 = full(problem.assembly.C1) C2 = full(problem.assembly.C2) @test isapprox(C1, C2) @test isapprox(C1, 1/24*[2 1 1; 1 2 1; 1 1 2]) end @testset "dirichlet problem in 2 dimensions" begin element = Seg2([1, 2]) element["geometry"] = Node[[1.0, 1.0], [0.0, 1.0]] element["displacement 1"] = 0.0 element["displacement 2"] = 0.0 problem = Problem(Dirichlet, "test problem", 2, "displacement") push!(problem, element) assemble!(problem, 0.0) C1 = full(problem.assembly.C1) C2 = full(problem.assembly.C2) g = full(problem.assembly.g) @test isapprox(C1, C2) C1_expected = 1/6*[2 0 1 0; 0 2 0 1; 1 0 2 0; 0 1 0 2] @test isapprox(C1, C1_expected) @test isapprox(g, [0.0, 0.0, 0.0, 0.0]) end @testset "dirichlet problem in 2 dimensions, with 1 dof fixed" begin element = Seg2([1, 2]) element["geometry"] = Node[[1.0, 1.0], [0.0, 1.0]] element["displacement 2"] = 0.0 problem = Problem(Dirichlet, "test problem", 2, "displacement") push!(problem, element) assemble!(problem, 0.0) C1 = full(problem.assembly.C1) C2 = full(problem.assembly.C2) g = full(problem.assembly.g) @test isapprox(C1, C2) C1_expected = 1/6*[ 0 0 0 0 0 2 0 1 0 0 0 0 0 1 0 2] @test isapprox(C1, C1_expected) @test isapprox(g, [0.0, 0.0, 0.0, 0.0]) end =#