Templating data type of Field

Use template in type Field to make type stabile code. This should fix
problems related to type stability.
This commit is contained in:
Jukka Aho
2017-08-15 14:56:06 +03:00
parent 0ec0b8ddef
commit 2ffe1589d7
2 changed files with 50 additions and 24 deletions
+48 -13
View File
@@ -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)
+2 -11
View File
@@ -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