@@ -125,28 +125,57 @@ UniformStokesDrift with parameters (uˢ=0.005, h=20):
125
125
UniformStokesDrift (; ∂z_uˢ= zerofunction, ∂z_vˢ= zerofunction, ∂t_uˢ= zerofunction, ∂t_vˢ= zerofunction, parameters= nothing ) =
126
126
UniformStokesDrift (∂z_uˢ, ∂z_vˢ, ∂t_uˢ, ∂t_vˢ, parameters)
127
127
128
+ function UniformStokesDrift (grid:: AbstractGrid ;
129
+ ∂z_uˢ = Field {Nothing, Nothing, Face} (grid),
130
+ ∂z_vˢ = Field {Nothing, Nothing, Face} (grid),
131
+ ∂t_uˢ = Field {Nothing, Nothing, Center} (grid),
132
+ ∂t_vˢ = Field {Nothing, Nothing, Center} (grid),
133
+ parameters = nothing )
134
+
135
+ return UniformStokesDrift (∂z_uˢ, ∂z_vˢ, ∂t_uˢ, ∂t_vˢ, parameters)
136
+ end
137
+
128
138
const USD = UniformStokesDrift
129
139
const USDnoP = UniformStokesDrift{<: Nothing }
130
- const f = Face ()
131
140
const c = Center ()
141
+ const f = Face ()
132
142
133
- @inline ∂t_uˢ (i, j, k, grid, sw:: USD , time) = sw.∂t_uˢ (znode (k, grid, c), time, sw. parameters)
134
- @inline ∂t_vˢ (i, j, k, grid, sw:: USD , time) = sw.∂t_vˢ (znode (k, grid, c), time, sw. parameters)
135
- @inline ∂t_wˢ (i, j, k, grid, sw:: USD , time) = zero (grid)
136
-
137
- @inline x_curl_Uˢ_cross_U (i, j, k, grid, sw:: USD , U, time) = ℑxzᶠᵃᶜ (i, j, k, grid, U. w) * sw.∂z_uˢ (znode (k, grid, c), time, sw. parameters)
138
- @inline y_curl_Uˢ_cross_U (i, j, k, grid, sw:: USD , U, time) = ℑyzᵃᶠᶜ (i, j, k, grid, U. w) * sw.∂z_vˢ (znode (k, grid, c), time, sw. parameters)
139
- @inline z_curl_Uˢ_cross_U (i, j, k, grid, sw:: USD , U, time) = (- ℑxzᶜᵃᶠ (i, j, k, grid, U. u) * sw.∂z_uˢ (znode (k, grid, f), time, sw. parameters)
140
- - ℑyzᵃᶜᶠ (i, j, k, grid, U. v) * sw.∂z_vˢ (znode (k, grid, f), time, sw. parameters))
141
-
142
- # Methods for when `parameters == nothing`
143
- @inline ∂t_uˢ (i, j, k, grid, sw:: USDnoP , time) = sw.∂t_uˢ (znode (k, grid, c), time)
144
- @inline ∂t_vˢ (i, j, k, grid, sw:: USDnoP , time) = sw.∂t_vˢ (znode (k, grid, c), time)
145
-
146
- @inline x_curl_Uˢ_cross_U (i, j, k, grid, sw:: USDnoP , U, time) = ℑxzᶠᵃᶜ (i, j, k, grid, U. w) * sw.∂z_uˢ (znode (k, grid, c), time)
147
- @inline y_curl_Uˢ_cross_U (i, j, k, grid, sw:: USDnoP , U, time) = ℑyzᵃᶠᶜ (i, j, k, grid, U. w) * sw.∂z_vˢ (znode (k, grid, c), time)
148
- @inline z_curl_Uˢ_cross_U (i, j, k, grid, sw:: USDnoP , U, time) = (- ℑxzᶜᵃᶠ (i, j, k, grid, U. u) * sw.∂z_uˢ (znode (k, grid, f), time)
149
- - ℑyzᵃᶜᶠ (i, j, k, grid, U. v) * sw.∂z_vˢ (znode (k, grid, f), time))
143
+ # Some helpers for three cases: Nothing, AbstractArray, or fallback (function)
144
+ @inline ∂z_Uᵃᵃᶜ (i, j, k, grid, sd:: USDnoP , ∂z_Uˢ, time) = ∂z_Uˢ (znode (k, grid, c), time)
145
+ @inline ∂z_Uᵃᵃᶜ (i, j, k, grid, sd:: USD , ∂z_Uˢ, time) = ∂z_Uˢ (znode (k, grid, c), time, sd. parameters)
146
+ @inline ∂z_Uᵃᵃᶜ (i, j, k, grid, sd:: USD , ∂z_Uˢ:: AbstractArray , time) = ℑzᵃᵃᶜ (i, j, k, grid, ∂z_Uˢ)
147
+ @inline ∂z_Uᵃᵃᶜ (i, j, k, grid, sd:: USDnoP , ∂z_Uˢ:: AbstractArray , time) = ℑzᵃᵃᶜ (i, j, k, grid, ∂z_Uˢ)
148
+ @inline ∂z_Uᵃᵃᶜ (i, j, k, grid, sd:: USD , :: Nothing , time) = zero (grid)
149
+ @inline ∂z_Uᵃᵃᶜ (i, j, k, grid, sd:: USDnoP , :: Nothing , time) = zero (grid)
150
+
151
+ @inline ∂z_Uᵃᵃᶠ (i, j, k, grid, sd:: USDnoP , ∂z_Uˢ, time) = ∂z_Uˢ (znode (k, grid, f), time)
152
+ @inline ∂z_Uᵃᵃᶠ (i, j, k, grid, sd:: USD , ∂z_Uˢ, time) = ∂z_Uˢ (znode (k, grid, f), time, sd. parameters)
153
+ @inline ∂z_Uᵃᵃᶠ (i, j, k, grid, sd:: USD , ∂z_Uˢ:: AbstractArray , time) = @inbounds ∂z_Uˢ[i, j, k]
154
+ @inline ∂z_Uᵃᵃᶠ (i, j, k, grid, sd:: USDnoP , ∂z_Uˢ:: AbstractArray , time) = @inbounds ∂z_Uˢ[i, j, k]
155
+ @inline ∂z_Uᵃᵃᶠ (i, j, k, grid, sd:: USD , :: Nothing , time) = zero (grid)
156
+ @inline ∂z_Uᵃᵃᶠ (i, j, k, grid, sd:: USDnoP , :: Nothing , time) = zero (grid)
157
+
158
+ @inline ∂t_U (i, j, k, grid, sd:: USDnoP , ∂t_Uˢ, time) = ∂t_Uˢ (znode (k, grid, c), time)
159
+ @inline ∂t_U (i, j, k, grid, sd:: USD , ∂t_Uˢ, time) = ∂t_Uˢ (znode (k, grid, c), time, sd. parameters)
160
+ @inline ∂t_U (i, j, k, grid, sd:: USD , ∂t_Uˢ:: AbstractArray , time) = @inbounds ∂t_Uˢ[i, j, k]
161
+ @inline ∂t_U (i, j, k, grid, sd:: USDnoP , ∂t_Uˢ:: AbstractArray , time) = @inbounds ∂t_Uˢ[i, j, k]
162
+ @inline ∂t_U (i, j, k, grid, sd:: USD , :: Nothing , time) = zero (grid)
163
+ @inline ∂t_U (i, j, k, grid, sd:: USDnoP , :: Nothing , time) = zero (grid)
164
+
165
+ # Kernel functions
166
+ @inline ∂t_uˢ (i, j, k, grid, sd:: USD , time) = ∂t_U (i, j, k, grid, sd, sd.∂t_uˢ, time)
167
+ @inline ∂t_vˢ (i, j, k, grid, sd:: USD , time) = ∂t_U (i, j, k, grid, sd, sd.∂t_vˢ, time)
168
+ @inline ∂t_wˢ (i, j, k, grid, sd:: USD , time) = zero (grid)
169
+
170
+ @inline x_curl_Uˢ_cross_U (i, j, k, grid, sd:: USD , U, time) =
171
+ ℑxzᶠᵃᶜ (i, j, k, grid, U. w) * ∂z_Uᵃᵃᶜ (i, j, k, grid, sd, sd.∂z_uˢ, time)
172
+
173
+ @inline y_curl_Uˢ_cross_U (i, j, k, grid, sd:: USD , U, time) =
174
+ ℑyzᵃᶠᶜ (i, j, k, grid, U. w) * ∂z_Uᵃᵃᶜ (i, j, k, grid, sd, sd.∂z_vˢ, time)
175
+
176
+ @inline z_curl_Uˢ_cross_U (i, j, k, grid, sd:: USD , U, time) = (
177
+ - ℑxzᶜᵃᶠ (i, j, k, grid, U. u) * ∂z_Uᵃᵃᶠ (i, j, k, grid, sd, sd.∂z_uˢ, time)
178
+ - ℑyzᵃᶜᶠ (i, j, k, grid, U. v) * ∂z_Uᵃᵃᶠ (i, j, k, grid, sd, sd.∂z_vˢ, time))
150
179
151
180
struct StokesDrift{P, VX, WX, UY, WY, UZ, VZ, UT, VT, WT}
152
181
∂x_vˢ :: VX
0 commit comments