test(materials): add orthotropic elasticity regression

This commit is contained in:
Jukka Aho
2026-05-09 18:39:17 +03:00
parent 33efbe2714
commit 08248d393c
@@ -0,0 +1,82 @@
# 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