mirror of
https://github.com/JuliaFEM/JuliaFEM.jl.git
synced 2026-08-16 02:24:05 +00:00
2ffe1589d7
Use template in type Field to make type stabile code. This should fix problems related to type stability.
176 lines
4.9 KiB
Julia
176 lines
4.9 KiB
Julia
# This file is a part of JuliaFEM.
|
|
# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE.md
|
|
|
|
using JuliaFEM
|
|
using JuliaFEM.Testing
|
|
|
|
@testset "discrete, constant, time invariant field" begin
|
|
@test DCTI(0.0).data == 0.0
|
|
@test isa(Field(0.0), DCTI)
|
|
f = DCTI(0.0)
|
|
update!(f, 1.0)
|
|
@test isapprox(f, DCTI(1.0))
|
|
@test isapprox(f, 1.0)
|
|
@test 2*f == 2.0 # multiply by constant
|
|
@test f(1.0) == 1.0 # time interpolation
|
|
@test isapprox(reshape([2.0],1,1)*f, 2.0) # wanted behavior?
|
|
end
|
|
|
|
@testset "discrete, variable, time invariant field" begin
|
|
@test DVTI([1.0, 2.0]).data == [1.0, 2.0]
|
|
@test isa(Field([1.0, 2.0]), DVTI)
|
|
|
|
f = DVTI(zeros(2))
|
|
update!(f, [2.0, 3.0])
|
|
@test isapprox(f.data, [2.0, 3.0])
|
|
@test length(f) == 2
|
|
|
|
# slicing
|
|
@test isapprox(f[1], 2.0)
|
|
@test isapprox(f[[1, 2]], [2.0, 3.0])
|
|
|
|
# boolean comparison and multiplying by a constant
|
|
@test f == DVTI([2.0, 3.0])
|
|
@test isapprox(2*f, [4.0, 6.0])
|
|
|
|
f3 = 2*f
|
|
@test isa(f3, DVTI)
|
|
@test f3+f == 3*f
|
|
@test f3-f == f
|
|
|
|
# spatial interpolation
|
|
N = [1.0, 2.0]
|
|
@test isapprox(N*f, 8.0)
|
|
|
|
# time interpolation
|
|
@test isapprox(f(1.0), [2.0, 3.0])
|
|
|
|
# spatial interpolation of vector valued variable field
|
|
f2 = DVTI(Vector[[1.0, 2.0], [3.0, 4.0]])
|
|
@test isapprox(f2[1], [1.0, 2.0])
|
|
@test isapprox(f2[2], [3.0, 4.0])
|
|
@test length(f2) == 2
|
|
@test isapprox(N*f2, [1.0, 2.0] + [6.0, 8.0])
|
|
|
|
# iteration of DVTI field
|
|
s = zeros(2)
|
|
for j in f2
|
|
s += j
|
|
end
|
|
@test isapprox(s, [4.0, 6.0])
|
|
|
|
@test vec(f2) == [1.0, 2.0, 3.0, 4.0]
|
|
@test isapprox([1.0 2.0]*f, [8.0]'')
|
|
|
|
new_data = [2.0, 3.0, 4.0, 5.0]
|
|
f4 = similar(f2, new_data)
|
|
@test isa(f4, DVTI)
|
|
@test isapprox(f4.data[1], [2.0, 3.0])
|
|
@test isapprox(f4.data[2], [4.0, 5.0])
|
|
end
|
|
|
|
@testset "discrete, constant, time-variant field" begin
|
|
f = Field(0.0 => 1.0)
|
|
@test isa(f, DCTV)
|
|
@test last(f).time == 0.0
|
|
@test last(f).data == 1.0
|
|
update!(f, 0.0 => 2.0)
|
|
@test last(f).time == 0.0
|
|
@test last(f).data == 2.0
|
|
@test length(f) == 1
|
|
update!(f, 1.0 => 3.0)
|
|
@test last(f).time == 1.0
|
|
@test last(f).data == 3.0
|
|
@test length(f) == 2
|
|
|
|
@testset "interpolation in time direction" begin
|
|
@test isa(f(0.0), DCTI) # converts to time-invariant after time interpolation
|
|
@test isapprox(f(-1.0), 2.0)
|
|
@test isapprox(f(0.0), 2.0)
|
|
@test isapprox(f(0.5), 2.5)
|
|
@test isapprox(f(1.0), 3.0)
|
|
@test isapprox(f(2.0), 3.0)
|
|
end
|
|
|
|
# create several time steps at once
|
|
f = DCTV(0.0 => 1.0, 1.0 => 2.0)
|
|
@test isapprox(f(0.5), 1.5)
|
|
|
|
end
|
|
|
|
@testset "discrete, variable, time-variant field" begin
|
|
f = Field(0.0 => [1.0, 2.0])
|
|
@test isa(f, DVTV)
|
|
@test last(f).time == 0.0
|
|
@test last(f).data == [1.0, 2.0]
|
|
update!(f, 0.0 => [2.0, 3.0])
|
|
@test last(f).time == 0.0
|
|
@test last(f).data == [2.0, 3.0]
|
|
@test length(f) == 1
|
|
update!(f, 1.0 => [3.0, 4.0])
|
|
@test last(f).time == 1.0
|
|
@test last(f).data == [3.0, 4.0]
|
|
@test length(f) == 2
|
|
|
|
@testset "interpolation in time direction" begin
|
|
@test isa(f(0.0), DVTI) # converts to time-invariant after time interpolation
|
|
@test isapprox(f(-1.0), [2.0, 3.0])
|
|
@test isapprox(f(0.0), [2.0, 3.0])
|
|
@test isapprox(f(0.5), [2.5, 3.5])
|
|
@test isapprox(f(1.0), [3.0, 4.0])
|
|
@test isapprox(f(2.0), [3.0, 4.0])
|
|
end
|
|
|
|
# create several time steps at once
|
|
f = DVTV(0.0 => [1.0, 2.0], 1.0 => [2.0, 3.0])
|
|
@test isapprox(f(0.5), [1.5, 2.5])
|
|
end
|
|
|
|
@testset "continuous, constant, time-invariant field" begin
|
|
f = Field(() -> 2.0)
|
|
@test isapprox(f([1.0], 2.0), 2.0)
|
|
|
|
end
|
|
|
|
@testset "continuous, constant, time variant field" begin
|
|
f = Field((time::Float64) -> 2.0*time)
|
|
@test isapprox(f([1.0], 2.0), 4.0)
|
|
|
|
end
|
|
|
|
@testset "continuous, variable, time invariant field" begin
|
|
f = Field((xi::Vector) -> sum(xi))
|
|
@test isapprox(f([1.0, 2.0], 2.0), 3.0)
|
|
end
|
|
|
|
@testset "continuous, variable, time variant field" begin
|
|
f = Field((xi::Vector, t::Float64) -> xi[1]*t)
|
|
@test isapprox(f([1.0], 2.0), 2.0)
|
|
end
|
|
|
|
@testset "unknown function argument for continuous field" begin
|
|
@test_throws ErrorException Field((a, b, c) -> a*b*c)
|
|
end
|
|
|
|
@testset "dictionary fields" begin
|
|
f1 = Dict{Int64, Vector{Float64}}(1 => [0.0, 0.0], 2 => [0.0, 0.0])
|
|
f2 = Dict{Int64, Vector{Float64}}(1 => [1.0, 1.0], 2 => [1.0, 1.0])
|
|
f = Field(0.0 => f1, 1.0 => f2)
|
|
@test isa(f, DVTV)
|
|
@test isapprox(f(0.0)[1], [0.0, 0.0])
|
|
@test isapprox(f(1.0)[2], [1.0, 1.0])
|
|
|
|
f = Field(0.0 => f1)
|
|
update!(f, 1.0 => f2)
|
|
@test isa(f, DVTV)
|
|
@test isapprox(f(0.0)[1], [0.0, 0.0])
|
|
@test isapprox(f(1.0)[2], [1.0, 1.0])
|
|
|
|
f = Field(f1)
|
|
@test isapprox(f(0.0)[1], [0.0, 0.0])
|
|
@test isapprox(f[1], [0.0, 0.0])
|
|
|
|
f = Field(f1)
|
|
@test isa(f, DVTI)
|
|
end
|