-
Notifications
You must be signed in to change notification settings - Fork 100
/
Copy pathQPointCellFields.jl
74 lines (59 loc) · 1.83 KB
/
QPointCellFields.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
"""
"""
function QPointCellField(value::Number,trian::Triangulation,quad::CellQuadrature)
q = get_coordinates(quad)
v_q = [ fill(value,size(qi)) for qi in q ]
array = ArrayOfEvaluatedFields(v_q,q)
cell_map = get_cell_map(trian)
GenericCellField(array, cell_map)
end
"""
"""
function CellField(value::Number,trian::Triangulation,quad::CellQuadrature)
QPointCellField(value,trian,quad)
end
struct EvaluatedField{A<:AbstractArray,P<:AbstractArray} <:Field
array::A
points::P
end
function field_cache(f::EvaluatedField,x)
nothing
end
function evaluate_field!(cache,f::EvaluatedField,x)
@assert length(x) == length(f.array)
@assert x === f.points || x == f.points
f.array
end
struct ArrayOfEvaluatedFields{T,N,A,B} <: AbstractArray{EvaluatedField{T},N}
array::A
points::B
function ArrayOfEvaluatedFields(array::AbstractArray{T,N},points::AbstractArray) where {T<:AbstractArray,N}
A = typeof(array)
B = typeof(points)
new{T,N,A,B}(array,points)
end
end
Base.size(a::ArrayOfEvaluatedFields) = size(a.array)
Base.IndexStyle(::Type{<:ArrayOfEvaluatedFields{T,N,A}}) where {T,N,A} = IndexStyle(A)
@inline function Base.getindex(a::ArrayOfEvaluatedFields,i::Integer)
EvaluatedField(a.array[i],a.points[i])
end
@inline function Base.getindex(a::ArrayOfEvaluatedFields{T,N},i::Vararg{Int,N}) where {T,N}
EvaluatedField(a.array[i...],a.points[i...])
end
function array_cache(a::ArrayOfEvaluatedFields)
ca = array_cache(a.array)
cp = array_cache(a.points)
(ca,cp)
end
@inline function getindex!(cache,a::ArrayOfEvaluatedFields,i...)
ca, cp = cache
array = getindex!(ca,a.array,i...)
points = getindex!(ca,a.points,i...)
EvaluatedField(array,points)
end
function evaluate_field_array(a::ArrayOfEvaluatedFields,x::AbstractArray)
@assert a.points === x || a.points == x
@assert length(a) == length(x)
a.array
end