src/Gradient.jl

Mon, 18 Nov 2019 18:21:00 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Mon, 18 Nov 2019 18:21:00 -0500
changeset 4
5c0f579a5d0f
parent 0
eef71dd7202b
child 5
29b38780d52b
permissions
-rw-r--r--

Added central differences fold

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
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5 module Gradient
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
6
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7 ##############
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
8 # Our exports
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9 ##############
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11 export ∇₂!, ∇₂ᵀ!, ∇₂fold!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12 ∇₂_norm₂₂_est, ∇₂_norm₂₂_est²,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13 ∇₂_norm₂∞_est, ∇₂_norm₂∞_est²,
4
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
14 ∇₂c!, ∇₂cfold!,
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 ∇₃!, ∇₃ᵀ!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16 vec∇₃!, vec∇₃ᵀ!
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 ##################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19 # Helper routines
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20 ##################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 @inline function imfold₂′!(f_aa!, f_a0!, f_ab!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23 f_0a!, f_00!, f_0b!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 f_ba!, f_b0!, f_bb!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 n, m, state)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 # First row
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 state = f_aa!(state, (1, 1))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 for j = 2:m-1
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 state = f_a0!(state, (1, j))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 state = f_ab!(state, (1, m))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33 # Middle rows
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 for i=2:n-1
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35 state = f_0a!(state, (i, 1))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 for j = 2:m-1
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 state = f_00!(state, (i, j))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 state = f_0b!(state, (i, m))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 # Last row
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43 state = f_ba!(state, (n, 1))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 for j =2:m-1
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45 state = f_b0!(state, (n, j))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47 return f_bb!(state, (n, m))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 #########################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 # 2D forward differences
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52 #########################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54 ∇₂_norm₂₂_est² = 8
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55 ∇₂_norm₂₂_est = √∇₂_norm₂₂_est²
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 ∇₂_norm₂∞_est² = 2
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
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
59 function ∇₂!(u₁, u₂, u)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
60 @. @views begin
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
61 u₁[1:(end-1), :] = u[2:end, :] - u[1:(end-1), :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
62 u₁[end, :, :] = 0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64 u₂[:, 1:(end-1)] = u[:, 2:end] - u[:, 1:(end-1)]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
65 u₂[:, end] = 0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
66 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67 return u₁, u₂
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 function ∇₂!(v, u)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71 ∇₂!(@view(v[1, :, :]), @view(v[2, :, :]), u)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
73
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74 @inline function ∇₂fold!(f!::Function, u, state)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75 g! = (state, pt) -> begin
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
76 (i, j) = pt
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
77 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
78 return f!(g, state, pt)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
80 gr! = (state, pt) -> begin
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81 (i, j) = pt
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
82 g = @inbounds [u[i+1, j]-u[i, j], 0.0]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
83 return f!(g, state, pt)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
84 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
85 gb! = (state, pt) -> begin
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
86 (i, j) = pt
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
87 g = @inbounds [0.0, u[i, j+1]-u[i, j]]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
88 return f!(g, state, pt)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
89 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
90 g0! = (state, pt) -> begin
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
91 return f!([0.0, 0.0], state, pt)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
92 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
93 return imfold₂′!(g!, g!, gr!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
94 g!, g!, gr!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
95 gb!, gb!, g0!,
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
96 size(u, 1), size(u, 2), state)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
97 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
98
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
99 function ∇₂ᵀ!(v, v₁, v₂)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
100 @. @views begin
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
101 v[2:(end-1), :] = v₁[1:(end-2), :] - v₁[2:(end-1), :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
102 v[1, :] = -v₁[1, :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
103 v[end, :] = v₁[end-1, :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
104
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
105 v[:, 2:(end-1)] += v₂[:, 1:(end-2)] - v₂[:, 2:(end-1)]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
106 v[:, 1] += -v₂[:, 1]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
107 v[:, end] += v₂[:, end-1]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
108 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
109 return v
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
110 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
111
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
112 function ∇₂ᵀ!(u, v)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
113 ∇₂ᵀ!(u, @view(v[1, :, :]), @view(v[2, :, :]))
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
114 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
115
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
116 ##################################################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
117 # 2D central differences (partial implementation)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118 ##################################################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
119
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
120 function ∇₂c!(v, u)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
121 @. @views begin
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
122 v[1, 2:(end-1), :] = (u[3:end, :] - u[1:(end-2), :])/2
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
123 v[1, end, :] = (u[end, :] - u[end-1, :])/2
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
124 v[1, 1, :] = (u[2, :] - u[1, :])/2
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
125
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
126 v[2, :, 2:(end-1)] = (u[:, 3:end] - u[:, 1:(end-2)])/2
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
127 v[2, :, end] = (u[:, end] - u[:, end-1])/2
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
128 v[2, :, 1] = (u[:, 2] - u[:, 1])/2
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
129 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
130 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
131
4
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
132 @inline function ∇₂cfold!(f!::Function, u, state)
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
133 n, m = size(u)
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
134 g! = (state, pt) -> begin
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
135 (i, j) = pt
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
136 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
137 return f!(g, state, pt)
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
138 end
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
139 gb! = (state, pt) -> begin
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
140 (i, j) = pt
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
141 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
142 (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
143 return f!(g, state, pt)
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
144 end
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
145 return imfold₂′!(gb!, gb!, gb!,
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
146 gb!, g!, gb!,
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
147 gb!, gb!, gb!,
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
148 size(u, 1), size(u, 2), state)
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
149 end
5c0f579a5d0f Added central differences fold
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
150
0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
151 #########################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
152 # 3D forward differences
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
153 #########################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
154
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
155 function ∇₃!(u₁,u₂,u₃,u)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
156 @. @views begin
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
157 u₁[1:(end-1), :, :] = u[2:end, :, :] - u[1:(end-1), :, :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
158 u₁[end, :, :] = 0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
159
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
160 u₂[:, 1:(end-1), :] = u[:, 2:end, :] - u[:, 1:(end-1), :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
161 u₂[:, end, :] = 0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
162
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
163 u₃[:, :, 1:(end-1)] = u[:, :, 2:end] - u[:, :, 1:(end-1)]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
164 u₃[:, :, end] = 0
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
165 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
166 return u₁, u₂, u₃
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
167 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
168
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
169 function ∇₃ᵀ!(v,v₁,v₂,v₃)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
170 @. @views begin
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
171 v[2:(end-1), :, :] = v₁[1:(end-2), :, :] - v₁[2:(end-1), :, :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
172 v[1, :, :] = -v₁[1, :, :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
173 v[end, :, :] = v₁[end-1, :, :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
174
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
175 v[:, 2:(end-1), :] += v₂[:, 1:(end-2), :] - v₂[:, 2:(end-1), :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
176 v[:, 1, :] += -v₂[:, 1, :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
177 v[:, end, :] += v₂[:, end-1, :]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
178
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
179 v[:, :, 2:(end-1)] += v₃[:, :, 1:(end-2)] - v₃[:, :, 2:(end-1)]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
180 v[:, :, 1] += -v₃[:, :, 1]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
181 v[:, :, end] += v₃[:, :, end-1]
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
182 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
183 return v
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
184 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
185
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
186 ###########################################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
187 # 3D forward differences for vector fields
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
188 ###########################################
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
189
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
190 function vec∇₃!(u₁,u₂,u₃,u)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
191 @. @views for j=1:size(u, 1)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
192 ∇₃!(u₁[j, :, :, :],u₂[j, :, :, :],u₃[j, :, :, :],u[j, :, :, :])
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
193 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
194 return u₁, u₂, u₃
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
195 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
196
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
197 function vec∇₃ᵀ!(u,v₁,v₂,v₃)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
198 @. @views for j=1:size(u, 1)
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
199 ∇₃ᵀ!(u[j, :, :, :],v₁[j, :, :, :],v₂[j, :, :, :],v₃[j, :, :, :])
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
200 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
201 return u
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
202 end
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
203
eef71dd7202b Initialise
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
204 end # Module

mercurial