little tuning of test, updated tests, @debug-macro, fixed notebook conversion to pdf

This commit is contained in:
Jukka Aho
2015-11-02 11:46:37 +02:00
parent f6ca82e3a1
commit 39241b514a
7 changed files with 304 additions and 164 deletions
+126 -108
View File
@@ -4,119 +4,146 @@
module FieldTests
using JuliaFEM
using JuliaFEM: Increment, TimeStep, Field, DefaultDiscreteField, FieldSet
using JuliaFEM: TemporalBasis, SpatialBasis, ContinuousField, DiscreteField
using JuliaFEM: DefaultContinuousField
using JuliaFEM.Test
""" testing Increment """
function test_increment()
function test_increment_constant_increment()
I = Increment(1)
@test isa(I, Increment)
@test length(I) == 1
@test I == 1
end
# constant increment
I3 = Increment(1)
@test isa(I3, Increment)
@test length(I3) == 1
# FIXME: i don't like 1-length arrays
@test I3 == [1]
# two increments with vector data
function test_increments_with_vector_data()
I1 = Increment([1, 2, 3])
I2 = Increment([2, 3, 4])
@test length(I1) == 3
@test length(I2) == 3
@test I1 == [1, 2, 3]
@test I2 == [2, 3, 4]
end
# basic math
function test_increments_basic_math()
I1 = Increment([1, 2, 3])
I2 = Increment([2, 3, 4])
@test 1/2*(I1+I2) == [1.5, 2.5, 3.5]
@test I1 + 1 == [2, 3, 4]
@test I1 - 1 == [0, 1, 2]
@test I1*3 == [3, 6, 9]
@test I1+I2 == [3, 5, 7]
end
# dot product
function test_increment_dot_product()
I1 = Increment([1, 2, 3])
I2 = Increment([2, 3, 4])
@test dot(I1, I2) == 20
@test dot([1,2,3], I2) == 20
@test dot(I1, [2,3,4]) == 20
@test dot([1, 2], Increment[I1, I2])
end
# similarity
f = zeros(Increment, 2, 4)
function test_increment_similarity()
f = zeros(Increment, Int, 2, 4)
@test length(f) == 4
g = similar(f, ones(8))
g = similar(f, ones(Int, 8))
@test typeof(f) == typeof(g)
@test length(f) == length(g)
@test size(g) == (2, 4)
end
# vec
@test vec(g) == ones(8)
function test_increment_vec()
g = zeros(Increment, Int, 2, 4)
@test vec(g) == ones(Int, 8)
end
# promotion
# FIXME: how to do promotion so that modified increment is still increment?
function test_increment_promotion()
I1 = Increment([1, 2, 3])
I2 = Increment([2, 3, 4])
@test isa(I1+1, Increment)
@test isa(I1-1, Increment)
@test isa(3*I1, Increment)
@test isa(1/2*I1, Increment)
@test isa(I1+I2, Increment)
@test isa(I1-I2, Increment)
end
""" testing TimeStep """
function test_timestep()
info("test_timestep(): create empty timestep")
function test_timestep_empty_timestep()
ts = TimeStep()
@test length(ts) == 0
@test ts.time == 0.0
end
info("create timestep with two increments")
function test_timestep_with_two_increments()
i1 = Increment([1, 2, 3])
i2 = Increment([2, 3, 4])
increments = Increment[i1, i2]
ts = TimeStep(1.0, increments)
@test length(ts) == 2
end
info("create timestep with scalar value")
function test_create_timestep_with_scalar_value()
ts = TimeStep(1)
@test length(ts) == 1
@test ts.time == 0.0
@test isa(ts[1], Increment)
@test ts[1] == [1]
end
info("create timestep compactly for time t=0.0")
function test_create_timestep_compactly_for_time_t0()
ts = TimeStep([1, 2, 3])
@test length(ts) == 1
@test ts.time == 0.0
@test isa(ts[1], Increment)
@test ts[1] == [1, 2, 3]
end
info("create timestep compactly, add three increments compactly for time t=0.0")
function test_create_timestep_compactly_add_three_increments_compactly_for_time_t0()
ts = TimeStep(1, 2, 3)
@test length(ts) == 3
@test ts.time == 0.0
@test isa(ts[1], Increment)
end
info("create timestep compactly, add two increments compactly for time t=0.0")
function test_create_timestep_compactly_add_two_increments()
ts = TimeStep([1, 2, 3], [2, 3, 4])
@test length(ts) == 2
@test ts.time == 0.0
@test isa(ts[1], Increment)
@test isa(ts[2], Increment)
@test ts[1] == [1, 2, 3]
@test ts[2] == [2, 3, 4]
end
info("create standard timesteps")
info(TimeStep(0.5, Increment([1, 2])))
function test_create_timesteps_for_different_times()
@test TimeStep(0.5, [1, 2]).time == 0.5
@test TimeStep(0.5, [1, 2]) == [1, 2]
@test TimeStep(0.5, 1).time == 0.5
@test TimeStep(0.5, 1) == [1]
end
""" testing DefaultDiscreteField """
function test_default_discrete_field()
function test_default_discrete_field_quick_way_vector()
f1 = DefaultDiscreteField([1, 2, 3])
@debug("f1 = $f1")
@test isa(f1[1], TimeStep)
@test isa(f1[1][1], Increment)
@test f1[1][1] == [1, 2, 3]
@test f1[1].time == 0.0
end
info("test_default_discrete_field(): the traditional way")
function test_default_discrete_field_quick_way_scalar()
f1 = DefaultDiscreteField(1)
@test length(f1) == 1
@test isa(f1[1], TimeStep)
@test isa(f1[1][1], Increment)
@test f1[1][1] == [1]
@test f1[1].time == 0.0
end
function test_default_discrete_field_traditional_way()
i1 = Increment([1, 2, 3])
i2 = Increment([2, 3, 4])
t1 = TimeStep(1.0, Increment[i1, i2])
@@ -133,16 +160,9 @@ function test_default_discrete_field()
@test f1[2][2] == [3, 4, 5]
@test f1[1].time == 1.0
@test f1[2].time == 2.0
end
info("test_default_discrete_field(): quick way, this creates one timestep with vector value")
f1 = DefaultDiscreteField([1, 2, 3])
info("f1 = $f1")
@test isa(f1[1], TimeStep)
@test isa(f1[1][1], Increment)
@test f1[1][1] == [1, 2, 3]
@test f1[1].time == 0.0
info("test_default_discrete_field(): quick way, two timesteps with constant value")
function test_default_discrete_field_quick_way_two_timesteps_with_constant_value()
f1 = DefaultDiscreteField(1, 2)
@test length(f1) == 2
@test isa(f1[1], TimeStep)
@@ -153,16 +173,9 @@ function test_default_discrete_field()
@test f1[2][1] == [2]
@test f1[1].time == 0.0
@test f1[2].time == 1.0
end
info("test_default_discrete_field(): quick way, one timestep with scalar value")
f1 = DefaultDiscreteField(1)
@test length(f1) == 1
@test isa(f1[1], TimeStep)
@test isa(f1[1][1], Increment)
@test f1[1][1] == [1]
@test f1[1].time == 0.0
info("test_default_discrete_field(): quick way, two timesteps with vector value")
function test_default_discrete_field_quick_way_two_timesteps_with_vector_value()
f1 = DefaultDiscreteField([1, 2, 3], [3, 4, 5])
@test length(f1) == 2
@test isa(f1[1], TimeStep)
@@ -173,8 +186,9 @@ function test_default_discrete_field()
@test f1[2][1] == [3, 4, 5]
@test f1[1].time == 0.0
@test f1[2].time == 1.0
end
info("test_default_discrete_field(): quick way, set time vector also")
function test_default_discrete_field_quick_way_set_time_vector_also()
f1 = DefaultDiscreteField( (0.5, [1, 2, 3]), (1.0, [3, 4, 5]) )
@test isa(f1[1], TimeStep)
@test isa(f1[2], TimeStep)
@@ -184,10 +198,8 @@ function test_default_discrete_field()
@test f1[2][1] == [3, 4, 5]
@test f1[1].time == 0.5
@test f1[2].time == 1.0
end
""" testing DefaultContinuousField """
function test_default_continuous_field()
function myfield(xi::Vector, time::Float64)
@@ -203,70 +215,81 @@ function test_default_continuous_field()
end
""" testing FieldSet """
function test_fieldset()
info("test_fieldset(): testing adding discrete field to FieldSet")
function test_add_discrete_field_to_fieldset()
fs = FieldSet()
fs["temperature"] = DefaultDiscreteField([1, 2, 3])
@test length(fs) == 1
@test fs["temperature"] == [1, 2, 3]
end
info("test_fieldset(): testing adding discrete fields quickly")
fs2 = FieldSet()
fs2["temperature"] = [1, 2, 3, 4]
@test fs2["temperature"][end][end] == [1, 2, 3, 4]
@test last(fs2["temperature"]) == [1, 2, 3, 4]
function test_adding_discrete_fields_to_fieldset_quickly()
fs = FieldSet()
fs["temperature"] = [1, 2, 3, 4]
@test fs["temperature"][end][end] == [1, 2, 3, 4]
@test last(fs["temperature"]) == [1, 2, 3, 4]
end
info("test_fieldset(): testing adding all kind of discrete fields")
fs2 = FieldSet()
fs2["constant scalar field"] = 1
fs2["scalar field"] = [1, 2, 3, 4]
fs2["vector field"] = reshape(collect(1:8), 2, 4)
fs2["second order tensor field"] = reshape(collect(1:3*3*4), 3, 3, 4)
fs2["fourth order tensor field"] = reshape(collect(1:3*3*3*3*4), 3, 3, 3, 3, 4)
timestep = fs2["vector field"][end]
@test timestep.time == 0.0
function test_adding_all_kind_of_fields_to_fieldset()
fs = FieldSet()
fs["constant scalar field"] = 1
fs["scalar field"] = [1, 2, 3, 4]
fs["vector field"] = reshape(collect(1:8), 2, 4)
fs["second order tensor field"] = reshape(collect(1:3*3*4), 3, 3, 4)
fs["fourth order tensor field"] = reshape(collect(1:3*3*3*3*4), 3, 3, 3, 3, 4)
timestep = fs["vector field"][end]
@test fs["vector field"][end].time == 0.0
end
info("test_fieldset(): testing adding timesteps")
function test_adding_timesteps()
fs = FieldSet()
fs["temperature"] = [1, 2, 3, 4]
T0 = last(fs["temperature"]) # last increment of last field
info("last temperature T0 = $T0")
@debug("last temperature T0 = $T0")
T1 = Increment(T0 + 1)
info("typeof T1 = $(typeof(T1))")
@debug("typeof T1 = $(typeof(T1))")
timestep = TimeStep(1.0, Increment[T1]) # new list of increments for timestep
push!(fs["temperature"], timestep)
T2 = last(fs["temperature"])
info("last temperature T2 = $T2")
@debug("last temperature T2 = $T2")
@test length(fs["temperature"]) == 2
@test last(fs["temperature"]) == [2, 3, 4, 5]
@test fs["temperature"][end].time == 1.0
end
info("test_fieldset(): testing adding timesteps compactly")
timestep = TimeStep(2.0, T1)
push!(fs["temperature"], timestep)
@test length(fs["temperature"].timesteps) == 3
function test_adding_timesteps_compactly()
fs = FieldSet()
fs["temperature"] = [1, 2, 3, 4]
T0 = last(fs["temperature"])
T1 = Increment(T0 + 1)
push!(fs["temperature"], TimeStep(1.0, T1))
@test length(fs["temperature"]) == 2
@test last(fs["temperature"]) == [2, 3, 4, 5]
@test fs["temperature"][end].time == 1.0
end
info("test_fieldset(): test adding several time steps at once without time vector")
fs3 = FieldSet()
fs3["time series 2"] = [1, 2, 3, 4], [2, 3, 4, 5]
info(fs3)
@test fs3["time series 2"][1].time == 0.0
@test fs3["time series 2"][2].time == 1.0
@test fs3["time series 2"][1][end] == [1, 2, 3, 4]
@test fs3["time series 2"][2][end] == [2, 3, 4, 5]
function test_add_several_timesteps_without_time_vector()
fs = FieldSet()
fs["time series"] = [1, 2, 3, 4], [2, 3, 4, 5]
@debug("fieldset = $fs")
@test fs["time series"][1].time == 0.0
@test fs["time series"][2].time == 1.0
@test fs["time series"][1][end] == [1, 2, 3, 4]
@test fs["time series"][2][end] == [2, 3, 4, 5]
end
info("test_fieldset(): test adding several time steps at once with time vector")
fs3 = FieldSet()
fs3["time series 1"] = (0.0, [1, 2, 3, 4]), (0.5, [2, 3, 4, 5])
@test fs3["time series 1"][1].time == 0.0
@test fs3["time series 1"][2].time == 0.5
@test fs3["time series 1"][1][end] == [1, 2, 3, 4]
@test fs3["time series 1"][2][end] == [2, 3, 4, 5]
function test_adding_several_timesteps_at_once_with_time_vector()
fs = FieldSet()
fs["time series"] = (0.0, [1, 2, 3, 4]), (0.5, [2, 3, 4, 5])
@test fs3["time series"][1].time == 0.0
@test fs3["time series"][2].time == 0.5
@test fs3["time series"][1][end] == [1, 2, 3, 4]
@test fs3["time series"][2][end] == [2, 3, 4, 5]
end
info("test_fieldset(): adding continuous field")
function test_adding_continuous_field_to_fieldset()
fs = FieldSet()
fs["continuous field"] = (xi, t) -> xi[1]*xi[2]*t
@test fs["continuous field"]([1.0, 2.0], 3.0) == 6.0
end
type MyContinuousField <: ContinuousField
@@ -275,12 +298,10 @@ type MyContinuousField <: ContinuousField
end
function Base.call(field::MyContinuousField, xi::Vector, time::Number=1.0)
data = last(field.discrete_field) # get the last timestep last increment
info("data = $data, typeof data = $(typeof(data))")
@debug("data = $data, typeof data = $(typeof(data))")
basis = time*field.basis(xi) # evaluate basis at point ξ.
sum([basis[i]*data[i] for i=1:length(data)]) # sum results
end
""" testing ContinuousField """
function test_continuous_field()
fs = FieldSet()
fs["discrete field"] = [1, 2, 3, 4]
@@ -292,9 +313,8 @@ function test_continuous_field()
fs["continuous field"] = MyContinuousField(basis, fs["discrete field"])
@test fs["continuous field"]([0.0, 0.0], 1.0) == 1/4*(1+2+3+4)
T0 = last(fs["discrete field"])
T1 = T0 + 1.0
ts = TimeStep(1.0, T1)
push!(fs["discrete field"], TimeStep(1.0, T0+1.0))
T1 = Increment(T0 + 1)
push!(fs["discrete field"], TimeStep(1.0, T1))
@test fs["continuous field"]([0.0, 0.0], 1.0) == 1/4*(2+3+4+5)
end
@@ -308,8 +328,6 @@ Base.last(field::MyDiscreteField) = Float64[field[i] for i=1:length(field)]
function Base.getindex(field::MyDiscreteField, idx::Int64)
field.continuous_field(field.discrete_points[idx])
end
""" testing DiscreteField """
function test_discrete_field()
fs = FieldSet()
fs["discrete field"] = [1, 2, 3, 4]