src/Gradient.jl

Fri, 23 Oct 2020 18:00:53 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Fri, 23 Oct 2020 18:00:53 -0500
changeset 45
097f95638dba
parent 8
c5aabb2c41d9
permissions
-rw-r--r--

Indirect dependency workarounds

0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 ########################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2 # Discretised gradients
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3 ########################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4
7
ab7d59b47140 Add __precompile__() for whatever it is worth
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
5 __precompile__()
ab7d59b47140 Add __precompile__() for whatever it is worth
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
6
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7 module Gradient
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
8
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9 ##############
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10 # Our exports
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11 ##############
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13 export ∇₂!, ∇₂ᵀ!, ∇₂fold!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 ∇₂_norm₂₂_est, ∇₂_norm₂₂_est²,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 ∇₂_norm₂∞_est, ∇₂_norm₂∞_est²,
4
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
16 ∇₂c!, ∇₂cfold!,
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 ∇₃!, ∇₃ᵀ!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 vec∇₃!, vec∇₃ᵀ!
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20 ##################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 # Helper routines
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 ##################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 @inline function imfold₂′!(f_aa!, f_a0!, f_ab!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 f_0a!, f_00!, f_0b!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 f_ba!, f_b0!, f_bb!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 n, m, state)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 # First row
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 state = f_aa!(state, (1, 1))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 for j = 2:m-1
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 state = f_a0!(state, (1, j))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33 state = f_ab!(state, (1, m))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35 # Middle rows
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 for i=2:n-1
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 state = f_0a!(state, (i, 1))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 for j = 2:m-1
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 state = f_00!(state, (i, j))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 state = f_0b!(state, (i, m))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 # Last row
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45 state = f_ba!(state, (n, 1))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 for j =2:m-1
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47 state = f_b0!(state, (n, j))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49 return f_bb!(state, (n, m))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52 #########################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53 # 2D forward differences
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54 #########################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 ∇₂_norm₂₂_est² = 8
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
57 ∇₂_norm₂₂_est = √∇₂_norm₂₂_est²
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
58 ∇₂_norm₂∞_est² = 2
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
59 ∇₂_norm₂∞_est = √∇₂_norm₂∞_est²
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
60
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
61 function ∇₂!(u₁, u₂, u)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
62 @. @views begin
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63 u₁[1:(end-1), :] = u[2:end, :] - u[1:(end-1), :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64 u₁[end, :, :] = 0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
65
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
66 u₂[:, 1:(end-1)] = u[:, 2:end] - u[:, 1:(end-1)]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67 u₂[:, end] = 0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69 return u₁, u₂
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72 function ∇₂!(v, u)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
73 ∇₂!(@view(v[1, :, :]), @view(v[2, :, :]), u)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
76 @inline function ∇₂fold!(f!::Function, u, state)
8
c5aabb2c41d9 More strongly hint @inline
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
77 @inline function g!(state, pt)
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
78 (i, j) = pt
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79 g = @inbounds [u[i+1, j]-u[i, j], u[i, j+1]-u[i, j]]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
80 return f!(g, state, pt)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81 end
8
c5aabb2c41d9 More strongly hint @inline
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
82 @inline function gr!(state, pt)
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
83 (i, j) = pt
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
84 g = @inbounds [u[i+1, j]-u[i, j], 0.0]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
85 return f!(g, state, pt)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
86 end
8
c5aabb2c41d9 More strongly hint @inline
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
87 @inline function gb!(state, pt)
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
88 (i, j) = pt
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
89 g = @inbounds [0.0, u[i, j+1]-u[i, j]]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
90 return f!(g, state, pt)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
91 end
8
c5aabb2c41d9 More strongly hint @inline
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
92 @inline function g0!(state, pt)
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
93 return f!([0.0, 0.0], state, pt)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
94 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
95 return imfold₂′!(g!, g!, gr!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
96 g!, g!, gr!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
97 gb!, gb!, g0!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
98 size(u, 1), size(u, 2), state)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
99 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
100
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
101 function ∇₂ᵀ!(v, v₁, v₂)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
102 @. @views begin
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
103 v[2:(end-1), :] = v₁[1:(end-2), :] - v₁[2:(end-1), :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
104 v[1, :] = -v₁[1, :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
105 v[end, :] = v₁[end-1, :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
106
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
107 v[:, 2:(end-1)] += v₂[:, 1:(end-2)] - v₂[:, 2:(end-1)]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
108 v[:, 1] += -v₂[:, 1]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
109 v[:, end] += v₂[:, end-1]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
110 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
111 return v
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
112 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
113
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
114 function ∇₂ᵀ!(u, v)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
115 ∇₂ᵀ!(u, @view(v[1, :, :]), @view(v[2, :, :]))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
116 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
117
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118 ##################################################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
119 # 2D central differences (partial implementation)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
120 ##################################################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
121
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
122 function ∇₂c!(v, u)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
123 @. @views begin
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
124 v[1, 2:(end-1), :] = (u[3:end, :] - u[1:(end-2), :])/2
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
125 v[1, end, :] = (u[end, :] - u[end-1, :])/2
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
126 v[1, 1, :] = (u[2, :] - u[1, :])/2
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
127
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
128 v[2, :, 2:(end-1)] = (u[:, 3:end] - u[:, 1:(end-2)])/2
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
129 v[2, :, end] = (u[:, end] - u[:, end-1])/2
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
130 v[2, :, 1] = (u[:, 2] - u[:, 1])/2
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
131 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
132 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
133
4
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
134 @inline function ∇₂cfold!(f!::Function, u, state)
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
135 n, m = size(u)
8
c5aabb2c41d9 More strongly hint @inline
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
136 @inline function g!(state, pt)
4
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
137 (i, j) = pt
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
138 g = @inbounds [(u[i+1, j]-u[i-1, j])/2, (u[i, j+1]-u[i, j-1])/2]
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
139 return f!(g, state, pt)
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
140 end
8
c5aabb2c41d9 More strongly hint @inline
Tuomo Valkonen <tuomov@iki.fi>
parents: 7
diff changeset
141 @inline function gb!(state, pt)
4
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
142 (i, j) = pt
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
143 g = @inbounds [(u[min(i+1,n), j]-u[max(i-1,1), j])/2,
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
144 (u[i, min(j+1,m)]-u[i, max(j-1,1)])/2]
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
145 return f!(g, state, pt)
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
146 end
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
147 return imfold₂′!(gb!, gb!, gb!,
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
148 gb!, g!, gb!,
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
149 gb!, gb!, gb!,
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
150 size(u, 1), size(u, 2), state)
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
151 end
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
152
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
153 #########################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
154 # 3D forward differences
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
155 #########################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
156
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
157 function ∇₃!(u₁,u₂,u₃,u)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
158 @. @views begin
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
159 u₁[1:(end-1), :, :] = u[2:end, :, :] - u[1:(end-1), :, :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
160 u₁[end, :, :] = 0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
161
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
162 u₂[:, 1:(end-1), :] = u[:, 2:end, :] - u[:, 1:(end-1), :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
163 u₂[:, end, :] = 0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
164
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
165 u₃[:, :, 1:(end-1)] = u[:, :, 2:end] - u[:, :, 1:(end-1)]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
166 u₃[:, :, end] = 0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
167 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
168 return u₁, u₂, u₃
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
169 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
170
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
171 function ∇₃ᵀ!(v,v₁,v₂,v₃)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
172 @. @views begin
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
173 v[2:(end-1), :, :] = v₁[1:(end-2), :, :] - v₁[2:(end-1), :, :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
174 v[1, :, :] = -v₁[1, :, :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
175 v[end, :, :] = v₁[end-1, :, :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
176
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
177 v[:, 2:(end-1), :] += v₂[:, 1:(end-2), :] - v₂[:, 2:(end-1), :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
178 v[:, 1, :] += -v₂[:, 1, :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
179 v[:, end, :] += v₂[:, end-1, :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
180
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
181 v[:, :, 2:(end-1)] += v₃[:, :, 1:(end-2)] - v₃[:, :, 2:(end-1)]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
182 v[:, :, 1] += -v₃[:, :, 1]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
183 v[:, :, end] += v₃[:, :, end-1]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
184 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
185 return v
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
186 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
187
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
188 ###########################################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
189 # 3D forward differences for vector fields
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
190 ###########################################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
191
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
192 function vec∇₃!(u₁,u₂,u₃,u)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
193 @. @views for j=1:size(u, 1)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
194 ∇₃!(u₁[j, :, :, :],u₂[j, :, :, :],u₃[j, :, :, :],u[j, :, :, :])
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
195 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
196 return u₁, u₂, u₃
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
197 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
198
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
199 function vec∇₃ᵀ!(u,v₁,v₂,v₃)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
200 @. @views for j=1:size(u, 1)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
201 ∇₃ᵀ!(u[j, :, :, :],v₁[j, :, :, :],v₂[j, :, :, :],v₃[j, :, :, :])
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
202 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
203 return u
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
204 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
205
5
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
206 #####################################################
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
207 # Precompilation hints to speed up compilation time
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
208 # for projects depending on this package (hopefully).
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
209 ######################################################
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
210
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
211 precompile(∇₂!, (Array{Float64,2}, Array{Float64,2}, Array{Float64,2}))
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
212 precompile(∇₂!, (Array{Float64,3}, Array{Float64,2}))
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
213 precompile(∇₂ᵀ!, (Array{Float64,2}, Array{Float64,2}, Array{Float64,2}))
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
214 precompile(∇₂ᵀ!, (Array{Float64,2}, Array{Float64,3}))
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
215 precompile(∇₂c!, (Array{Float64,3}, Array{Float64,2}))
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
216 precompile(∇₃!, (Array{Float64,3}, Array{Float64,3}, Array{Float64,3},Array{Float64,3}))
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
217 precompile(∇₃ᵀ!, (Array{Float64,3}, Array{Float64,3}, Array{Float64,3},Array{Float64,3}))
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
218 precompile(vec∇₃!, (Array{Float64,4}, Array{Float64,4}, Array{Float64,4},Array{Float64,4}))
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
219 precompile(vec∇₃ᵀ!, (Array{Float64,4}, Array{Float64,4}, Array{Float64,4},Array{Float64,4}))
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
220
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
221 # The folding functions cannot be precompiled as theyre' meant to be (hopefully)
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
222 # inlined in such a way that the parameter function also gets inlined withou our
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
223 # code
29b38780d52b Add precompilation hints. Do they help or not?
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
224
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
225 end # Module

mercurial