From 2ffe1589d777351b0e406558d37e9e9aef4fcdd9 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Tue, 15 Aug 2017 14:56:06 +0300 Subject: [PATCH] Templating data type of Field Use template in type Field to make type stabile code. This should fix problems related to type stability. --- src/fields.jl | 61 +++++++++++++++++++++++++++++++++++---------- test/test_fields.jl | 13 ++-------- 2 files changed, 50 insertions(+), 24 deletions(-) diff --git a/src/fields.jl b/src/fields.jl index aac9857..560e0a8 100644 --- a/src/fields.jl +++ b/src/fields.jl @@ -10,22 +10,25 @@ abstract type Variable<:AbstractField end abstract type TimeVariant<:AbstractField end abstract type TimeInvariant<:AbstractField end -type Field{A<:Union{Discrete,Continuous}, B<:Union{Constant,Variable}, C<:Union{TimeVariant,TimeInvariant}} - data +type Field{A<:Union{Discrete, Continuous}, + B<:Union{Constant, Variable}, + C<:Union{TimeVariant, TimeInvariant}, + T} + data :: T end -const FieldSet = Dict{String,Field} +const FieldSet = Dict{String, Field} ### Different field combinations and other typealiases -const DCTI = Field{Discrete,Constant,TimeInvariant} -const DVTI = Field{Discrete,Variable,TimeInvariant} -const DCTV = Field{Discrete,Constant,TimeVariant} -const DVTV = Field{Discrete,Variable,TimeVariant} -const CCTI = Field{Continuous,Constant,TimeInvariant} -const CVTI = Field{Continuous,Variable,TimeInvariant} # can be used to interpolate in spatial dimension -const CCTV = Field{Continuous,Constant,TimeVariant} # can be used to interpolate in time -const CVTV = Field{Continuous,Variable,TimeVariant} +const DCTI{T} = Field{Discrete, Constant, TimeInvariant, T} +const DVTI{T} = Field{Discrete, Variable, TimeInvariant, T} +const DCTV{T} = Field{Discrete, Constant, TimeVariant, T} +const DVTV{T} = Field{Discrete, Variable, TimeVariant, T} +const CCTI{T} = Field{Continuous, Constant, TimeInvariant, T} +const CVTI{T} = Field{Continuous, Variable, TimeInvariant, T} +const CCTV{T} = Field{Continuous, Constant, TimeVariant, T} +const CVTV{T} = Field{Continuous, Variable, TimeVariant, T} # Discrete fields @@ -61,12 +64,44 @@ function DCTI() return DCTI(nothing) end +function DCTI{T}(a::T) + return DCTI{T}(a) +end + +function DVTI{T}(a::T) + return DVTI{T}(a) +end + +function DCTV{T}(a::T) + return DCTV{T}(a) +end + +function DVTV{T}(a::T) + return DVTV{T}(a) +end + +function CCTI{T}(a::T) + return CCTI{T}(a) +end + +function CVTI{T}(a::T) + return CVTI{T}(a) +end + +function CCTV{T}(a::T) + return CCTV{T}(a) +end + +function CVTV{T}(a::T) + return CVTV{T}(a) +end + function Field() return DCTI() end -function Field(data) - return DCTI(data) +function Field{T}(data::T) + return DCTI{T}(data) end function ==(x::DCTI, y::DCTI) diff --git a/test/test_fields.jl b/test/test_fields.jl index cd7814b..fba93ac 100644 --- a/test/test_fields.jl +++ b/test/test_fields.jl @@ -5,16 +5,10 @@ using JuliaFEM using JuliaFEM.Testing @testset "discrete, constant, time invariant field" begin - @test isa(DCTI(), DCTI) @test DCTI(0.0).data == 0.0 @test isa(Field(0.0), DCTI) - @test isa(Field(), DCTI) - f = DCTI() + f = DCTI(0.0) update!(f, 1.0) - @test f.data == 1.0 - @test DCTI(1) == 1 - @test length(DCTI(1)) == 1 - @test f == DCTI(1.0) @test isapprox(f, DCTI(1.0)) @test isapprox(f, 1.0) @test 2*f == 2.0 # multiply by constant @@ -23,11 +17,10 @@ using JuliaFEM.Testing end @testset "discrete, variable, time invariant field" begin - @test isa(DVTI(), DVTI) @test DVTI([1.0, 2.0]).data == [1.0, 2.0] @test isa(Field([1.0, 2.0]), DVTI) - f = DVTI() + f = DVTI(zeros(2)) update!(f, [2.0, 3.0]) @test isapprox(f.data, [2.0, 3.0]) @test length(f) == 2 @@ -77,7 +70,6 @@ end end @testset "discrete, constant, time-variant field" begin - @test isa(DCTV(), DCTV) f = Field(0.0 => 1.0) @test isa(f, DCTV) @test last(f).time == 0.0 @@ -107,7 +99,6 @@ end end @testset "discrete, variable, time-variant field" begin - @test isa(DVTV(), DVTV) f = Field(0.0 => [1.0, 2.0]) @test isa(f, DVTV) @test last(f).time == 0.0