mirror of
https://github.com/JuliaFEM/JuliaFEM.jl.git
synced 2026-09-23 11:02:36 +00:00
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:
+48
-13
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user