diff --git a/test/fields/test_local_field.jl b/test/fields/test_local_field.jl new file mode 100644 index 0000000..cb86f1a --- /dev/null +++ b/test/fields/test_local_field.jl @@ -0,0 +1,69 @@ +# This file is a part of JuliaFEM. +# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md + +using Test +using JuliaFEM +using Tensors + +@testset "LocalField" begin + @testset "Scalar field (Temperature)" begin + # Create temperature field at a point + T = 300.0 + ∇T = Vec{3}((1.0, 2.0, 3.0)) + Ṫ = 0.5 + ∇Ṫ = Vec{3}((0.1, 0.2, 0.3)) + + T_local = LocalField(T, ∇T, Ṫ, ∇Ṫ) + + @test T_local.value == 300.0 + @test T_local.gradient == Vec{3}((1.0, 2.0, 3.0)) + @test T_local.rate == 0.5 + @test T_local.gradient_rate == Vec{3}((0.1, 0.2, 0.3)) + + # Type stability + @test typeof(T_local) == LocalField{Float64, Vec{3,Float64}, Float64, Vec{3,Float64}} + end + + @testset "Vector field (Displacement)" begin + # Create displacement field at a point + u = Vec{3}((0.1, 0.2, 0.3)) + ∇u = Tensor{2,3}((1.0, 0.1, 0.0, + 0.1, 1.0, 0.0, + 0.0, 0.0, 1.0)) + u̇ = Vec{3}((0.01, 0.02, 0.03)) + ∇u̇ = Tensor{2,3}((0.001, 0.0, 0.0, + 0.0, 0.001, 0.0, + 0.0, 0.0, 0.001)) + + u_local = LocalField(u, ∇u, u̇, ∇u̇) + + @test u_local.value == u + @test u_local.gradient == ∇u + @test u_local.rate == u̇ + @test u_local.gradient_rate == ∇u̇ + + # Type stability + @test typeof(u_local) == LocalField{Vec{3,Float64}, Tensor{2,3,Float64,9}, Vec{3,Float64}, Tensor{2,3,Float64,9}} + end + + @testset "Quasi-static case (rate = 0)" begin + # Quasi-static: rate = 0, but gradient_rate is computed from increments + u = Vec{3}((0.1, 0.2, 0.3)) + ∇u = Tensor{2,3}((1.01, 0.0, 0.0, + 0.0, 1.02, 0.0, + 0.0, 0.0, 1.03)) + u̇ = zero(Vec{3}) # No velocity in quasi-static + ∇u̇ = Tensor{2,3}((0.01, 0.0, 0.0, + 0.0, 0.02, 0.0, + 0.0, 0.0, 0.03)) # Still computed from increment! + + u_local = LocalField(u, ∇u, u̇, ∇u̇) + + @test u_local.value == u + @test u_local.rate == zero(Vec{3}) + @test u_local.gradient_rate ≠ zero(Tensor{2,3}) # Gradient rate is NOT zero! + end + + # NOTE: create_local_field_namedtuple() was removed - use interpolate_local_fields() instead + # See test/elements/test_interpolate_local_fields.jl for the real implementation tests +end