test(elements): add interpolate_field_value regression

This commit is contained in:
Jukka Aho
2026-05-09 18:38:50 +03:00
parent b7c2fb4da7
commit 30b85ba7d6
@@ -0,0 +1,71 @@
# 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
uint_tuple(n::Int) = tuple([UInt(i) for i in 1:n]...)
# Regression coverage for the interpolate_field_value vector branch.
# Previously the @generated body referenced the function `quantity_type`
# instead of the local variable `Q`, so the elseif silently failed and
# the vector branch was unreachable. These tests would have errored out
# before the fix.
@testset "interpolate_field_value" begin
@testset "Scalar (Temperature) field" begin
S = @DOFSet{T::DOF{Temperature, Vertex}}
elem = Element{Tetrahedron{4}, Lagrange{1}, S, 4}(UInt(1), uint_tuple(4))
# Use a constant field; any interpolation must reproduce that value.
u_global = fill(2.5, 4)
ξ = Vec((0.25, 0.25, 0.25))
T_val = interpolate_field_value(elem, u_global, :T, ξ)
@test T_val isa Float64
@test T_val 2.5
@inferred interpolate_field_value(elem, u_global, :T, ξ)
end
@testset "Vector (Displacement{3}) field" begin
S = @DOFSet{u::DOF{Displacement{3}, Vertex}}
elem = Element{Tetrahedron{4}, Lagrange{1}, S, 12}(UInt(1), uint_tuple(12))
# Constant per-component values; vector interpolation must reproduce
# the per-component constant.
u_global = Float64[
1.0, 2.0, 3.0, # Node 1
1.0, 2.0, 3.0, # Node 2
1.0, 2.0, 3.0, # Node 3
1.0, 2.0, 3.0, # Node 4
]
ξ = Vec((0.25, 0.25, 0.25))
u_val = interpolate_field_value(elem, u_global, :u, ξ)
@test u_val isa Vec{3, Float64}
@test u_val Vec{3}((1.0, 2.0, 3.0))
@inferred interpolate_field_value(elem, u_global, :u, ξ)
end
@testset "Multi-field (T + u)" begin
S = @DOFSet{T::DOF{Temperature, Vertex}, u::DOF{Displacement{3}, Vertex}}
elem = Element{Tetrahedron{4}, Lagrange{1}, S, 16}(UInt(1), uint_tuple(16))
# First 4 entries are temperature, next 12 are displacement.
u_global = Float64[
5.0, 5.0, 5.0, 5.0,
0.5, 0.0, 0.0,
0.5, 0.0, 0.0,
0.5, 0.0, 0.0,
0.5, 0.0, 0.0,
]
ξ = Vec((0.25, 0.25, 0.25))
@test interpolate_field_value(elem, u_global, :T, ξ) 5.0
@test interpolate_field_value(elem, u_global, :u, ξ) Vec{3}((0.5, 0.0, 0.0))
@test_throws ErrorException interpolate_field_value(elem, u_global, :nope, ξ)
end
end