Files
JuliaFEM.jl/test/materials/test_orthotropic_linear_elastic.jl

83 lines
2.9 KiB
Julia
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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