@@ -22,7 +22,7 @@ Create a WENO scheme structure for the given field `u` on the specified `grid` u
2222- `boundary::NTuple{2N, Int}`: Tuple specifying the boundary conditions for each dimension (0: homogeneous Neumann, 1: homogeneous Dirichlet, 2: periodic). Default is periodic (2).
2323- `stag::Bool`: Whether the grid is staggered (velocities on cell faces) or not (velocities on cell centers).
2424"""
25- function WENOScheme (c0:: AbstractField{T, N} , grid:: StructuredGrid ; boundary:: NTuple = (2 , 2 ), stag:: Bool = true , lim_ZS:: Bool = false , kwargs ... ) where {T, N}
25+ function WENOScheme (c0:: AbstractField{T, N} , grid:: StructuredGrid ; boundary:: NTuple = (2 , 2 ), stag:: Bool = true , lim_ZS:: Bool = false , upwind_mode = false ) where {T, N}
2626
2727 # check that boundary conditions are correctly defined
2828 @assert length (boundary) == 2 N " Boundary conditions must be a tuple of length $(2 N) for $(N) D data."
@@ -44,7 +44,7 @@ function WENOScheme(c0::AbstractField{T, N}, grid::StructuredGrid; boundary::NTu
4444 TFlux = typeof (fl)
4545 TArray = typeof (du)
4646
47- return WENOScheme {T, TArray, TFlux, N_boundary} (stag = stag, boundary = boundary, multithreading = multithreading, lim_ZS = lim_ZS, fl = fl, fr = fr, du = du, ut = ut)
47+ return WENOScheme {T, TArray, TFlux, N_boundary} (stag = stag, boundary = boundary, multithreading = multithreading, lim_ZS = lim_ZS, fl = fl, fr = fr, du = du, ut = ut, upwind_mode = upwind_mode )
4848end
4949
5050function WENOScheme (c0:: AbstractField ; kwargs... )
@@ -103,22 +103,27 @@ function WENO_step!(u::T_field, v::NamedTuple{(:x,), <:Tuple{<:AbstractField{<:R
103103 nx = grid. axes[1 ]. length
104104 Δx_ = inv (Δx)
105105
106- @unpack ut, du, fl, fr, stag, lim_ZS, boundary, χ, γ, ζ, ϵ = weno
106+ @unpack ut, du, fl, fr, stag, lim_ZS, boundary, χ, γ, ζ, ϵ, upwind_mode = weno
107107
108- launch (arch, grid, WENO_flux_KA_1D => (fl. x, fr. x, u, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
109- launch (arch, grid, WENO_semi_discretisation_weno5_KA_1D! => (du, fl, fr, v, stag, Δx_, grid))
108+ if ! upwind_mode
110109
111- interior (ut) .= @muladd interior (u) .- Δt .* interior (du)
110+ launch (arch, grid, WENO_flux_KA_1D => (fl. x, fr. x, u, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
111+ launch (arch, grid, WENO_semi_discretisation_weno5_KA_1D! => (du, fl, fr, v, stag, Δx_, grid))
112112
113- launch (arch, grid, WENO_flux_KA_1D => (fl. x, fr. x, ut, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
114- launch (arch, grid, WENO_semi_discretisation_weno5_KA_1D! => (du, fl, fr, v, stag, Δx_, grid))
113+ interior (ut) .= @muladd interior (u) .- Δt .* interior (du)
115114
116- interior (ut) .= @muladd 0.75 .* interior (u) .+ 0.25 .* interior (ut) .- 0.25 .* Δt .* interior (du)
115+ launch (arch, grid, WENO_flux_KA_1D => (fl. x, fr. x, ut, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
116+ launch (arch, grid, WENO_semi_discretisation_weno5_KA_1D! => (du, fl, fr, v, stag, Δx_, grid))
117117
118- launch (arch, grid, WENO_flux_KA_1D => (fl. x, fr. x, ut, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
119- launch (arch, grid, WENO_semi_discretisation_weno5_KA_1D! => (du, fl, fr, v, stag, Δx_, grid))
118+ interior (ut) .= @muladd 0.75 .* interior (u) .+ 0.25 .* interior (ut) .- 0.25 .* Δt .* interior (du)
120119
121- interior (u) .= @muladd inv (3.0 ) .* interior (u) .+ 2.0 / 3.0 .* interior (ut) .- 2.0 / 3.0 .* Δt .* interior (du)
120+ launch (arch, grid, WENO_flux_KA_1D => (fl. x, fr. x, ut, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
121+ launch (arch, grid, WENO_semi_discretisation_weno5_KA_1D! => (du, fl, fr, v, stag, Δx_, grid))
122+
123+ interior (u) .= @muladd inv (3.0 ) .* interior (u) .+ 2.0 / 3.0 .* interior (ut) .- 2.0 / 3.0 .* Δt .* interior (du)
124+ else
125+ launch (arch, grid, upwind_update_KA_1D! => (u, v, nx, Δx_, Δt, stag, boundary, grid))
126+ end
122127
123128 return nothing
124129end
@@ -159,25 +164,29 @@ function WENO_step!(u::T_field, v::NamedTuple{(:x, :y), <:Tuple{Vararg{AbstractF
159164 Δx_ = inv (Δx)
160165 Δy_ = inv (Δy)
161166
162- @unpack ut, du, fl, fr, stag, lim_ZS, boundary, χ, γ, ζ, ϵ = weno
167+ @unpack ut, du, fl, fr, stag, lim_ZS, boundary, χ, γ, ζ, ϵ, upwind_mode = weno
163168
164- launch (arch, grid, WENO_flux_KA_2D_x => (fl. x, fr. x, u, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
165- launch (arch, grid, WENO_flux_KA_2D_y => (fl. y, fr. y, u, boundary, ny, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
166- launch (arch, grid, WENO_semi_discretisation_weno5_KA_2D! => (du, fl, fr, v, stag, Δx_, Δy_, grid))
169+ if ! upwind_mode
170+ launch (arch, grid, WENO_flux_KA_2D_x => (fl. x, fr. x, u, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
171+ launch (arch, grid, WENO_flux_KA_2D_y => (fl. y, fr. y, u, boundary, ny, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
172+ launch (arch, grid, WENO_semi_discretisation_weno5_KA_2D! => (du, fl, fr, v, stag, Δx_, Δy_, grid))
167173
168- interior (ut) .= @muladd interior (u) .- Δt .* interior (du)
174+ interior (ut) .= @muladd interior (u) .- Δt .* interior (du)
169175
170- launch (arch, grid, WENO_flux_KA_2D_x => (fl. x, fr. x, ut, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
171- launch (arch, grid, WENO_flux_KA_2D_y => (fl. y, fr. y, ut, boundary, ny, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
172- launch (arch, grid, WENO_semi_discretisation_weno5_KA_2D! => (du, fl, fr, v, stag, Δx_, Δy_, grid))
176+ launch (arch, grid, WENO_flux_KA_2D_x => (fl. x, fr. x, ut, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
177+ launch (arch, grid, WENO_flux_KA_2D_y => (fl. y, fr. y, ut, boundary, ny, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
178+ launch (arch, grid, WENO_semi_discretisation_weno5_KA_2D! => (du, fl, fr, v, stag, Δx_, Δy_, grid))
173179
174- interior (ut) .= @muladd 0.75 .* interior (u) .+ 0.25 .* interior (ut) .- 0.25 .* Δt .* interior (du)
180+ interior (ut) .= @muladd 0.75 .* interior (u) .+ 0.25 .* interior (ut) .- 0.25 .* Δt .* interior (du)
175181
176- launch (arch, grid, WENO_flux_KA_2D_x => (fl. x, fr. x, ut, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
177- launch (arch, grid, WENO_flux_KA_2D_y => (fl. y, fr. y, ut, boundary, ny, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
178- launch (arch, grid, WENO_semi_discretisation_weno5_KA_2D! => (du, fl, fr, v, stag, Δx_, Δy_, grid))
182+ launch (arch, grid, WENO_flux_KA_2D_x => (fl. x, fr. x, ut, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
183+ launch (arch, grid, WENO_flux_KA_2D_y => (fl. y, fr. y, ut, boundary, ny, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
184+ launch (arch, grid, WENO_semi_discretisation_weno5_KA_2D! => (du, fl, fr, v, stag, Δx_, Δy_, grid))
179185
180- interior (u) .= @muladd inv (3.0 ) .* interior (u) .+ 2.0 / 3.0 .* interior (ut) .- 2.0 / 3.0 .* Δt .* interior (du)
186+ interior (u) .= @muladd inv (3.0 ) .* interior (u) .+ 2.0 / 3.0 .* interior (ut) .- 2.0 / 3.0 .* Δt .* interior (du)
187+ else
188+ launch (arch, grid, upwind_update_KA_2D! => (u, v, nx, ny, Δx_, Δy_, Δt, stag, boundary, grid))
189+ end
181190
182191 return nothing
183192end
@@ -223,28 +232,32 @@ function WENO_step!(u::T_field, v::NamedTuple{(:x, :y, :z), <:Tuple{Vararg{Abstr
223232 Δy_ = inv (Δy)
224233 Δz_ = inv (Δz)
225234
226- @unpack ut, du, fl, fr, stag, lim_ZS, boundary, χ, γ, ζ, ϵ = weno
235+ @unpack ut, du, fl, fr, stag, lim_ZS, boundary, χ, γ, ζ, ϵ, upwind_mode = weno
227236
228- launch (arch, grid, WENO_flux_KA_3D_x => (fl. x, fr. x, u, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
229- launch (arch, grid, WENO_flux_KA_3D_y => (fl. y, fr. y, u, boundary, ny, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
230- launch (arch, grid, WENO_flux_KA_3D_z => (fl. z, fr. z, u, boundary, nz, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
231- launch (arch, grid, WENO_semi_discretisation_weno5_KA_3D! => (du, fl, fr, v, stag, Δx_, Δy_, Δz_, grid))
237+ if ! upwind_mode
238+ launch (arch, grid, WENO_flux_KA_3D_x => (fl. x, fr. x, u, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
239+ launch (arch, grid, WENO_flux_KA_3D_y => (fl. y, fr. y, u, boundary, ny, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
240+ launch (arch, grid, WENO_flux_KA_3D_z => (fl. z, fr. z, u, boundary, nz, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
241+ launch (arch, grid, WENO_semi_discretisation_weno5_KA_3D! => (du, fl, fr, v, stag, Δx_, Δy_, Δz_, grid))
232242
233- interior (ut) .= @muladd interior (u) .- Δt .* interior (du)
243+ interior (ut) .= @muladd interior (u) .- Δt .* interior (du)
234244
235- launch (arch, grid, WENO_flux_KA_3D_x => (fl. x, fr. x, ut, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
236- launch (arch, grid, WENO_flux_KA_3D_y => (fl. y, fr. y, ut, boundary, ny, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
237- launch (arch, grid, WENO_flux_KA_3D_z => (fl. z, fr. z, ut, boundary, nz, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
238- launch (arch, grid, WENO_semi_discretisation_weno5_KA_3D! => (du, fl, fr, v, stag, Δx_, Δy_, Δz_, grid))
245+ launch (arch, grid, WENO_flux_KA_3D_x => (fl. x, fr. x, ut, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
246+ launch (arch, grid, WENO_flux_KA_3D_y => (fl. y, fr. y, ut, boundary, ny, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
247+ launch (arch, grid, WENO_flux_KA_3D_z => (fl. z, fr. z, ut, boundary, nz, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
248+ launch (arch, grid, WENO_semi_discretisation_weno5_KA_3D! => (du, fl, fr, v, stag, Δx_, Δy_, Δz_, grid))
239249
240- interior (ut) .= @muladd 0.75 .* interior (u) .+ 0.25 .* interior (ut) .- 0.25 .* Δt .* interior (du)
250+ interior (ut) .= @muladd 0.75 .* interior (u) .+ 0.25 .* interior (ut) .- 0.25 .* Δt .* interior (du)
241251
242- launch (arch, grid, WENO_flux_KA_3D_x => (fl. x, fr. x, ut, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
243- launch (arch, grid, WENO_flux_KA_3D_y => (fl. y, fr. y, ut, boundary, ny, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
244- launch (arch, grid, WENO_flux_KA_3D_z => (fl. z, fr. z, ut, boundary, nz, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
245- launch (arch, grid, WENO_semi_discretisation_weno5_KA_3D! => (du, fl, fr, v, stag, Δx_, Δy_, Δz_, grid))
252+ launch (arch, grid, WENO_flux_KA_3D_x => (fl. x, fr. x, ut, boundary, nx, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
253+ launch (arch, grid, WENO_flux_KA_3D_y => (fl. y, fr. y, ut, boundary, ny, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
254+ launch (arch, grid, WENO_flux_KA_3D_z => (fl. z, fr. z, ut, boundary, nz, χ, γ, ζ, ϵ, lim_ZS, u_min, u_max, grid))
255+ launch (arch, grid, WENO_semi_discretisation_weno5_KA_3D! => (du, fl, fr, v, stag, Δx_, Δy_, Δz_, grid))
246256
247- interior (u) .= @muladd inv (3.0 ) .* interior (u) .+ 2.0 / 3.0 .* interior (ut) .- 2.0 / 3.0 .* Δt .* interior (du)
257+ interior (u) .= @muladd inv (3.0 ) .* interior (u) .+ 2.0 / 3.0 .* interior (ut) .- 2.0 / 3.0 .* Δt .* interior (du)
258+ else
259+ launch (arch, grid, upwind_update_KA_3D! => (u, v, nx, ny, nz, Δx_, Δy_, Δz_, Δt, stag, boundary, grid))
260+ end
248261
249262 return nothing
250263end
0 commit comments