forked from gridap/GridapDistributed.jl
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTransientDistributedCellField.jl
More file actions
99 lines (82 loc) · 4.48 KB
/
TransientDistributedCellField.jl
File metadata and controls
99 lines (82 loc) · 4.48 KB
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# Transient Distributed CellField
abstract type TransientDistributedCellField <: DistributedCellDatum end
# Transient SingleField
struct TransientSingleFieldDistributedCellField{A} <: TransientDistributedCellField
cellfield::A
derivatives::Tuple
end
# Constructors
function TransientFETools.TransientCellField(single_field::DistributedSingleFieldFEFunction,derivatives::Tuple)
TransientSingleFieldDistributedCellField(single_field,derivatives)
end
function TransientFETools.TransientCellField(single_field::DistributedCellField,derivatives::Tuple)
TransientSingleFieldDistributedCellField(single_field,derivatives)
end
# Time derivative
function ∂t(f::TransientDistributedCellField)
cellfield, derivatives = first_and_tail(f.derivatives)
TransientCellField(cellfield,derivatives)
end
∂tt(f::TransientDistributedCellField) = ∂t(∂t(f))
# Integration related
function Fields.integrate(f::TransientDistributedCellField,b::DistributedMeasure)
integrate(f.cellfield,b)
end
# Differential Operations
Fields.gradient(f::TransientDistributedCellField) = gradient(f.cellfield)
Fields.∇∇(f::TransientDistributedCellField) = ∇∇(f.cellfield)
# Unary ops
for op in (:symmetric_part,:inv,:det,:abs,:abs2,:+,:-,:tr,:transpose,:adjoint,:grad2curl,:real,:imag,:conj)
@eval begin
($op)(a::TransientDistributedCellField) = ($op)(a.cellfield)
end
end
# Binary ops
for op in (:inner,:outer,:double_contraction,:+,:-,:*,:cross,:dot,:/)
@eval begin
($op)(a::TransientDistributedCellField,b::TransientDistributedCellField) = ($op)(a.cellfield,b.cellfield)
($op)(a::TransientDistributedCellField,b::DistributedCellField) = ($op)(a.cellfield,b)
($op)(a::DistributedCellField,b::TransientDistributedCellField) = ($op)(a,b.cellfield)
($op)(a::TransientDistributedCellField,b::Number) = ($op)(a.cellfield,b)
($op)(a::Number,b::TransientDistributedCellField) = ($op)(a,b.cellfield)
($op)(a::TransientDistributedCellField,b::Function) = ($op)(a.cellfield,b)
($op)(a::Function,b::TransientDistributedCellField) = ($op)(a,b.cellfield)
end
end
Base.broadcasted(f,a::TransientDistributedCellField,b::TransientDistributedCellField) = broadcasted(f,a.cellfield,b.cellfield)
Base.broadcasted(f,a::TransientDistributedCellField,b::DistributedCellField) = broadcasted(f,a.cellfield,b)
Base.broadcasted(f,a::DistributedCellField,b::TransientDistributedCellField) = broadcasted(f,a,b.cellfield)
Base.broadcasted(f,a::Number,b::TransientDistributedCellField) = broadcasted(f,a,b.cellfield)
Base.broadcasted(f,a::TransientDistributedCellField,b::Number) = broadcasted(f,a.cellfield,b)
Base.broadcasted(f,a::Function,b::TransientDistributedCellField) = broadcasted(f,a,b.cellfield)
Base.broadcasted(f,a::TransientDistributedCellField,b::Function) = broadcasted(f,a.cellfield,b)
Base.broadcasted(a::typeof(*),b::typeof(∇),f::TransientDistributedCellField) = broadcasted(a,b,f.cellfield)
Base.broadcasted(a::typeof(*),s::Fields.ShiftedNabla,f::TransientDistributedCellField) = broadcasted(a,s,f.cellfield)
dot(::typeof(∇),f::TransientDistributedCellField) = dot(∇,f.cellfield)
outer(::typeof(∇),f::TransientDistributedCellField) = outer(∇,f.cellfield)
outer(f::TransientDistributedCellField,::typeof(∇)) = outer(f.cellfield,∇)
cross(::typeof(∇),f::TransientDistributedCellField) = cross(∇,f.cellfield)
# Skeleton related
function Base.getproperty(f::TransientDistributedCellField, sym::Symbol)
if sym in (:⁺,:plus,:⁻, :minus)
derivatives = ()
cellfield = DistributedCellField(f.cellfield,sym)
for iderivative in f.derivatives
derivatives = (derivatives...,DistributedCellField(iderivative))
end
return TransientSingleFieldCellField(cellfield,derivatives)
else
return getfield(f, sym)
end
end
Base.propertynames(x::TransientDistributedCellField, private::Bool=false) = propertynames(x.cellfield, private)
for op in (:outer,:*,:dot)
@eval begin
($op)(a::TransientDistributedCellField,b::SkeletonPair{<:DistributedCellField}) = ($op)(a.cellfield,b)
($op)(a::SkeletonPair{<:DistributedCellField},b::TransientDistributedCellField) = ($op)(a,b.cellfield)
end
end
Arrays.evaluate!(cache,k::Operation,a::TransientDistributedCellField,b::SkeletonPair{<:DistributedCellField}) = evaluate!(cache,k,a.cellfield,b)
Arrays.evaluate!(cache,k::Operation,a::SkeletonPair{<:DistributedCellField},b::TransientDistributedCellField) = evaluate!(cache,k,a,b.cellfield)
CellData.jump(a::TransientDistributedCellField) = jump(a.cellfield)
CellData.mean(a::TransientDistributedCellField) = mean(a.cellfield)