mirror of
https://github.com/JuliaFEM/JuliaFEM.jl.git
synced 2026-09-25 19:36:58 +00:00
83 lines
2.9 KiB
Julia
83 lines
2.9 KiB
Julia
# SPDX-FileCopyrightText: 2015-2026 Jukka Aho
|
||
# SPDX-License-Identifier: MIT
|
||
|
||
using Test
|
||
using Random
|
||
using Tensors
|
||
using JuliaFEM
|
||
using JuliaFEM: OrthotropicLinearElastic, LinearElastic, compute_stress, elasticity_tensor
|
||
using JuliaFEM: material_behavior, StatelessConstantTangent, supported_physics, Elasticity
|
||
using JuliaFEM: required_state_variables
|
||
|
||
@testset "OrthotropicLinearElastic" begin
|
||
@testset "traits match isotropic elastic" begin
|
||
E = 70e9
|
||
ν = 0.33
|
||
G = E / (2(1 + ν))
|
||
mat = OrthotropicLinearElastic(;
|
||
E1 = E, E2 = E, E3 = E, G12 = G, G23 = G, G31 = G, ν12 = ν, ν23 = ν, ν31 = ν,
|
||
)
|
||
@test material_behavior(mat) isa StatelessConstantTangent
|
||
@test supported_physics(mat) == (Elasticity{3}(),)
|
||
@test required_state_variables(mat) == ()
|
||
end
|
||
|
||
@testset "isotropic reduction: tangent matches LinearElastic (Mandel)" begin
|
||
E = 210e9
|
||
ν = 0.3
|
||
G = E / (2(1 + ν))
|
||
iso = LinearElastic(E = E, ν = ν)
|
||
ort = OrthotropicLinearElastic(;
|
||
E1 = E, E2 = E, E3 = E, G12 = G, G23 = G, G31 = G, ν12 = ν, ν23 = ν, ν31 = ν,
|
||
)
|
||
ε0 = zero(SymmetricTensor{2,3,Float64})
|
||
_, 𝔻_iso, _ = compute_stress(iso, ε0, NamedTuple(), 0.0)
|
||
𝔻_ort = elasticity_tensor(ort)
|
||
@test tomandel(𝔻_iso) ≈ tomandel(𝔻_ort)
|
||
end
|
||
|
||
@testset "isotropic reduction: stress matches LinearElastic for random strain" begin
|
||
E = 50e9
|
||
ν = 0.27
|
||
G = E / (2(1 + ν))
|
||
iso = LinearElastic(E = E, ν = ν)
|
||
ort = OrthotropicLinearElastic(;
|
||
E1 = E, E2 = E, E3 = E, G12 = G, G23 = G, G31 = G, ν12 = ν, ν23 = ν, ν31 = ν,
|
||
)
|
||
rng = MersenneTwister(20260509)
|
||
for _ in 1:12
|
||
v = ntuple(_ -> randn(rng), 6)
|
||
ε = SymmetricTensor{2,3}(v)
|
||
σ_i, _, _ = compute_stress(iso, ε, NamedTuple(), 0.0)
|
||
σ_o, _, _ = compute_stress(ort, ε, NamedTuple(), 0.0)
|
||
@test σ_i ≈ σ_o
|
||
end
|
||
end
|
||
|
||
@testset "orthotropic coupling: σ₁ dominates under uniaxial ε₁₁" begin
|
||
mat = OrthotropicLinearElastic(;
|
||
E1 = 200e9,
|
||
E2 = 10e9,
|
||
E3 = 10e9,
|
||
G12 = 5e9,
|
||
G23 = 4e9,
|
||
G31 = 4e9,
|
||
ν12 = 0.03,
|
||
ν23 = 0.35,
|
||
ν31 = 0.03,
|
||
)
|
||
ε = SymmetricTensor{2,3}((1e-3, 0.0, 0.0, 0.0, 0.0, 0.0))
|
||
σ, _, _ = compute_stress(mat, ε, NamedTuple(), 0.0)
|
||
@test abs(σ[1, 1]) > 10 * abs(σ[2, 2])
|
||
@test abs(σ[1, 1]) > 10 * abs(σ[3, 3])
|
||
end
|
||
|
||
@testset "invalid compliance throws" begin
|
||
@test_throws ArgumentError OrthotropicLinearElastic(;
|
||
E1 = 1e9, E2 = 1e9, E3 = 1e9,
|
||
G12 = 1e9, G23 = 1e9, G31 = 1e9,
|
||
ν12 = 0.99, ν23 = 0.99, ν31 = 0.99,
|
||
)
|
||
end
|
||
end
|