mirror of
https://github.com/JuliaFEM/JuliaFEM.jl.git
synced 2026-08-17 10:59:08 +00:00
0ca7efd631
Change the code coverage to green. * removed duplicate code * Removed unused code * removed unmaintained code * DCTI + DVTI refactored * discrete fields refactored and tested * fields are now tested quite well. * Removed obsolete code not used anywhere * Element descriptions to common dictionary * size in global const dictionary also * Added coverage to sparse tools and removed couple unused functions * get nonzero rows from SparseMatrixCSC * bugfix: extending element basis now working and tested * Removed two unused functions from elements.jl * removed useless function * Useless conversion * remove elasticity assembly using ForwardDiff because it's not used anywhere' * Added basic testing for NURBS. Fixed bug in NSolid interpolation. * removed unused functions * Removed some debug stuff * renamed file * removed field assembly posthook, i think not good idea at all * test for nnz(K) == 0 and automatic determination of dofs * Testing that solver is throwing error if having problems with boundary assembly * Removed some unused options. Refactoring. * Moved solver non-related code to elements.jl * Removed custom exception (no need) * unneeded postprocess code * More tests for NURBS elements. * Removed unfinished .mail parser * proper use of Logging package * also read results * renamed test file * create_surface_elements accepts surface name in String now * bugfix: remove zero rows from constraint matrix after manually removing dofs from some boundary assemblies. * New test, displacement 3d patch test * skip displacement field in surface element splitting if not defined * test element splitting and linear surface elements, fails. * Bugfix: Xdmf, not XDMF * removed nonworking tests, requires bugfix * abaqus_read_results is not working -> bug
134 lines
4.4 KiB
Julia
134 lines
4.4 KiB
Julia
# 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.Testing
|
|
|
|
#= TODO: Fix test
|
|
function test_interpolate()
|
|
el = get_element()
|
|
@test isapprox(el("geometry", [0.0, 0.0]), [0.5, 0.5])
|
|
@test isapprox(el("geometry", [0.0, 0.0], 0.0), [0.5, 0.5])
|
|
@test isapprox(el([0.0, 0.0]), [0.25 0.25 0.25 0.25])
|
|
@test isapprox(el([0.0, 0.0], Val{:grad}), [-0.5 0.5 0.5 -0.5; -0.5 -0.5 0.5 0.5])
|
|
gradT = el("temperature", [0.0, 0.0], 1.0, Val{:grad})
|
|
info("gradT = $gradT")
|
|
X = [0.5, 0.5]
|
|
gradT_expected = [1-2*X[2] 3-2*X[1]]
|
|
info("gradT(expected) = $gradT_expected")
|
|
@test isapprox(gradT, gradT_expected)
|
|
|
|
# @test isapprox(el("temperature", [0.0, 0.0], 0.5), 1/2*gradT_expected)
|
|
|
|
# gradT = el("temperature", [0.0, 0.0], 0.5, Val{:grad})
|
|
# info("gradT = $gradT")
|
|
# @test isapprox(gradT, 1/2*gradT_expected)
|
|
end
|
|
=#
|
|
|
|
#= TODO: Fix test
|
|
function test_calculate_normal_tangential_coordinates()
|
|
el = Tri3([1, 2, 3])
|
|
el["geometry"] = Vector{Float64}[
|
|
[0.0, 0.0, 0.0],
|
|
[1.0, 0.0, 0.0],
|
|
[0.0, 1.0, 0.0]]
|
|
calculate_normal_tangential_coordinates!(el, 0.0)
|
|
n = [0.0 0.0 1.0]'
|
|
t1 = [1.0 0.0 0.0]'
|
|
t2 = [0.0 1.0 0.0]'
|
|
R = [n t1 t2]
|
|
@test isapprox(el("normal-tangential coordinates", [0.0, 0.0], 0.0), R)
|
|
end
|
|
=#
|
|
|
|
#= TODO: Fix test
|
|
function test_manifold_determinant()
|
|
el = Quad4([1, 2, 3, 4])
|
|
#el["geometry"] = Vector{Float64}[[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0]]
|
|
el["geometry"] = Vector{Float64}[[0.0, 0.0, 1.0], [1.0, 0.0, 1.0], [1.0, 1.0, 1.0], [0.0, 1.0, 1.0]]
|
|
# mother element area = 2*2 = 4, this element is 1, determinant should be 1/4 everywhere
|
|
d = det(el, [0.1, 0.2], 0.0)
|
|
d_expected = 0.25
|
|
@test d == d_expected
|
|
end
|
|
=#
|
|
|
|
#= TODO: Fix test
|
|
@testset "add new discrete constant time-variant field and interpolate it" begin
|
|
element = Element(Quad4, [1, 2, 3, 4])
|
|
element["my field"] = (0.0 => 0.0, 1.0 => 1.0)
|
|
@test isapprox(element("my field", [0.0, 0.0], 0.5), 0.5)
|
|
update!(element, "my field 2", 0.0 => 0.0, 1.0 => 1.0)
|
|
@test isapprox(element("my field 2", [0.0, 0.0], 0.5), 0.5)
|
|
end
|
|
=#
|
|
|
|
@testset "add time dependent field to element" begin
|
|
el = Element(Seg2, [1, 2])
|
|
u1 = Vector{Float64}[[0.0, 0.0], [0.0, 0.0]]
|
|
u2 = Vector{Float64}[[1.0, 1.0], [1.0, 1.0]]
|
|
update!(el, "displacement", 0.0 => u1)
|
|
update!(el, "displacement", 1.0 => u2)
|
|
@test length(el["displacement"]) == 2
|
|
@test isapprox(el("displacement", [0.0], 0.0), [0.0, 0.0])
|
|
@test isapprox(el("displacement", [0.0], 0.5), [0.5, 0.5])
|
|
@test isapprox(el("displacement", [0.0], 1.0), [1.0, 1.0])
|
|
el2 = Element(Poi1, [1])
|
|
update!(el2, "force 1", 0.0 => 1.0)
|
|
end
|
|
|
|
@testset "add CVTV field to element" begin
|
|
el = Element(Seg2, [1, 2])
|
|
f(xi, time) = xi[1]*time
|
|
update!(el, "my field", f)
|
|
v = el("my field", [1.0], 2.0)
|
|
@test isapprox(v, 2.0)
|
|
end
|
|
|
|
@testset "add DCTI to element" begin
|
|
el = Element(Quad4, [1, 2, 3, 4])
|
|
update!(el, "displacement load", DCTI([4.0, 8.0]))
|
|
@test isa(el["displacement load"], DCTI)
|
|
@test !isa(el["displacement load"].data, DCTI)
|
|
update!(el, "displacement load 2", [4.0, 8.0])
|
|
@test isa(el["displacement load 2"], DCTI)
|
|
update!(el, "temperature", [1.0, 2.0, 3.0, 4.0])
|
|
@test isa(el["temperature"], DVTI)
|
|
@test isapprox(el("displacement load", [0.0, 0.0], 0.0), [4.0, 8.0])
|
|
end
|
|
|
|
@testset "interpolate DCTI from element" begin
|
|
el = Element(Seg2, [1, 2])
|
|
update!(el, "foobar", 1.0)
|
|
fb = el("foobar", [0.0], 0.0)
|
|
@test isa(fb, Float64)
|
|
@test isapprox(fb, 1.0)
|
|
end
|
|
|
|
#= unnecessary feature
|
|
@testset "add two time dependent fields to element at once" begin
|
|
el = Element(Seg2, [1, 2])
|
|
update!(el, "foo1", 1.0 => 1.0)
|
|
update!(el, "foo1", 2.0 => 2.0)
|
|
update!(el, "foo2", 1.0 => 1.0, 2.0 => 2.0)
|
|
@test isapprox(el("foo1", 1.5), el("foo2", 1.5))
|
|
end
|
|
=#
|
|
|
|
@testset "add elements to elements" begin
|
|
el1 = Element(Seg2, [1, 2])
|
|
el2 = Element(Seg2, [3, 4])
|
|
update!(el1, "master elements", [el2])
|
|
lst = el1("master elements", 0.0)
|
|
@test isa(lst, Vector)
|
|
end
|
|
|
|
@testset "extend basis" begin
|
|
el = Element(Quad4, [1, 2, 3, 4])
|
|
expected = [
|
|
0.25 0.00 0.25 0.00 0.25 0.00 0.25 0.00
|
|
0.00 0.25 0.00 0.25 0.00 0.25 0.00 0.25]
|
|
@test isapprox(el([0.0, 0.0], 0.0, 2), expected)
|
|
end
|