From 884f88496e201c494b20394a33f866a85bb7fce8 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 5 Mar 2024 13:21:32 -0500 Subject: [PATCH 001/152] correct partition --- src/DistributedComputations/distributed_architectures.jl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/DistributedComputations/distributed_architectures.jl b/src/DistributedComputations/distributed_architectures.jl index 2aa2a53e45..64802ed386 100644 --- a/src/DistributedComputations/distributed_architectures.jl +++ b/src/DistributedComputations/distributed_architectures.jl @@ -204,16 +204,19 @@ Keyword arguments if not for testing or developing. Change at your own risk! """ function Distributed(child_architecture = CPU(); - communicator = MPI.COMM_WORLD, + communicator = nothing, devices = nothing, synchronized_communication = false, - partition = Partition(MPI.Comm_size(communicator))) + partition = nothing) if !(MPI.Initialized()) @info "MPI has not been initialized, so we are calling MPI.Init()." MPI.Init() end + communicator = inothing(communicator) ? MPI.COMM_WORLD : communicator + partition = isnothing(partition) ? Partition(MPI.Comm_size(communicator)) : partition + ranks = size(partition) Rx, Ry, Rz = ranks total_ranks = Rx * Ry * Rz From a335280f672b5a4b1b930a5aba2907dbfe8a6395 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 5 Mar 2024 20:30:14 -0500 Subject: [PATCH 002/152] inothing -> isnothing --- src/DistributedComputations/distributed_architectures.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DistributedComputations/distributed_architectures.jl b/src/DistributedComputations/distributed_architectures.jl index 64802ed386..c2a7054159 100644 --- a/src/DistributedComputations/distributed_architectures.jl +++ b/src/DistributedComputations/distributed_architectures.jl @@ -214,7 +214,7 @@ function Distributed(child_architecture = CPU(); MPI.Init() end - communicator = inothing(communicator) ? MPI.COMM_WORLD : communicator + communicator = isnothing(communicator) ? MPI.COMM_WORLD : communicator partition = isnothing(partition) ? Partition(MPI.Comm_size(communicator)) : partition ranks = size(partition) From 73fd9c656b06f4d4a9211bee4f8aac40c3dd2875 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 16:17:56 -0400 Subject: [PATCH 003/152] does not work on julia 1.9? --- src/AbstractOperations/conditional_operations.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AbstractOperations/conditional_operations.jl b/src/AbstractOperations/conditional_operations.jl index e621bcd262..a5d72fa1f8 100644 --- a/src/AbstractOperations/conditional_operations.jl +++ b/src/AbstractOperations/conditional_operations.jl @@ -1,6 +1,6 @@ using Oceananigans.Fields: OneField using Oceananigans.Grids: architecture -using Oceananigans.Architectures: on_architecture +import Oceananigans.Architectures: on_architecture import Oceananigans.Fields: condition_operand, conditional_length, set!, compute_at!, indices # For conditional reductions such as mean(u * v, condition = u .> 0)) From d2d2449aba18ef1854d27546d6c68549b904d393 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 16:20:30 -0400 Subject: [PATCH 004/152] hopefully last one? --- src/DistributedComputations/distributed_on_architecture.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/DistributedComputations/distributed_on_architecture.jl b/src/DistributedComputations/distributed_on_architecture.jl index 1564547a59..e02c0172a1 100644 --- a/src/DistributedComputations/distributed_on_architecture.jl +++ b/src/DistributedComputations/distributed_on_architecture.jl @@ -1,5 +1,6 @@ using CUDA: CuArray using OffsetArrays +import Oceananigans.Architectures: on_architecture # We do not support switching from distributed and serial through `on_architecture`. # We only support moving a type from CPU to GPU and the other way around From eaf318f32f49c7f18e545c1ded0d3d3b958b89d3 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 16:21:38 -0400 Subject: [PATCH 005/152] this was the last --- src/DistributedComputations/partition_assemble.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DistributedComputations/partition_assemble.jl b/src/DistributedComputations/partition_assemble.jl index d381743cb1..a6e730cf47 100644 --- a/src/DistributedComputations/partition_assemble.jl +++ b/src/DistributedComputations/partition_assemble.jl @@ -1,4 +1,4 @@ -using Oceananigans.Architectures: on_architecture +import Oceananigans.Architectures: on_architecture all_reduce(op, val, arch::Distributed) = MPI.Allreduce(val, op, arch.communicator) From 81b333974ce7ec4f3ea6a0b3a4d9f954a54eaa96 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 16:31:47 -0400 Subject: [PATCH 006/152] other ones slipped --- src/TurbulenceClosures/implicit_explicit_time_discretization.jl | 1 - .../convective_adjustment_vertical_diffusivity.jl | 2 +- .../ri_based_vertical_diffusivity.jl | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/TurbulenceClosures/implicit_explicit_time_discretization.jl b/src/TurbulenceClosures/implicit_explicit_time_discretization.jl index 33fe206185..3fa9d7a54e 100644 --- a/src/TurbulenceClosures/implicit_explicit_time_discretization.jl +++ b/src/TurbulenceClosures/implicit_explicit_time_discretization.jl @@ -1,4 +1,3 @@ -using Oceananigans.Utils: on_architecture using Oceananigans.Grids: AbstractGrid abstract type AbstractTimeDiscretization end diff --git a/src/TurbulenceClosures/turbulence_closure_implementations/convective_adjustment_vertical_diffusivity.jl b/src/TurbulenceClosures/turbulence_closure_implementations/convective_adjustment_vertical_diffusivity.jl index a973edc0a0..cfdd407523 100644 --- a/src/TurbulenceClosures/turbulence_closure_implementations/convective_adjustment_vertical_diffusivity.jl +++ b/src/TurbulenceClosures/turbulence_closure_implementations/convective_adjustment_vertical_diffusivity.jl @@ -1,4 +1,4 @@ -using Oceananigans.Architectures: architecture, on_architecture +using Oceananigans.Architectures: architecture using Oceananigans.AbstractOperations: KernelFunctionOperation using Oceananigans.BuoyancyModels: ∂z_b using Oceananigans.Operators: ℑzᵃᵃᶜ diff --git a/src/TurbulenceClosures/turbulence_closure_implementations/ri_based_vertical_diffusivity.jl b/src/TurbulenceClosures/turbulence_closure_implementations/ri_based_vertical_diffusivity.jl index 21f44f3000..0e83f3aa4e 100644 --- a/src/TurbulenceClosures/turbulence_closure_implementations/ri_based_vertical_diffusivity.jl +++ b/src/TurbulenceClosures/turbulence_closure_implementations/ri_based_vertical_diffusivity.jl @@ -1,4 +1,4 @@ -using Oceananigans.Architectures: architecture, on_architecture +using Oceananigans.Architectures: architecture using Oceananigans.BuoyancyModels: ∂z_b using Oceananigans.Operators using Oceananigans.Grids: inactive_node From efe7b82aeb734fdc9d1977381ec0568ff3890720 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 16:35:30 -0400 Subject: [PATCH 007/152] other ones remaining --- src/ImmersedBoundaries/grid_fitted_bottom.jl | 1 - src/ImmersedBoundaries/mask_immersed_field.jl | 1 - src/ImmersedBoundaries/partial_cell_bottom.jl | 1 - 3 files changed, 3 deletions(-) diff --git a/src/ImmersedBoundaries/grid_fitted_bottom.jl b/src/ImmersedBoundaries/grid_fitted_bottom.jl index a3461ac16d..18eca1da92 100644 --- a/src/ImmersedBoundaries/grid_fitted_bottom.jl +++ b/src/ImmersedBoundaries/grid_fitted_bottom.jl @@ -4,7 +4,6 @@ using OffsetArrays: OffsetArray using Oceananigans.Utils: getnamewrapper using Oceananigans.Grids: total_size using Oceananigans.Fields: fill_halo_regions! -using Oceananigans.Architectures: on_architecture using Oceananigans.BoundaryConditions: FBC using Printf diff --git a/src/ImmersedBoundaries/mask_immersed_field.jl b/src/ImmersedBoundaries/mask_immersed_field.jl index 4bd2878eec..4f8f0afbad 100644 --- a/src/ImmersedBoundaries/mask_immersed_field.jl +++ b/src/ImmersedBoundaries/mask_immersed_field.jl @@ -1,6 +1,5 @@ using KernelAbstractions: @kernel, @index using Statistics -using Oceananigans.Architectures: architecture using Oceananigans.Fields: location, ZReducedField, Field instantiate(T::Type) = T() diff --git a/src/ImmersedBoundaries/partial_cell_bottom.jl b/src/ImmersedBoundaries/partial_cell_bottom.jl index f6ba0368e3..f00771e834 100644 --- a/src/ImmersedBoundaries/partial_cell_bottom.jl +++ b/src/ImmersedBoundaries/partial_cell_bottom.jl @@ -1,6 +1,5 @@ using Oceananigans.Utils: prettysummary using Oceananigans.Fields: fill_halo_regions! -using Oceananigans.Architectures: on_architecture using Printf ##### From d34e07bf92874cf51601d7ecb41c09b24ffdbedb Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 19:42:28 -0400 Subject: [PATCH 008/152] let's test it out! --- src/Advection/weno_interpolants.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 7c96b00adb..3e657ab36a 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -206,7 +206,7 @@ end @inline function metaprogrammed_zweno_alpha_loop(buffer) elem = Vector(undef, buffer) for stencil = 1:buffer - elem[stencil] = :(@inbounds FT(coeff(scheme, Val($(stencil-1)))) * (1 + (τ / (β[$stencil] + FT(ε)))^ƞ)) + elem[stencil] = :(@inbounds FT(coeff(scheme, Val($(stencil-1)))) * (1 + (τ / Base.literal_pow(^, β[$stencil] + FT(ε), Val(2))))) end return :($(elem...),) @@ -216,7 +216,7 @@ end @inline function metaprogrammed_js_alpha_loop(buffer) elem = Vector(undef, buffer) for stencil = 1:buffer - elem[stencil] = :(@inbounds FT(coeff(scheme, Val($(stencil-1)))) / (β[$stencil] + FT(ε))^ƞ) + elem[stencil] = :(@inbounds FT(coeff(scheme, Val($(stencil-1)))) / Base.literal_pow(^, β[$stencil] + FT(ε), Val(2))) end return :($(elem...),) From 1e9cb8e498267b53dfbaeab204d6478a62cc0922 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 19:56:21 -0400 Subject: [PATCH 009/152] using fastmath? --- src/Advection/weno_interpolants.jl | 38 +++++++++++++++--------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 3e657ab36a..6295445329 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -158,12 +158,12 @@ end elem = Vector(undef, buffer) c_idx = 1 for stencil = 1:buffer - 1 - stencil_sum = Expr(:call, :+, (:(@inbounds C[$(c_idx + i - stencil)] * ψ[$i]) for i in stencil:buffer)...) - elem[stencil] = :(@inbounds ψ[$stencil] * $stencil_sum) + stencil_sum = Expr(:call, :+, (:(@inbounds @fastmath C[$(c_idx + i - stencil)] * ψ[$i]) for i in stencil:buffer)...) + elem[stencil] = :(@inbounds @fastmath ψ[$stencil] * $stencil_sum) c_idx += buffer - stencil + 1 end - elem[buffer] = :(@inbounds ψ[$buffer] * ψ[$buffer] * C[$c_idx]) + elem[buffer] = :(@inbounds @fastmath ψ[$buffer] * ψ[$buffer] * C[$c_idx]) return Expr(:call, :+, elem...) end @@ -171,13 +171,13 @@ end # Smoothness indicators for stencil `stencil` for left and right biased reconstruction for buffer in [2, 3, 4, 5, 6] @eval begin - @inline smoothness_sum(scheme::WENO{$buffer}, ψ, C) = @inbounds $(metaprogrammed_smoothness_sum(buffer)) + @inline smoothness_sum(scheme::WENO{$buffer}, ψ, C) = @inbounds @fastmath $(metaprogrammed_smoothness_sum(buffer)) end for stencil in [0, 1, 2, 3, 4, 5] @eval begin - @inline left_biased_β(ψ, scheme::WENO{$buffer}, ::Val{$stencil}) = @inbounds smoothness_sum(scheme, ψ, smoothness_coefficients(scheme, Val($stencil))) - @inline right_biased_β(ψ, scheme::WENO{$buffer}, ::Val{$stencil}) = @inbounds smoothness_sum(scheme, ψ, smoothness_coefficients(scheme, Val($stencil))) + @inline left_biased_β(ψ, scheme::WENO{$buffer}, ::Val{$stencil}) = smoothness_sum(scheme, ψ, smoothness_coefficients(scheme, Val($stencil))) + @inline right_biased_β(ψ, scheme::WENO{$buffer}, ::Val{$stencil}) = smoothness_sum(scheme, ψ, smoothness_coefficients(scheme, Val($stencil))) end end end @@ -186,7 +186,7 @@ end @inline function metaprogrammed_beta_sum(buffer) elem = Vector(undef, buffer) for stencil = 1:buffer - elem[stencil] = :(@inbounds (β₁[$stencil] + β₂[$stencil])/2) + elem[stencil] = :(@inbounds @fastmath (β₁[$stencil] + β₂[$stencil])/2) end return :($(elem...),) @@ -196,7 +196,7 @@ end @inline function metaprogrammed_beta_loop(buffer) elem = Vector(undef, buffer) for stencil = 1:buffer - elem[stencil] = :(@inbounds func(ψ[$stencil], scheme, Val($(stencil-1)))) + elem[stencil] = :(@inbounds @fastmath func(ψ[$stencil], scheme, Val($(stencil-1)))) end return :($(elem...),) @@ -206,7 +206,7 @@ end @inline function metaprogrammed_zweno_alpha_loop(buffer) elem = Vector(undef, buffer) for stencil = 1:buffer - elem[stencil] = :(@inbounds FT(coeff(scheme, Val($(stencil-1)))) * (1 + (τ / Base.literal_pow(^, β[$stencil] + FT(ε), Val(2))))) + elem[stencil] = :(@inbounds @fastmath FT(coeff(scheme, Val($(stencil-1)))) * (1 + (τ / Base.literal_pow(^, β[$stencil] + FT(ε), Val(2))))) end return :($(elem...),) @@ -216,7 +216,7 @@ end @inline function metaprogrammed_js_alpha_loop(buffer) elem = Vector(undef, buffer) for stencil = 1:buffer - elem[stencil] = :(@inbounds FT(coeff(scheme, Val($(stencil-1)))) / Base.literal_pow(^, β[$stencil] + FT(ε), Val(2))) + elem[stencil] = :(@inbounds @fastmath FT(coeff(scheme, Val($(stencil-1)))) / Base.literal_pow(^, β[$stencil] + FT(ε), Val(2))) end return :($(elem...),) @@ -224,19 +224,19 @@ end for buffer in [2, 3, 4, 5, 6] @eval begin - @inline beta_sum(scheme::WENO{$buffer}, β₁, β₂) = @inbounds $(metaprogrammed_beta_sum(buffer)) - @inline beta_loop(scheme::WENO{$buffer}, ψ, func) = @inbounds $(metaprogrammed_beta_loop(buffer)) - @inline zweno_alpha_loop(scheme::WENO{$buffer}, β, τ, coeff, FT) = @inbounds $(metaprogrammed_zweno_alpha_loop(buffer)) - @inline js_alpha_loop(scheme::WENO{$buffer}, β, coeff, FT) = @inbounds $(metaprogrammed_js_alpha_loop(buffer)) + @inline beta_sum(scheme::WENO{$buffer}, β₁, β₂) = @inbounds @fastmath $(metaprogrammed_beta_sum(buffer)) + @inline beta_loop(scheme::WENO{$buffer}, ψ, func) = @inbounds @fastmath $(metaprogrammed_beta_loop(buffer)) + @inline zweno_alpha_loop(scheme::WENO{$buffer}, β, τ, coeff, FT) = @inbounds @fastmath $(metaprogrammed_zweno_alpha_loop(buffer)) + @inline js_alpha_loop(scheme::WENO{$buffer}, β, coeff, FT) = @inbounds @fastmath $(metaprogrammed_js_alpha_loop(buffer)) end end # Global smoothness indicator τ₂ᵣ₋₁ taken from "Accuracy of the weighted essentially non-oscillatory conservative finite difference schemes", Don & Borges, 2013 -@inline global_smoothness_indicator(::Val{2}, β) = @inbounds abs(β[1] - β[2]) -@inline global_smoothness_indicator(::Val{3}, β) = @inbounds abs(β[1] - β[3]) -@inline global_smoothness_indicator(::Val{4}, β) = @inbounds abs(β[1] + 3β[2] - 3β[3] - β[4]) -@inline global_smoothness_indicator(::Val{5}, β) = @inbounds abs(β[1] + 2β[2] - 6β[3] + 2β[4] + β[5]) -@inline global_smoothness_indicator(::Val{6}, β) = @inbounds abs(β[1] + 36β[2] + 135β[3] - 135β[4] - 36β[5] - β[6]) +@inline global_smoothness_indicator(::Val{2}, β) = @inbounds @fastmath abs(β[1] - β[2]) +@inline global_smoothness_indicator(::Val{3}, β) = @inbounds @fastmath abs(β[1] - β[3]) +@inline global_smoothness_indicator(::Val{4}, β) = @inbounds @fastmath abs(β[1] + 3β[2] - 3β[3] - β[4]) +@inline global_smoothness_indicator(::Val{5}, β) = @inbounds @fastmath abs(β[1] + 2β[2] - 6β[3] + 2β[4] + β[5]) +@inline global_smoothness_indicator(::Val{6}, β) = @inbounds @fastmath abs(β[1] + 36β[2] + 135β[3] - 135β[4] - 36β[5] - β[6]) # Calculating Dynamic WENO Weights (wᵣ), either with JS weno, Z weno or VectorInvariant WENO for (side, coeff) in zip([:left, :right], (:Cl, :Cr)) From 6e06ac79ad1f46a00b0babaa13d8273e215abfb2 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 20:19:06 -0400 Subject: [PATCH 010/152] fast math and reduce divisions by 4 --- src/Advection/weno_interpolants.jl | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 6295445329..1e6b5f0fc1 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -259,7 +259,10 @@ for (side, coeff) in zip([:left, :right], (:Cl, :Cr)) else α = js_alpha_loop(scheme, β, $coeff, FT) end - return α ./ sum(α) + + α_tot = 1 / sum(α) + + return α .* α_tot end end @@ -280,7 +283,10 @@ for (side, coeff) in zip([:left, :right], (:Cl, :Cr)) else α = js_alpha_loop(scheme, β, $coeff, FT) end - return α ./ sum(α) + + α_tot = 1 / sum(α) + + return α .* α_tot end end end From 2a39065e476bb34e4f87187eddc97704226d92a2 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 20:26:20 -0400 Subject: [PATCH 011/152] remove inbounds where I don't need it --- src/Advection/weno_interpolants.jl | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 1e6b5f0fc1..9ab6684d4f 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -158,12 +158,12 @@ end elem = Vector(undef, buffer) c_idx = 1 for stencil = 1:buffer - 1 - stencil_sum = Expr(:call, :+, (:(@inbounds @fastmath C[$(c_idx + i - stencil)] * ψ[$i]) for i in stencil:buffer)...) - elem[stencil] = :(@inbounds @fastmath ψ[$stencil] * $stencil_sum) + stencil_sum = Expr(:call, :+, (:(C[$(c_idx + i - stencil)] * ψ[$i]) for i in stencil:buffer)...) + elem[stencil] = :(ψ[$stencil] * $stencil_sum) c_idx += buffer - stencil + 1 end - elem[buffer] = :(@inbounds @fastmath ψ[$buffer] * ψ[$buffer] * C[$c_idx]) + elem[buffer] = :(ψ[$buffer] * ψ[$buffer] * C[$c_idx]) return Expr(:call, :+, elem...) end @@ -196,7 +196,7 @@ end @inline function metaprogrammed_beta_loop(buffer) elem = Vector(undef, buffer) for stencil = 1:buffer - elem[stencil] = :(@inbounds @fastmath func(ψ[$stencil], scheme, Val($(stencil-1)))) + elem[stencil] = :(func(ψ[$stencil], scheme, Val($(stencil-1)))) end return :($(elem...),) @@ -206,7 +206,7 @@ end @inline function metaprogrammed_zweno_alpha_loop(buffer) elem = Vector(undef, buffer) for stencil = 1:buffer - elem[stencil] = :(@inbounds @fastmath FT(coeff(scheme, Val($(stencil-1)))) * (1 + (τ / Base.literal_pow(^, β[$stencil] + FT(ε), Val(2))))) + elem[stencil] = :(FT(coeff(scheme, Val($(stencil-1)))) * (1 + (τ / Base.literal_pow(^, β[$stencil] + FT(ε), Val(2))))) end return :($(elem...),) @@ -216,7 +216,7 @@ end @inline function metaprogrammed_js_alpha_loop(buffer) elem = Vector(undef, buffer) for stencil = 1:buffer - elem[stencil] = :(@inbounds @fastmath FT(coeff(scheme, Val($(stencil-1)))) / Base.literal_pow(^, β[$stencil] + FT(ε), Val(2))) + elem[stencil] = :(FT(coeff(scheme, Val($(stencil-1)))) / Base.literal_pow(^, β[$stencil] + FT(ε), Val(2))) end return :($(elem...),) @@ -364,15 +364,15 @@ end # Parallel to the interpolation direction! (same as left/right stencil) using Oceananigans.Operators: ℑyᵃᶠᵃ, ℑxᶠᵃᵃ -@inline tangential_left_stencil_u(i, j, k, scheme, ::Val{1}, u) = @inbounds left_stencil_x(i, j, k, scheme, ℑyᵃᶠᵃ, u) -@inline tangential_left_stencil_u(i, j, k, scheme, ::Val{2}, u) = @inbounds left_stencil_y(i, j, k, scheme, ℑyᵃᶠᵃ, u) -@inline tangential_left_stencil_v(i, j, k, scheme, ::Val{1}, v) = @inbounds left_stencil_x(i, j, k, scheme, ℑxᶠᵃᵃ, v) -@inline tangential_left_stencil_v(i, j, k, scheme, ::Val{2}, v) = @inbounds left_stencil_y(i, j, k, scheme, ℑxᶠᵃᵃ, v) +@inline tangential_left_stencil_u(i, j, k, scheme, ::Val{1}, u) = @inbounds @fastmath left_stencil_x(i, j, k, scheme, ℑyᵃᶠᵃ, u) +@inline tangential_left_stencil_u(i, j, k, scheme, ::Val{2}, u) = @inbounds @fastmath left_stencil_y(i, j, k, scheme, ℑyᵃᶠᵃ, u) +@inline tangential_left_stencil_v(i, j, k, scheme, ::Val{1}, v) = @inbounds @fastmath left_stencil_x(i, j, k, scheme, ℑxᶠᵃᵃ, v) +@inline tangential_left_stencil_v(i, j, k, scheme, ::Val{2}, v) = @inbounds @fastmath left_stencil_y(i, j, k, scheme, ℑxᶠᵃᵃ, v) -@inline tangential_right_stencil_u(i, j, k, scheme, ::Val{1}, u) = @inbounds right_stencil_x(i, j, k, scheme, ℑyᵃᶠᵃ, u) -@inline tangential_right_stencil_u(i, j, k, scheme, ::Val{2}, u) = @inbounds right_stencil_y(i, j, k, scheme, ℑyᵃᶠᵃ, u) -@inline tangential_right_stencil_v(i, j, k, scheme, ::Val{1}, v) = @inbounds right_stencil_x(i, j, k, scheme, ℑxᶠᵃᵃ, v) -@inline tangential_right_stencil_v(i, j, k, scheme, ::Val{2}, v) = @inbounds right_stencil_y(i, j, k, scheme, ℑxᶠᵃᵃ, v) +@inline tangential_right_stencil_u(i, j, k, scheme, ::Val{1}, u) = @inbounds @fastmath right_stencil_x(i, j, k, scheme, ℑyᵃᶠᵃ, u) +@inline tangential_right_stencil_u(i, j, k, scheme, ::Val{2}, u) = @inbounds @fastmath right_stencil_y(i, j, k, scheme, ℑyᵃᶠᵃ, u) +@inline tangential_right_stencil_v(i, j, k, scheme, ::Val{1}, v) = @inbounds @fastmath right_stencil_x(i, j, k, scheme, ℑxᶠᵃᵃ, v) +@inline tangential_right_stencil_v(i, j, k, scheme, ::Val{2}, v) = @inbounds @fastmath right_stencil_y(i, j, k, scheme, ℑxᶠᵃᵃ, v) # Trick to force compilation of Val(stencil-1) and avoid loops on the GPU @inline function metaprogrammed_stencil_sum(buffer) From 159aab363948748ab139814ce38349d11bf7ca82 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 20:31:44 -0400 Subject: [PATCH 012/152] try fastmath --- src/Advection/weno_interpolants.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 9ab6684d4f..4f07168a90 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -206,7 +206,7 @@ end @inline function metaprogrammed_zweno_alpha_loop(buffer) elem = Vector(undef, buffer) for stencil = 1:buffer - elem[stencil] = :(FT(coeff(scheme, Val($(stencil-1)))) * (1 + (τ / Base.literal_pow(^, β[$stencil] + FT(ε), Val(2))))) + elem[stencil] = :(FT(coeff(scheme, Val($(stencil-1)))) * (1 + (τ / (β[$stencil] + FT(ε))^2))) end return :($(elem...),) @@ -216,7 +216,7 @@ end @inline function metaprogrammed_js_alpha_loop(buffer) elem = Vector(undef, buffer) for stencil = 1:buffer - elem[stencil] = :(FT(coeff(scheme, Val($(stencil-1)))) / Base.literal_pow(^, β[$stencil] + FT(ε), Val(2))) + elem[stencil] = :(FT(coeff(scheme, Val($(stencil-1)))) / (β[$stencil] + FT(ε))^2) end return :($(elem...),) From 622fb374eaa66a9e8ac522e44298ab6c5670e243 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 22:19:01 -0400 Subject: [PATCH 013/152] try simplifying --- src/Advection/weno_interpolants.jl | 173 +++++++++++++++++++++-------- 1 file changed, 128 insertions(+), 45 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 4f07168a90..aff389de74 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -65,7 +65,6 @@ end Base.show(io::IO, a::FunctionStencil) = print(io, "FunctionStencil f = $(a.func)") -const ƞ = Int32(2) # WENO exponent const ε = 1e-8 # Optimal values taken from @@ -121,30 +120,30 @@ for buffer in [2, 3, 4, 5, 6] end # _UNIFORM_ smoothness coefficients (stretched smoothness coefficients are to be fixed!) -@inline smoothness_coefficients(scheme::WENO{2, FT}, ::Val{0}) where FT = @inbounds FT.((1, -2, 1)) -@inline smoothness_coefficients(scheme::WENO{2, FT}, ::Val{1}) where FT = @inbounds FT.((1, -2, 1)) - -@inline smoothness_coefficients(scheme::WENO{3, FT}, ::Val{0}) where FT = @inbounds FT.((10, -31, 11, 25, -19, 4)) -@inline smoothness_coefficients(scheme::WENO{3, FT}, ::Val{1}) where FT = @inbounds FT.((4, -13, 5, 13, -13, 4)) -@inline smoothness_coefficients(scheme::WENO{3, FT}, ::Val{2}) where FT = @inbounds FT.((4, -19, 11, 25, -31, 10)) - -@inline smoothness_coefficients(scheme::WENO{4, FT}, ::Val{0}) where FT = @inbounds FT.((2.107, -9.402, 7.042, -1.854, 11.003, -17.246, 4.642, 7.043, -3.882, 0.547)) -@inline smoothness_coefficients(scheme::WENO{4, FT}, ::Val{1}) where FT = @inbounds FT.((0.547, -2.522, 1.922, -0.494, 3.443, - 5.966, 1.602, 2.843, -1.642, 0.267)) -@inline smoothness_coefficients(scheme::WENO{4, FT}, ::Val{2}) where FT = @inbounds FT.((0.267, -1.642, 1.602, -0.494, 2.843, - 5.966, 1.922, 3.443, -2.522, 0.547)) -@inline smoothness_coefficients(scheme::WENO{4, FT}, ::Val{3}) where FT = @inbounds FT.((0.547, -3.882, 4.642, -1.854, 7.043, -17.246, 7.042, 11.003, -9.402, 2.107)) - -@inline smoothness_coefficients(scheme::WENO{5, FT}, ::Val{0}) where FT = @inbounds FT.((1.07918, -6.49501, 7.58823, -4.11487, 0.86329, 10.20563, -24.62076, 13.58458, -2.88007, 15.21393, -17.04396, 3.64863, 4.82963, -2.08501, 0.22658)) -@inline smoothness_coefficients(scheme::WENO{5, FT}, ::Val{1}) where FT = @inbounds FT.((0.22658, -1.40251, 1.65153, -0.88297, 0.18079, 2.42723, -6.11976, 3.37018, -0.70237, 4.06293, -4.64976, 0.99213, 1.38563, -0.60871, 0.06908)) -@inline smoothness_coefficients(scheme::WENO{5, FT}, ::Val{2}) where FT = @inbounds FT.((0.06908, -0.51001, 0.67923, -0.38947, 0.08209, 1.04963, -2.99076, 1.79098, -0.38947, 2.31153, -2.99076, 0.67923, 1.04963, -0.51001, 0.06908)) -@inline smoothness_coefficients(scheme::WENO{5, FT}, ::Val{3}) where FT = @inbounds FT.((0.06908, -0.60871, 0.99213, -0.70237, 0.18079, 1.38563, -4.64976, 3.37018, -0.88297, 4.06293, -6.11976, 1.65153, 2.42723, -1.40251, 0.22658)) -@inline smoothness_coefficients(scheme::WENO{5, FT}, ::Val{4}) where FT = @inbounds FT.((0.22658, -2.08501, 3.64863, -2.88007, 0.86329, 4.82963, -17.04396, 13.58458, -4.11487, 15.21393, -24.62076, 7.58823, 10.20563, -6.49501, 1.07918)) - -@inline smoothness_coefficients(scheme::WENO{6, FT}, ::Val{0}) where FT = @inbounds FT.((0.6150211, -4.7460464, 7.6206736, -6.3394124, 2.7060170, -0.4712740, 9.4851237, -31.1771244, 26.2901672, -11.3206788, 1.9834350, 26.0445372, -44.4003904, 19.2596472, -3.3918804, 19.0757572, -16.6461044, 2.9442256, 3.6480687, -1.2950184, 0.1152561)) -@inline smoothness_coefficients(scheme::WENO{6, FT}, ::Val{1}) where FT = @inbounds FT.((0.1152561, -0.9117992, 1.4742480, -1.2183636, 0.5134574, -0.0880548, 1.9365967, -6.5224244, 5.5053752, -2.3510468, 0.4067018, 5.6662212, -9.7838784, 4.2405032, -0.7408908, 4.3093692, -3.7913324, 0.6694608, 0.8449957, -0.3015728, 0.0271779)) -@inline smoothness_coefficients(scheme::WENO{6, FT}, ::Val{2}) where FT = @inbounds FT.((0.0271779, -0.2380800, 0.4086352, -0.3462252, 0.1458762, -0.0245620, 0.5653317, -2.0427884, 1.7905032, -0.7727988, 0.1325006, 1.9510972, -3.5817664, 1.5929912, -0.2792660, 1.7195652, -1.5880404, 0.2863984, 0.3824847, -0.1429976, 0.0139633)) -@inline smoothness_coefficients(scheme::WENO{6, FT}, ::Val{3}) where FT = @inbounds FT.((0.0139633, -0.1429976, 0.2863984, -0.2792660, 0.1325006, -0.0245620, 0.3824847, -1.5880404, 1.5929912, -0.7727988, 0.1458762, 1.7195652, -3.5817664, 1.7905032, -0.3462252, 1.9510972, -2.0427884, 0.4086352, 0.5653317, -0.2380800, 0.0271779)) -@inline smoothness_coefficients(scheme::WENO{6, FT}, ::Val{4}) where FT = @inbounds FT.((0.0271779, -0.3015728, 0.6694608, -0.7408908, 0.4067018, -0.0880548, 0.8449957, -3.7913324, 4.2405032, -2.3510468, 0.5134574, 4.3093692, -9.7838784, 5.5053752, -1.2183636, 5.6662212, -6.5224244, 1.4742480, 1.9365967, -0.9117992, 0.1152561)) -@inline smoothness_coefficients(scheme::WENO{6, FT}, ::Val{5}) where FT = @inbounds FT.((0.1152561, -1.2950184, 2.9442256, -3.3918804, 1.9834350, -0.4712740, 3.6480687, -16.6461044, 19.2596472, -11.3206788, 2.7060170, 19.0757572, -44.4003904, 26.2901672, -6.3394124, 26.0445372, -31.1771244, 7.6206736, 9.4851237, -4.7460464, 0.6150211)) +@inline smoothness_coefficients(::WENO{2, FT}, ::Val{0}) where FT = @inbounds FT.((1, -2, 1)) +@inline smoothness_coefficients(::WENO{2, FT}, ::Val{1}) where FT = @inbounds FT.((1, -2, 1)) + +@inline smoothness_coefficients(::WENO{3, FT}, ::Val{0}) where FT = @inbounds FT.((10, -31, 11, 25, -19, 4)) +@inline smoothness_coefficients(::WENO{3, FT}, ::Val{1}) where FT = @inbounds FT.((4, -13, 5, 13, -13, 4)) +@inline smoothness_coefficients(::WENO{3, FT}, ::Val{2}) where FT = @inbounds FT.((4, -19, 11, 25, -31, 10)) + +@inline smoothness_coefficients(::WENO{4, FT}, ::Val{0}) where FT = @inbounds FT.((2.107, -9.402, 7.042, -1.854, 11.003, -17.246, 4.642, 7.043, -3.882, 0.547)) +@inline smoothness_coefficients(::WENO{4, FT}, ::Val{1}) where FT = @inbounds FT.((0.547, -2.522, 1.922, -0.494, 3.443, - 5.966, 1.602, 2.843, -1.642, 0.267)) +@inline smoothness_coefficients(::WENO{4, FT}, ::Val{2}) where FT = @inbounds FT.((0.267, -1.642, 1.602, -0.494, 2.843, - 5.966, 1.922, 3.443, -2.522, 0.547)) +@inline smoothness_coefficients(::WENO{4, FT}, ::Val{3}) where FT = @inbounds FT.((0.547, -3.882, 4.642, -1.854, 7.043, -17.246, 7.042, 11.003, -9.402, 2.107)) + +@inline smoothness_coefficients(::WENO{5, FT}, ::Val{0}) where FT = @inbounds FT.((1.07918, -6.49501, 7.58823, -4.11487, 0.86329, 10.20563, -24.62076, 13.58458, -2.88007, 15.21393, -17.04396, 3.64863, 4.82963, -2.08501, 0.22658)) +@inline smoothness_coefficients(::WENO{5, FT}, ::Val{1}) where FT = @inbounds FT.((0.22658, -1.40251, 1.65153, -0.88297, 0.18079, 2.42723, -6.11976, 3.37018, -0.70237, 4.06293, -4.64976, 0.99213, 1.38563, -0.60871, 0.06908)) +@inline smoothness_coefficients(::WENO{5, FT}, ::Val{2}) where FT = @inbounds FT.((0.06908, -0.51001, 0.67923, -0.38947, 0.08209, 1.04963, -2.99076, 1.79098, -0.38947, 2.31153, -2.99076, 0.67923, 1.04963, -0.51001, 0.06908)) +@inline smoothness_coefficients(::WENO{5, FT}, ::Val{3}) where FT = @inbounds FT.((0.06908, -0.60871, 0.99213, -0.70237, 0.18079, 1.38563, -4.64976, 3.37018, -0.88297, 4.06293, -6.11976, 1.65153, 2.42723, -1.40251, 0.22658)) +@inline smoothness_coefficients(::WENO{5, FT}, ::Val{4}) where FT = @inbounds FT.((0.22658, -2.08501, 3.64863, -2.88007, 0.86329, 4.82963, -17.04396, 13.58458, -4.11487, 15.21393, -24.62076, 7.58823, 10.20563, -6.49501, 1.07918)) + +@inline smoothness_coefficients(::WENO{6, FT}, ::Val{0}) where FT = @inbounds FT.((0.6150211, -4.7460464, 7.6206736, -6.3394124, 2.7060170, -0.4712740, 9.4851237, -31.1771244, 26.2901672, -11.3206788, 1.9834350, 26.0445372, -44.4003904, 19.2596472, -3.3918804, 19.0757572, -16.6461044, 2.9442256, 3.6480687, -1.2950184, 0.1152561)) +@inline smoothness_coefficients(::WENO{6, FT}, ::Val{1}) where FT = @inbounds FT.((0.1152561, -0.9117992, 1.4742480, -1.2183636, 0.5134574, -0.0880548, 1.9365967, -6.5224244, 5.5053752, -2.3510468, 0.4067018, 5.6662212, -9.7838784, 4.2405032, -0.7408908, 4.3093692, -3.7913324, 0.6694608, 0.8449957, -0.3015728, 0.0271779)) +@inline smoothness_coefficients(::WENO{6, FT}, ::Val{2}) where FT = @inbounds FT.((0.0271779, -0.2380800, 0.4086352, -0.3462252, 0.1458762, -0.0245620, 0.5653317, -2.0427884, 1.7905032, -0.7727988, 0.1325006, 1.9510972, -3.5817664, 1.5929912, -0.2792660, 1.7195652, -1.5880404, 0.2863984, 0.3824847, -0.1429976, 0.0139633)) +@inline smoothness_coefficients(::WENO{6, FT}, ::Val{3}) where FT = @inbounds FT.((0.0139633, -0.1429976, 0.2863984, -0.2792660, 0.1325006, -0.0245620, 0.3824847, -1.5880404, 1.5929912, -0.7727988, 0.1458762, 1.7195652, -3.5817664, 1.7905032, -0.3462252, 1.9510972, -2.0427884, 0.4086352, 0.5653317, -0.2380800, 0.0271779)) +@inline smoothness_coefficients(::WENO{6, FT}, ::Val{4}) where FT = @inbounds FT.((0.0271779, -0.3015728, 0.6694608, -0.7408908, 0.4067018, -0.0880548, 0.8449957, -3.7913324, 4.2405032, -2.3510468, 0.5134574, 4.3093692, -9.7838784, 5.5053752, -1.2183636, 5.6662212, -6.5224244, 1.4742480, 1.9365967, -0.9117992, 0.1152561)) +@inline smoothness_coefficients(::WENO{6, FT}, ::Val{5}) where FT = @inbounds FT.((0.1152561, -1.2950184, 2.9442256, -3.3918804, 1.9834350, -0.4712740, 3.6480687, -16.6461044, 19.2596472, -11.3206788, 2.7060170, 19.0757572, -44.4003904, 26.2901672, -6.3394124, 26.0445372, -31.1771244, 7.6206736, 9.4851237, -4.7460464, 0.6150211)) # The rule for calculating smoothness indicators is the following (example WENO{4} which is seventh order) # ψ[1] (C[1] * ψ[1] + C[2] * ψ[2] + C[3] * ψ[3] + C[4] * ψ[4]) + @@ -186,17 +185,7 @@ end @inline function metaprogrammed_beta_sum(buffer) elem = Vector(undef, buffer) for stencil = 1:buffer - elem[stencil] = :(@inbounds @fastmath (β₁[$stencil] + β₂[$stencil])/2) - end - - return :($(elem...),) -end - -# left and right biased_β calculation for scheme and stencil = 0:buffer - 1 -@inline function metaprogrammed_beta_loop(buffer) - elem = Vector(undef, buffer) - for stencil = 1:buffer - elem[stencil] = :(func(ψ[$stencil], scheme, Val($(stencil-1)))) + elem[stencil] = :(@inbounds (β₁[$stencil] + β₂[$stencil])/2) end return :($(elem...),) @@ -225,12 +214,107 @@ end for buffer in [2, 3, 4, 5, 6] @eval begin @inline beta_sum(scheme::WENO{$buffer}, β₁, β₂) = @inbounds @fastmath $(metaprogrammed_beta_sum(buffer)) - @inline beta_loop(scheme::WENO{$buffer}, ψ, func) = @inbounds @fastmath $(metaprogrammed_beta_loop(buffer)) - @inline zweno_alpha_loop(scheme::WENO{$buffer}, β, τ, coeff, FT) = @inbounds @fastmath $(metaprogrammed_zweno_alpha_loop(buffer)) @inline js_alpha_loop(scheme::WENO{$buffer}, β, coeff, FT) = @inbounds @fastmath $(metaprogrammed_js_alpha_loop(buffer)) end end +@inline function zweno_alpha_loop(scheme::WENO{2, FT}, β, τ, coeff) where FT + α₀ = @inbounds @fastmath FT(coeff(scheme, Val(0))) * (1 + τ / (β[1] + FT(ε))^2) + α₁ = @inbounds @fastmath FT(coeff(scheme, Val(1))) * (1 + τ / (β[2] + FT(ε))^2) + + return (α₀, α₁) +end + +@inline function zweno_alpha_loop(scheme::WENO{3, FT}, β, τ, coeff) where FT + α₀ = @inbounds @fastmath FT(coeff(scheme, Val(0))) * (1 + τ / (β[1] + FT(ε))^2) + α₁ = @inbounds @fastmath FT(coeff(scheme, Val(1))) * (1 + τ / (β[2] + FT(ε))^2) + α₂ = @inbounds @fastmath FT(coeff(scheme, Val(2))) * (1 + τ / (β[2] + FT(ε))^2) + + return (α₀, α₁, α₂) +end + +@inline function zweno_alpha_loop(scheme::WENO{4, FT}, β, τ, coeff) where FT + α₀ = @inbounds @fastmath FT(coeff(scheme, Val(0))) * (1 + τ / (β[1] + FT(ε))^2) + α₁ = @inbounds @fastmath FT(coeff(scheme, Val(1))) * (1 + τ / (β[2] + FT(ε))^2) + α₂ = @inbounds @fastmath FT(coeff(scheme, Val(2))) * (1 + τ / (β[3] + FT(ε))^2) + α₃ = @inbounds @fastmath FT(coeff(scheme, Val(3))) * (1 + τ / (β[4] + FT(ε))^2) + + return (α₀, α₁, α₂, α₃) +end + +@inline function zweno_alpha_loop(scheme::WENO{5, FT}, β, τ, coeff) where FT + α₀ = @inbounds @fastmath FT(coeff(scheme, Val(0))) * (1 + τ / (β[1] + FT(ε))^2) + α₁ = @inbounds @fastmath FT(coeff(scheme, Val(1))) * (1 + τ / (β[2] + FT(ε))^2) + α₂ = @inbounds @fastmath FT(coeff(scheme, Val(2))) * (1 + τ / (β[3] + FT(ε))^2) + α₃ = @inbounds @fastmath FT(coeff(scheme, Val(3))) * (1 + τ / (β[4] + FT(ε))^2) + α₄ = @inbounds @fastmath FT(coeff(scheme, Val(4))) * (1 + τ / (β[5] + FT(ε))^2) + + return (α₀, α₁, α₂, α₃, α₄) +end + +@inline function zweno_alpha_loop(scheme::WENO{5, FT}, β, τ, coeff) where FT + α₀ = @inbounds @fastmath FT(coeff(scheme, Val(0))) * (1 + τ / (β[1] + FT(ε))^2) + α₁ = @inbounds @fastmath FT(coeff(scheme, Val(1))) * (1 + τ / (β[2] + FT(ε))^2) + α₂ = @inbounds @fastmath FT(coeff(scheme, Val(2))) * (1 + τ / (β[3] + FT(ε))^2) + α₃ = @inbounds @fastmath FT(coeff(scheme, Val(3))) * (1 + τ / (β[4] + FT(ε))^2) + α₄ = @inbounds @fastmath FT(coeff(scheme, Val(4))) * (1 + τ / (β[5] + FT(ε))^2) + α₅ = @inbounds @fastmath FT(coeff(scheme, Val(5))) * (1 + τ / (β[6] + FT(ε))^2) + + return (α₀, α₁, α₂, α₃, α₄, α₅) +end + +# left and right biased_β calculation for scheme and stencil = 0:buffer - 1 +for side in [:left, :right] + β_loop = Symbol(:β_loop, side) + biased_β = Symbol(side, :_biased_β) + @eval begin + @inline function $β_loop(scheme::WENO{2, FT}, ψ) + β₀ = $biased_β(ψ[1], scheme, Val(0)) + β₁ = $biased_β(ψ[2], scheme, Val(1)) + + return (β₀, β₁) + end + + @inline function $β_loop(scheme::WENO{3, FT}, ψ) + β₀ = $biased_β(ψ[1], scheme, Val(0)) + β₁ = $biased_β(ψ[2], scheme, Val(1)) + β₂ = $biased_β(ψ[3], scheme, Val(2)) + + return (β₀, β₁, β₂) + end + + @inline function $β_loop(scheme::WENO{4, FT}, ψ) + β₀ = $biased_β(ψ[1], scheme, Val(0)) + β₁ = $biased_β(ψ[2], scheme, Val(1)) + β₂ = $biased_β(ψ[3], scheme, Val(2)) + β₃ = $biased_β(ψ[4], scheme, Val(3)) + + return (β₀, β₁, β₂, β₃) + end + + @inline function $β_loop(scheme::WENO{5, FT}, ψ) + β₀ = $biased_β(ψ[1], scheme, Val(0)) + β₁ = $biased_β(ψ[2], scheme, Val(1)) + β₂ = $biased_β(ψ[3], scheme, Val(2)) + β₃ = $biased_β(ψ[4], scheme, Val(3)) + β₄ = $biased_β(ψ[5], scheme, Val(4)) + + return (β₀, β₁, β₂, β₃, β₄) + end + + @inline function $β_loop(scheme::WENO{6, FT}, ψ) + β₀ = $biased_β(ψ[1], scheme, Val(0)) + β₁ = $biased_β(ψ[2], scheme, Val(1)) + β₂ = $biased_β(ψ[3], scheme, Val(2)) + β₃ = $biased_β(ψ[4], scheme, Val(3)) + β₄ = $biased_β(ψ[5], scheme, Val(4)) + β₅ = $biased_β(ψ[6], scheme, Val(5)) + + return (β₀, β₁, β₂, β₃, β₄, β₅) + end + end +end + # Global smoothness indicator τ₂ᵣ₋₁ taken from "Accuracy of the weighted essentially non-oscillatory conservative finite difference schemes", Don & Borges, 2013 @inline global_smoothness_indicator(::Val{2}, β) = @inbounds @fastmath abs(β[1] - β[2]) @inline global_smoothness_indicator(::Val{3}, β) = @inbounds @fastmath abs(β[1] - β[3]) @@ -241,8 +325,7 @@ end # Calculating Dynamic WENO Weights (wᵣ), either with JS weno, Z weno or VectorInvariant WENO for (side, coeff) in zip([:left, :right], (:Cl, :Cr)) biased_weno_weights = Symbol(side, :_biased_weno_weights) - biased_β = Symbol(side, :_biased_β) - + beta_loop = Symbol(:β_loop_, side) tangential_stencil_u = Symbol(:tangential_, side, :_stencil_u) tangential_stencil_v = Symbol(:tangential_, side, :_stencil_v) @@ -251,11 +334,11 @@ for (side, coeff) in zip([:left, :right], (:Cl, :Cr)) @eval begin @inline function $biased_weno_weights(ψ, scheme::WENO{N, FT}, args...) where {N, FT} @inbounds begin - β = beta_loop(scheme, ψ, $biased_β) + β = $beta_loop(scheme, ψ) if scheme isa ZWENO τ = global_smoothness_indicator(Val(N), β) - α = zweno_alpha_loop(scheme, β, τ, $coeff, FT) + α = zweno_alpha_loop(scheme, β, τ, $coeff) else α = js_alpha_loop(scheme, β, $coeff, FT) end @@ -272,14 +355,14 @@ for (side, coeff) in zip([:left, :right], (:Cl, :Cr)) uₛ = $tangential_stencil_u(i, j, k, scheme, dir, u) vₛ = $tangential_stencil_v(i, j, k, scheme, dir, v) - βᵤ = beta_loop(scheme, uₛ, $biased_β) - βᵥ = beta_loop(scheme, vₛ, $biased_β) + βᵤ = $beta_loop(scheme, uₛ) + βᵥ = $beta_loop(scheme, vₛ) β = beta_sum(scheme, βᵤ, βᵥ) if scheme isa ZWENO τ = global_smoothness_indicator(Val(N), β) - α = zweno_alpha_loop(scheme, β, τ, $coeff, FT) + α = zweno_alpha_loop(scheme, β, τ, $coeff) else α = js_alpha_loop(scheme, β, $coeff, FT) end From 8f23c87ff00e7a93d63ec140ee26fdbdbf27e125 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 22:26:13 -0400 Subject: [PATCH 014/152] bugfix --- src/Advection/weno_interpolants.jl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index aff389de74..79bed81c54 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -268,14 +268,14 @@ for side in [:left, :right] β_loop = Symbol(:β_loop, side) biased_β = Symbol(side, :_biased_β) @eval begin - @inline function $β_loop(scheme::WENO{2, FT}, ψ) + @inline function $β_loop(scheme::WENO{2}, ψ) β₀ = $biased_β(ψ[1], scheme, Val(0)) β₁ = $biased_β(ψ[2], scheme, Val(1)) return (β₀, β₁) end - @inline function $β_loop(scheme::WENO{3, FT}, ψ) + @inline function $β_loop(scheme::WENO{3}, ψ) β₀ = $biased_β(ψ[1], scheme, Val(0)) β₁ = $biased_β(ψ[2], scheme, Val(1)) β₂ = $biased_β(ψ[3], scheme, Val(2)) @@ -283,7 +283,7 @@ for side in [:left, :right] return (β₀, β₁, β₂) end - @inline function $β_loop(scheme::WENO{4, FT}, ψ) + @inline function $β_loop(scheme::WENO{4}, ψ) β₀ = $biased_β(ψ[1], scheme, Val(0)) β₁ = $biased_β(ψ[2], scheme, Val(1)) β₂ = $biased_β(ψ[3], scheme, Val(2)) @@ -292,7 +292,7 @@ for side in [:left, :right] return (β₀, β₁, β₂, β₃) end - @inline function $β_loop(scheme::WENO{5, FT}, ψ) + @inline function $β_loop(scheme::WENO{5}, ψ) β₀ = $biased_β(ψ[1], scheme, Val(0)) β₁ = $biased_β(ψ[2], scheme, Val(1)) β₂ = $biased_β(ψ[3], scheme, Val(2)) @@ -302,7 +302,7 @@ for side in [:left, :right] return (β₀, β₁, β₂, β₃, β₄) end - @inline function $β_loop(scheme::WENO{6, FT}, ψ) + @inline function $β_loop(scheme::WENO{6}, ψ) β₀ = $biased_β(ψ[1], scheme, Val(0)) β₁ = $biased_β(ψ[2], scheme, Val(1)) β₂ = $biased_β(ψ[3], scheme, Val(2)) From 79c36995ed5e3558ae210199e59f937e13620327 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 23:00:12 -0400 Subject: [PATCH 015/152] bugfix --- src/Advection/weno_interpolants.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 79bed81c54..cc961abed2 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -252,7 +252,7 @@ end return (α₀, α₁, α₂, α₃, α₄) end -@inline function zweno_alpha_loop(scheme::WENO{5, FT}, β, τ, coeff) where FT +@inline function zweno_alpha_loop(scheme::WENO{6, FT}, β, τ, coeff) where FT α₀ = @inbounds @fastmath FT(coeff(scheme, Val(0))) * (1 + τ / (β[1] + FT(ε))^2) α₁ = @inbounds @fastmath FT(coeff(scheme, Val(1))) * (1 + τ / (β[2] + FT(ε))^2) α₂ = @inbounds @fastmath FT(coeff(scheme, Val(2))) * (1 + τ / (β[3] + FT(ε))^2) From 9fef163687d985b5c9f9c37d5d73180cc55a08f8 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 23:01:01 -0400 Subject: [PATCH 016/152] remove JS weno --- src/Advection/weno_interpolants.jl | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index cc961abed2..6dd771fa83 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -335,14 +335,9 @@ for (side, coeff) in zip([:left, :right], (:Cl, :Cr)) @inline function $biased_weno_weights(ψ, scheme::WENO{N, FT}, args...) where {N, FT} @inbounds begin β = $beta_loop(scheme, ψ) - - if scheme isa ZWENO - τ = global_smoothness_indicator(Val(N), β) - α = zweno_alpha_loop(scheme, β, τ, $coeff) - else - α = js_alpha_loop(scheme, β, $coeff, FT) - end - + τ = global_smoothness_indicator(Val(N), β) + α = zweno_alpha_loop(scheme, β, τ, $coeff) + α_tot = 1 / sum(α) return α .* α_tot @@ -358,15 +353,9 @@ for (side, coeff) in zip([:left, :right], (:Cl, :Cr)) βᵤ = $beta_loop(scheme, uₛ) βᵥ = $beta_loop(scheme, vₛ) - β = beta_sum(scheme, βᵤ, βᵥ) - - if scheme isa ZWENO - τ = global_smoothness_indicator(Val(N), β) - α = zweno_alpha_loop(scheme, β, τ, $coeff) - else - α = js_alpha_loop(scheme, β, $coeff, FT) - end - + β = beta_sum(scheme, βᵤ, βᵥ) + τ = global_smoothness_indicator(Val(N), β) + α = zweno_alpha_loop(scheme, β, τ, $coeff) α_tot = 1 / sum(α) return α .* α_tot From 15c764f6ed4d08f9af30dc01f2ec311c79c67723 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 23:04:25 -0400 Subject: [PATCH 017/152] remove js weno --- src/Advection/weno_interpolants.jl | 31 +++--------------------------- 1 file changed, 3 insertions(+), 28 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 6dd771fa83..2e126bb6f0 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -191,30 +191,9 @@ end return :($(elem...),) end -# ZWENO α weights dᵣ * (1 + (τ₂ᵣ₋₁ / (βᵣ + ε))ᵖ) -@inline function metaprogrammed_zweno_alpha_loop(buffer) - elem = Vector(undef, buffer) - for stencil = 1:buffer - elem[stencil] = :(FT(coeff(scheme, Val($(stencil-1)))) * (1 + (τ / (β[$stencil] + FT(ε))^2))) - end - - return :($(elem...),) -end - -# JSWENO α weights dᵣ / (βᵣ + ε)² -@inline function metaprogrammed_js_alpha_loop(buffer) - elem = Vector(undef, buffer) - for stencil = 1:buffer - elem[stencil] = :(FT(coeff(scheme, Val($(stencil-1)))) / (β[$stencil] + FT(ε))^2) - end - - return :($(elem...),) -end - for buffer in [2, 3, 4, 5, 6] @eval begin - @inline beta_sum(scheme::WENO{$buffer}, β₁, β₂) = @inbounds @fastmath $(metaprogrammed_beta_sum(buffer)) - @inline js_alpha_loop(scheme::WENO{$buffer}, β, coeff, FT) = @inbounds @fastmath $(metaprogrammed_js_alpha_loop(buffer)) + @inline beta_sum(scheme::WENO{$buffer}, β₁, β₂) = @inbounds @fastmath $(metaprogrammed_beta_sum(buffer)) end end @@ -337,10 +316,7 @@ for (side, coeff) in zip([:left, :right], (:Cl, :Cr)) β = $beta_loop(scheme, ψ) τ = global_smoothness_indicator(Val(N), β) α = zweno_alpha_loop(scheme, β, τ, $coeff) - - α_tot = 1 / sum(α) - - return α .* α_tot + return α ./ sum(α) end end @@ -356,9 +332,8 @@ for (side, coeff) in zip([:left, :right], (:Cl, :Cr)) β = beta_sum(scheme, βᵤ, βᵥ) τ = global_smoothness_indicator(Val(N), β) α = zweno_alpha_loop(scheme, β, τ, $coeff) - α_tot = 1 / sum(α) - return α .* α_tot + return α ./ sum(α) end end end From e91aa61b709756efece7eecb2fa2e485614dc1ce Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 23:16:12 -0400 Subject: [PATCH 018/152] reducing registers? --- src/Advection/weno_interpolants.jl | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 2e126bb6f0..879df2c71e 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -181,20 +181,11 @@ for buffer in [2, 3, 4, 5, 6] end end -# Shenanigans for WENO weights calculation for vector invariant formulation -> [β[i] = 0.5*(βᵤ[i] + βᵥ[i]) for i in 1:buffer] -@inline function metaprogrammed_beta_sum(buffer) - elem = Vector(undef, buffer) - for stencil = 1:buffer - elem[stencil] = :(@inbounds (β₁[$stencil] + β₂[$stencil])/2) - end - - return :($(elem...),) -end - -for buffer in [2, 3, 4, 5, 6] - @eval begin - @inline beta_sum(scheme::WENO{$buffer}, β₁, β₂) = @inbounds @fastmath $(metaprogrammed_beta_sum(buffer)) +@inline function beta_sum(::Val{buffer}, β₁, β₂) where buffer + @unroll for i in 1:buffer + @ibounds β₁[i] = (β₁[i] + β₂[i]) / 2 end + return β₁ end @inline function zweno_alpha_loop(scheme::WENO{2, FT}, β, τ, coeff) where FT @@ -326,12 +317,12 @@ for (side, coeff) in zip([:left, :right], (:Cl, :Cr)) uₛ = $tangential_stencil_u(i, j, k, scheme, dir, u) vₛ = $tangential_stencil_v(i, j, k, scheme, dir, v) - βᵤ = $beta_loop(scheme, uₛ) - βᵥ = $beta_loop(scheme, vₛ) + β₁ = $beta_loop(scheme, uₛ) + β₂ = $beta_loop(scheme, vₛ) - β = beta_sum(scheme, βᵤ, βᵥ) - τ = global_smoothness_indicator(Val(N), β) - α = zweno_alpha_loop(scheme, β, τ, $coeff) + β₁ = beta_sum(Val(N), β₁, β₂) + τ = global_smoothness_indicator(Val(N), β₁) + α = zweno_alpha_loop(scheme, β₁, τ, $coeff) return α ./ sum(α) end From 492f3afabd55afe7f9ceb75e9e87a5ead380564c Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 23:17:08 -0400 Subject: [PATCH 019/152] reduce registers --- src/Advection/weno_interpolants.jl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 879df2c71e..52ccb3a44c 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -368,16 +368,16 @@ julia> calc_weno_stencil(2, :right, :x) c = n - buffer - 1 if func stencil_point[idx] = dir == :x ? - :(@inbounds ψ(i + $c, j, k, args...)) : + :(ψ(i + $c, j, k, args...)) : dir == :y ? - :(@inbounds ψ(i, j + $c, k, args...)) : - :(@inbounds ψ(i, j, k + $c, args...)) + :(ψ(i, j + $c, k, args...)) : + :(ψ(i, j, k + $c, args...)) else stencil_point[idx] = dir == :x ? - :(@inbounds ψ[i + $c, j, k]) : + :(ψ[i + $c, j, k]) : dir == :y ? - :(@inbounds ψ[i, j + $c, k]) : - :(@inbounds ψ[i, j, k + $c]) + :(ψ[i, j + $c, k]) : + :(ψ[i, j, k + $c]) end end stencil_full[buffer - stencil + 1] = :($(stencil_point...), ) From 70fa8409f5a1aab35b3041484002061690f58572 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 23:28:03 -0400 Subject: [PATCH 020/152] try it now --- src/Advection/Advection.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Advection/Advection.jl b/src/Advection/Advection.jl index b8d7d96469..c3d6d19ce3 100644 --- a/src/Advection/Advection.jl +++ b/src/Advection/Advection.jl @@ -40,6 +40,8 @@ import Base: show, summary import Oceananigans.Grids: required_halo_size import Oceananigans.Architectures: on_architecture +using KernelAbstractions.Extras.LoopInfo: @unroll + abstract type AbstractAdvectionScheme{B, FT} end abstract type AbstractCenteredAdvectionScheme{B, FT} <: AbstractAdvectionScheme{B, FT} end abstract type AbstractUpwindBiasedAdvectionScheme{B, FT} <: AbstractAdvectionScheme{B, FT} end From c969ebc2a8265ee7f408d99d23e2256a4e3b7417 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 23:29:30 -0400 Subject: [PATCH 021/152] bugfix --- src/Advection/weno_interpolants.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 52ccb3a44c..d9b82b7c12 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -183,7 +183,7 @@ end @inline function beta_sum(::Val{buffer}, β₁, β₂) where buffer @unroll for i in 1:buffer - @ibounds β₁[i] = (β₁[i] + β₂[i]) / 2 + @inbounds β₁[i] = (β₁[i] + β₂[i]) / 2 end return β₁ end From d906af04d2376e22cad2b1823dc5ca036215e3fd Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 23:31:35 -0400 Subject: [PATCH 022/152] json3 --- Manifest.toml | 12 +++--------- Project.toml | 1 + 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/Manifest.toml b/Manifest.toml index 75e2e2cfa1..db251cca6f 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -2,7 +2,7 @@ julia_version = "1.10.2" manifest_format = "2.0" -project_hash = "04d395caf937b0921325a77873167e8baa293a99" +project_hash = "b88218a83f549bb63907bbcc5722346210b95d8b" [[deps.AbstractFFTs]] deps = ["LinearAlgebra"] @@ -397,15 +397,9 @@ version = "1.5.0" [[deps.JSON3]] deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] -git-tree-sha1 = "eb3edce0ed4fa32f75a0a11217433c31d56bd48b" +git-tree-sha1 = "95220473901735a0f4df9d1ca5b171b568b2daa3" uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" -version = "1.14.0" - - [deps.JSON3.extensions] - JSON3ArrowExt = ["ArrowTypes"] - - [deps.JSON3.weakdeps] - ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" +version = "1.13.2" [[deps.JuliaNVTXCallbacks_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] diff --git a/Project.toml b/Project.toml index 7438f1c929..86b38e2a66 100644 --- a/Project.toml +++ b/Project.toml @@ -17,6 +17,7 @@ IncompleteLU = "40713840-3770-5561-ab4c-a76e7d0d7895" InteractiveUtils = "b77e0a4c-d291-57a0-90e8-8db25a27a240" IterativeSolvers = "42fd0dbc-a981-5370-80f2-aaf504508153" JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" From 47078e17976c9a941004037eee81867950e98383 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 23:35:50 -0400 Subject: [PATCH 023/152] try it now --- src/Advection/weno_interpolants.jl | 75 +++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index d9b82b7c12..9f45c9eb80 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -235,7 +235,7 @@ end # left and right biased_β calculation for scheme and stencil = 0:buffer - 1 for side in [:left, :right] - β_loop = Symbol(:β_loop, side) + β_loop = Symbol(:β_loop_, side) biased_β = Symbol(side, :_biased_β) @eval begin @inline function $β_loop(scheme::WENO{2}, ψ) @@ -398,6 +398,79 @@ for side in (:left, :right), dir in (:x, :y, :z) end end +# @inline function calc_weno_stencil_function(buffer, shift, dir) +# N = buffer * 2 +# if shift != :none +# N -=1 +# end +# stencil_full = Vector(undef, buffer) +# rng = 1:N +# if shift == :right +# rng = rng .+ 1 +# end +# for stencil in 1:buffer +# stencil_point = Vector(undef, buffer) +# rngstencil = rng[stencil:stencil+buffer-1] +# for (idx, n) in enumerate(rngstencil) +# c = n - buffer - 1 +# stencil_point[idx] = dir == :x ? +# :(ψ(i + $c, j, k, args...)) : +# dir == :y ? +# :(ψ(i, j + $c, k, args...)) : +# :(ψ(i, j, k + $c, args...)) +# end +# stencil_full[buffer - stencil + 1] = :($(stencil_point...), ) +# end +# return :($(stencil_full...),) +# end + +# @inline function calc_weno_stencil_variable(buffer, shift, dir, field::Bool = false) +# N = buffer * 2 +# if shift != :none +# N -=1 +# end +# stencil_full = Vector(undef, buffer) +# rng = 1:N +# if shift == :right +# rng = rng .+ 1 +# end +# for stencil in 1:buffer +# rngstencil = rng[stencil:stencil+buffer-1] +# c_min = rngstencil[1] - buffer - 1 +# c_max = rngstencil[end] - buffer - 1 +# if field +# stencil_full[buffer - stencil + 1] = dir == :x ? +# :(view(ψ.data, i+$c_min:i+$c_max, j, k)) : +# dir == :y ? +# :(view(ψ.data, i, j+$c_min:j+$c_max, k)) : +# :(view(ψ.data, i, j, k+$c_min:k+$c_max)) +# else +# stencil_full[buffer - stencil + 1] = dir == :x ? +# :(view(ψ, i+$c_min:i+$c_max, j, k)) : +# dir == :y ? +# :(view(ψ, i, j+$c_min:j+$c_max, k)) : +# :(view(ψ, i, j, k+$c_min:k+$c_max)) +# end +# end +# return :($(stencil_full...),) +# end + +# using Oceananigans.Fields: Field + +# # Stencils for left and right biased reconstruction ((ψ̅ᵢ₋ᵣ₊ⱼ for j in 0:k) for r in 0:k) to calculate v̂ᵣ = ∑ⱼ(cᵣⱼψ̅ᵢ₋ᵣ₊ⱼ) +# # where `k = N - 1`. Coefficients (cᵣⱼ for j in 0:N) for stencil r are given by `coeff_side_p(scheme, Val(r), ...)` +# for side in (:left, :right), dir in (:x, :y, :z) +# stencil = Symbol(side, :_stencil_, dir) + +# for buffer in [2, 3, 4, 5, 6] +# @eval begin +# @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ::Field, args...) = @inbounds $(calc_weno_stencil_variable(buffer, side, dir, true)) +# @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ::AbstractArray, args...) = @inbounds $(calc_weno_stencil_variable(buffer, side, dir, false)) +# @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ::Function, args...) = @inbounds $(calc_weno_stencil_function(buffer, side, dir)) +# end +# end +# end + # Stencil for vector invariant calculation of smoothness indicators in the horizontal direction # Parallel to the interpolation direction! (same as left/right stencil) using Oceananigans.Operators: ℑyᵃᶠᵃ, ℑxᶠᵃᵃ From da87968826e0dfae7dac92bec4ff6a18bb811064 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 23:41:04 -0400 Subject: [PATCH 024/152] ready to go --- src/Advection/weno_interpolants.jl | 55 +++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 9f45c9eb80..312413afbd 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -1,3 +1,6 @@ +using Oceananigans.Fields: Field +using Oceananigans.Operators: ℑyᵃᶠᵃ, ℑxᶠᵃᵃ + # WENO reconstruction of order `M` entails reconstructions of order `N` # on `N` different stencils, where `N = (M + 1) / 2`. # @@ -181,11 +184,49 @@ for buffer in [2, 3, 4, 5, 6] end end -@inline function beta_sum(::Val{buffer}, β₁, β₂) where buffer - @unroll for i in 1:buffer - @inbounds β₁[i] = (β₁[i] + β₂[i]) / 2 - end - return β₁ +@inline function beta_sum(::Val{2}, βᵤ, βᵥ) + β₀ = (βᵤ[1] + βᵥ[1]) / 2 + β₁ = (βᵤ[2] + βᵥ[2]) / 2 + + return (β₀, β₁) +end + +@inline function beta_sum(::Val{3}, βᵤ, βᵥ) + β₀ = (βᵤ[1] + βᵥ[1]) / 2 + β₁ = (βᵤ[2] + βᵥ[2]) / 2 + β₂ = (βᵤ[3] + βᵥ[3]) / 2 + + return (β₀, β₁, β₂) +end + +@inline function beta_sum(::Val{4}, βᵤ, βᵥ) + β₀ = (βᵤ[1] + βᵥ[1]) / 2 + β₁ = (βᵤ[2] + βᵥ[2]) / 2 + β₂ = (βᵤ[3] + βᵥ[3]) / 2 + β₃ = (βᵤ[4] + βᵥ[4]) / 2 + + return (β₀, β₁, β₂, β₃) +end + +@inline function beta_sum(::Val{5}, βᵤ, βᵥ) + β₀ = (βᵤ[1] + βᵥ[1]) / 2 + β₁ = (βᵤ[2] + βᵥ[2]) / 2 + β₂ = (βᵤ[3] + βᵥ[3]) / 2 + β₃ = (βᵤ[4] + βᵥ[4]) / 2 + β₄ = (βᵤ[5] + βᵥ[5]) / 2 + + return (β₀, β₁, β₂, β₃, β₄) +end + +@inline function beta_sum(::Val{6}, βᵤ, βᵥ) + β₀ = (βᵤ[1] + βᵥ[1]) / 2 + β₁ = (βᵤ[2] + βᵥ[2]) / 2 + β₂ = (βᵤ[3] + βᵥ[3]) / 2 + β₃ = (βᵤ[4] + βᵥ[4]) / 2 + β₄ = (βᵤ[5] + βᵥ[5]) / 2 + β₅ = (βᵤ[6] + βᵥ[6]) / 2 + + return (β₀, β₁, β₂, β₃, β₄, β₅) end @inline function zweno_alpha_loop(scheme::WENO{2, FT}, β, τ, coeff) where FT @@ -455,8 +496,6 @@ end # return :($(stencil_full...),) # end -# using Oceananigans.Fields: Field - # # Stencils for left and right biased reconstruction ((ψ̅ᵢ₋ᵣ₊ⱼ for j in 0:k) for r in 0:k) to calculate v̂ᵣ = ∑ⱼ(cᵣⱼψ̅ᵢ₋ᵣ₊ⱼ) # # where `k = N - 1`. Coefficients (cᵣⱼ for j in 0:N) for stencil r are given by `coeff_side_p(scheme, Val(r), ...)` # for side in (:left, :right), dir in (:x, :y, :z) @@ -473,8 +512,6 @@ end # Stencil for vector invariant calculation of smoothness indicators in the horizontal direction # Parallel to the interpolation direction! (same as left/right stencil) -using Oceananigans.Operators: ℑyᵃᶠᵃ, ℑxᶠᵃᵃ - @inline tangential_left_stencil_u(i, j, k, scheme, ::Val{1}, u) = @inbounds @fastmath left_stencil_x(i, j, k, scheme, ℑyᵃᶠᵃ, u) @inline tangential_left_stencil_u(i, j, k, scheme, ::Val{2}, u) = @inbounds @fastmath left_stencil_y(i, j, k, scheme, ℑyᵃᶠᵃ, u) @inline tangential_left_stencil_v(i, j, k, scheme, ::Val{1}, v) = @inbounds @fastmath left_stencil_x(i, j, k, scheme, ℑxᶠᵃᵃ, v) From 845a25203b2b5cb3de2bcd41148404da8b780b50 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 12 Mar 2024 23:54:01 -0400 Subject: [PATCH 025/152] new stencils --- src/Advection/weno_interpolants.jl | 174 ++++++++++++++--------------- 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 312413afbd..314ad79047 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -392,54 +392,7 @@ julia> calc_weno_stencil(2, :right, :x) :(((ψ[i + 0, j, k], ψ[i + 1, j, k]), (ψ[i + -1, j, k], ψ[i + 0, j, k]))) """ -@inline function calc_weno_stencil(buffer, shift, dir, func::Bool = false) - N = buffer * 2 - if shift != :none - N -=1 - end - stencil_full = Vector(undef, buffer) - rng = 1:N - if shift == :right - rng = rng .+ 1 - end - for stencil in 1:buffer - stencil_point = Vector(undef, buffer) - rngstencil = rng[stencil:stencil+buffer-1] - for (idx, n) in enumerate(rngstencil) - c = n - buffer - 1 - if func - stencil_point[idx] = dir == :x ? - :(ψ(i + $c, j, k, args...)) : - dir == :y ? - :(ψ(i, j + $c, k, args...)) : - :(ψ(i, j, k + $c, args...)) - else - stencil_point[idx] = dir == :x ? - :(ψ[i + $c, j, k]) : - dir == :y ? - :(ψ[i, j + $c, k]) : - :(ψ[i, j, k + $c]) - end - end - stencil_full[buffer - stencil + 1] = :($(stencil_point...), ) - end - return :($(stencil_full...),) -end - -# Stencils for left and right biased reconstruction ((ψ̅ᵢ₋ᵣ₊ⱼ for j in 0:k) for r in 0:k) to calculate v̂ᵣ = ∑ⱼ(cᵣⱼψ̅ᵢ₋ᵣ₊ⱼ) -# where `k = N - 1`. Coefficients (cᵣⱼ for j in 0:N) for stencil r are given by `coeff_side_p(scheme, Val(r), ...)` -for side in (:left, :right), dir in (:x, :y, :z) - stencil = Symbol(side, :_stencil_, dir) - - for buffer in [2, 3, 4, 5, 6] - @eval begin - @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, false)) - @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ::Function, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, true)) - end - end -end - -# @inline function calc_weno_stencil_function(buffer, shift, dir) +# @inline function calc_weno_stencil(buffer, shift, dir, func::Bool = false) # N = buffer * 2 # if shift != :none # N -=1 @@ -454,48 +407,25 @@ end # rngstencil = rng[stencil:stencil+buffer-1] # for (idx, n) in enumerate(rngstencil) # c = n - buffer - 1 -# stencil_point[idx] = dir == :x ? -# :(ψ(i + $c, j, k, args...)) : -# dir == :y ? -# :(ψ(i, j + $c, k, args...)) : -# :(ψ(i, j, k + $c, args...)) +# if func +# stencil_point[idx] = dir == :x ? +# :(ψ(i + $c, j, k, args...)) : +# dir == :y ? +# :(ψ(i, j + $c, k, args...)) : +# :(ψ(i, j, k + $c, args...)) +# else +# stencil_point[idx] = dir == :x ? +# :(ψ[i + $c, j, k]) : +# dir == :y ? +# :(ψ[i, j + $c, k]) : +# :(ψ[i, j, k + $c]) +# end # end # stencil_full[buffer - stencil + 1] = :($(stencil_point...), ) # end # return :($(stencil_full...),) # end -# @inline function calc_weno_stencil_variable(buffer, shift, dir, field::Bool = false) -# N = buffer * 2 -# if shift != :none -# N -=1 -# end -# stencil_full = Vector(undef, buffer) -# rng = 1:N -# if shift == :right -# rng = rng .+ 1 -# end -# for stencil in 1:buffer -# rngstencil = rng[stencil:stencil+buffer-1] -# c_min = rngstencil[1] - buffer - 1 -# c_max = rngstencil[end] - buffer - 1 -# if field -# stencil_full[buffer - stencil + 1] = dir == :x ? -# :(view(ψ.data, i+$c_min:i+$c_max, j, k)) : -# dir == :y ? -# :(view(ψ.data, i, j+$c_min:j+$c_max, k)) : -# :(view(ψ.data, i, j, k+$c_min:k+$c_max)) -# else -# stencil_full[buffer - stencil + 1] = dir == :x ? -# :(view(ψ, i+$c_min:i+$c_max, j, k)) : -# dir == :y ? -# :(view(ψ, i, j+$c_min:j+$c_max, k)) : -# :(view(ψ, i, j, k+$c_min:k+$c_max)) -# end -# end -# return :($(stencil_full...),) -# end - # # Stencils for left and right biased reconstruction ((ψ̅ᵢ₋ᵣ₊ⱼ for j in 0:k) for r in 0:k) to calculate v̂ᵣ = ∑ⱼ(cᵣⱼψ̅ᵢ₋ᵣ₊ⱼ) # # where `k = N - 1`. Coefficients (cᵣⱼ for j in 0:N) for stencil r are given by `coeff_side_p(scheme, Val(r), ...)` # for side in (:left, :right), dir in (:x, :y, :z) @@ -503,13 +433,83 @@ end # for buffer in [2, 3, 4, 5, 6] # @eval begin -# @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ::Field, args...) = @inbounds $(calc_weno_stencil_variable(buffer, side, dir, true)) -# @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ::AbstractArray, args...) = @inbounds $(calc_weno_stencil_variable(buffer, side, dir, false)) -# @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ::Function, args...) = @inbounds $(calc_weno_stencil_function(buffer, side, dir)) +# @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, false)) +# @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ::Function, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, true)) # end # end # end +@inline function calc_weno_stencil_function(buffer, shift, dir) + N = buffer * 2 + if shift != :none + N -=1 + end + stencil_full = Vector(undef, buffer) + rng = 1:N + if shift == :right + rng = rng .+ 1 + end + for stencil in 1:buffer + stencil_point = Vector(undef, buffer) + rngstencil = rng[stencil:stencil+buffer-1] + for (idx, n) in enumerate(rngstencil) + c = n - buffer - 1 + stencil_point[idx] = dir == :x ? + :(ψ(i + $c, j, k, args...)) : + dir == :y ? + :(ψ(i, j + $c, k, args...)) : + :(ψ(i, j, k + $c, args...)) + end + stencil_full[buffer - stencil + 1] = :($(stencil_point...), ) + end + return :($(stencil_full...),) +end + +@inline function calc_weno_stencil_variable(buffer, shift, dir, field::Bool = false) + N = buffer * 2 + if shift != :none + N -=1 + end + stencil_full = Vector(undef, buffer) + rng = 1:N + if shift == :right + rng = rng .+ 1 + end + for stencil in 1:buffer + rngstencil = rng[stencil:stencil+buffer-1] + c_min = rngstencil[1] - buffer - 1 + c_max = rngstencil[end] - buffer - 1 + if field + stencil_full[buffer - stencil + 1] = dir == :x ? + :(view(ψ.data, i+$c_min:i+$c_max, j, k)) : + dir == :y ? + :(view(ψ.data, i, j+$c_min:j+$c_max, k)) : + :(view(ψ.data, i, j, k+$c_min:k+$c_max)) + else + stencil_full[buffer - stencil + 1] = dir == :x ? + :(view(ψ, i+$c_min:i+$c_max, j, k)) : + dir == :y ? + :(view(ψ, i, j+$c_min:j+$c_max, k)) : + :(view(ψ, i, j, k+$c_min:k+$c_max)) + end + end + return :($(stencil_full...),) +end + +# Stencils for left and right biased reconstruction ((ψ̅ᵢ₋ᵣ₊ⱼ for j in 0:k) for r in 0:k) to calculate v̂ᵣ = ∑ⱼ(cᵣⱼψ̅ᵢ₋ᵣ₊ⱼ) +# where `k = N - 1`. Coefficients (cᵣⱼ for j in 0:N) for stencil r are given by `coeff_side_p(scheme, Val(r), ...)` +for side in (:left, :right), dir in (:x, :y, :z) + stencil = Symbol(side, :_stencil_, dir) + + for buffer in [2, 3, 4, 5, 6] + @eval begin + @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ::Field, args...) = @inbounds $(calc_weno_stencil_variable(buffer, side, dir, true)) + @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ::AbstractArray, args...) = @inbounds $(calc_weno_stencil_variable(buffer, side, dir, false)) + @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ::Function, args...) = @inbounds $(calc_weno_stencil_function(buffer, side, dir)) + end + end +end + # Stencil for vector invariant calculation of smoothness indicators in the horizontal direction # Parallel to the interpolation direction! (same as left/right stencil) @inline tangential_left_stencil_u(i, j, k, scheme, ::Val{1}, u) = @inbounds @fastmath left_stencil_x(i, j, k, scheme, ℑyᵃᶠᵃ, u) From 6c3c1364b074760e82ceff8195cb1e7b7d5d9835 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 00:00:37 -0400 Subject: [PATCH 026/152] bugfix --- src/Advection/weno_interpolants.jl | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 314ad79047..b446f83bf8 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -116,8 +116,23 @@ for buffer in [2, 3, 4, 5, 6] # left biased and right biased reconstruction value for each stencil @eval begin - @inline left_biased_p(scheme::WENO{$buffer}, ::Val{$stencil}, ψ, T, dir, i, loc) = @inbounds sum(coeff_left_p(scheme, Val($stencil), T, dir, i, loc) .* ψ) - @inline right_biased_p(scheme::WENO{$buffer}, ::Val{$stencil}, ψ, T, dir, i, loc) = @inbounds sum(coeff_right_p(scheme, Val($stencil), T, dir, i, loc) .* ψ) + @inline function left_biased_p(scheme::WENO{$buffer}, ::Val{$stencil}, ψ, T, dir, i, loc) + C = coeff_left_p(scheme, Val($stencil), T, dir, i, loc) + r = 0 + @unroll for idx in 1:$buffer + r += C[idx] * ψ[idx] + end + return r + end + + @inline function right_biased_p(scheme::WENO{$buffer}, ::Val{$stencil}, ψ, T, dir, i, loc) + C = coeff_right_p(scheme, Val($stencil), T, dir, i, loc) + r = 0 + @unroll for idx in 1:$buffer + r += C[idx] * ψ[idx] + end + return r + end end end end From 44312e05acb30c64dcf59c64cf9b41f17c23eea4 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 00:12:52 -0400 Subject: [PATCH 027/152] go back --- src/Advection/weno_interpolants.jl | 122 +++++------------------------ 1 file changed, 18 insertions(+), 104 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index b446f83bf8..d3cb6b3cb0 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -116,23 +116,8 @@ for buffer in [2, 3, 4, 5, 6] # left biased and right biased reconstruction value for each stencil @eval begin - @inline function left_biased_p(scheme::WENO{$buffer}, ::Val{$stencil}, ψ, T, dir, i, loc) - C = coeff_left_p(scheme, Val($stencil), T, dir, i, loc) - r = 0 - @unroll for idx in 1:$buffer - r += C[idx] * ψ[idx] - end - return r - end - - @inline function right_biased_p(scheme::WENO{$buffer}, ::Val{$stencil}, ψ, T, dir, i, loc) - C = coeff_right_p(scheme, Val($stencil), T, dir, i, loc) - r = 0 - @unroll for idx in 1:$buffer - r += C[idx] * ψ[idx] - end - return r - end + @inline left_biased_p(scheme::WENO{$buffer}, ::Val{$stencil}, ψ, T, dir, i, loc) = @inbounds sum(coeff_left_p(scheme, Val($stencil), T, dir, i, loc) .* ψ) + @inline right_biased_p(scheme::WENO{$buffer}, ::Val{$stencil}, ψ, T, dir, i, loc) = @inbounds sum(coeff_right_p(scheme, Val($stencil), T, dir, i, loc) .* ψ) end end end @@ -407,54 +392,7 @@ julia> calc_weno_stencil(2, :right, :x) :(((ψ[i + 0, j, k], ψ[i + 1, j, k]), (ψ[i + -1, j, k], ψ[i + 0, j, k]))) """ -# @inline function calc_weno_stencil(buffer, shift, dir, func::Bool = false) -# N = buffer * 2 -# if shift != :none -# N -=1 -# end -# stencil_full = Vector(undef, buffer) -# rng = 1:N -# if shift == :right -# rng = rng .+ 1 -# end -# for stencil in 1:buffer -# stencil_point = Vector(undef, buffer) -# rngstencil = rng[stencil:stencil+buffer-1] -# for (idx, n) in enumerate(rngstencil) -# c = n - buffer - 1 -# if func -# stencil_point[idx] = dir == :x ? -# :(ψ(i + $c, j, k, args...)) : -# dir == :y ? -# :(ψ(i, j + $c, k, args...)) : -# :(ψ(i, j, k + $c, args...)) -# else -# stencil_point[idx] = dir == :x ? -# :(ψ[i + $c, j, k]) : -# dir == :y ? -# :(ψ[i, j + $c, k]) : -# :(ψ[i, j, k + $c]) -# end -# end -# stencil_full[buffer - stencil + 1] = :($(stencil_point...), ) -# end -# return :($(stencil_full...),) -# end - -# # Stencils for left and right biased reconstruction ((ψ̅ᵢ₋ᵣ₊ⱼ for j in 0:k) for r in 0:k) to calculate v̂ᵣ = ∑ⱼ(cᵣⱼψ̅ᵢ₋ᵣ₊ⱼ) -# # where `k = N - 1`. Coefficients (cᵣⱼ for j in 0:N) for stencil r are given by `coeff_side_p(scheme, Val(r), ...)` -# for side in (:left, :right), dir in (:x, :y, :z) -# stencil = Symbol(side, :_stencil_, dir) - -# for buffer in [2, 3, 4, 5, 6] -# @eval begin -# @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, false)) -# @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ::Function, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, true)) -# end -# end -# end - -@inline function calc_weno_stencil_function(buffer, shift, dir) +@inline function calc_weno_stencil(buffer, shift, dir, func::Bool = false) N = buffer * 2 if shift != :none N -=1 @@ -469,48 +407,25 @@ julia> calc_weno_stencil(2, :right, :x) rngstencil = rng[stencil:stencil+buffer-1] for (idx, n) in enumerate(rngstencil) c = n - buffer - 1 - stencil_point[idx] = dir == :x ? - :(ψ(i + $c, j, k, args...)) : - dir == :y ? - :(ψ(i, j + $c, k, args...)) : - :(ψ(i, j, k + $c, args...)) + if func + stencil_point[idx] = dir == :x ? + :(ψ(i + $c, j, k, args...)) : + dir == :y ? + :(ψ(i, j + $c, k, args...)) : + :(ψ(i, j, k + $c, args...)) + else + stencil_point[idx] = dir == :x ? + :(ψ[i + $c, j, k]) : + dir == :y ? + :(ψ[i, j + $c, k]) : + :(ψ[i, j, k + $c]) + end end stencil_full[buffer - stencil + 1] = :($(stencil_point...), ) end return :($(stencil_full...),) end -@inline function calc_weno_stencil_variable(buffer, shift, dir, field::Bool = false) - N = buffer * 2 - if shift != :none - N -=1 - end - stencil_full = Vector(undef, buffer) - rng = 1:N - if shift == :right - rng = rng .+ 1 - end - for stencil in 1:buffer - rngstencil = rng[stencil:stencil+buffer-1] - c_min = rngstencil[1] - buffer - 1 - c_max = rngstencil[end] - buffer - 1 - if field - stencil_full[buffer - stencil + 1] = dir == :x ? - :(view(ψ.data, i+$c_min:i+$c_max, j, k)) : - dir == :y ? - :(view(ψ.data, i, j+$c_min:j+$c_max, k)) : - :(view(ψ.data, i, j, k+$c_min:k+$c_max)) - else - stencil_full[buffer - stencil + 1] = dir == :x ? - :(view(ψ, i+$c_min:i+$c_max, j, k)) : - dir == :y ? - :(view(ψ, i, j+$c_min:j+$c_max, k)) : - :(view(ψ, i, j, k+$c_min:k+$c_max)) - end - end - return :($(stencil_full...),) -end - # Stencils for left and right biased reconstruction ((ψ̅ᵢ₋ᵣ₊ⱼ for j in 0:k) for r in 0:k) to calculate v̂ᵣ = ∑ⱼ(cᵣⱼψ̅ᵢ₋ᵣ₊ⱼ) # where `k = N - 1`. Coefficients (cᵣⱼ for j in 0:N) for stencil r are given by `coeff_side_p(scheme, Val(r), ...)` for side in (:left, :right), dir in (:x, :y, :z) @@ -518,9 +433,8 @@ for side in (:left, :right), dir in (:x, :y, :z) for buffer in [2, 3, 4, 5, 6] @eval begin - @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ::Field, args...) = @inbounds $(calc_weno_stencil_variable(buffer, side, dir, true)) - @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ::AbstractArray, args...) = @inbounds $(calc_weno_stencil_variable(buffer, side, dir, false)) - @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ::Function, args...) = @inbounds $(calc_weno_stencil_function(buffer, side, dir)) + @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, false)) + @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ::Function, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, true)) end end end From 89028ad1cbe477730aac12fa50ba4dc236a67c2c Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 01:00:32 -0400 Subject: [PATCH 028/152] sadly just weno js --- src/Advection/weno_interpolants.jl | 407 ++++++++--------------------- 1 file changed, 107 insertions(+), 300 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index d3cb6b3cb0..84f03a6650 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -72,55 +72,30 @@ const ε = 1e-8 # Optimal values taken from # Balsara & Shu, "Monotonicity Preserving Weighted Essentially Non-oscillatory Schemes with Inceasingly High Order of Accuracy" -@inline Cl(::WENO{2}, ::Val{0}) = 2/3 -@inline Cl(::WENO{2}, ::Val{1}) = 1/3 - -@inline Cl(::WENO{3}, ::Val{0}) = 3/10 -@inline Cl(::WENO{3}, ::Val{1}) = 3/5 -@inline Cl(::WENO{3}, ::Val{2}) = 1/10 - -@inline Cl(::WENO{4}, ::Val{0}) = 4/35 -@inline Cl(::WENO{4}, ::Val{1}) = 18/35 -@inline Cl(::WENO{4}, ::Val{2}) = 12/35 -@inline Cl(::WENO{4}, ::Val{3}) = 1/35 - -@inline Cl(::WENO{5}, ::Val{0}) = 5/126 -@inline Cl(::WENO{5}, ::Val{1}) = 20/63 -@inline Cl(::WENO{5}, ::Val{2}) = 10/21 -@inline Cl(::WENO{5}, ::Val{3}) = 10/63 -@inline Cl(::WENO{5}, ::Val{4}) = 1/126 - -@inline Cl(::WENO{6}, ::Val{0}) = 1/77 -@inline Cl(::WENO{6}, ::Val{1}) = 25/154 -@inline Cl(::WENO{6}, ::Val{2}) = 100/231 -@inline Cl(::WENO{6}, ::Val{3}) = 25/77 -@inline Cl(::WENO{6}, ::Val{4}) = 5/77 -@inline Cl(::WENO{6}, ::Val{5}) = 1/462 - -# ENO reconstruction procedure per stencil -for buffer in [2, 3, 4, 5, 6] - for stencil in collect(0:1:buffer-1) - - # ENO coefficients for uniform direction (when T<:Nothing) and stretched directions (when T<:Any) - @eval begin - @inline Cr(scheme::WENO{$buffer}, ::Val{$stencil}) = @inbounds Cl(scheme, Val($(buffer-stencil-1))) - - # uniform coefficients are independent on direction and location - @inline coeff_left_p(scheme::WENO{$buffer, FT}, ::Val{$stencil}, ::Type{Nothing}, args...) where FT = @inbounds FT.($(stencil_coefficients(50, stencil , collect(1:100), collect(1:100); order = buffer))) - @inline coeff_right_p(scheme::WENO{$buffer, FT}, ::Val{$stencil}, ::Type{Nothing}, args...) where FT = @inbounds FT.($(stencil_coefficients(50, stencil-1, collect(1:100), collect(1:100); order = buffer))) - - # stretched coefficients are retrieved from precalculated coefficients - @inline coeff_left_p(scheme::WENO{$buffer}, ::Val{$stencil}, T, dir, i, loc) = @inbounds retrieve_coeff(scheme, $stencil, dir, i, loc) - @inline coeff_right_p(scheme::WENO{$buffer}, ::Val{$stencil}, T, dir, i, loc) = @inbounds retrieve_coeff(scheme, $(stencil-1), dir, i, loc) - end - - # left biased and right biased reconstruction value for each stencil - @eval begin - @inline left_biased_p(scheme::WENO{$buffer}, ::Val{$stencil}, ψ, T, dir, i, loc) = @inbounds sum(coeff_left_p(scheme, Val($stencil), T, dir, i, loc) .* ψ) - @inline right_biased_p(scheme::WENO{$buffer}, ::Val{$stencil}, ψ, T, dir, i, loc) = @inbounds sum(coeff_right_p(scheme, Val($stencil), T, dir, i, loc) .* ψ) - end - end -end +@inline coeff_left(::WENO{2}, ::Val{0}) = 2/3 +@inline coeff_left(::WENO{2}, ::Val{1}) = 1/3 + +@inline coeff_left(::WENO{3}, ::Val{0}) = 3/10 +@inline coeff_left(::WENO{3}, ::Val{1}) = 3/5 +@inline coeff_left(::WENO{3}, ::Val{2}) = 1/10 + +@inline coeff_left(::WENO{4}, ::Val{0}) = 4/35 +@inline coeff_left(::WENO{4}, ::Val{1}) = 18/35 +@inline coeff_left(::WENO{4}, ::Val{2}) = 12/35 +@inline coeff_left(::WENO{4}, ::Val{3}) = 1/35 + +@inline coeff_left(::WENO{5}, ::Val{0}) = 5/126 +@inline coeff_left(::WENO{5}, ::Val{1}) = 20/63 +@inline coeff_left(::WENO{5}, ::Val{2}) = 10/21 +@inline coeff_left(::WENO{5}, ::Val{3}) = 10/63 +@inline coeff_left(::WENO{5}, ::Val{4}) = 1/126 + +@inline coeff_left(::WENO{6}, ::Val{0}) = 1/77 +@inline coeff_left(::WENO{6}, ::Val{1}) = 25/154 +@inline coeff_left(::WENO{6}, ::Val{2}) = 100/231 +@inline coeff_left(::WENO{6}, ::Val{3}) = 25/77 +@inline coeff_left(::WENO{6}, ::Val{4}) = 5/77 +@inline coeff_left(::WENO{6}, ::Val{5}) = 1/462 # _UNIFORM_ smoothness coefficients (stretched smoothness coefficients are to be fixed!) @inline smoothness_coefficients(::WENO{2, FT}, ::Val{0}) where FT = @inbounds FT.((1, -2, 1)) @@ -181,147 +156,24 @@ for buffer in [2, 3, 4, 5, 6] @inline left_biased_β(ψ, scheme::WENO{$buffer}, ::Val{$stencil}) = smoothness_sum(scheme, ψ, smoothness_coefficients(scheme, Val($stencil))) @inline right_biased_β(ψ, scheme::WENO{$buffer}, ::Val{$stencil}) = smoothness_sum(scheme, ψ, smoothness_coefficients(scheme, Val($stencil))) end - end -end - -@inline function beta_sum(::Val{2}, βᵤ, βᵥ) - β₀ = (βᵤ[1] + βᵥ[1]) / 2 - β₁ = (βᵤ[2] + βᵥ[2]) / 2 - - return (β₀, β₁) -end - -@inline function beta_sum(::Val{3}, βᵤ, βᵥ) - β₀ = (βᵤ[1] + βᵥ[1]) / 2 - β₁ = (βᵤ[2] + βᵥ[2]) / 2 - β₂ = (βᵤ[3] + βᵥ[3]) / 2 - - return (β₀, β₁, β₂) -end - -@inline function beta_sum(::Val{4}, βᵤ, βᵥ) - β₀ = (βᵤ[1] + βᵥ[1]) / 2 - β₁ = (βᵤ[2] + βᵥ[2]) / 2 - β₂ = (βᵤ[3] + βᵥ[3]) / 2 - β₃ = (βᵤ[4] + βᵥ[4]) / 2 - - return (β₀, β₁, β₂, β₃) -end - -@inline function beta_sum(::Val{5}, βᵤ, βᵥ) - β₀ = (βᵤ[1] + βᵥ[1]) / 2 - β₁ = (βᵤ[2] + βᵥ[2]) / 2 - β₂ = (βᵤ[3] + βᵥ[3]) / 2 - β₃ = (βᵤ[4] + βᵥ[4]) / 2 - β₄ = (βᵤ[5] + βᵥ[5]) / 2 - - return (β₀, β₁, β₂, β₃, β₄) -end - -@inline function beta_sum(::Val{6}, βᵤ, βᵥ) - β₀ = (βᵤ[1] + βᵥ[1]) / 2 - β₁ = (βᵤ[2] + βᵥ[2]) / 2 - β₂ = (βᵤ[3] + βᵥ[3]) / 2 - β₃ = (βᵤ[4] + βᵥ[4]) / 2 - β₄ = (βᵤ[5] + βᵥ[5]) / 2 - β₅ = (βᵤ[6] + βᵥ[6]) / 2 - - return (β₀, β₁, β₂, β₃, β₄, β₅) -end - -@inline function zweno_alpha_loop(scheme::WENO{2, FT}, β, τ, coeff) where FT - α₀ = @inbounds @fastmath FT(coeff(scheme, Val(0))) * (1 + τ / (β[1] + FT(ε))^2) - α₁ = @inbounds @fastmath FT(coeff(scheme, Val(1))) * (1 + τ / (β[2] + FT(ε))^2) - - return (α₀, α₁) -end - -@inline function zweno_alpha_loop(scheme::WENO{3, FT}, β, τ, coeff) where FT - α₀ = @inbounds @fastmath FT(coeff(scheme, Val(0))) * (1 + τ / (β[1] + FT(ε))^2) - α₁ = @inbounds @fastmath FT(coeff(scheme, Val(1))) * (1 + τ / (β[2] + FT(ε))^2) - α₂ = @inbounds @fastmath FT(coeff(scheme, Val(2))) * (1 + τ / (β[2] + FT(ε))^2) - - return (α₀, α₁, α₂) -end - -@inline function zweno_alpha_loop(scheme::WENO{4, FT}, β, τ, coeff) where FT - α₀ = @inbounds @fastmath FT(coeff(scheme, Val(0))) * (1 + τ / (β[1] + FT(ε))^2) - α₁ = @inbounds @fastmath FT(coeff(scheme, Val(1))) * (1 + τ / (β[2] + FT(ε))^2) - α₂ = @inbounds @fastmath FT(coeff(scheme, Val(2))) * (1 + τ / (β[3] + FT(ε))^2) - α₃ = @inbounds @fastmath FT(coeff(scheme, Val(3))) * (1 + τ / (β[4] + FT(ε))^2) - - return (α₀, α₁, α₂, α₃) -end - -@inline function zweno_alpha_loop(scheme::WENO{5, FT}, β, τ, coeff) where FT - α₀ = @inbounds @fastmath FT(coeff(scheme, Val(0))) * (1 + τ / (β[1] + FT(ε))^2) - α₁ = @inbounds @fastmath FT(coeff(scheme, Val(1))) * (1 + τ / (β[2] + FT(ε))^2) - α₂ = @inbounds @fastmath FT(coeff(scheme, Val(2))) * (1 + τ / (β[3] + FT(ε))^2) - α₃ = @inbounds @fastmath FT(coeff(scheme, Val(3))) * (1 + τ / (β[4] + FT(ε))^2) - α₄ = @inbounds @fastmath FT(coeff(scheme, Val(4))) * (1 + τ / (β[5] + FT(ε))^2) - - return (α₀, α₁, α₂, α₃, α₄) -end - -@inline function zweno_alpha_loop(scheme::WENO{6, FT}, β, τ, coeff) where FT - α₀ = @inbounds @fastmath FT(coeff(scheme, Val(0))) * (1 + τ / (β[1] + FT(ε))^2) - α₁ = @inbounds @fastmath FT(coeff(scheme, Val(1))) * (1 + τ / (β[2] + FT(ε))^2) - α₂ = @inbounds @fastmath FT(coeff(scheme, Val(2))) * (1 + τ / (β[3] + FT(ε))^2) - α₃ = @inbounds @fastmath FT(coeff(scheme, Val(3))) * (1 + τ / (β[4] + FT(ε))^2) - α₄ = @inbounds @fastmath FT(coeff(scheme, Val(4))) * (1 + τ / (β[5] + FT(ε))^2) - α₅ = @inbounds @fastmath FT(coeff(scheme, Val(5))) * (1 + τ / (β[6] + FT(ε))^2) - - return (α₀, α₁, α₂, α₃, α₄, α₅) -end - -# left and right biased_β calculation for scheme and stencil = 0:buffer - 1 -for side in [:left, :right] - β_loop = Symbol(:β_loop_, side) - biased_β = Symbol(side, :_biased_β) - @eval begin - @inline function $β_loop(scheme::WENO{2}, ψ) - β₀ = $biased_β(ψ[1], scheme, Val(0)) - β₁ = $biased_β(ψ[2], scheme, Val(1)) - - return (β₀, β₁) - end - - @inline function $β_loop(scheme::WENO{3}, ψ) - β₀ = $biased_β(ψ[1], scheme, Val(0)) - β₁ = $biased_β(ψ[2], scheme, Val(1)) - β₂ = $biased_β(ψ[3], scheme, Val(2)) - - return (β₀, β₁, β₂) - end - @inline function $β_loop(scheme::WENO{4}, ψ) - β₀ = $biased_β(ψ[1], scheme, Val(0)) - β₁ = $biased_β(ψ[2], scheme, Val(1)) - β₂ = $biased_β(ψ[3], scheme, Val(2)) - β₃ = $biased_β(ψ[4], scheme, Val(3)) - - return (β₀, β₁, β₂, β₃) - end + # ENO coefficients for uniform direction (when T<:Nothing) and stretched directions (when T<:Any) + @eval begin + @inline coeff_right(scheme::WENO{$buffer}, ::Val{$stencil}) = @inbounds coeff_left(scheme, Val($(buffer-stencil-1))) - @inline function $β_loop(scheme::WENO{5}, ψ) - β₀ = $biased_β(ψ[1], scheme, Val(0)) - β₁ = $biased_β(ψ[2], scheme, Val(1)) - β₂ = $biased_β(ψ[3], scheme, Val(2)) - β₃ = $biased_β(ψ[4], scheme, Val(3)) - β₄ = $biased_β(ψ[5], scheme, Val(4)) + # uniform coefficients are independent on direction and location + @inline coeff_left_p(scheme::WENO{$buffer, FT}, ::Val{$stencil}, ::Type{Nothing}, args...) where FT = @inbounds FT.($(stencil_coefficients(50, stencil , collect(1:100), collect(1:100); order = buffer))) + @inline coeff_right_p(scheme::WENO{$buffer, FT}, ::Val{$stencil}, ::Type{Nothing}, args...) where FT = @inbounds FT.($(stencil_coefficients(50, stencil-1, collect(1:100), collect(1:100); order = buffer))) - return (β₀, β₁, β₂, β₃, β₄) + # stretched coefficients are retrieved from precalculated coefficients + @inline coeff_left_p(scheme::WENO{$buffer}, ::Val{$stencil}, T, dir, i, loc) = @inbounds retrieve_coeff(scheme, $stencil, dir, i, loc) + @inline coeff_right_p(scheme::WENO{$buffer}, ::Val{$stencil}, T, dir, i, loc) = @inbounds retrieve_coeff(scheme, $(stencil-1), dir, i, loc) end - - @inline function $β_loop(scheme::WENO{6}, ψ) - β₀ = $biased_β(ψ[1], scheme, Val(0)) - β₁ = $biased_β(ψ[2], scheme, Val(1)) - β₂ = $biased_β(ψ[3], scheme, Val(2)) - β₃ = $biased_β(ψ[4], scheme, Val(3)) - β₄ = $biased_β(ψ[5], scheme, Val(4)) - β₅ = $biased_β(ψ[6], scheme, Val(5)) - - return (β₀, β₁, β₂, β₃, β₄, β₅) + + # left biased and right biased reconstruction value for each stencil + @eval begin + @inline left_biased_p(scheme::WENO{$buffer}, ::Val{$stencil}, ψ, T, dir, i, loc) = @inbounds sum(coeff_left_p(scheme, Val($stencil), T, dir, i, loc) .* ψ) + @inline right_biased_p(scheme::WENO{$buffer}, ::Val{$stencil}, ψ, T, dir, i, loc) = @inbounds sum(coeff_right_p(scheme, Val($stencil), T, dir, i, loc) .* ψ) end end end @@ -333,44 +185,6 @@ end @inline global_smoothness_indicator(::Val{5}, β) = @inbounds @fastmath abs(β[1] + 2β[2] - 6β[3] + 2β[4] + β[5]) @inline global_smoothness_indicator(::Val{6}, β) = @inbounds @fastmath abs(β[1] + 36β[2] + 135β[3] - 135β[4] - 36β[5] - β[6]) -# Calculating Dynamic WENO Weights (wᵣ), either with JS weno, Z weno or VectorInvariant WENO -for (side, coeff) in zip([:left, :right], (:Cl, :Cr)) - biased_weno_weights = Symbol(side, :_biased_weno_weights) - beta_loop = Symbol(:β_loop_, side) - tangential_stencil_u = Symbol(:tangential_, side, :_stencil_u) - tangential_stencil_v = Symbol(:tangential_, side, :_stencil_v) - - biased_stencil_z = Symbol(side, :_stencil_z) - - @eval begin - @inline function $biased_weno_weights(ψ, scheme::WENO{N, FT}, args...) where {N, FT} - @inbounds begin - β = $beta_loop(scheme, ψ) - τ = global_smoothness_indicator(Val(N), β) - α = zweno_alpha_loop(scheme, β, τ, $coeff) - return α ./ sum(α) - end - end - - @inline function $biased_weno_weights(ijk, scheme::WENO{N, FT}, dir, ::VelocityStencil, u, v) where {N, FT} - @inbounds begin - i, j, k = ijk - - uₛ = $tangential_stencil_u(i, j, k, scheme, dir, u) - vₛ = $tangential_stencil_v(i, j, k, scheme, dir, v) - β₁ = $beta_loop(scheme, uₛ) - β₂ = $beta_loop(scheme, vₛ) - - β₁ = beta_sum(Val(N), β₁, β₂) - τ = global_smoothness_indicator(Val(N), β₁) - α = zweno_alpha_loop(scheme, β₁, τ, $coeff) - - return α ./ sum(α) - end - end - end -end - """ calc_weno_stencil(buffer, shift, dir, func::Bool = false) @@ -423,103 +237,96 @@ julia> calc_weno_stencil(2, :right, :x) end stencil_full[buffer - stencil + 1] = :($(stencil_point...), ) end - return :($(stencil_full...),) + return stencil_full end # Stencils for left and right biased reconstruction ((ψ̅ᵢ₋ᵣ₊ⱼ for j in 0:k) for r in 0:k) to calculate v̂ᵣ = ∑ⱼ(cᵣⱼψ̅ᵢ₋ᵣ₊ⱼ) # where `k = N - 1`. Coefficients (cᵣⱼ for j in 0:N) for stencil r are given by `coeff_side_p(scheme, Val(r), ...)` for side in (:left, :right), dir in (:x, :y, :z) - stencil = Symbol(side, :_stencil_, dir) - + retrieve_stencil = Symbol(side, :_stencil_, dir) for buffer in [2, 3, 4, 5, 6] - @eval begin - @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, false)) - @inline $stencil(i, j, k, scheme::WENO{$buffer}, ψ::Function, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, true)) + for stencil in [1:buffer] + @eval begin + @inline $retrieve_stencil(i, j, k, scheme::WENO{$buffer}, ::Val{$stencil}, ψ, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, false)[stencil]) + @inline $retrieve_stencil(i, j, k, scheme::WENO{$buffer}, ::Val{$stencil}, ψ::Function, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, true)[stencil]) + end end end end # Stencil for vector invariant calculation of smoothness indicators in the horizontal direction # Parallel to the interpolation direction! (same as left/right stencil) -@inline tangential_left_stencil_u(i, j, k, scheme, ::Val{1}, u) = @inbounds @fastmath left_stencil_x(i, j, k, scheme, ℑyᵃᶠᵃ, u) -@inline tangential_left_stencil_u(i, j, k, scheme, ::Val{2}, u) = @inbounds @fastmath left_stencil_y(i, j, k, scheme, ℑyᵃᶠᵃ, u) -@inline tangential_left_stencil_v(i, j, k, scheme, ::Val{1}, v) = @inbounds @fastmath left_stencil_x(i, j, k, scheme, ℑxᶠᵃᵃ, v) -@inline tangential_left_stencil_v(i, j, k, scheme, ::Val{2}, v) = @inbounds @fastmath left_stencil_y(i, j, k, scheme, ℑxᶠᵃᵃ, v) - -@inline tangential_right_stencil_u(i, j, k, scheme, ::Val{1}, u) = @inbounds @fastmath right_stencil_x(i, j, k, scheme, ℑyᵃᶠᵃ, u) -@inline tangential_right_stencil_u(i, j, k, scheme, ::Val{2}, u) = @inbounds @fastmath right_stencil_y(i, j, k, scheme, ℑyᵃᶠᵃ, u) -@inline tangential_right_stencil_v(i, j, k, scheme, ::Val{1}, v) = @inbounds @fastmath right_stencil_x(i, j, k, scheme, ℑxᶠᵃᵃ, v) -@inline tangential_right_stencil_v(i, j, k, scheme, ::Val{2}, v) = @inbounds @fastmath right_stencil_y(i, j, k, scheme, ℑxᶠᵃᵃ, v) - -# Trick to force compilation of Val(stencil-1) and avoid loops on the GPU -@inline function metaprogrammed_stencil_sum(buffer) - elem = Vector(undef, buffer) - for stencil = 1:buffer - elem[stencil] = :(@inbounds w[$stencil] * func(scheme, Val($(stencil-1)), ψ[$stencil], cT, Val(val), idx, loc)) - end - - return Expr(:call, :+, elem...) -end - -# Calculation of WENO reconstructed value v⋆ = ∑ᵣ(wᵣv̂ᵣ) -for buffer in [2, 3, 4, 5, 6] - @eval begin - @inline stencil_sum(scheme::WENO{$buffer}, ψ, w, func, cT, val, idx, loc) = @inbounds $(metaprogrammed_stencil_sum(buffer)) - end -end - -# Interpolation functions -for (interp, dir, val, cT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [:x, :y, :z], [1, 2, 3], [:XT, :YT, :ZT]) - for side in (:left, :right) - interpolate_func = Symbol(:inner_, side, :_biased_interpolate_, interp) - stencil = Symbol(side, :_stencil_, dir) - weno_weights = Symbol(side, :_biased_weno_weights) - biased_p = Symbol(side, :_biased_p) +@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{1}, u) = @inbounds @fastmath left_stencil_x(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, u) +@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{2}, u) = @inbounds @fastmath left_stencil_y(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, u) +@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{1}, v) = @inbounds @fastmath left_stencil_x(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, v) +@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{2}, v) = @inbounds @fastmath left_stencil_y(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, v) + +@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{1}, u) = @inbounds @fastmath right_stencil_x(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, u) +@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{2}, u) = @inbounds @fastmath right_stencil_y(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, u) +@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, v) = @inbounds @fastmath right_stencil_x(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, v) +@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, v) = @inbounds @fastmath right_stencil_y(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, v) + +for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) + biased_β = Symbol(side, :_biased_β) + coeff = Symbol(:coeff_, side) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + + @eval begin + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{N, FT}, + ψ, idx, loc, args...) where {N, FT} - @eval begin - @inline function $interpolate_func(i, j, k, grid, - scheme::WENO{N, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {N, FT, XT, YT, ZT} - @inbounds begin - ψₜ = $stencil(i, j, k, scheme, ψ, grid, args...) - w = $weno_weights(ψₜ, scheme, Val($val), Nothing, args...) - return stencil_sum(scheme, ψₜ, w, $biased_p, $cT, $val, idx, loc) - end + wei = 0 + sol = 0 + @unroll for s in 1:N + ψs = $stencil(i, j, k, scheme, 1, ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(s-1)) + α = @inbounds @fastmath FT($coeff(scheme, Val(s-1))) / (β + FT(ε))^2 + sol += $biased_p(scheme, Val(s-1), ψs, Nothing, idx) * α + wei += α end - @inline function $interpolate_func(i, j, k, grid, - scheme::WENO{N, FT, XT, YT, ZT}, - ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT, XT, YT, ZT} + return sol / wei + end - @inbounds begin - ψₜ = $stencil(i, j, k, scheme, ψ, grid, args...) - w = $weno_weights(ψₜ, scheme, Val($val), VI, args...) - return stencil_sum(scheme, ψₜ, w, $biased_p, $cT, $val, idx, loc) - end + @inline function $interpolate_func(i, j, k, grid, + scheme::WENO{N, FT}, + ψ, idx, loc, VI::VelocityStencil, u, v) where {N, FT} + + wei = 0 + sol = 0 + @unroll for s in 1:N + ψs = $stencil(i, j, k, scheme, s, ψ, grid, u, v, args...) + us = $stencil_u(i, j, k, scheme, Val(s-1), Val($val), u) + vs = $stencil_v(i, j, k, scheme, Val(s-1), Val($val), v) + βu = $biased_β(us, scheme, Val(s-1)) + βv = $biased_β(vs, scheme, Val(s-1)) + α = @inbounds @fastmath FT($coeff(scheme, Val(s-1))) / (0.5 * (βu + βv) + FT(ε))^2 + sol += $biased_p(scheme, Val(s-1), ψs, Nothing, idx) * α + wei += α end - @inline function $interpolate_func(i, j, k, grid, - scheme::WENO{N, FT, XT, YT, ZT}, - ψ, idx, loc, VI::VelocityStencil, u, v, args...) where {N, FT, XT, YT, ZT} + return sol / wei + end - @inbounds begin - ψₜ = $stencil(i, j, k, scheme, ψ, grid, u, v, args...) - w = $weno_weights((i, j, k), scheme, Val($val), VI, u, v) - return stencil_sum(scheme, ψₜ, w, $biased_p, $cT, $val, idx, loc) - end + @inline function $interpolate_func(i, j, k, grid, + scheme::WENO{N, FT}, + ψ, idx, loc,VI::FunctionStencil, args...) where {N, FT} + + wei = 0 + sol = 0 + @unroll for s in 1:N + ψs = $stencil(i, j, k, scheme, s, ψ, grid, args...) + ϕs = $stencil(i, j, k, scheme, s, VI.func, grid, args...) + βϕ = $biased_β(ϕs, scheme, Val(s-1)) + α = @inbounds @fastmath FT($coeff(scheme, Val(s-1))) / (βϕ + FT(ε))^2 + sol += $biased_p(scheme, Val(s-1), ψs, Nothing, idx) * α + wei += α end - @inline function $interpolate_func(i, j, k, grid, - scheme::WENO{N, FT, XT, YT, ZT}, - ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT, XT, YT, ZT} - - @inbounds begin - ψₜ = $stencil(i, j, k, scheme, ψ, grid, args...) - ψₛ = $stencil(i, j, k, scheme, VI.func, grid, args...) - w = $weno_weights(ψₛ, scheme, Val($val), VI, args...) - return stencil_sum(scheme, ψₜ, w, $biased_p, $cT, $val, idx, loc) - end - end + return sol / wei end end end From 9026f366cc23db784f33fea886f5e13aaa03fe74 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 01:18:55 -0400 Subject: [PATCH 029/152] optimized WENO --- src/Advection/weno_interpolants.jl | 101 +++++++++++++++++++++-------- 1 file changed, 75 insertions(+), 26 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 84f03a6650..3ef18f6faf 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -97,6 +97,12 @@ const ε = 1e-8 @inline coeff_left(::WENO{6}, ::Val{4}) = 5/77 @inline coeff_left(::WENO{6}, ::Val{5}) = 1/462 +for buffer in [2, 3, 4, 5, 6] + for stencil in [0, 1, 2, 3, 4, 5] + @eval @inline coeff_right(scheme::WENO{$buffer}, ::Val{$stencil}) = @inbounds coeff_left(scheme, Val($(buffer-stencil-1))) + end +end + # _UNIFORM_ smoothness coefficients (stretched smoothness coefficients are to be fixed!) @inline smoothness_coefficients(::WENO{2, FT}, ::Val{0}) where FT = @inbounds FT.((1, -2, 1)) @inline smoothness_coefficients(::WENO{2, FT}, ::Val{1}) where FT = @inbounds FT.((1, -2, 1)) @@ -159,8 +165,6 @@ for buffer in [2, 3, 4, 5, 6] # ENO coefficients for uniform direction (when T<:Nothing) and stretched directions (when T<:Any) @eval begin - @inline coeff_right(scheme::WENO{$buffer}, ::Val{$stencil}) = @inbounds coeff_left(scheme, Val($(buffer-stencil-1))) - # uniform coefficients are independent on direction and location @inline coeff_left_p(scheme::WENO{$buffer, FT}, ::Val{$stencil}, ::Type{Nothing}, args...) where FT = @inbounds FT.($(stencil_coefficients(50, stencil , collect(1:100), collect(1:100); order = buffer))) @inline coeff_right_p(scheme::WENO{$buffer, FT}, ::Val{$stencil}, ::Type{Nothing}, args...) where FT = @inbounds FT.($(stencil_coefficients(50, stencil-1, collect(1:100), collect(1:100); order = buffer))) @@ -179,11 +183,30 @@ for buffer in [2, 3, 4, 5, 6] end # Global smoothness indicator τ₂ᵣ₋₁ taken from "Accuracy of the weighted essentially non-oscillatory conservative finite difference schemes", Don & Borges, 2013 -@inline global_smoothness_indicator(::Val{2}, β) = @inbounds @fastmath abs(β[1] - β[2]) -@inline global_smoothness_indicator(::Val{3}, β) = @inbounds @fastmath abs(β[1] - β[3]) -@inline global_smoothness_indicator(::Val{4}, β) = @inbounds @fastmath abs(β[1] + 3β[2] - 3β[3] - β[4]) -@inline global_smoothness_indicator(::Val{5}, β) = @inbounds @fastmath abs(β[1] + 2β[2] - 6β[3] + 2β[4] + β[5]) -@inline global_smoothness_indicator(::Val{6}, β) = @inbounds @fastmath abs(β[1] + 36β[2] + 135β[3] - 135β[4] - 36β[5] - β[6]) +@inline add_global_smoothness(τ, β, ::Val{2}, ::Val{1}) = τ + β +@inline add_global_smoothness(τ, β, ::Val{2}, ::Val{2}) = τ - β + +@inline add_global_smoothness(τ, β, ::Val{3}, ::Val{1}) = τ + β +@inline add_global_smoothness(τ, β, ::Val{3}, ::Val{2}) = τ +@inline add_global_smoothness(τ, β, ::Val{3}, ::Val{3}) = τ - β + +@inline add_global_smoothness(τ, β, ::Val{4}, ::Val{1}) = τ + β +@inline add_global_smoothness(τ, β, ::Val{4}, ::Val{2}) = τ + 3β +@inline add_global_smoothness(τ, β, ::Val{4}, ::Val{3}) = τ - 3β +@inline add_global_smoothness(τ, β, ::Val{4}, ::Val{4}) = τ - β + +@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{1}) = τ + β +@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{2}) = τ + 2β +@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{3}) = τ - 6β +@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{4}) = τ + 2β +@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{5}) = τ + β + +@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{1}) = τ + β +@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{2}) = τ + 36β +@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{3}) = τ + 135β +@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{4}) = τ - 135β +@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{5}) = τ - 36β +@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{6}) = τ - β """ calc_weno_stencil(buffer, shift, dir, func::Bool = false) @@ -278,55 +301,81 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{N, FT}, ψ, idx, loc, args...) where {N, FT} - wei = 0 - sol = 0 + wei1 = 0 + wei2 = 0 + sol1 = 0 + sol2 = 0 + glob = 0 @unroll for s in 1:N ψs = $stencil(i, j, k, scheme, 1, ψ, grid, args...) β = $biased_β(ψs, scheme, Val(s-1)) - α = @inbounds @fastmath FT($coeff(scheme, Val(s-1))) / (β + FT(ε))^2 - sol += $biased_p(scheme, Val(s-1), ψs, Nothing, idx) * α - wei += α + C = FT($coeff(scheme, Val(s-1))) + α = @inbounds @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, idx) + glob = add_global_smoothness(glob, β, Val(N), Val(s)) + sol1 += ψ̅ * C + sol2 += ψ̅ * α + wei1 += α + wei2 += C end - return sol / wei + glob = abs(glob) + + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) end @inline function $interpolate_func(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, VI::VelocityStencil, u, v) where {N, FT} - wei = 0 - sol = 0 + wei1 = 0 + wei2 = 0 + sol1 = 0 + sol2 = 0 + glob = 0 @unroll for s in 1:N ψs = $stencil(i, j, k, scheme, s, ψ, grid, u, v, args...) us = $stencil_u(i, j, k, scheme, Val(s-1), Val($val), u) vs = $stencil_v(i, j, k, scheme, Val(s-1), Val($val), v) βu = $biased_β(us, scheme, Val(s-1)) βv = $biased_β(vs, scheme, Val(s-1)) - α = @inbounds @fastmath FT($coeff(scheme, Val(s-1))) / (0.5 * (βu + βv) + FT(ε))^2 - sol += $biased_p(scheme, Val(s-1), ψs, Nothing, idx) * α - wei += α + C = FT($coeff(scheme, Val(s-1))) + α = @inbounds @fastmath C / (0.5 * (βu + βv) + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, idx) + glob = add_global_smoothness(glob, β, Val(N), Val(s)) + sol1 += ψ̅ * C + sol2 += ψ̅ * α + wei1 += α + wei2 += C end - return sol / wei + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) end @inline function $interpolate_func(i, j, k, grid, scheme::WENO{N, FT}, - ψ, idx, loc,VI::FunctionStencil, args...) where {N, FT} + ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} - wei = 0 - sol = 0 + wei1 = 0 + wei2 = 0 + sol1 = 0 + sol2 = 0 + glob = 0 @unroll for s in 1:N ψs = $stencil(i, j, k, scheme, s, ψ, grid, args...) ϕs = $stencil(i, j, k, scheme, s, VI.func, grid, args...) βϕ = $biased_β(ϕs, scheme, Val(s-1)) - α = @inbounds @fastmath FT($coeff(scheme, Val(s-1))) / (βϕ + FT(ε))^2 - sol += $biased_p(scheme, Val(s-1), ψs, Nothing, idx) * α - wei += α + C = FT($coeff(scheme, Val(s-1))) + α = @inbounds @fastmath C / (βϕ + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, idx) + glob = add_global_smoothness(glob, β, Val(N), Val(s)) + sol1 += ψ̅ * C + sol2 += ψ̅ * α + wei1 += α + wei2 += C end - return sol / wei + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) end end end From f68cd6141355e159ab6f3d6ac75290b54bb8bbaa Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 01:21:03 -0400 Subject: [PATCH 030/152] try it out --- src/Advection/weno_interpolants.jl | 31 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 3ef18f6faf..2e3f451754 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -201,12 +201,12 @@ end @inline add_global_smoothness(τ, β, ::Val{5}, ::Val{4}) = τ + 2β @inline add_global_smoothness(τ, β, ::Val{5}, ::Val{5}) = τ + β -@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{1}) = τ + β -@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{2}) = τ + 36β -@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{3}) = τ + 135β -@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{4}) = τ - 135β -@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{5}) = τ - 36β -@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{6}) = τ - β +@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{1}) = τ + β +@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{2}) = τ + 36β +@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{3}) = τ + 135β +@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{4}) = τ - 135β +@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{5}) = τ - 36β +@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{6}) = τ - β """ calc_weno_stencil(buffer, shift, dir, func::Bool = false) @@ -265,7 +265,7 @@ end # Stencils for left and right biased reconstruction ((ψ̅ᵢ₋ᵣ₊ⱼ for j in 0:k) for r in 0:k) to calculate v̂ᵣ = ∑ⱼ(cᵣⱼψ̅ᵢ₋ᵣ₊ⱼ) # where `k = N - 1`. Coefficients (cᵣⱼ for j in 0:N) for stencil r are given by `coeff_side_p(scheme, Val(r), ...)` -for side in (:left, :right), dir in (:x, :y, :z) +for side in (:left, :right), dir in (:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ) retrieve_stencil = Symbol(side, :_stencil_, dir) for buffer in [2, 3, 4, 5, 6] for stencil in [1:buffer] @@ -279,20 +279,21 @@ end # Stencil for vector invariant calculation of smoothness indicators in the horizontal direction # Parallel to the interpolation direction! (same as left/right stencil) -@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{1}, u) = @inbounds @fastmath left_stencil_x(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, u) -@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{2}, u) = @inbounds @fastmath left_stencil_y(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, u) -@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{1}, v) = @inbounds @fastmath left_stencil_x(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, v) -@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{2}, v) = @inbounds @fastmath left_stencil_y(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, v) +@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{1}, u) = @inbounds @fastmath left_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, u) +@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{2}, u) = @inbounds @fastmath left_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, u) +@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{1}, v) = @inbounds @fastmath left_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, v) +@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{2}, v) = @inbounds @fastmath left_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, v) -@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{1}, u) = @inbounds @fastmath right_stencil_x(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, u) -@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{2}, u) = @inbounds @fastmath right_stencil_y(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, u) -@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, v) = @inbounds @fastmath right_stencil_x(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, v) -@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, v) = @inbounds @fastmath right_stencil_y(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, v) +@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{1}, u) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, u) +@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{2}, u) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, u) +@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, v) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, v) +@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, v) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, v) for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) biased_β = Symbol(side, :_biased_β) coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) stencil_u = Symbol(:tangential_, side, :_stencil_u) stencil_v = Symbol(:tangential_, side, :_stencil_v) From c084ae6a4d4f78708b645f14042481feb23177e1 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 01:24:22 -0400 Subject: [PATCH 031/152] compiles --- src/Advection/weno_interpolants.jl | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 2e3f451754..d48f9dba3e 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -292,6 +292,7 @@ end for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) coeff = Symbol(:coeff_, side) stencil = Symbol(side, :_stencil_, dir) stencil_u = Symbol(:tangential_, side, :_stencil_u) @@ -325,9 +326,9 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) end - @inline function $interpolate_func(i, j, k, grid, - scheme::WENO{N, FT}, - ψ, idx, loc, VI::VelocityStencil, u, v) where {N, FT} + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{N, FT}, + ψ, idx, loc, VI::VelocityStencil, u, v) where {N, FT} wei1 = 0 wei2 = 0 @@ -353,9 +354,9 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) end - @inline function $interpolate_func(i, j, k, grid, - scheme::WENO{N, FT}, - ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{N, FT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} wei1 = 0 wei2 = 0 From 05d8dbdcc0d0c312acc813a572aa08625d9a97d9 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 01:30:05 -0400 Subject: [PATCH 032/152] bugfix --- src/Advection/weno_interpolants.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index d48f9dba3e..cfb0fb5672 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -309,7 +309,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 = 0 glob = 0 @unroll for s in 1:N - ψs = $stencil(i, j, k, scheme, 1, ψ, grid, args...) + ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) β = $biased_β(ψs, scheme, Val(s-1)) C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (β + FT(ε))^2 @@ -336,7 +336,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 = 0 glob = 0 @unroll for s in 1:N - ψs = $stencil(i, j, k, scheme, s, ψ, grid, u, v, args...) + ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) us = $stencil_u(i, j, k, scheme, Val(s-1), Val($val), u) vs = $stencil_v(i, j, k, scheme, Val(s-1), Val($val), v) βu = $biased_β(us, scheme, Val(s-1)) @@ -364,8 +364,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 = 0 glob = 0 @unroll for s in 1:N - ψs = $stencil(i, j, k, scheme, s, ψ, grid, args...) - ϕs = $stencil(i, j, k, scheme, s, VI.func, grid, args...) + ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) + ϕs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) βϕ = $biased_β(ϕs, scheme, Val(s-1)) C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (βϕ + FT(ε))^2 From cfdfec8d5827f7e10f1015a552f0c2cd6bb05a82 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 01:30:32 -0400 Subject: [PATCH 033/152] go like this --- src/Advection/weno_interpolants.jl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index cfb0fb5672..c5a9d2c446 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -321,7 +321,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ wei2 += C end - glob = abs(glob) + glob = glob * glob return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) end @@ -351,6 +351,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ wei2 += C end + glob = glob * glob + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) end @@ -377,6 +379,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ wei2 += C end + glob = glob * glob + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) end end From 681bf515964cf4199abf337c920c3be23dd2df89 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 01:33:12 -0400 Subject: [PATCH 034/152] another bugfix --- src/Advection/weno_interpolants.jl | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index c5a9d2c446..a455acff04 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -326,6 +326,33 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) end + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{N, FT}, + ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} + + wei1 = 0 + wei2 = 0 + sol1 = 0 + sol2 = 0 + glob = 0 + @unroll for s in 1:N + ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(s-1)) + C = FT($coeff(scheme, Val(s-1))) + α = @inbounds @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, idx) + glob = add_global_smoothness(glob, β, Val(N), Val(s)) + sol1 += ψ̅ * C + sol2 += ψ̅ * α + wei1 += α + wei2 += C + end + + glob = glob * glob + + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, VI::VelocityStencil, u, v) where {N, FT} From 8066b63b42cbc85e428720a5af8c00f346efa97c Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 01:37:06 -0400 Subject: [PATCH 035/152] try now --- src/Advection/weno_interpolants.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index a455acff04..f80e395ee1 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -268,7 +268,7 @@ end for side in (:left, :right), dir in (:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ) retrieve_stencil = Symbol(side, :_stencil_, dir) for buffer in [2, 3, 4, 5, 6] - for stencil in [1:buffer] + for stencil in [1, 2, 3, 4, 5, 6] @eval begin @inline $retrieve_stencil(i, j, k, scheme::WENO{$buffer}, ::Val{$stencil}, ψ, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, false)[stencil]) @inline $retrieve_stencil(i, j, k, scheme::WENO{$buffer}, ::Val{$stencil}, ψ::Function, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, true)[stencil]) From 7af09399f516321caea219bff249b338185846b6 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 01:48:15 -0400 Subject: [PATCH 036/152] working! --- src/Advection/weno_interpolants.jl | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index f80e395ee1..16e0942c58 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -268,7 +268,7 @@ end for side in (:left, :right), dir in (:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ) retrieve_stencil = Symbol(side, :_stencil_, dir) for buffer in [2, 3, 4, 5, 6] - for stencil in [1, 2, 3, 4, 5, 6] + for stencil in 1:buffer @eval begin @inline $retrieve_stencil(i, j, k, scheme::WENO{$buffer}, ::Val{$stencil}, ψ, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, false)[stencil]) @inline $retrieve_stencil(i, j, k, scheme::WENO{$buffer}, ::Val{$stencil}, ψ::Function, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, true)[stencil]) @@ -313,7 +313,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β = $biased_β(ψs, scheme, Val(s-1)) C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, idx) + ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) glob = add_global_smoothness(glob, β, Val(N), Val(s)) sol1 += ψ̅ * C sol2 += ψ̅ * α @@ -340,7 +340,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β = $biased_β(ψs, scheme, Val(s-1)) C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, idx) + ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) glob = add_global_smoothness(glob, β, Val(N), Val(s)) sol1 += ψ̅ * C sol2 += ψ̅ * α @@ -368,10 +368,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ vs = $stencil_v(i, j, k, scheme, Val(s-1), Val($val), v) βu = $biased_β(us, scheme, Val(s-1)) βv = $biased_β(vs, scheme, Val(s-1)) + βU = 0.5 * (βu + βv) C = FT($coeff(scheme, Val(s-1))) - α = @inbounds @fastmath C / (0.5 * (βu + βv) + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, idx) - glob = add_global_smoothness(glob, β, Val(N), Val(s)) + α = @inbounds @fastmath C / (βU + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) + glob = add_global_smoothness(glob, βU, Val(N), Val(s)) sol1 += ψ̅ * C sol2 += ψ̅ * α wei1 += α @@ -398,8 +399,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ βϕ = $biased_β(ϕs, scheme, Val(s-1)) C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (βϕ + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, idx) - glob = add_global_smoothness(glob, β, Val(N), Val(s)) + ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) + glob = add_global_smoothness(glob, βϕ, Val(N), Val(s)) sol1 += ψ̅ * C sol2 += ψ̅ * α wei1 += α From 4cad70d99c17bf90ed9a1beb10e953de8970b344 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 01:55:13 -0400 Subject: [PATCH 037/152] removing JS weno --- src/Advection/weno_reconstruction.jl | 56 ++++++++++++++-------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/src/Advection/weno_reconstruction.jl b/src/Advection/weno_reconstruction.jl index 49e00f9a0b..01c5701556 100644 --- a/src/Advection/weno_reconstruction.jl +++ b/src/Advection/weno_reconstruction.jl @@ -2,7 +2,7 @@ ##### Weighted Essentially Non-Oscillatory (WENO) advection scheme ##### -struct WENO{N, FT, XT, YT, ZT, WF, PP, CA, SI} <: AbstractUpwindBiasedAdvectionScheme{N, FT} +struct WENO{N, FT, XT, YT, ZT, PP, CA, SI} <: AbstractUpwindBiasedAdvectionScheme{N, FT} "Coefficient for ENO reconstruction on x-faces" coeff_xᶠᵃᵃ::XT @@ -25,16 +25,16 @@ struct WENO{N, FT, XT, YT, ZT, WF, PP, CA, SI} <: AbstractUpwindBiasedAdvectionS "Reconstruction scheme used for symmetric interpolation" advecting_velocity_scheme :: SI - function WENO{N, FT, WF}(coeff_xᶠᵃᵃ::XT, coeff_xᶜᵃᵃ::XT, - coeff_yᵃᶠᵃ::YT, coeff_yᵃᶜᵃ::YT, - coeff_zᵃᵃᶠ::ZT, coeff_zᵃᵃᶜ::ZT, - bounds::PP, buffer_scheme::CA, - advecting_velocity_scheme :: SI) where {N, FT, XT, YT, ZT, WF, PP, CA, SI} + function WENO{N, FT}(coeff_xᶠᵃᵃ::XT, coeff_xᶜᵃᵃ::XT, + coeff_yᵃᶠᵃ::YT, coeff_yᵃᶜᵃ::YT, + coeff_zᵃᵃᶠ::ZT, coeff_zᵃᵃᶜ::ZT, + bounds::PP, buffer_scheme::CA, + advecting_velocity_scheme :: SI) where {N, FT, XT, YT, ZT, PP, CA, SI} - return new{N, FT, XT, YT, ZT, WF, PP, CA, SI}(coeff_xᶠᵃᵃ, coeff_xᶜᵃᵃ, - coeff_yᵃᶠᵃ, coeff_yᵃᶜᵃ, - coeff_zᵃᵃᶠ, coeff_zᵃᵃᶜ, - bounds, buffer_scheme, advecting_velocity_scheme) + return new{N, FT, XT, YT, ZT, PP, CA, SI}(coeff_xᶠᵃᵃ, coeff_xᶜᵃᵃ, + coeff_yᵃᶠᵃ, coeff_yᵃᶜᵃ, + coeff_zᵃᵃᶠ, coeff_zᵃᵃᶜ, + bounds, buffer_scheme, advecting_velocity_scheme) end end @@ -103,7 +103,6 @@ WENO reconstruction order 7 function WENO(FT::DataType=Float64; order = 5, grid = nothing, - zweno = true, bounds = nothing) if !(grid isa Nothing) @@ -123,7 +122,7 @@ function WENO(FT::DataType=Float64; advecting_velocity_scheme = Centered(FT; grid, order = order - 1) end - return WENO{N, FT, zweno}(weno_coefficients..., bounds, buffer_scheme, advecting_velocity_scheme) + return WENO{N, FT}(weno_coefficients..., bounds, buffer_scheme, advecting_velocity_scheme) end WENO(grid, FT::DataType=Float64; kwargs...) = WENO(FT; grid, kwargs...) @@ -133,8 +132,7 @@ WENOThirdOrder(grid=nothing, FT::DataType=Float64; kwargs...) = WENO(grid, FT; WENOFifthOrder(grid=nothing, FT::DataType=Float64; kwargs...) = WENO(grid, FT; order=5, kwargs...) # Flavours of WENO -const ZWENO = WENO{<:Any, <:Any, <:Any, <:Any, <:Any, true} -const PositiveWENO = WENO{<:Any, <:Any, <:Any, <:Any, <:Any, <:Any, <:Tuple} +const PositiveWENO = WENO{<:Any, <:Any, <:Any, <:Any, <:Any, <:Tuple} Base.summary(a::WENO{N}) where N = string("WENO reconstruction order ", N*2-1) @@ -152,21 +150,21 @@ Base.show(io::IO, a::WENO{N, FT, RX, RY, RZ, WF, PP}) where {N, FT, RX, RY, RZ, " ├── Y $(RY == Nothing ? "regular" : "stretched") \n", " └── Z $(RZ == Nothing ? "regular" : "stretched")" ) -Adapt.adapt_structure(to, scheme::WENO{N, FT, XT, YT, ZT, WF, PP}) where {N, FT, XT, YT, ZT, WF, PP} = - WENO{N, FT, WF}(Adapt.adapt(to, scheme.coeff_xᶠᵃᵃ), Adapt.adapt(to, scheme.coeff_xᶜᵃᵃ), - Adapt.adapt(to, scheme.coeff_yᵃᶠᵃ), Adapt.adapt(to, scheme.coeff_yᵃᶜᵃ), - Adapt.adapt(to, scheme.coeff_zᵃᵃᶠ), Adapt.adapt(to, scheme.coeff_zᵃᵃᶜ), - Adapt.adapt(to, scheme.bounds), - Adapt.adapt(to, scheme.buffer_scheme), - Adapt.adapt(to, scheme.advecting_velocity_scheme)) - -on_architecture(to, scheme::WENO{N, FT, XT, YT, ZT, WF, PP}) where {N, FT, XT, YT, ZT, WF, PP} = - WENO{N, FT, WF}(on_architecture(to, scheme.coeff_xᶠᵃᵃ), on_architecture(to, scheme.coeff_xᶜᵃᵃ), - on_architecture(to, scheme.coeff_yᵃᶠᵃ), on_architecture(to, scheme.coeff_yᵃᶜᵃ), - on_architecture(to, scheme.coeff_zᵃᵃᶠ), on_architecture(to, scheme.coeff_zᵃᵃᶜ), - on_architecture(to, scheme.bounds), - on_architecture(to, scheme.buffer_scheme), - on_architecture(to, scheme.advecting_velocity_scheme)) +Adapt.adapt_structure(to, scheme::WENO{N, FT, XT, YT, ZT}) where {N, FT, XT, YT, ZT} = + WENO{N, FT}(Adapt.adapt(to, scheme.coeff_xᶠᵃᵃ), Adapt.adapt(to, scheme.coeff_xᶜᵃᵃ), + Adapt.adapt(to, scheme.coeff_yᵃᶠᵃ), Adapt.adapt(to, scheme.coeff_yᵃᶜᵃ), + Adapt.adapt(to, scheme.coeff_zᵃᵃᶠ), Adapt.adapt(to, scheme.coeff_zᵃᵃᶜ), + Adapt.adapt(to, scheme.bounds), + Adapt.adapt(to, scheme.buffer_scheme), + Adapt.adapt(to, scheme.advecting_velocity_scheme)) + +on_architecture(to, scheme::WENO{N, FT, XT, YT, ZT, WF}) where {N, FT, XT, YT, ZT} = + WENO{N, FT}(on_architecture(to, scheme.coeff_xᶠᵃᵃ), on_architecture(to, scheme.coeff_xᶜᵃᵃ), + on_architecture(to, scheme.coeff_yᵃᶠᵃ), on_architecture(to, scheme.coeff_yᵃᶜᵃ), + on_architecture(to, scheme.coeff_zᵃᵃᶠ), on_architecture(to, scheme.coeff_zᵃᵃᶜ), + on_architecture(to, scheme.bounds), + on_architecture(to, scheme.buffer_scheme), + on_architecture(to, scheme.advecting_velocity_scheme)) # Retrieve precomputed coefficients (+2 for julia's 1 based indices) @inline retrieve_coeff(scheme::WENO, r, ::Val{1}, i, ::Type{Face}) = @inbounds scheme.coeff_xᶠᵃᵃ[r+2][i] From d58ef5f82b0426e2acd526fbf32e4acfed14a653 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 02:00:32 -0400 Subject: [PATCH 038/152] the ntuple trick --- src/Advection/weno_interpolants.jl | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 16e0942c58..878c0e7544 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -308,7 +308,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol1 = 0 sol2 = 0 glob = 0 - @unroll for s in 1:N + ntuple(Val(N)) do s + Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) β = $biased_β(ψs, scheme, Val(s-1)) C = FT($coeff(scheme, Val(s-1))) @@ -335,7 +336,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol1 = 0 sol2 = 0 glob = 0 - @unroll for s in 1:N + ntuple(Val(N)) do s + Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) β = $biased_β(ψs, scheme, Val(s-1)) C = FT($coeff(scheme, Val(s-1))) @@ -348,9 +350,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ wei2 += C end - glob = glob * glob - - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + return (sol1 + sol2 * glob * glob) / (wei1 + wei2 * glob * glob) end @inline function $biased_interpolate(i, j, k, grid, @@ -362,7 +362,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol1 = 0 sol2 = 0 glob = 0 - @unroll for s in 1:N + ntuple(Val(N)) do s + Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) us = $stencil_u(i, j, k, scheme, Val(s-1), Val($val), u) vs = $stencil_v(i, j, k, scheme, Val(s-1), Val($val), v) @@ -379,9 +380,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ wei2 += C end - glob = glob * glob - - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + return (sol1 + sol2 * glob * glob) / (wei1 + wei2 * glob * glob) end @inline function $biased_interpolate(i, j, k, grid, @@ -393,7 +392,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol1 = 0 sol2 = 0 glob = 0 - @unroll for s in 1:N + ntuple(Val(N)) do s + Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) ϕs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) βϕ = $biased_β(ϕs, scheme, Val(s-1)) @@ -407,9 +407,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ wei2 += C end - glob = glob * glob - - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + return (sol1 + sol2 * glob * glob) / (wei1 + wei2 * glob * glob) end end end From 748728b83994252ac3b3881d90d8c606d80c8c68 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 02:01:54 -0400 Subject: [PATCH 039/152] always zweno --- src/Advection/weno_reconstruction.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Advection/weno_reconstruction.jl b/src/Advection/weno_reconstruction.jl index 01c5701556..39e9dbd643 100644 --- a/src/Advection/weno_reconstruction.jl +++ b/src/Advection/weno_reconstruction.jl @@ -158,7 +158,7 @@ Adapt.adapt_structure(to, scheme::WENO{N, FT, XT, YT, ZT}) where {N, FT, XT, YT, Adapt.adapt(to, scheme.buffer_scheme), Adapt.adapt(to, scheme.advecting_velocity_scheme)) -on_architecture(to, scheme::WENO{N, FT, XT, YT, ZT, WF}) where {N, FT, XT, YT, ZT} = +on_architecture(to, scheme::WENO{N, FT, XT, YT, ZT}) where {N, FT, XT, YT, ZT} = WENO{N, FT}(on_architecture(to, scheme.coeff_xᶠᵃᵃ), on_architecture(to, scheme.coeff_xᶜᵃᵃ), on_architecture(to, scheme.coeff_yᵃᶠᵃ), on_architecture(to, scheme.coeff_yᵃᶜᵃ), on_architecture(to, scheme.coeff_zᵃᵃᶠ), on_architecture(to, scheme.coeff_zᵃᵃᶜ), From 3330e6dcf70a122c5cf15008052cb64890e28b06 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 02:03:14 -0400 Subject: [PATCH 040/152] let's go --- src/Advection/weno_reconstruction.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Advection/weno_reconstruction.jl b/src/Advection/weno_reconstruction.jl index 39e9dbd643..1cb466403b 100644 --- a/src/Advection/weno_reconstruction.jl +++ b/src/Advection/weno_reconstruction.jl @@ -118,7 +118,7 @@ function WENO(FT::DataType=Float64; N = Int((order + 1) ÷ 2) weno_coefficients = compute_reconstruction_coefficients(grid, FT, :WENO; order = N) - buffer_scheme = WENO(FT; grid, order = order - 2, zweno, bounds) + buffer_scheme = WENO(FT; grid, order = order - 2, bounds) advecting_velocity_scheme = Centered(FT; grid, order = order - 1) end From 3556c994ba21715b2a30ee40295a517e079b165f Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 02:07:26 -0400 Subject: [PATCH 041/152] make this gpu work --- src/Advection/weno_interpolants.jl | 52 +++++++++++++++--------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 878c0e7544..14c27b8768 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -201,12 +201,12 @@ end @inline add_global_smoothness(τ, β, ::Val{5}, ::Val{4}) = τ + 2β @inline add_global_smoothness(τ, β, ::Val{5}, ::Val{5}) = τ + β -@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{1}) = τ + β -@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{2}) = τ + 36β -@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{3}) = τ + 135β -@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{4}) = τ - 135β -@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{5}) = τ - 36β -@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{6}) = τ - β +@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{1}) = τ + β +@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{2}) = τ + β +@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{3}) = τ - 8β +@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{4}) = τ + 8β +@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{5}) = τ - β +@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{6}) = τ - β """ calc_weno_stencil(buffer, shift, dir, func::Bool = false) @@ -303,11 +303,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{N, FT}, ψ, idx, loc, args...) where {N, FT} - wei1 = 0 - wei2 = 0 - sol1 = 0 - sol2 = 0 - glob = 0 + wei1 = FT(0) + wei2 = FT(0) + sol1 = FT(0) + sol2 = FT(0) + glob = FT(0) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -331,11 +331,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{N, FT}, ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} - wei1 = 0 - wei2 = 0 - sol1 = 0 - sol2 = 0 - glob = 0 + wei1 = FT(0) + wei2 = FT(0) + sol1 = FT(0) + sol2 = FT(0) + glob = FT(0) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -357,11 +357,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{N, FT}, ψ, idx, loc, VI::VelocityStencil, u, v) where {N, FT} - wei1 = 0 - wei2 = 0 - sol1 = 0 - sol2 = 0 - glob = 0 + wei1 = FT(0) + wei2 = FT(0) + sol1 = FT(0) + sol2 = FT(0) + glob = FT(0) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) @@ -387,11 +387,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{N, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} - wei1 = 0 - wei2 = 0 - sol1 = 0 - sol2 = 0 - glob = 0 + wei1 = FT(0) + wei2 = FT(0) + sol1 = FT(0) + sol2 = FT(0) + glob = FT(0) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) From 76b9cdbaa5dd91f91a87d7c7e6014ad3f3f89e6d Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 02:13:05 -0400 Subject: [PATCH 042/152] test it out --- src/Advection/weno_interpolants.jl | 8 ++++---- src/Advection/weno_reconstruction.jl | 2 -- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 14c27b8768..882e018117 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -315,7 +315,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - glob = add_global_smoothness(glob, β, Val(N), Val(s)) + glob += 1 #add_global_smoothness(glob, β, Val(N), Val(s)) sol1 += ψ̅ * C sol2 += ψ̅ * α wei1 += α @@ -343,7 +343,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - glob = add_global_smoothness(glob, β, Val(N), Val(s)) + glob += 1 # add_global_smoothness(glob, β, Val(N), Val(s)) sol1 += ψ̅ * C sol2 += ψ̅ * α wei1 += α @@ -373,7 +373,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - glob = add_global_smoothness(glob, βU, Val(N), Val(s)) + glob += 1 # add_global_smoothness(glob, βU, Val(N), Val(s)) sol1 += ψ̅ * C sol2 += ψ̅ * α wei1 += α @@ -400,7 +400,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - glob = add_global_smoothness(glob, βϕ, Val(N), Val(s)) + glob += 1 # add_global_smoothness(glob, βϕ, Val(N), Val(s)) sol1 += ψ̅ * C sol2 += ψ̅ * α wei1 += α diff --git a/src/Advection/weno_reconstruction.jl b/src/Advection/weno_reconstruction.jl index 1cb466403b..36cab9200a 100644 --- a/src/Advection/weno_reconstruction.jl +++ b/src/Advection/weno_reconstruction.jl @@ -138,8 +138,6 @@ Base.summary(a::WENO{N}) where N = string("WENO reconstruction order ", N*2-1) Base.show(io::IO, a::WENO{N, FT, RX, RY, RZ, WF, PP}) where {N, FT, RX, RY, RZ, WF, PP} = print(io, summary(a), " \n", - " Smoothness formulation: ", "\n", - " └── $(WF ? "Z-weno" : "JS-weno") \n", a.bounds isa Nothing ? "" : " Bounds : \n └── $(a.bounds) \n", " Boundary scheme: ", "\n", " └── ", summary(a.buffer_scheme) , "\n", From 9df2bd01bd7eba592539d8ba505c3e95d01595a3 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 02:22:08 -0400 Subject: [PATCH 043/152] just add refs --- src/Advection/weno_interpolants.jl | 90 +++++++++++++++--------------- 1 file changed, 44 insertions(+), 46 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 882e018117..73334f84b4 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -303,11 +303,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{N, FT}, ψ, idx, loc, args...) where {N, FT} - wei1 = FT(0) - wei2 = FT(0) - sol1 = FT(0) - sol2 = FT(0) - glob = FT(0) + wei1 = Ref(FT(0)) + wei2 = Ref(FT(0)) + sol1 = Ref(FT(0)) + sol2 = Ref(FT(0)) + glob = Ref(FT(0)) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -315,27 +315,25 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - glob += 1 #add_global_smoothness(glob, β, Val(N), Val(s)) - sol1 += ψ̅ * C - sol2 += ψ̅ * α - wei1 += α - wei2 += C + glob[] += add_global_smoothness(glob[], β, Val(N), Val(s)) + sol1[] += ψ̅ * C + sol2[] += ψ̅ * α + wei1[] += α + wei2[] += C end - glob = glob * glob - - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + return (sol1[] + sol2[] * glob[] * glob[]) / (wei1[] + wei2[] * glob[] * glob[]) end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} - wei1 = FT(0) - wei2 = FT(0) - sol1 = FT(0) - sol2 = FT(0) - glob = FT(0) + wei1 = Ref(FT(0)) + wei2 = Ref(FT(0)) + sol1 = Ref(FT(0)) + sol2 = Ref(FT(0)) + glob = Ref(FT(0)) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -343,25 +341,25 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - glob += 1 # add_global_smoothness(glob, β, Val(N), Val(s)) - sol1 += ψ̅ * C - sol2 += ψ̅ * α - wei1 += α - wei2 += C + glob[] += add_global_smoothness(glob[], β, Val(N), Val(s)) + sol1[] += ψ̅ * C + sol2[] += ψ̅ * α + wei1[] += α + wei2[] += C end - return (sol1 + sol2 * glob * glob) / (wei1 + wei2 * glob * glob) + return (sol1[] + sol2[] * glob[] * glob[]) / (wei1[] + wei2[] * glob[] * glob[]) end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, VI::VelocityStencil, u, v) where {N, FT} - wei1 = FT(0) - wei2 = FT(0) - sol1 = FT(0) - sol2 = FT(0) - glob = FT(0) + wei1 = Ref(FT(0)) + wei2 = Ref(FT(0)) + sol1 = Ref(FT(0)) + sol2 = Ref(FT(0)) + glob = Ref(FT(0)) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) @@ -373,25 +371,25 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - glob += 1 # add_global_smoothness(glob, βU, Val(N), Val(s)) - sol1 += ψ̅ * C - sol2 += ψ̅ * α - wei1 += α - wei2 += C + glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) + sol1[] += ψ̅ * C + sol2[] += ψ̅ * α + wei1[] += α + wei2[] += C end - return (sol1 + sol2 * glob * glob) / (wei1 + wei2 * glob * glob) + return (sol1[] + sol2[] * glob[] * glob[]) / (wei1[] + wei2[] * glob[] * glob[]) end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} - wei1 = FT(0) - wei2 = FT(0) - sol1 = FT(0) - sol2 = FT(0) - glob = FT(0) + wei1 = Ref(FT(0)) + wei2 = Ref(FT(0)) + sol1 = Ref(FT(0)) + sol2 = Ref(FT(0)) + glob = Ref(FT(0)) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -400,14 +398,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - glob += 1 # add_global_smoothness(glob, βϕ, Val(N), Val(s)) - sol1 += ψ̅ * C - sol2 += ψ̅ * α - wei1 += α - wei2 += C + glob[] += add_global_smoothness(glob[], βϕ, Val(N), Val(s)) + sol1[] += ψ̅ * C + sol2[] += ψ̅ * α + wei1[] += α + wei2[] += C end - return (sol1 + sol2 * glob * glob) / (wei1 + wei2 * glob * glob) + return (sol1[] + sol2[] * glob[] * glob[]) / (wei1[] + wei2[] * glob[] * glob[]) end end end From f295384df91a846b325de5769d2cc960acb60c98 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 02:25:33 -0400 Subject: [PATCH 044/152] Optimization done! --- src/Advection/weno_interpolants.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 73334f84b4..6cc7d76180 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -299,6 +299,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ stencil_v = Symbol(:tangential_, side, :_stencil_v) @eval begin + # The WENO-Z solution here is @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, args...) where {N, FT} From 108cb78586358f9a7358b41387b51b0e42552c65 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 02:33:01 -0400 Subject: [PATCH 045/152] test --- src/Advection/weno_interpolants.jl | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 6cc7d76180..c1b07ce329 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -1,5 +1,6 @@ using Oceananigans.Fields: Field using Oceananigans.Operators: ℑyᵃᶠᵃ, ℑxᶠᵃᵃ +using KernelAbstractions: @localmem # WENO reconstruction of order `M` entails reconstructions of order `N` # on `N` different stencils, where `N = (M + 1) / 2`. @@ -323,7 +324,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ wei2[] += C end - return (sol1[] + sol2[] * glob[] * glob[]) / (wei1[] + wei2[] * glob[] * glob[]) + return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) end @inline function $biased_interpolate(i, j, k, grid, @@ -349,13 +350,17 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ wei2[] += C end - return (sol1[] + sol2[] * glob[] * glob[]) / (wei1[] + wei2[] * glob[] * glob[]) + return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, VI::VelocityStencil, u, v) where {N, FT} + + sol = @localmem FT (5) * + li = @index(Local, NTuple) + wei1 = Ref(FT(0)) wei2 = Ref(FT(0)) sol1 = Ref(FT(0)) @@ -379,7 +384,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ wei2[] += C end - return (sol1[] + sol2[] * glob[] * glob[]) / (wei1[] + wei2[] * glob[] * glob[]) + # Is glob squared here? + return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) end @inline function $biased_interpolate(i, j, k, grid, @@ -406,7 +412,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ wei2[] += C end - return (sol1[] + sol2[] * glob[] * glob[]) / (wei1[] + wei2[] * glob[] * glob[]) + return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) end end end From 9f2419bd4cd8163ecae70da9d86e4084a0ddf677 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 08:25:08 -0400 Subject: [PATCH 046/152] correct --- src/Advection/weno_interpolants.jl | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index c1b07ce329..d9f01c5fd0 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -355,11 +355,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, - ψ, idx, loc, VI::VelocityStencil, u, v) where {N, FT} - - - sol = @localmem FT (5) * - li = @index(Local, NTuple) + ψ, idx, loc, VI::VelocityStencil, u, v, args...) where {N, FT} wei1 = Ref(FT(0)) wei2 = Ref(FT(0)) From f8d035623578ee80233d1eee3a0dd8c71138047b Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 08:28:51 -0400 Subject: [PATCH 047/152] weno js --- src/Advection/weno_interpolants.jl | 71 ++++++++++++++++-------------- 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index d9f01c5fd0..0c39e4b591 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -305,11 +305,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{N, FT}, ψ, idx, loc, args...) where {N, FT} - wei1 = Ref(FT(0)) + # wei1 = Ref(FT(0)) wei2 = Ref(FT(0)) - sol1 = Ref(FT(0)) + # sol1 = Ref(FT(0)) sol2 = Ref(FT(0)) - glob = Ref(FT(0)) + # glob = Ref(FT(0)) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -317,25 +317,27 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - glob[] += add_global_smoothness(glob[], β, Val(N), Val(s)) - sol1[] += ψ̅ * C + # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) + # sol1[] += ψ̅ * C + # wei1[] += C sol2[] += ψ̅ * α - wei1[] += α - wei2[] += C + wei2[] += α end - return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) + # Is glob squared here? + # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) + return sol2[] / wei2[] end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} - wei1 = Ref(FT(0)) + # wei1 = Ref(FT(0)) wei2 = Ref(FT(0)) - sol1 = Ref(FT(0)) + # sol1 = Ref(FT(0)) sol2 = Ref(FT(0)) - glob = Ref(FT(0)) + # glob = Ref(FT(0)) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -343,25 +345,27 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - glob[] += add_global_smoothness(glob[], β, Val(N), Val(s)) - sol1[] += ψ̅ * C + # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) + # sol1[] += ψ̅ * C + # wei1[] += C sol2[] += ψ̅ * α - wei1[] += α - wei2[] += C + wei2[] += α end - return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) + # Is glob squared here? + # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) + return sol2[] / wei2[] end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, VI::VelocityStencil, u, v, args...) where {N, FT} - wei1 = Ref(FT(0)) + # wei1 = Ref(FT(0)) wei2 = Ref(FT(0)) - sol1 = Ref(FT(0)) + # sol1 = Ref(FT(0)) sol2 = Ref(FT(0)) - glob = Ref(FT(0)) + # glob = Ref(FT(0)) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) @@ -373,26 +377,27 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) - sol1[] += ψ̅ * C + # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) + # sol1[] += ψ̅ * C + # wei1[] += C sol2[] += ψ̅ * α - wei1[] += α - wei2[] += C + wei2[] += α end # Is glob squared here? - return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) + # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) + return sol2[] / wei2[] end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} - wei1 = Ref(FT(0)) + # wei1 = Ref(FT(0)) wei2 = Ref(FT(0)) - sol1 = Ref(FT(0)) + # sol1 = Ref(FT(0)) sol2 = Ref(FT(0)) - glob = Ref(FT(0)) + # glob = Ref(FT(0)) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -401,14 +406,16 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - glob[] += add_global_smoothness(glob[], βϕ, Val(N), Val(s)) - sol1[] += ψ̅ * C + # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) + # sol1[] += ψ̅ * C + # wei1[] += C sol2[] += ψ̅ * α - wei1[] += α - wei2[] += C + wei2[] += α end - return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) + # Is glob squared here? + # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) + return sol2[] / wei2[] end end end From 7f034c08b131f4b788b49717473c028b478d6eaf Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 08:40:13 -0400 Subject: [PATCH 048/152] another fix --- src/Advection/weno_interpolants.jl | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 0c39e4b591..6be0a8047f 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -280,15 +280,15 @@ end # Stencil for vector invariant calculation of smoothness indicators in the horizontal direction # Parallel to the interpolation direction! (same as left/right stencil) -@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{1}, u) = @inbounds @fastmath left_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, u) -@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{2}, u) = @inbounds @fastmath left_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, u) -@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{1}, v) = @inbounds @fastmath left_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, v) -@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{2}, v) = @inbounds @fastmath left_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, v) - -@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{1}, u) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, u) -@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{2}, u) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, u) -@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, v) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, v) -@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, v) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, v) +@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{1}, u) = @inbounds @fastmath left_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) +@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{2}, u) = @inbounds @fastmath left_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) +@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{1}, v) = @inbounds @fastmath left_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) +@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{2}, v) = @inbounds @fastmath left_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) + +@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{1}, u) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) +@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{2}, u) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) +@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, v) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) +@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, v) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) From d4651e2e08b9228f2a02b3fd76d18b54fbe560c0 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 08:42:15 -0400 Subject: [PATCH 049/152] add this --- src/Advection/weno_interpolants.jl | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 6be0a8047f..cf77489e34 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -280,15 +280,15 @@ end # Stencil for vector invariant calculation of smoothness indicators in the horizontal direction # Parallel to the interpolation direction! (same as left/right stencil) -@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{1}, u) = @inbounds @fastmath left_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) -@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{2}, u) = @inbounds @fastmath left_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) -@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{1}, v) = @inbounds @fastmath left_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) -@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{2}, v) = @inbounds @fastmath left_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) +@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{1}, grid, u) = @inbounds @fastmath left_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) +@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{2}, grid, u) = @inbounds @fastmath left_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) +@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{1}, grid, v) = @inbounds @fastmath left_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) +@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{2}, grid, v) = @inbounds @fastmath left_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) -@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{1}, u) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) -@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{2}, u) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) -@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, v) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) -@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, v) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) +@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{1}, grid, u) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) +@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{2}, grid, u) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) +@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, grid, v) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) +@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, grid, v) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) @@ -369,8 +369,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(s-1), Val($val), u) - vs = $stencil_v(i, j, k, scheme, Val(s-1), Val($val), v) + us = $stencil_u(i, j, k, scheme, Val(s-1), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(s-1), Val($val), grid, v) βu = $biased_β(us, scheme, Val(s-1)) βv = $biased_β(vs, scheme, Val(s-1)) βU = 0.5 * (βu + βv) From 6aea6b4ceb16b02e2763e51ba51c776475fec620 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 08:43:24 -0400 Subject: [PATCH 050/152] minimum registers? --- src/Advection/weno_interpolants.jl | 40 +++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index cf77489e34..78a344207e 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -306,9 +306,9 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, args...) where {N, FT} # wei1 = Ref(FT(0)) - wei2 = Ref(FT(0)) + # wei2 = Ref(FT(0)) # sol1 = Ref(FT(0)) - sol2 = Ref(FT(0)) + # sol2 = Ref(FT(0)) # glob = Ref(FT(0)) ntuple(Val(N)) do s Base.@_inline_meta @@ -320,13 +320,13 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) # sol1[] += ψ̅ * C # wei1[] += C - sol2[] += ψ̅ * α - wei2[] += α + sol2 = ψ̅ * α + wei2 = α end # Is glob squared here? # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) - return sol2[] / wei2[] + return sol2 / wei2 end @inline function $biased_interpolate(i, j, k, grid, @@ -334,9 +334,9 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} # wei1 = Ref(FT(0)) - wei2 = Ref(FT(0)) + # wei2 = Ref(FT(0)) # sol1 = Ref(FT(0)) - sol2 = Ref(FT(0)) + # sol2 = Ref(FT(0)) # glob = Ref(FT(0)) ntuple(Val(N)) do s Base.@_inline_meta @@ -348,13 +348,13 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) # sol1[] += ψ̅ * C # wei1[] += C - sol2[] += ψ̅ * α - wei2[] += α + sol2 = ψ̅ * α + wei2 = α end # Is glob squared here? # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) - return sol2[] / wei2[] + return sol2 / wei2 end @inline function $biased_interpolate(i, j, k, grid, @@ -362,9 +362,9 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, VI::VelocityStencil, u, v, args...) where {N, FT} # wei1 = Ref(FT(0)) - wei2 = Ref(FT(0)) + # wei2 = Ref(FT(0)) # sol1 = Ref(FT(0)) - sol2 = Ref(FT(0)) + # sol2 = Ref(FT(0)) # glob = Ref(FT(0)) ntuple(Val(N)) do s Base.@_inline_meta @@ -380,13 +380,13 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) # sol1[] += ψ̅ * C # wei1[] += C - sol2[] += ψ̅ * α - wei2[] += α + sol2 = ψ̅ * α + wei2 = α end # Is glob squared here? # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) - return sol2[] / wei2[] + return sol2 / wei2 end @inline function $biased_interpolate(i, j, k, grid, @@ -394,9 +394,9 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} # wei1 = Ref(FT(0)) - wei2 = Ref(FT(0)) + # wei2 = Ref(FT(0)) # sol1 = Ref(FT(0)) - sol2 = Ref(FT(0)) + # sol2 = Ref(FT(0)) # glob = Ref(FT(0)) ntuple(Val(N)) do s Base.@_inline_meta @@ -409,13 +409,13 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) # sol1[] += ψ̅ * C # wei1[] += C - sol2[] += ψ̅ * α - wei2[] += α + sol2 = ψ̅ * α + wei2 = α end # Is glob squared here? # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) - return sol2[] / wei2[] + return sol2 / wei2 end end end From bff5c2358244ecdb01c2ac0a89420261c1cabf5c Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 08:44:06 -0400 Subject: [PATCH 051/152] with bugfix --- src/Advection/weno_interpolants.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 78a344207e..4657c9a3b7 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -369,8 +369,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(s-1), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(s-1), Val($val), grid, v) + us = $stencil_u(i, j, k, scheme, Val(s), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(s), Val($val), grid, v) βu = $biased_β(us, scheme, Val(s-1)) βv = $biased_β(vs, scheme, Val(s-1)) βU = 0.5 * (βu + βv) From 2fa3ecdb6c1dd7ad701f382838f02498f5e140ef Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 08:46:54 -0400 Subject: [PATCH 052/152] try like this --- src/Advection/weno_interpolants.jl | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 4657c9a3b7..7b9e6c798d 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -320,13 +320,13 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) # sol1[] += ψ̅ * C # wei1[] += C - sol2 = ψ̅ * α - wei2 = α + # sol2 = ψ̅ * α + # wei2 = α end # Is glob squared here? # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) - return sol2 / wei2 + return 1 end @inline function $biased_interpolate(i, j, k, grid, @@ -348,13 +348,13 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) # sol1[] += ψ̅ * C # wei1[] += C - sol2 = ψ̅ * α - wei2 = α + # sol2 = ψ̅ * α + # wei2 = α end # Is glob squared here? # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) - return sol2 / wei2 + return 1 end @inline function $biased_interpolate(i, j, k, grid, @@ -380,13 +380,13 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) # sol1[] += ψ̅ * C # wei1[] += C - sol2 = ψ̅ * α - wei2 = α + # sol2 = ψ̅ * α + # wei2 = α end # Is glob squared here? # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) - return sol2 / wei2 + return 1 end @inline function $biased_interpolate(i, j, k, grid, @@ -409,13 +409,13 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) # sol1[] += ψ̅ * C # wei1[] += C - sol2 = ψ̅ * α - wei2 = α + # sol2 = ψ̅ * α + # wei2 = α end # Is glob squared here? # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) - return sol2 / wei2 + return 1 end end end From bb80e23901242f17155c69815466b258a0acbf73 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 08:51:54 -0400 Subject: [PATCH 053/152] just write down the loop --- src/Advection/weno_interpolants.jl | 60 ++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 7b9e6c798d..e75986a719 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -329,6 +329,66 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ return 1 end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{7, FT}, + ψ, idx, loc, args...) where {N, FT} + + glob = 0 + wei1 = 0 + wei2 = 0 + sol1 = 0 + sol2 = 0 + + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(0)) + C = FT($coeff(scheme, Val(0))) + α = @inbounds @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, βU, Val(N), Val(0)) + sol1 = ψ̅ * C + wei1 = C + sol2 = ψ̅ * α + wei2 = α + + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(1)) + C = FT($coeff(scheme, Val(1))) + α = @inbounds @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, βU, Val(N), Val(1)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(2)) + C = FT($coeff(scheme, Val(2))) + α = @inbounds @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, βU, Val(N), Val(2)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(3)) + C = FT($coeff(scheme, Val(3))) + α = @inbounds @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, βU, Val(N), Val(3)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + # Is glob squared here? + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + + @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} From 027dceb004ed6bf3438a4a8b983dfc638433d8c2 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 08:55:15 -0400 Subject: [PATCH 054/152] unroll manually --- src/Advection/weno_interpolants.jl | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index e75986a719..c5e0703fa5 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -334,18 +334,12 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{7, FT}, ψ, idx, loc, args...) where {N, FT} - glob = 0 - wei1 = 0 - wei2 = 0 - sol1 = 0 - sol2 = 0 - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) β = $biased_β(ψs, scheme, Val(0)) C = FT($coeff(scheme, Val(0))) - α = @inbounds @fastmath C / (β + FT(ε))^2 + α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(N), Val(0)) + glob = βU sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α @@ -354,7 +348,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) β = $biased_β(ψs, scheme, Val(1)) C = FT($coeff(scheme, Val(1))) - α = @inbounds @fastmath C / (β + FT(ε))^2 + α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(glob, βU, Val(N), Val(1)) sol1 += ψ̅ * C @@ -365,7 +359,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) β = $biased_β(ψs, scheme, Val(2)) C = FT($coeff(scheme, Val(2))) - α = @inbounds @fastmath C / (β + FT(ε))^2 + α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(glob, βU, Val(N), Val(2)) sol1 += ψ̅ * C @@ -376,7 +370,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) β = $biased_β(ψs, scheme, Val(3)) C = FT($coeff(scheme, Val(3))) - α = @inbounds @fastmath C / (β + FT(ε))^2 + α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(glob, βU, Val(N), Val(3)) sol1 += ψ̅ * C @@ -403,7 +397,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) β = $biased_β(ψs, scheme, Val(s-1)) C = FT($coeff(scheme, Val(s-1))) - α = @inbounds @fastmath C / (β + FT(ε))^2 + α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) # sol1[] += ψ̅ * C @@ -435,7 +429,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ βv = $biased_β(vs, scheme, Val(s-1)) βU = 0.5 * (βu + βv) C = FT($coeff(scheme, Val(s-1))) - α = @inbounds @fastmath C / (βU + FT(ε))^2 + α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) # sol1[] += ψ̅ * C @@ -464,7 +458,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ϕs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) βϕ = $biased_β(ϕs, scheme, Val(s-1)) C = FT($coeff(scheme, Val(s-1))) - α = @inbounds @fastmath C / (βϕ + FT(ε))^2 + α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) # sol1[] += ψ̅ * C From 9bbe28140f776af6c391af2fec79fabce443ae90 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 08:56:50 -0400 Subject: [PATCH 055/152] bugfix --- src/Advection/weno_interpolants.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index c5e0703fa5..101085b2ba 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -339,7 +339,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(0))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob = βU + glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α @@ -350,7 +350,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(N), Val(1)) + glob += add_global_smoothness(glob, β, Val(N), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -361,7 +361,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(N), Val(2)) + glob += add_global_smoothness(glob, β, Val(N), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -372,7 +372,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(N), Val(3)) + glob += add_global_smoothness(glob, β, Val(N), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α From a0f3b87ae9c0ee1b40d28f6cab56dd4212dbf32e Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 08:57:22 -0400 Subject: [PATCH 056/152] add here --- src/Advection/weno_interpolants.jl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 101085b2ba..59c3ce9829 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -329,9 +329,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ return 1 end - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{7, FT}, + scheme::WENO{4, FT}, ψ, idx, loc, args...) where {N, FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) From 893fccf60a2049eb5bf3a848961191784762532b Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:06:15 -0400 Subject: [PATCH 057/152] let's go with weno 4 --- src/Advection/Advection.jl | 1 + src/Advection/weno_4.jl | 240 +++++++++++++++++++++++++++++ src/Advection/weno_interpolants.jl | 1 - 3 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 src/Advection/weno_4.jl diff --git a/src/Advection/Advection.jl b/src/Advection/Advection.jl index c3d6d19ce3..e653258868 100644 --- a/src/Advection/Advection.jl +++ b/src/Advection/Advection.jl @@ -67,6 +67,7 @@ include("centered_reconstruction.jl") include("upwind_biased_reconstruction.jl") include("weno_reconstruction.jl") include("weno_interpolants.jl") +include("weno_4.jl") include("stretched_weno_smoothness.jl") include("multi_dimensional_reconstruction.jl") include("vector_invariant_upwinding.jl") diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl new file mode 100644 index 0000000000..fba98da5d6 --- /dev/null +++ b/src/Advection/weno_4.jl @@ -0,0 +1,240 @@ + +for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4, FT}, + ψ, idx, loc, args...) where {FT} + + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(0)) + C = FT($coeff(scheme, Val(0))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + glob = β + sol1 = ψ̅ * C + wei1 = C + sol2 = ψ̅ * α + wei2 = α + + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(1)) + C = FT($coeff(scheme, Val(1))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(1)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(2)) + C = FT($coeff(scheme, Val(2))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(2)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(3)) + C = FT($coeff(scheme, Val(3))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(3)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + # Is glob squared here? + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4, FT}, + ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} + + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(0)) + C = FT($coeff(scheme, Val(0))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + glob = β + sol1 = ψ̅ * C + wei1 = C + sol2 = ψ̅ * α + wei2 = α + + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(1)) + C = FT($coeff(scheme, Val(1))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(1)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(2)) + C = FT($coeff(scheme, Val(2))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(2)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(3)) + C = FT($coeff(scheme, Val(3))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(3)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + # Is glob squared here? + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4, FT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} + + + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) + βu = $biased_β(us, scheme, Val(0)) + βv = $biased_β(vs, scheme, Val(0)) + βU = 0.5 * (βu + βv) + C = FT($coeff(scheme, Val(0))) + α = @fastmath C / (βU + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + glob = β + sol1 = ψ̅ * C + wei1 = C + sol2 = ψ̅ * α + wei2 = α + + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) + us = $stencil_u(i, j, k, scheme, Val(2), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(2), Val($val), grid, v) + βu = $biased_β(us, scheme, Val(1)) + βv = $biased_β(vs, scheme, Val(1)) + βU = 0.5 * (βu + βv) + C = FT($coeff(scheme, Val(1))) + α = @fastmath C / (βU + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(1)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) + us = $stencil_u(i, j, k, scheme, Val(3), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(3), Val($val), grid, v) + βu = $biased_β(us, scheme, Val(2)) + βv = $biased_β(vs, scheme, Val(2)) + βU = 0.5 * (βu + βv) + C = FT($coeff(scheme, Val(2))) + α = @fastmath C / (βU + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(2)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) + us = $stencil_u(i, j, k, scheme, Val(4), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(4), Val($val), grid, v) + βu = $biased_β(us, scheme, Val(3)) + βv = $biased_β(vs, scheme, Val(3)) + βU = 0.5 * (βu + βv) + C = FT($coeff(scheme, Val(3))) + α = @fastmath C / (βU + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(3)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + # Is glob squared here? + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4, FT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT} + + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) + βϕ = $biased_β(ϕs, scheme, Val(0)) + C = FT($coeff(scheme, Val(0))) + α = @fastmath C / (βϕ + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + glob = β + sol1 = ψ̅ * C + wei1 = C + sol2 = ψ̅ * α + wei2 = α + + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) + ϕs = $stencil(i, j, k, scheme, Val(2), VI.func, grid, args...) + βϕ = $biased_β(ϕs, scheme, Val(1)) + C = FT($coeff(scheme, Val(1))) + α = @fastmath C / (βϕ + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(1)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) + ϕs = $stencil(i, j, k, scheme, Val(3), VI.func, grid, args...) + βϕ = $biased_β(ϕs, scheme, Val(2)) + C = FT($coeff(scheme, Val(2))) + α = @fastmath C / (βϕ + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(2)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) + ϕs = $stencil(i, j, k, scheme, Val(4), VI.func, grid, args...) + βϕ = $biased_β(ϕs, scheme, Val(3)) + C = FT($coeff(scheme, Val(3))) + α = @fastmath C / (βϕ + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(3)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + # Is glob squared here? + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + end +end \ No newline at end of file diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 59c3ce9829..9d5c814141 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -381,7 +381,6 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) end - @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} From b756aff9e3cbcae86a9c7052466a9194ef6bf1f4 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:08:15 -0400 Subject: [PATCH 058/152] go with weno4 --- src/Advection/Advection.jl | 4 ++++ src/Advection/weno_2.jl | 0 src/Advection/weno_3.jl | 0 src/Advection/weno_4.jl | 2 +- src/Advection/weno_5.jl | 0 src/Advection/weno_6.jl | 0 6 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 src/Advection/weno_2.jl create mode 100644 src/Advection/weno_3.jl create mode 100644 src/Advection/weno_5.jl create mode 100644 src/Advection/weno_6.jl diff --git a/src/Advection/Advection.jl b/src/Advection/Advection.jl index e653258868..02b27ea60a 100644 --- a/src/Advection/Advection.jl +++ b/src/Advection/Advection.jl @@ -67,7 +67,11 @@ include("centered_reconstruction.jl") include("upwind_biased_reconstruction.jl") include("weno_reconstruction.jl") include("weno_interpolants.jl") +include("weno_2.jl") +include("weno_3.jl") include("weno_4.jl") +include("weno_5.jl") +include("weno_6.jl") include("stretched_weno_smoothness.jl") include("multi_dimensional_reconstruction.jl") include("vector_invariant_upwinding.jl") diff --git a/src/Advection/weno_2.jl b/src/Advection/weno_2.jl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index fba98da5d6..dfead501a0 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -1,4 +1,3 @@ - for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) biased_β = Symbol(side, :_biased_β) @@ -8,6 +7,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ stencil_u = Symbol(:tangential_, side, :_stencil_u) stencil_v = Symbol(:tangential_, side, :_stencil_v) + @eval begin @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{4, FT}, ψ, idx, loc, args...) where {FT} diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/Advection/weno_6.jl b/src/Advection/weno_6.jl new file mode 100644 index 0000000000..e69de29bb2 From 040b68d753759e9219d1401ea17d1681f9d3f01f Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:11:56 -0400 Subject: [PATCH 059/152] go with weno 4 --- src/Advection/weno_4.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index dfead501a0..62c312b4f2 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -117,7 +117,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) βu = $biased_β(us, scheme, Val(0)) @@ -132,7 +132,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, u, v, args...) us = $stencil_u(i, j, k, scheme, Val(2), Val($val), grid, u) vs = $stencil_v(i, j, k, scheme, Val(2), Val($val), grid, v) βu = $biased_β(us, scheme, Val(1)) @@ -147,7 +147,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, u, v, args...) us = $stencil_u(i, j, k, scheme, Val(3), Val($val), grid, u) vs = $stencil_v(i, j, k, scheme, Val(3), Val($val), grid, v) βu = $biased_β(us, scheme, Val(2)) @@ -162,7 +162,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) + ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, u, v, args...) us = $stencil_u(i, j, k, scheme, Val(4), Val($val), grid, u) vs = $stencil_v(i, j, k, scheme, Val(4), Val($val), grid, v) βu = $biased_β(us, scheme, Val(3)) From af1603b8ffd80abe9cf084762bd73e090baf234d Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:14:03 -0400 Subject: [PATCH 060/152] wenos till 5 --- src/Advection/weno_2.jl | 143 ++++++++++++++++++++ src/Advection/weno_3.jl | 191 ++++++++++++++++++++++++++ src/Advection/weno_5.jl | 289 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 623 insertions(+) diff --git a/src/Advection/weno_2.jl b/src/Advection/weno_2.jl index e69de29bb2..ec751f635a 100644 --- a/src/Advection/weno_2.jl +++ b/src/Advection/weno_2.jl @@ -0,0 +1,143 @@ +for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + + @eval begin + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{2, FT}, + ψ, idx, loc, args...) where {FT} + + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(0)) + C = FT($coeff(scheme, Val(0))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + glob = β + sol1 = ψ̅ * C + wei1 = C + sol2 = ψ̅ * α + wei2 = α + + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(1)) + C = FT($coeff(scheme, Val(1))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(1)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + # Is glob squared here? + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{2, FT}, + ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} + + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(0)) + C = FT($coeff(scheme, Val(0))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + glob = β + sol1 = ψ̅ * C + wei1 = C + sol2 = ψ̅ * α + wei2 = α + + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(1)) + C = FT($coeff(scheme, Val(1))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(1)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + # Is glob squared here? + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{2, FT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} + + + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) + us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) + βu = $biased_β(us, scheme, Val(0)) + βv = $biased_β(vs, scheme, Val(0)) + βU = 0.5 * (βu + βv) + C = FT($coeff(scheme, Val(0))) + α = @fastmath C / (βU + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + glob = β + sol1 = ψ̅ * C + wei1 = C + sol2 = ψ̅ * α + wei2 = α + + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, u, v, args...) + us = $stencil_u(i, j, k, scheme, Val(2), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(2), Val($val), grid, v) + βu = $biased_β(us, scheme, Val(1)) + βv = $biased_β(vs, scheme, Val(1)) + βU = 0.5 * (βu + βv) + C = FT($coeff(scheme, Val(1))) + α = @fastmath C / (βU + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(1)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + + # Is glob squared here? + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{2, FT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT} + + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) + βϕ = $biased_β(ϕs, scheme, Val(0)) + C = FT($coeff(scheme, Val(0))) + α = @fastmath C / (βϕ + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + glob = β + sol1 = ψ̅ * C + wei1 = C + sol2 = ψ̅ * α + wei2 = α + + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) + ϕs = $stencil(i, j, k, scheme, Val(2), VI.func, grid, args...) + βϕ = $biased_β(ϕs, scheme, Val(1)) + C = FT($coeff(scheme, Val(1))) + α = @fastmath C / (βϕ + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(1)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + # Is glob squared here? + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + end +end \ No newline at end of file diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl index e69de29bb2..ba078516a7 100644 --- a/src/Advection/weno_3.jl +++ b/src/Advection/weno_3.jl @@ -0,0 +1,191 @@ +for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + + @eval begin + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{3, FT}, + ψ, idx, loc, args...) where {FT} + + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(0)) + C = FT($coeff(scheme, Val(0))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + glob = β + sol1 = ψ̅ * C + wei1 = C + sol2 = ψ̅ * α + wei2 = α + + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(1)) + C = FT($coeff(scheme, Val(1))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(1)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(2)) + C = FT($coeff(scheme, Val(2))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(2)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + # Is glob squared here? + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{3, FT}, + ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} + + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(0)) + C = FT($coeff(scheme, Val(0))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + glob = β + sol1 = ψ̅ * C + wei1 = C + sol2 = ψ̅ * α + wei2 = α + + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(1)) + C = FT($coeff(scheme, Val(1))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(1)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(2)) + C = FT($coeff(scheme, Val(2))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(2)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + # Is glob squared here? + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{3, FT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} + + + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) + us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) + βu = $biased_β(us, scheme, Val(0)) + βv = $biased_β(vs, scheme, Val(0)) + βU = 0.5 * (βu + βv) + C = FT($coeff(scheme, Val(0))) + α = @fastmath C / (βU + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + glob = β + sol1 = ψ̅ * C + wei1 = C + sol2 = ψ̅ * α + wei2 = α + + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, u, v, args...) + us = $stencil_u(i, j, k, scheme, Val(2), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(2), Val($val), grid, v) + βu = $biased_β(us, scheme, Val(1)) + βv = $biased_β(vs, scheme, Val(1)) + βU = 0.5 * (βu + βv) + C = FT($coeff(scheme, Val(1))) + α = @fastmath C / (βU + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(1)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, u, v, args...) + us = $stencil_u(i, j, k, scheme, Val(3), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(3), Val($val), grid, v) + βu = $biased_β(us, scheme, Val(2)) + βv = $biased_β(vs, scheme, Val(2)) + βU = 0.5 * (βu + βv) + C = FT($coeff(scheme, Val(2))) + α = @fastmath C / (βU + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(2)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + # Is glob squared here? + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{3, FT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT} + + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) + βϕ = $biased_β(ϕs, scheme, Val(0)) + C = FT($coeff(scheme, Val(0))) + α = @fastmath C / (βϕ + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + glob = β + sol1 = ψ̅ * C + wei1 = C + sol2 = ψ̅ * α + wei2 = α + + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) + ϕs = $stencil(i, j, k, scheme, Val(2), VI.func, grid, args...) + βϕ = $biased_β(ϕs, scheme, Val(1)) + C = FT($coeff(scheme, Val(1))) + α = @fastmath C / (βϕ + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(1)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) + ϕs = $stencil(i, j, k, scheme, Val(3), VI.func, grid, args...) + βϕ = $biased_β(ϕs, scheme, Val(2)) + C = FT($coeff(scheme, Val(2))) + α = @fastmath C / (βϕ + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(2)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + # Is glob squared here? + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + end +end \ No newline at end of file diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl index e69de29bb2..bc40087e7a 100644 --- a/src/Advection/weno_5.jl +++ b/src/Advection/weno_5.jl @@ -0,0 +1,289 @@ +for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + + @eval begin + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4, FT}, + ψ, idx, loc, args...) where {FT} + + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(0)) + C = FT($coeff(scheme, Val(0))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + glob = β + sol1 = ψ̅ * C + wei1 = C + sol2 = ψ̅ * α + wei2 = α + + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(1)) + C = FT($coeff(scheme, Val(1))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(1)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(2)) + C = FT($coeff(scheme, Val(2))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(2)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(3)) + C = FT($coeff(scheme, Val(3))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(3)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(5), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(4)) + C = FT($coeff(scheme, Val(4))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(4)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + # Is glob squared here? + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4, FT}, + ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} + + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(0)) + C = FT($coeff(scheme, Val(0))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + glob = β + sol1 = ψ̅ * C + wei1 = C + sol2 = ψ̅ * α + wei2 = α + + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(1)) + C = FT($coeff(scheme, Val(1))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(1)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(2)) + C = FT($coeff(scheme, Val(2))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(2)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(3)) + C = FT($coeff(scheme, Val(3))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(3)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(5), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(4)) + C = FT($coeff(scheme, Val(4))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(4)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + # Is glob squared here? + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4, FT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} + + + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) + us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) + βu = $biased_β(us, scheme, Val(0)) + βv = $biased_β(vs, scheme, Val(0)) + βU = 0.5 * (βu + βv) + C = FT($coeff(scheme, Val(0))) + α = @fastmath C / (βU + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + glob = β + sol1 = ψ̅ * C + wei1 = C + sol2 = ψ̅ * α + wei2 = α + + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, u, v, args...) + us = $stencil_u(i, j, k, scheme, Val(2), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(2), Val($val), grid, v) + βu = $biased_β(us, scheme, Val(1)) + βv = $biased_β(vs, scheme, Val(1)) + βU = 0.5 * (βu + βv) + C = FT($coeff(scheme, Val(1))) + α = @fastmath C / (βU + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(1)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, u, v, args...) + us = $stencil_u(i, j, k, scheme, Val(3), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(3), Val($val), grid, v) + βu = $biased_β(us, scheme, Val(2)) + βv = $biased_β(vs, scheme, Val(2)) + βU = 0.5 * (βu + βv) + C = FT($coeff(scheme, Val(2))) + α = @fastmath C / (βU + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(2)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, u, v, args...) + us = $stencil_u(i, j, k, scheme, Val(4), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(4), Val($val), grid, v) + βu = $biased_β(us, scheme, Val(3)) + βv = $biased_β(vs, scheme, Val(3)) + βU = 0.5 * (βu + βv) + C = FT($coeff(scheme, Val(3))) + α = @fastmath C / (βU + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(3)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(5), ψ, grid, u, v, args...) + us = $stencil_u(i, j, k, scheme, Val(5), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(5), Val($val), grid, v) + βu = $biased_β(us, scheme, Val(4)) + βv = $biased_β(vs, scheme, Val(4)) + βU = 0.5 * (βu + βv) + C = FT($coeff(scheme, Val(4))) + α = @fastmath C / (βU + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(4)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + # Is glob squared here? + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4, FT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT} + + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) + βϕ = $biased_β(ϕs, scheme, Val(0)) + C = FT($coeff(scheme, Val(0))) + α = @fastmath C / (βϕ + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + glob = β + sol1 = ψ̅ * C + wei1 = C + sol2 = ψ̅ * α + wei2 = α + + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) + ϕs = $stencil(i, j, k, scheme, Val(2), VI.func, grid, args...) + βϕ = $biased_β(ϕs, scheme, Val(1)) + C = FT($coeff(scheme, Val(1))) + α = @fastmath C / (βϕ + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(1)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) + ϕs = $stencil(i, j, k, scheme, Val(3), VI.func, grid, args...) + βϕ = $biased_β(ϕs, scheme, Val(2)) + C = FT($coeff(scheme, Val(2))) + α = @fastmath C / (βϕ + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(2)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) + ϕs = $stencil(i, j, k, scheme, Val(4), VI.func, grid, args...) + βϕ = $biased_β(ϕs, scheme, Val(3)) + C = FT($coeff(scheme, Val(3))) + α = @fastmath C / (βϕ + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(3)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + ψs = $stencil(i, j, k, scheme, Val(5), ψ, grid, args...) + ϕs = $stencil(i, j, k, scheme, Val(5), VI.func, grid, args...) + βϕ = $biased_β(ϕs, scheme, Val(4)) + C = FT($coeff(scheme, Val(4))) + α = @fastmath C / (βϕ + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) + glob += add_global_smoothness(glob, β, Val(N), Val(4)) + sol1 += ψ̅ * C + wei1 += C + sol2 += ψ̅ * α + wei2 += α + + # Is glob squared here? + return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + end + end +end \ No newline at end of file From e46f9350e629407fa43c4de29822bfa30e7bad9f Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:14:58 -0400 Subject: [PATCH 061/152] last correction? --- src/Advection/weno_4.jl | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index 62c312b4f2..22412f8552 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -126,7 +126,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(0))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob = β + glob = βU sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α @@ -141,7 +141,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(1)) + glob += add_global_smoothness(glob, βU, Val(N), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -156,7 +156,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(2)) + glob += add_global_smoothness(glob, βU, Val(N), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -171,7 +171,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(3)) + glob += add_global_smoothness(glob, βU, Val(N), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -191,7 +191,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(0))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob = β + glob = βϕ sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α @@ -203,7 +203,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(1)) + glob += add_global_smoothness(glob, βϕ, Val(N), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -215,7 +215,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(2)) + glob += add_global_smoothness(glob, βϕ, Val(N), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -227,7 +227,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(3)) + glob += add_global_smoothness(glob, βϕ, Val(N), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α From 6b953820d00997fadef0f3004d8834faa8aa24f0 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:17:08 -0400 Subject: [PATCH 062/152] test it now --- src/Advection/weno_2.jl | 8 ++++---- src/Advection/weno_3.jl | 12 ++++++------ src/Advection/weno_5.jl | 20 ++++++++++---------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/Advection/weno_2.jl b/src/Advection/weno_2.jl index ec751f635a..ed6f0a63bb 100644 --- a/src/Advection/weno_2.jl +++ b/src/Advection/weno_2.jl @@ -82,7 +82,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(0))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob = β + glob = βU sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α @@ -97,7 +97,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(1)) + glob += add_global_smoothness(glob, βU, Val(N), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -118,7 +118,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(0))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob = β + glob = βϕ sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α @@ -130,7 +130,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(1)) + glob += add_global_smoothness(glob, βϕ, Val(N), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl index ba078516a7..8792a75a4c 100644 --- a/src/Advection/weno_3.jl +++ b/src/Advection/weno_3.jl @@ -104,7 +104,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(0))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob = β + glob = βU sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α @@ -119,7 +119,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(1)) + glob += add_global_smoothness(glob, βU, Val(N), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -134,7 +134,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(2)) + glob += add_global_smoothness(glob, βU, Val(N), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -154,7 +154,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(0))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob = β + glob = βϕ sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α @@ -166,7 +166,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(1)) + glob += add_global_smoothness(glob, βϕ, Val(N), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -178,7 +178,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(2)) + glob += add_global_smoothness(glob, βϕ, Val(N), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl index bc40087e7a..ab07b0b678 100644 --- a/src/Advection/weno_5.jl +++ b/src/Advection/weno_5.jl @@ -148,7 +148,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(0))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob = β + glob = βU sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α @@ -163,7 +163,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(1)) + glob += add_global_smoothness(glob, βU, Val(N), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -178,7 +178,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(2)) + glob += add_global_smoothness(glob, βU, Val(N), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -193,7 +193,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(3)) + glob += add_global_smoothness(glob, βU, Val(N), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -208,7 +208,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(4))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(4)) + glob += add_global_smoothness(glob, βU, Val(N), Val(4)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -228,7 +228,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(0))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob = β + glob = βϕ sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α @@ -240,7 +240,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(1)) + glob += add_global_smoothness(glob, βϕ, Val(N), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -252,7 +252,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(2)) + glob += add_global_smoothness(glob, βϕ, Val(N), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -264,7 +264,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(3)) + glob += add_global_smoothness(glob, βϕ, Val(N), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -276,7 +276,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(4))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(4)) + glob += add_global_smoothness(glob, βϕ, Val(N), Val(4)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α From 629bd49d594c0796caeafe9fc48eef88359ab302 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:17:55 -0400 Subject: [PATCH 063/152] dorrect weno 5 --- src/Advection/weno_5.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl index ab07b0b678..6a9cd7e057 100644 --- a/src/Advection/weno_5.jl +++ b/src/Advection/weno_5.jl @@ -9,7 +9,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, + scheme::WENO{5, FT}, ψ, idx, loc, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -72,7 +72,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, + scheme::WENO{5, FT}, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -135,7 +135,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, + scheme::WENO{5, FT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} @@ -219,7 +219,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, + scheme::WENO{5, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) From 1f8a6adebca2127325636f76112b4d669e3346b0 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:21:53 -0400 Subject: [PATCH 064/152] should be ok? --- src/Advection/weno_2.jl | 8 ++++---- src/Advection/weno_3.jl | 12 ++++++------ src/Advection/weno_4.jl | 24 ++++++++++++------------ src/Advection/weno_5.jl | 32 ++++++++++++++++---------------- 4 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/Advection/weno_2.jl b/src/Advection/weno_2.jl index ed6f0a63bb..18d835b5eb 100644 --- a/src/Advection/weno_2.jl +++ b/src/Advection/weno_2.jl @@ -28,7 +28,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(1)) + glob += add_global_smoothness(glob, β, Val(2), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -58,7 +58,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(1)) + glob += add_global_smoothness(glob, β, Val(2), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -97,7 +97,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(N), Val(1)) + glob += add_global_smoothness(glob, βU, Val(2), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -130,7 +130,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(N), Val(1)) + glob += add_global_smoothness(glob, βϕ, Val(2), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl index 8792a75a4c..4fc494bd81 100644 --- a/src/Advection/weno_3.jl +++ b/src/Advection/weno_3.jl @@ -69,7 +69,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(1)) + glob += add_global_smoothness(glob, β, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -80,7 +80,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(2)) + glob += add_global_smoothness(glob, β, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -119,7 +119,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(N), Val(1)) + glob += add_global_smoothness(glob, βU, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -134,7 +134,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(N), Val(2)) + glob += add_global_smoothness(glob, βU, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -166,7 +166,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(N), Val(1)) + glob += add_global_smoothness(glob, βϕ, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -178,7 +178,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(N), Val(2)) + glob += add_global_smoothness(glob, βϕ, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index 22412f8552..e5078225dc 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -28,7 +28,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(1)) + glob += add_global_smoothness(glob, β, Val(4), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -39,7 +39,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(2)) + glob += add_global_smoothness(glob, β, Val(4), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -50,7 +50,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(3)) + glob += add_global_smoothness(glob, β, Val(4), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -80,7 +80,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(1)) + glob += add_global_smoothness(glob, β, Val(4), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -91,7 +91,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(2)) + glob += add_global_smoothness(glob, β, Val(4), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -102,7 +102,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(3)) + glob += add_global_smoothness(glob, β, Val(4), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -141,7 +141,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(N), Val(1)) + glob += add_global_smoothness(glob, βU, Val(4), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -156,7 +156,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(N), Val(2)) + glob += add_global_smoothness(glob, βU, Val(4), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -171,7 +171,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(N), Val(3)) + glob += add_global_smoothness(glob, βU, Val(4), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -203,7 +203,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(N), Val(1)) + glob += add_global_smoothness(glob, βϕ, Val(4), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -215,7 +215,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(N), Val(2)) + glob += add_global_smoothness(glob, βϕ, Val(4), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -227,7 +227,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(N), Val(3)) + glob += add_global_smoothness(glob, βϕ, Val(4), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl index 6a9cd7e057..adcb26a446 100644 --- a/src/Advection/weno_5.jl +++ b/src/Advection/weno_5.jl @@ -28,7 +28,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(1)) + glob += add_global_smoothness(glob, β, Val(5), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -39,7 +39,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(2)) + glob += add_global_smoothness(glob, β, Val(5), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -50,7 +50,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(3)) + glob += add_global_smoothness(glob, β, Val(5), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -61,7 +61,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(4))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(4)) + glob += add_global_smoothness(glob, β, Val(5), Val(4)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -91,7 +91,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(1)) + glob += add_global_smoothness(glob, β, Val(5), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -102,7 +102,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(2)) + glob += add_global_smoothness(glob, β, Val(5), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -113,7 +113,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(3)) + glob += add_global_smoothness(glob, β, Val(5), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -124,7 +124,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(4))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(4)) + glob += add_global_smoothness(glob, β, Val(5), Val(4)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -163,7 +163,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(N), Val(1)) + glob += add_global_smoothness(glob, βU, Val(5), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -178,7 +178,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(N), Val(2)) + glob += add_global_smoothness(glob, βU, Val(5), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -193,7 +193,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(N), Val(3)) + glob += add_global_smoothness(glob, βU, Val(5), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -208,7 +208,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(4))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(N), Val(4)) + glob += add_global_smoothness(glob, βU, Val(5), Val(4)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -240,7 +240,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(N), Val(1)) + glob += add_global_smoothness(glob, βϕ, Val(5), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -252,7 +252,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(N), Val(2)) + glob += add_global_smoothness(glob, βϕ, Val(5), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -264,7 +264,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(N), Val(3)) + glob += add_global_smoothness(glob, βϕ, Val(5), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -276,7 +276,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(4))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(N), Val(4)) + glob += add_global_smoothness(glob, βϕ, Val(5), Val(4)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α From 7edc1eff7b09da9cd13dceb2b64aa0859bbdc099 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:24:24 -0400 Subject: [PATCH 065/152] again --- src/Advection/weno_3.jl | 4 +-- src/Advection/weno_interpolants.jl | 52 ------------------------------ 2 files changed, 2 insertions(+), 54 deletions(-) diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl index 4fc494bd81..b938c6a618 100644 --- a/src/Advection/weno_3.jl +++ b/src/Advection/weno_3.jl @@ -28,7 +28,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(1)) + glob += add_global_smoothness(glob, β, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -39,7 +39,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(2)) + glob += add_global_smoothness(glob, β, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 9d5c814141..30217dc5f0 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -329,58 +329,6 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ return 1 end - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, - ψ, idx, loc, args...) where {N, FT} - - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(0)) - C = FT($coeff(scheme, Val(0))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob = β - sol1 = ψ̅ * C - wei1 = C - sol2 = ψ̅ * α - wei2 = α - - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(1)) - C = FT($coeff(scheme, Val(1))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(1)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(2)) - C = FT($coeff(scheme, Val(2))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(2)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(3)) - C = FT($coeff(scheme, Val(3))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(N), Val(3)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - # Is glob squared here? - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) - end - @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} From 548f7d2123c6b5416c44352cd9d5d993079a21ac Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:40:37 -0400 Subject: [PATCH 066/152] try it like this? --- src/Advection/Advection.jl | 8 +- src/Advection/weno_5.jl | 1 - src/Advection/weno_interpolants.jl | 254 ++++++++++++++--------------- src/Architectures.jl | 4 +- src/MyCUDABackend.jl | 247 ++++++++++++++++++++++++++++ src/Oceananigans.jl | 1 + 6 files changed, 381 insertions(+), 134 deletions(-) create mode 100644 src/MyCUDABackend.jl diff --git a/src/Advection/Advection.jl b/src/Advection/Advection.jl index 02b27ea60a..9f678c2d9c 100644 --- a/src/Advection/Advection.jl +++ b/src/Advection/Advection.jl @@ -67,11 +67,11 @@ include("centered_reconstruction.jl") include("upwind_biased_reconstruction.jl") include("weno_reconstruction.jl") include("weno_interpolants.jl") -include("weno_2.jl") -include("weno_3.jl") +# include("weno_2.jl") +# include("weno_3.jl") include("weno_4.jl") -include("weno_5.jl") -include("weno_6.jl") +# include("weno_5.jl") +# include("weno_6.jl") include("stretched_weno_smoothness.jl") include("multi_dimensional_reconstruction.jl") include("vector_invariant_upwinding.jl") diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl index adcb26a446..6381c6e4e6 100644 --- a/src/Advection/weno_5.jl +++ b/src/Advection/weno_5.jl @@ -138,7 +138,6 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{5, FT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 30217dc5f0..2f18af7ce0 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -290,132 +290,132 @@ end @inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, grid, v) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) @inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, grid, v) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) -for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) - - @eval begin - # The WENO-Z solution here is - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{N, FT}, - ψ, idx, loc, args...) where {N, FT} +# for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) +# biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) +# biased_β = Symbol(side, :_biased_β) +# biased_p = Symbol(side, :_biased_p) +# coeff = Symbol(:coeff_, side) +# stencil = Symbol(side, :_stencil_, dir) +# stencil_u = Symbol(:tangential_, side, :_stencil_u) +# stencil_v = Symbol(:tangential_, side, :_stencil_v) + +# @eval begin +# # The WENO-Z solution here is +# @inline function $biased_interpolate(i, j, k, grid, +# scheme::WENO{N, FT}, +# ψ, idx, loc, args...) where {N, FT} - # wei1 = Ref(FT(0)) - # wei2 = Ref(FT(0)) - # sol1 = Ref(FT(0)) - # sol2 = Ref(FT(0)) - # glob = Ref(FT(0)) - ntuple(Val(N)) do s - Base.@_inline_meta - ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(s-1)) - C = FT($coeff(scheme, Val(s-1))) - α = @inbounds @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) - # sol1[] += ψ̅ * C - # wei1[] += C - # sol2 = ψ̅ * α - # wei2 = α - end - - # Is glob squared here? - # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) - return 1 - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{N, FT}, - ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} +# # wei1 = Ref(FT(0)) +# # wei2 = Ref(FT(0)) +# # sol1 = Ref(FT(0)) +# # sol2 = Ref(FT(0)) +# # glob = Ref(FT(0)) +# ntuple(Val(N)) do s +# Base.@_inline_meta +# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) +# β = $biased_β(ψs, scheme, Val(s-1)) +# C = FT($coeff(scheme, Val(s-1))) +# α = @inbounds @fastmath C / (β + FT(ε))^2 +# ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) +# # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) +# # sol1[] += ψ̅ * C +# # wei1[] += C +# # sol2 = ψ̅ * α +# # wei2 = α +# end + +# # Is glob squared here? +# # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) +# return 1 +# end + +# @inline function $biased_interpolate(i, j, k, grid, +# scheme::WENO{N, FT}, +# ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} - # wei1 = Ref(FT(0)) - # wei2 = Ref(FT(0)) - # sol1 = Ref(FT(0)) - # sol2 = Ref(FT(0)) - # glob = Ref(FT(0)) - ntuple(Val(N)) do s - Base.@_inline_meta - ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(s-1)) - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) - # sol1[] += ψ̅ * C - # wei1[] += C - # sol2 = ψ̅ * α - # wei2 = α - end - - # Is glob squared here? - # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) - return 1 - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{N, FT}, - ψ, idx, loc, VI::VelocityStencil, u, v, args...) where {N, FT} - - # wei1 = Ref(FT(0)) - # wei2 = Ref(FT(0)) - # sol1 = Ref(FT(0)) - # sol2 = Ref(FT(0)) - # glob = Ref(FT(0)) - ntuple(Val(N)) do s - Base.@_inline_meta - ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(s), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(s), Val($val), grid, v) - βu = $biased_β(us, scheme, Val(s-1)) - βv = $biased_β(vs, scheme, Val(s-1)) - βU = 0.5 * (βu + βv) - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (βU + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) - # sol1[] += ψ̅ * C - # wei1[] += C - # sol2 = ψ̅ * α - # wei2 = α - end - - # Is glob squared here? - # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) - return 1 - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{N, FT}, - ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} - - # wei1 = Ref(FT(0)) - # wei2 = Ref(FT(0)) - # sol1 = Ref(FT(0)) - # sol2 = Ref(FT(0)) - # glob = Ref(FT(0)) - ntuple(Val(N)) do s - Base.@_inline_meta - ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) - ϕs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) - βϕ = $biased_β(ϕs, scheme, Val(s-1)) - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (βϕ + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) - # sol1[] += ψ̅ * C - # wei1[] += C - # sol2 = ψ̅ * α - # wei2 = α - end - - # Is glob squared here? - # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) - return 1 - end - end -end +# # wei1 = Ref(FT(0)) +# # wei2 = Ref(FT(0)) +# # sol1 = Ref(FT(0)) +# # sol2 = Ref(FT(0)) +# # glob = Ref(FT(0)) +# ntuple(Val(N)) do s +# Base.@_inline_meta +# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) +# β = $biased_β(ψs, scheme, Val(s-1)) +# C = FT($coeff(scheme, Val(s-1))) +# α = @fastmath C / (β + FT(ε))^2 +# ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) +# # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) +# # sol1[] += ψ̅ * C +# # wei1[] += C +# # sol2 = ψ̅ * α +# # wei2 = α +# end + +# # Is glob squared here? +# # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) +# return 1 +# end + +# @inline function $biased_interpolate(i, j, k, grid, +# scheme::WENO{N, FT}, +# ψ, idx, loc, VI::VelocityStencil, u, v, args...) where {N, FT} + +# # wei1 = Ref(FT(0)) +# # wei2 = Ref(FT(0)) +# # sol1 = Ref(FT(0)) +# # sol2 = Ref(FT(0)) +# # glob = Ref(FT(0)) +# ntuple(Val(N)) do s +# Base.@_inline_meta +# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) +# us = $stencil_u(i, j, k, scheme, Val(s), Val($val), grid, u) +# vs = $stencil_v(i, j, k, scheme, Val(s), Val($val), grid, v) +# βu = $biased_β(us, scheme, Val(s-1)) +# βv = $biased_β(vs, scheme, Val(s-1)) +# βU = 0.5 * (βu + βv) +# C = FT($coeff(scheme, Val(s-1))) +# α = @fastmath C / (βU + FT(ε))^2 +# ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) +# # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) +# # sol1[] += ψ̅ * C +# # wei1[] += C +# # sol2 = ψ̅ * α +# # wei2 = α +# end + +# # Is glob squared here? +# # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) +# return 1 +# end + +# @inline function $biased_interpolate(i, j, k, grid, +# scheme::WENO{N, FT}, +# ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} + +# # wei1 = Ref(FT(0)) +# # wei2 = Ref(FT(0)) +# # sol1 = Ref(FT(0)) +# # sol2 = Ref(FT(0)) +# # glob = Ref(FT(0)) +# ntuple(Val(N)) do s +# Base.@_inline_meta +# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) +# ϕs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) +# βϕ = $biased_β(ϕs, scheme, Val(s-1)) +# C = FT($coeff(scheme, Val(s-1))) +# α = @fastmath C / (βϕ + FT(ε))^2 +# ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) +# # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) +# # sol1[] += ψ̅ * C +# # wei1[] += C +# # sol2 = ψ̅ * α +# # wei2 = α +# end + +# # Is glob squared here? +# # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) +# return 1 +# end +# end +# end diff --git a/src/Architectures.jl b/src/Architectures.jl index 9b03fbf7fa..45b4f02d20 100644 --- a/src/Architectures.jl +++ b/src/Architectures.jl @@ -4,8 +4,8 @@ export AbstractArchitecture, AbstractSerialArchitecture export CPU, GPU export device, architecture, unified_array, device_copy_to! export array_type, on_architecture, arch_array - using CUDA +using MyCUDABackend using KernelAbstractions using Adapt using OffsetArrays @@ -44,7 +44,7 @@ struct GPU <: AbstractSerialArchitecture end ##### device(::CPU) = KernelAbstractions.CPU() -device(::GPU) = CUDA.CUDABackend(; always_inline=true) +device(::GPU) = MyCUDABackend(; always_inline=true, max_registers=128) architecture() = nothing architecture(::Number) = nothing diff --git a/src/MyCUDABackend.jl b/src/MyCUDABackend.jl new file mode 100644 index 0000000000..824c648bd6 --- /dev/null +++ b/src/MyCUDABackend.jl @@ -0,0 +1,247 @@ +module MyCUDABackend + +using ..CUDA +using ..CUDA: @device_override + +import KernelAbstractions as KA + +import StaticArrays + +import Adapt + +## back-end + +export CUDABackendMine + +struct CUDABackendMine <: KA.GPU + prefer_blocks::Bool + always_inline::Bool + max_registers::Int +end + +CUDABackendMine(; prefer_blocks=false, always_inline=false, max_registers=255) = CUDABackendMine(prefer_blocks, always_inline, max_registers) + +KA.allocate(::CUDABackendMine, ::Type{T}, dims::Tuple) where T = CuArray{T}(undef, dims) +KA.zeros(::CUDABackendMine, ::Type{T}, dims::Tuple) where T = CUDA.zeros(T, dims) +KA.ones(::CUDABackendMine, ::Type{T}, dims::Tuple) where T = CUDA.ones(T, dims) + +KA.get_backend(::CuArray) = CUDABackendMine() +KA.get_backend(::CUSPARSE.AbstractCuSparseArray) = CUDABackendMine() +KA.synchronize(::CUDABackendMine) = synchronize() + +Adapt.adapt_storage(::CUDABackendMine, a::Array) = Adapt.adapt(CuArray, a) +Adapt.adapt_storage(::CUDABackendMine, a::CuArray) = a +Adapt.adapt_storage(::KA.CPU, a::CuArray) = convert(Array, a) + +## memory operations + +function KA.copyto!(::CUDABackendMine, A, B) + A isa Array && __pin!(A) + B isa Array && __pin!(B) + + GC.@preserve A B begin + destptr = pointer(A) + srcptr = pointer(B) + N = length(A) + unsafe_copyto!(destptr, srcptr, N, async=true) + end + return A +end + +# - IdDict does not free the memory +# - WeakRef dict does not unique the key by objectid +const __pinned_memory = Dict{UInt64, WeakRef}() + +function __pin!(a) + # use pointer instead of objectid? + oid = objectid(a) + if haskey(__pinned_memory, oid) && __pinned_memory[oid].value !== nothing + return nothing + end + ad = Mem.register(Mem.Host, pointer(a), sizeof(a)) + finalizer(_ -> Mem.unregister(ad), a) + __pinned_memory[oid] = WeakRef(a) + return nothing +end + +## kernel launch + +function KA.mkcontext(kernel::KA.Kernel{CUDABackendMine}, _ndrange, iterspace) + KA.CompilerMetadata{KA.ndrange(kernel), KA.DynamicCheck}(_ndrange, iterspace) +end + +function KA.launch_config(kernel::KA.Kernel{CUDABackendMine}, ndrange, workgroupsize) + if ndrange isa Integer + ndrange = (ndrange,) + end + if workgroupsize isa Integer + workgroupsize = (workgroupsize, ) + end + + # partition checked that the ndrange's agreed + if KA.ndrange(kernel) <: KA.StaticSize + ndrange = nothing + end + + iterspace, dynamic = if KA.workgroupsize(kernel) <: KA.DynamicSize && + workgroupsize === nothing + # use ndrange as preliminary workgroupsize for autotuning + KA.partition(kernel, ndrange, ndrange) + else + KA.partition(kernel, ndrange, workgroupsize) + end + + return ndrange, workgroupsize, iterspace, dynamic +end + +function threads_to_workgroupsize(threads, ndrange) + total = 1 + return map(ndrange) do n + x = min(div(threads, total), n) + total *= x + return x + end +end + +function (obj::KA.Kernel{CUDABackendMine})(args...; ndrange=nothing, workgroupsize=nothing) + backend = KA.backend(obj) + + ndrange, workgroupsize, iterspace, dynamic = KA.launch_config(obj, ndrange, workgroupsize) + # this might not be the final context, since we may tune the workgroupsize + ctx = KA.mkcontext(obj, ndrange, iterspace) + + # If the kernel is statically sized we can tell the compiler about that + if KA.workgroupsize(obj) <: KA.StaticSize + maxthreads = prod(KA.get(KA.workgroupsize(obj))) + else + maxthreads = nothing + end + + kernel = @cuda launch=false always_inline=backend.always_inline maxthreads=maxthreads max_registers=backend.max_registers obj.f(ctx, args...) + + # figure out the optimal workgroupsize automatically + if KA.workgroupsize(obj) <: KA.DynamicSize && workgroupsize === nothing + config = CUDA.launch_configuration(kernel.fun; max_threads=prod(ndrange)) + if backend.prefer_blocks + # Prefer blocks over threads + threads = min(prod(ndrange), config.threads) + # XXX: Some kernels performs much better with all blocks active + cu_blocks = max(cld(prod(ndrange), threads), config.blocks) + threads = cld(prod(ndrange), cu_blocks) + else + threads = config.threads + end + + workgroupsize = threads_to_workgroupsize(threads, ndrange) + iterspace, dynamic = KA.partition(obj, ndrange, workgroupsize) + ctx = KA.mkcontext(obj, ndrange, iterspace) + end + + blocks = length(KA.blocks(iterspace)) + threads = length(KA.workitems(iterspace)) + + if blocks == 0 + return nothing + end + + # Launch kernel + kernel(ctx, args...; threads, blocks) + + return nothing +end + +## indexing + +@device_override @inline function KA.__index_Local_Linear(ctx) + return threadIdx().x +end + + +@device_override @inline function KA.__index_Group_Linear(ctx) + return blockIdx().x +end + +@device_override @inline function KA.__index_Global_Linear(ctx) + I = @inbounds KA.expand(KA.__iterspace(ctx), blockIdx().x, threadIdx().x) + # TODO: This is unfortunate, can we get the linear index cheaper + @inbounds LinearIndices(KA.__ndrange(ctx))[I] +end + +@device_override @inline function KA.__index_Local_Cartesian(ctx) + @inbounds KA.workitems(KA.__iterspace(ctx))[threadIdx().x] +end + +@device_override @inline function KA.__index_Group_Cartesian(ctx) + @inbounds KA.blocks(KA.__iterspace(ctx))[blockIdx().x] +end + +@device_override @inline function KA.__index_Global_Cartesian(ctx) + return @inbounds KA.expand(KA.__iterspace(ctx), blockIdx().x, threadIdx().x) +end + +@device_override @inline function KA.__validindex(ctx) + if KA.__dynamic_checkbounds(ctx) + I = @inbounds KA.expand(KA.__iterspace(ctx), blockIdx().x, threadIdx().x) + return I in KA.__ndrange(ctx) + else + return true + end +end + +## shared and scratch memory + +@device_override @inline function KA.SharedMemory(::Type{T}, ::Val{Dims}, ::Val{Id}) where {T, Dims, Id} + CuStaticSharedArray(T, Dims) +end + +@device_override @inline function KA.Scratchpad(ctx, ::Type{T}, ::Val{Dims}) where {T, Dims} + StaticArrays.MArray{KA.__size(Dims), T}(undef) +end + +## synchronization and printing + +@device_override @inline function KA.__synchronize() + sync_threads() +end + +@device_override @inline function KA.__print(args...) + CUDA._cuprint(args...) +end + +## other + +Adapt.adapt_storage(to::KA.ConstAdaptor, a::CuDeviceArray) = Base.Experimental.Const(a) + +KA.argconvert(k::KA.Kernel{CUDABackendMine}, arg) = cudaconvert(arg) + +function KA.priority!(::CUDABackendMine, prio::Symbol) + if !(prio in (:high, :normal, :low)) + error("priority must be one of :high, :normal, :low") + end + + range = priority_range() + # 0:-1:-5 + # lower number is higher priority, default is 0 + # there is no "low" + if prio === :high + priority = last(range) + elseif prio === :normal || prio === :low + priority = first(range) + end + + old_stream = stream() + r_flags = Ref{Cuint}() + CUDA.cuStreamGetFlags(old_stream, r_flags) + flags = CUDA.CUstream_flags_enum(r_flags[]) + + event = CuEvent(CUDA.EVENT_DISABLE_TIMING) + record(event, old_stream) + + @debug "Switching default stream" flags priority + new_stream = CuStream(; flags, priority) + CUDA.wait(event, new_stream) + stream!(new_stream) + return nothing +end + +end \ No newline at end of file diff --git a/src/Oceananigans.jl b/src/Oceananigans.jl index 6e74ae3180..0e2138b13d 100644 --- a/src/Oceananigans.jl +++ b/src/Oceananigans.jl @@ -194,6 +194,7 @@ function tracer_tendency_kernel_function end ##### # Basics +include("MyCUDABackend.jl") include("Architectures.jl") include("Units.jl") include("Grids/Grids.jl") From 72ed359eaf209c55fa5caf2f020e7120b55e44f9 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:41:24 -0400 Subject: [PATCH 067/152] using mod --- src/Oceananigans.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Oceananigans.jl b/src/Oceananigans.jl index 0e2138b13d..a645412d41 100644 --- a/src/Oceananigans.jl +++ b/src/Oceananigans.jl @@ -242,6 +242,7 @@ include("MultiRegion/MultiRegion.jl") ##### using .Logger +using .MyCUDABackend using .Architectures using .Utils using .Advection From ccae862f880e35bd57bfb0d664c40f9af526a49f Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:42:44 -0400 Subject: [PATCH 068/152] added static arrays --- Manifest.toml | 2 +- Project.toml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Manifest.toml b/Manifest.toml index db251cca6f..1d6c61b6de 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -2,7 +2,7 @@ julia_version = "1.10.2" manifest_format = "2.0" -project_hash = "b88218a83f549bb63907bbcc5722346210b95d8b" +project_hash = "ebd246712231f728236bc79e507cd0d30883b432" [[deps.AbstractFFTs]] deps = ["LinearAlgebra"] diff --git a/Project.toml b/Project.toml index 86b38e2a66..2536e6c38e 100644 --- a/Project.toml +++ b/Project.toml @@ -33,6 +33,7 @@ Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Rotations = "6038ab10-8711-5258-84ad-4b1120ba62dc" SeawaterPolynomials = "d496a93d-167e-4197-9f49-d3af4ff8fe40" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" From 596d512ca6cbc1000cbd0f8d7eef2f7b60b04fa9 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:43:12 -0400 Subject: [PATCH 069/152] bugfix --- src/Architectures.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Architectures.jl b/src/Architectures.jl index 45b4f02d20..b624b6b032 100644 --- a/src/Architectures.jl +++ b/src/Architectures.jl @@ -44,7 +44,7 @@ struct GPU <: AbstractSerialArchitecture end ##### device(::CPU) = KernelAbstractions.CPU() -device(::GPU) = MyCUDABackend(; always_inline=true, max_registers=128) +device(::GPU) = CUDABackendMine(; always_inline=true, max_registers=128) architecture() = nothing architecture(::Number) = nothing From 1ee538539bd040ba9be949b8ecc62218dd2ad6a3 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 10:36:07 -0400 Subject: [PATCH 070/152] try it like this --- src/Advection/Advection.jl | 2 +- src/Advection/weno_interpolants.jl | 311 ++++++++++++++------------- src/Advection/weno_reconstruction.jl | 39 +++- 3 files changed, 191 insertions(+), 161 deletions(-) diff --git a/src/Advection/Advection.jl b/src/Advection/Advection.jl index 9f678c2d9c..d8e36dd9ef 100644 --- a/src/Advection/Advection.jl +++ b/src/Advection/Advection.jl @@ -69,7 +69,7 @@ include("weno_reconstruction.jl") include("weno_interpolants.jl") # include("weno_2.jl") # include("weno_3.jl") -include("weno_4.jl") +# include("weno_4.jl") # include("weno_5.jl") # include("weno_6.jl") include("stretched_weno_smoothness.jl") diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 2f18af7ce0..9d9d4889ab 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -184,30 +184,30 @@ for buffer in [2, 3, 4, 5, 6] end # Global smoothness indicator τ₂ᵣ₋₁ taken from "Accuracy of the weighted essentially non-oscillatory conservative finite difference schemes", Don & Borges, 2013 -@inline add_global_smoothness(τ, β, ::Val{2}, ::Val{1}) = τ + β -@inline add_global_smoothness(τ, β, ::Val{2}, ::Val{2}) = τ - β - -@inline add_global_smoothness(τ, β, ::Val{3}, ::Val{1}) = τ + β -@inline add_global_smoothness(τ, β, ::Val{3}, ::Val{2}) = τ -@inline add_global_smoothness(τ, β, ::Val{3}, ::Val{3}) = τ - β - -@inline add_global_smoothness(τ, β, ::Val{4}, ::Val{1}) = τ + β -@inline add_global_smoothness(τ, β, ::Val{4}, ::Val{2}) = τ + 3β -@inline add_global_smoothness(τ, β, ::Val{4}, ::Val{3}) = τ - 3β -@inline add_global_smoothness(τ, β, ::Val{4}, ::Val{4}) = τ - β - -@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{1}) = τ + β -@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{2}) = τ + 2β -@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{3}) = τ - 6β -@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{4}) = τ + 2β -@inline add_global_smoothness(τ, β, ::Val{5}, ::Val{5}) = τ + β - -@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{1}) = τ + β -@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{2}) = τ + β -@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{3}) = τ - 8β -@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{4}) = τ + 8β -@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{5}) = τ - β -@inline add_global_smoothness(τ, β, ::Val{6}, ::Val{6}) = τ - β +@inline add_global_smoothness(β, ::Val{2}, ::Val{1}) = + β +@inline add_global_smoothness(β, ::Val{2}, ::Val{2}) = - β + +@inline add_global_smoothness(β, ::Val{3}, ::Val{1}) = + β +@inline add_global_smoothness(β, ::Val{3}, ::Val{2}) = 0 +@inline add_global_smoothness(β, ::Val{3}, ::Val{3}) = - β + +@inline add_global_smoothness(β, ::Val{4}, ::Val{1}) = + β +@inline add_global_smoothness(β, ::Val{4}, ::Val{2}) = + 3β +@inline add_global_smoothness(β, ::Val{4}, ::Val{3}) = - 3β +@inline add_global_smoothness(β, ::Val{4}, ::Val{4}) = - β + +@inline add_global_smoothness(β, ::Val{5}, ::Val{1}) = + β +@inline add_global_smoothness(β, ::Val{5}, ::Val{2}) = + 2β +@inline add_global_smoothness(β, ::Val{5}, ::Val{3}) = - 6β +@inline add_global_smoothness(β, ::Val{5}, ::Val{4}) = + 2β +@inline add_global_smoothness(β, ::Val{5}, ::Val{5}) = + β + +@inline add_global_smoothness(β, ::Val{6}, ::Val{1}) = + β +@inline add_global_smoothness(β, ::Val{6}, ::Val{2}) = + β +@inline add_global_smoothness(β, ::Val{6}, ::Val{3}) = - 8β +@inline add_global_smoothness(β, ::Val{6}, ::Val{4}) = + 8β +@inline add_global_smoothness(β, ::Val{6}, ::Val{5}) = - β +@inline add_global_smoothness(β, ::Val{6}, ::Val{6}) = - β """ calc_weno_stencil(buffer, shift, dir, func::Bool = false) @@ -290,132 +290,141 @@ end @inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, grid, v) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) @inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, grid, v) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) -# for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) -# biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) -# biased_β = Symbol(side, :_biased_β) -# biased_p = Symbol(side, :_biased_p) -# coeff = Symbol(:coeff_, side) -# stencil = Symbol(side, :_stencil_, dir) -# stencil_u = Symbol(:tangential_, side, :_stencil_u) -# stencil_v = Symbol(:tangential_, side, :_stencil_v) - -# @eval begin -# # The WENO-Z solution here is -# @inline function $biased_interpolate(i, j, k, grid, -# scheme::WENO{N, FT}, -# ψ, idx, loc, args...) where {N, FT} +for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + + @eval begin + # The WENO-Z solution here is + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{N, FT}, + ψ, idx, loc, args...) where {N, FT} -# # wei1 = Ref(FT(0)) -# # wei2 = Ref(FT(0)) -# # sol1 = Ref(FT(0)) -# # sol2 = Ref(FT(0)) -# # glob = Ref(FT(0)) -# ntuple(Val(N)) do s -# Base.@_inline_meta -# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) -# β = $biased_β(ψs, scheme, Val(s-1)) -# C = FT($coeff(scheme, Val(s-1))) -# α = @inbounds @fastmath C / (β + FT(ε))^2 -# ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) -# # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) -# # sol1[] += ψ̅ * C -# # wei1[] += C -# # sol2 = ψ̅ * α -# # wei2 = α -# end - -# # Is glob squared here? -# # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) -# return 1 -# end - -# @inline function $biased_interpolate(i, j, k, grid, -# scheme::WENO{N, FT}, -# ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} + + scheme.wrk1[i, j, k] = zero(grid) + scheme.wrk2[i, j, k] = zero(grid) + scheme.wrk3[i, j, k] = zero(grid) + scheme.wrk4[i, j, k] = zero(grid) + scheme.wrk5[i, j, k] = zero(grid) + ntuple(Val(N)) do s + Base.@_inline_meta + ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(s-1)) + C = FT($coeff(scheme, Val(s-1))) + α = @inbounds @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) + scheme.wrk1[i, j, k] += add_global_smoothness(β, Val(N), Val(s)) + scheme.wrk2[i, j, k] += ψ̅ * C + scheme.wrk3[i, j, k] += C + scheme.wrk4[i, j, k] += ψ̅ * α + scheme.wrk5[i, j, k] += α + end + + scheme.wrk4[i, j, k] *= scheme.wrk1[i, j, k] + scheme.wrk5[i, j, k] *= scheme.wrk1[i, j, k] + + # Is glob squared here? + return (scheme.wrk2[i, j, k] + scheme.wrk4[i, j, k]) / (scheme.wrk3[i, j, k] + scheme.wrk5[i, j, k]) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{N, FT}, + ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} -# # wei1 = Ref(FT(0)) -# # wei2 = Ref(FT(0)) -# # sol1 = Ref(FT(0)) -# # sol2 = Ref(FT(0)) -# # glob = Ref(FT(0)) -# ntuple(Val(N)) do s -# Base.@_inline_meta -# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) -# β = $biased_β(ψs, scheme, Val(s-1)) -# C = FT($coeff(scheme, Val(s-1))) -# α = @fastmath C / (β + FT(ε))^2 -# ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) -# # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) -# # sol1[] += ψ̅ * C -# # wei1[] += C -# # sol2 = ψ̅ * α -# # wei2 = α -# end - -# # Is glob squared here? -# # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) -# return 1 -# end - -# @inline function $biased_interpolate(i, j, k, grid, -# scheme::WENO{N, FT}, -# ψ, idx, loc, VI::VelocityStencil, u, v, args...) where {N, FT} - -# # wei1 = Ref(FT(0)) -# # wei2 = Ref(FT(0)) -# # sol1 = Ref(FT(0)) -# # sol2 = Ref(FT(0)) -# # glob = Ref(FT(0)) -# ntuple(Val(N)) do s -# Base.@_inline_meta -# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) -# us = $stencil_u(i, j, k, scheme, Val(s), Val($val), grid, u) -# vs = $stencil_v(i, j, k, scheme, Val(s), Val($val), grid, v) -# βu = $biased_β(us, scheme, Val(s-1)) -# βv = $biased_β(vs, scheme, Val(s-1)) -# βU = 0.5 * (βu + βv) -# C = FT($coeff(scheme, Val(s-1))) -# α = @fastmath C / (βU + FT(ε))^2 -# ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) -# # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) -# # sol1[] += ψ̅ * C -# # wei1[] += C -# # sol2 = ψ̅ * α -# # wei2 = α -# end - -# # Is glob squared here? -# # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) -# return 1 -# end - -# @inline function $biased_interpolate(i, j, k, grid, -# scheme::WENO{N, FT}, -# ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} - -# # wei1 = Ref(FT(0)) -# # wei2 = Ref(FT(0)) -# # sol1 = Ref(FT(0)) -# # sol2 = Ref(FT(0)) -# # glob = Ref(FT(0)) -# ntuple(Val(N)) do s -# Base.@_inline_meta -# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) -# ϕs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) -# βϕ = $biased_β(ϕs, scheme, Val(s-1)) -# C = FT($coeff(scheme, Val(s-1))) -# α = @fastmath C / (βϕ + FT(ε))^2 -# ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) -# # glob[] += add_global_smoothness(glob[], βU, Val(N), Val(s)) -# # sol1[] += ψ̅ * C -# # wei1[] += C -# # sol2 = ψ̅ * α -# # wei2 = α -# end - -# # Is glob squared here? -# # return (sol1[] + sol2[] * glob[]) / (wei1[] + wei2[] * glob[]) -# return 1 -# end -# end -# end + scheme.wrk1[i, j, k] = zero(grid) + scheme.wrk2[i, j, k] = zero(grid) + scheme.wrk3[i, j, k] = zero(grid) + scheme.wrk4[i, j, k] = zero(grid) + scheme.wrk5[i, j, k] = zero(grid) + ntuple(Val(N)) do s + Base.@_inline_meta + ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(s-1)) + C = FT($coeff(scheme, Val(s-1))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) + scheme.wrk1[i, j, k] += add_global_smoothness(β, Val(N), Val(s)) + scheme.wrk2[i, j, k] += ψ̅ * C + scheme.wrk3[i, j, k] += C + scheme.wrk4[i, j, k] += ψ̅ * α + scheme.wrk5[i, j, k] += α + end + + scheme.wrk4[i, j, k] *= scheme.wrk1[i, j, k] + scheme.wrk5[i, j, k] *= scheme.wrk1[i, j, k] + + # Is glob squared here? + return (scheme.wrk2[i, j, k] + scheme.wrk4[i, j, k]) / (scheme.wrk3[i, j, k] + scheme.wrk5[i, j, k]) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{N, FT}, + ψ, idx, loc, VI::VelocityStencil, u, v, args...) where {N, FT} + + scheme.wrk1[i, j, k] = zero(grid) + scheme.wrk2[i, j, k] = zero(grid) + scheme.wrk3[i, j, k] = zero(grid) + scheme.wrk4[i, j, k] = zero(grid) + scheme.wrk5[i, j, k] = zero(grid) + ntuple(Val(N)) do s + Base.@_inline_meta + ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) + us = $stencil_u(i, j, k, scheme, Val(s), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(s), Val($val), grid, v) + βu = $biased_β(us, scheme, Val(s-1)) + βv = $biased_β(vs, scheme, Val(s-1)) + βU = 0.5 * (βu + βv) + C = FT($coeff(scheme, Val(s-1))) + α = @fastmath C / (βU + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) + scheme.wrk1[i, j, k] += add_global_smoothness(βU, Val(N), Val(s)) + scheme.wrk2[i, j, k] += ψ̅ * C + scheme.wrk3[i, j, k] += C + scheme.wrk4[i, j, k] += ψ̅ * α + scheme.wrk5[i, j, k] += α + end + + scheme.wrk4[i, j, k] *= scheme.wrk1[i, j, k] + scheme.wrk5[i, j, k] *= scheme.wrk1[i, j, k] + + # Is glob squared here? + return (scheme.wrk2[i, j, k] + scheme.wrk4[i, j, k]) / (scheme.wrk3[i, j, k] + scheme.wrk5[i, j, k]) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{N, FT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} + + scheme.wrk1[i, j, k] = zero(grid) + scheme.wrk2[i, j, k] = zero(grid) + scheme.wrk3[i, j, k] = zero(grid) + scheme.wrk4[i, j, k] = zero(grid) + scheme.wrk5[i, j, k] = zero(grid) + ntuple(Val(N)) do s + Base.@_inline_meta + ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) + ϕs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) + βϕ = $biased_β(ϕs, scheme, Val(s-1)) + C = FT($coeff(scheme, Val(s-1))) + α = @fastmath C / (βϕ + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) + scheme.wrk1[i, j, k] += add_global_smoothness(βϕ, Val(N), Val(s)) + scheme.wrk2[i, j, k] += ψ̅ * C + scheme.wrk3[i, j, k] += C + scheme.wrk4[i, j, k] += ψ̅ * α + scheme.wrk5[i, j, k] += α + end + + scheme.wrk4[i, j, k] *= scheme.wrk1[i, j, k] + scheme.wrk5[i, j, k] *= scheme.wrk1[i, j, k] + + # Is glob squared here? + return (scheme.wrk2[i, j, k] + scheme.wrk4[i, j, k]) / (scheme.wrk3[i, j, k] + scheme.wrk5[i, j, k]) + end + end +end diff --git a/src/Advection/weno_reconstruction.jl b/src/Advection/weno_reconstruction.jl index 36cab9200a..a30b54fe5f 100644 --- a/src/Advection/weno_reconstruction.jl +++ b/src/Advection/weno_reconstruction.jl @@ -2,7 +2,7 @@ ##### Weighted Essentially Non-Oscillatory (WENO) advection scheme ##### -struct WENO{N, FT, XT, YT, ZT, PP, CA, SI} <: AbstractUpwindBiasedAdvectionScheme{N, FT} +struct WENO{N, FT, XT, YT, ZT, PP, CA, SI, W} <: AbstractUpwindBiasedAdvectionScheme{N, FT} "Coefficient for ENO reconstruction on x-faces" coeff_xᶠᵃᵃ::XT @@ -25,16 +25,24 @@ struct WENO{N, FT, XT, YT, ZT, PP, CA, SI} <: AbstractUpwindBiasedAdvectionSchem "Reconstruction scheme used for symmetric interpolation" advecting_velocity_scheme :: SI + wrk1 :: W + wrk2 :: W + wrk3 :: W + wrk4 :: W + wrk5 :: W + function WENO{N, FT}(coeff_xᶠᵃᵃ::XT, coeff_xᶜᵃᵃ::XT, coeff_yᵃᶠᵃ::YT, coeff_yᵃᶜᵃ::YT, coeff_zᵃᵃᶠ::ZT, coeff_zᵃᵃᶜ::ZT, bounds::PP, buffer_scheme::CA, - advecting_velocity_scheme :: SI) where {N, FT, XT, YT, ZT, PP, CA, SI} - - return new{N, FT, XT, YT, ZT, PP, CA, SI}(coeff_xᶠᵃᵃ, coeff_xᶜᵃᵃ, - coeff_yᵃᶠᵃ, coeff_yᵃᶜᵃ, - coeff_zᵃᵃᶠ, coeff_zᵃᵃᶜ, - bounds, buffer_scheme, advecting_velocity_scheme) + advecting_velocity_scheme :: SI, + wrk1::W, wrk2::W, wrk3::W, wrk4::W, wrk5::W) where {N, FT, XT, YT, ZT, PP, CA, SI, W} + + return new{N, FT, XT, YT, ZT, PP, CA, SI, W}(coeff_xᶠᵃᵃ, coeff_xᶜᵃᵃ, + coeff_yᵃᶠᵃ, coeff_yᵃᶜᵃ, + coeff_zᵃᵃᶠ, coeff_zᵃᵃᶜ, + bounds, buffer_scheme, advecting_velocity_scheme, + wrk1, wrk2, wrk3, wrk4, wrk5) end end @@ -122,7 +130,15 @@ function WENO(FT::DataType=Float64; advecting_velocity_scheme = Centered(FT; grid, order = order - 1) end - return WENO{N, FT}(weno_coefficients..., bounds, buffer_scheme, advecting_velocity_scheme) + wrk1 = CenterField(grid) + wrk2 = CenterField(grid) + wrk3 = CenterField(grid) + wrk4 = CenterField(grid) + wrk5 = CenterField(grid) + + return WENO{N, FT}(weno_coefficients..., + bounds, buffer_scheme, advecting_velocity_scheme, + wrk1, wrk2, wrk3, wrk4, wrk5) end WENO(grid, FT::DataType=Float64; kwargs...) = WENO(FT; grid, kwargs...) @@ -154,7 +170,12 @@ Adapt.adapt_structure(to, scheme::WENO{N, FT, XT, YT, ZT}) where {N, FT, XT, YT, Adapt.adapt(to, scheme.coeff_zᵃᵃᶠ), Adapt.adapt(to, scheme.coeff_zᵃᵃᶜ), Adapt.adapt(to, scheme.bounds), Adapt.adapt(to, scheme.buffer_scheme), - Adapt.adapt(to, scheme.advecting_velocity_scheme)) + Adapt.adapt(to, scheme.advecting_velocity_scheme), + Adapt.adapt(to, scheme.wrk1), + Adapt.adapt(to, scheme.wrk2), + Adapt.adapt(to, scheme.wrk3), + Adapt.adapt(to, scheme.wrk4), + Adapt.adapt(to, scheme.wrk5)) on_architecture(to, scheme::WENO{N, FT, XT, YT, ZT}) where {N, FT, XT, YT, ZT} = WENO{N, FT}(on_architecture(to, scheme.coeff_xᶠᵃᵃ), on_architecture(to, scheme.coeff_xᶜᵃᵃ), From 4826f0c76ac47ee3a667dd5125b800e4ea5d8a58 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 10:37:09 -0400 Subject: [PATCH 071/152] back --- src/Architectures.jl | 3 +- src/MyCUDABackend.jl | 247 ------------------------------------------- src/Oceananigans.jl | 2 - 3 files changed, 1 insertion(+), 251 deletions(-) delete mode 100644 src/MyCUDABackend.jl diff --git a/src/Architectures.jl b/src/Architectures.jl index b624b6b032..01b5e706a7 100644 --- a/src/Architectures.jl +++ b/src/Architectures.jl @@ -5,7 +5,6 @@ export CPU, GPU export device, architecture, unified_array, device_copy_to! export array_type, on_architecture, arch_array using CUDA -using MyCUDABackend using KernelAbstractions using Adapt using OffsetArrays @@ -44,7 +43,7 @@ struct GPU <: AbstractSerialArchitecture end ##### device(::CPU) = KernelAbstractions.CPU() -device(::GPU) = CUDABackendMine(; always_inline=true, max_registers=128) +device(::GPU) = CUDABackend( ; always_inline=true) architecture() = nothing architecture(::Number) = nothing diff --git a/src/MyCUDABackend.jl b/src/MyCUDABackend.jl deleted file mode 100644 index 824c648bd6..0000000000 --- a/src/MyCUDABackend.jl +++ /dev/null @@ -1,247 +0,0 @@ -module MyCUDABackend - -using ..CUDA -using ..CUDA: @device_override - -import KernelAbstractions as KA - -import StaticArrays - -import Adapt - -## back-end - -export CUDABackendMine - -struct CUDABackendMine <: KA.GPU - prefer_blocks::Bool - always_inline::Bool - max_registers::Int -end - -CUDABackendMine(; prefer_blocks=false, always_inline=false, max_registers=255) = CUDABackendMine(prefer_blocks, always_inline, max_registers) - -KA.allocate(::CUDABackendMine, ::Type{T}, dims::Tuple) where T = CuArray{T}(undef, dims) -KA.zeros(::CUDABackendMine, ::Type{T}, dims::Tuple) where T = CUDA.zeros(T, dims) -KA.ones(::CUDABackendMine, ::Type{T}, dims::Tuple) where T = CUDA.ones(T, dims) - -KA.get_backend(::CuArray) = CUDABackendMine() -KA.get_backend(::CUSPARSE.AbstractCuSparseArray) = CUDABackendMine() -KA.synchronize(::CUDABackendMine) = synchronize() - -Adapt.adapt_storage(::CUDABackendMine, a::Array) = Adapt.adapt(CuArray, a) -Adapt.adapt_storage(::CUDABackendMine, a::CuArray) = a -Adapt.adapt_storage(::KA.CPU, a::CuArray) = convert(Array, a) - -## memory operations - -function KA.copyto!(::CUDABackendMine, A, B) - A isa Array && __pin!(A) - B isa Array && __pin!(B) - - GC.@preserve A B begin - destptr = pointer(A) - srcptr = pointer(B) - N = length(A) - unsafe_copyto!(destptr, srcptr, N, async=true) - end - return A -end - -# - IdDict does not free the memory -# - WeakRef dict does not unique the key by objectid -const __pinned_memory = Dict{UInt64, WeakRef}() - -function __pin!(a) - # use pointer instead of objectid? - oid = objectid(a) - if haskey(__pinned_memory, oid) && __pinned_memory[oid].value !== nothing - return nothing - end - ad = Mem.register(Mem.Host, pointer(a), sizeof(a)) - finalizer(_ -> Mem.unregister(ad), a) - __pinned_memory[oid] = WeakRef(a) - return nothing -end - -## kernel launch - -function KA.mkcontext(kernel::KA.Kernel{CUDABackendMine}, _ndrange, iterspace) - KA.CompilerMetadata{KA.ndrange(kernel), KA.DynamicCheck}(_ndrange, iterspace) -end - -function KA.launch_config(kernel::KA.Kernel{CUDABackendMine}, ndrange, workgroupsize) - if ndrange isa Integer - ndrange = (ndrange,) - end - if workgroupsize isa Integer - workgroupsize = (workgroupsize, ) - end - - # partition checked that the ndrange's agreed - if KA.ndrange(kernel) <: KA.StaticSize - ndrange = nothing - end - - iterspace, dynamic = if KA.workgroupsize(kernel) <: KA.DynamicSize && - workgroupsize === nothing - # use ndrange as preliminary workgroupsize for autotuning - KA.partition(kernel, ndrange, ndrange) - else - KA.partition(kernel, ndrange, workgroupsize) - end - - return ndrange, workgroupsize, iterspace, dynamic -end - -function threads_to_workgroupsize(threads, ndrange) - total = 1 - return map(ndrange) do n - x = min(div(threads, total), n) - total *= x - return x - end -end - -function (obj::KA.Kernel{CUDABackendMine})(args...; ndrange=nothing, workgroupsize=nothing) - backend = KA.backend(obj) - - ndrange, workgroupsize, iterspace, dynamic = KA.launch_config(obj, ndrange, workgroupsize) - # this might not be the final context, since we may tune the workgroupsize - ctx = KA.mkcontext(obj, ndrange, iterspace) - - # If the kernel is statically sized we can tell the compiler about that - if KA.workgroupsize(obj) <: KA.StaticSize - maxthreads = prod(KA.get(KA.workgroupsize(obj))) - else - maxthreads = nothing - end - - kernel = @cuda launch=false always_inline=backend.always_inline maxthreads=maxthreads max_registers=backend.max_registers obj.f(ctx, args...) - - # figure out the optimal workgroupsize automatically - if KA.workgroupsize(obj) <: KA.DynamicSize && workgroupsize === nothing - config = CUDA.launch_configuration(kernel.fun; max_threads=prod(ndrange)) - if backend.prefer_blocks - # Prefer blocks over threads - threads = min(prod(ndrange), config.threads) - # XXX: Some kernels performs much better with all blocks active - cu_blocks = max(cld(prod(ndrange), threads), config.blocks) - threads = cld(prod(ndrange), cu_blocks) - else - threads = config.threads - end - - workgroupsize = threads_to_workgroupsize(threads, ndrange) - iterspace, dynamic = KA.partition(obj, ndrange, workgroupsize) - ctx = KA.mkcontext(obj, ndrange, iterspace) - end - - blocks = length(KA.blocks(iterspace)) - threads = length(KA.workitems(iterspace)) - - if blocks == 0 - return nothing - end - - # Launch kernel - kernel(ctx, args...; threads, blocks) - - return nothing -end - -## indexing - -@device_override @inline function KA.__index_Local_Linear(ctx) - return threadIdx().x -end - - -@device_override @inline function KA.__index_Group_Linear(ctx) - return blockIdx().x -end - -@device_override @inline function KA.__index_Global_Linear(ctx) - I = @inbounds KA.expand(KA.__iterspace(ctx), blockIdx().x, threadIdx().x) - # TODO: This is unfortunate, can we get the linear index cheaper - @inbounds LinearIndices(KA.__ndrange(ctx))[I] -end - -@device_override @inline function KA.__index_Local_Cartesian(ctx) - @inbounds KA.workitems(KA.__iterspace(ctx))[threadIdx().x] -end - -@device_override @inline function KA.__index_Group_Cartesian(ctx) - @inbounds KA.blocks(KA.__iterspace(ctx))[blockIdx().x] -end - -@device_override @inline function KA.__index_Global_Cartesian(ctx) - return @inbounds KA.expand(KA.__iterspace(ctx), blockIdx().x, threadIdx().x) -end - -@device_override @inline function KA.__validindex(ctx) - if KA.__dynamic_checkbounds(ctx) - I = @inbounds KA.expand(KA.__iterspace(ctx), blockIdx().x, threadIdx().x) - return I in KA.__ndrange(ctx) - else - return true - end -end - -## shared and scratch memory - -@device_override @inline function KA.SharedMemory(::Type{T}, ::Val{Dims}, ::Val{Id}) where {T, Dims, Id} - CuStaticSharedArray(T, Dims) -end - -@device_override @inline function KA.Scratchpad(ctx, ::Type{T}, ::Val{Dims}) where {T, Dims} - StaticArrays.MArray{KA.__size(Dims), T}(undef) -end - -## synchronization and printing - -@device_override @inline function KA.__synchronize() - sync_threads() -end - -@device_override @inline function KA.__print(args...) - CUDA._cuprint(args...) -end - -## other - -Adapt.adapt_storage(to::KA.ConstAdaptor, a::CuDeviceArray) = Base.Experimental.Const(a) - -KA.argconvert(k::KA.Kernel{CUDABackendMine}, arg) = cudaconvert(arg) - -function KA.priority!(::CUDABackendMine, prio::Symbol) - if !(prio in (:high, :normal, :low)) - error("priority must be one of :high, :normal, :low") - end - - range = priority_range() - # 0:-1:-5 - # lower number is higher priority, default is 0 - # there is no "low" - if prio === :high - priority = last(range) - elseif prio === :normal || prio === :low - priority = first(range) - end - - old_stream = stream() - r_flags = Ref{Cuint}() - CUDA.cuStreamGetFlags(old_stream, r_flags) - flags = CUDA.CUstream_flags_enum(r_flags[]) - - event = CuEvent(CUDA.EVENT_DISABLE_TIMING) - record(event, old_stream) - - @debug "Switching default stream" flags priority - new_stream = CuStream(; flags, priority) - CUDA.wait(event, new_stream) - stream!(new_stream) - return nothing -end - -end \ No newline at end of file diff --git a/src/Oceananigans.jl b/src/Oceananigans.jl index a645412d41..6e74ae3180 100644 --- a/src/Oceananigans.jl +++ b/src/Oceananigans.jl @@ -194,7 +194,6 @@ function tracer_tendency_kernel_function end ##### # Basics -include("MyCUDABackend.jl") include("Architectures.jl") include("Units.jl") include("Grids/Grids.jl") @@ -242,7 +241,6 @@ include("MultiRegion/MultiRegion.jl") ##### using .Logger -using .MyCUDABackend using .Architectures using .Utils using .Advection From c86cd995b2a65d96478bcd214d87858e355778ca Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 10:38:51 -0400 Subject: [PATCH 072/152] done --- src/Advection/weno_reconstruction.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Advection/weno_reconstruction.jl b/src/Advection/weno_reconstruction.jl index a30b54fe5f..968a8605fc 100644 --- a/src/Advection/weno_reconstruction.jl +++ b/src/Advection/weno_reconstruction.jl @@ -1,6 +1,7 @@ ##### ##### Weighted Essentially Non-Oscillatory (WENO) advection scheme ##### +using Oceananigans.Fields: CenterField struct WENO{N, FT, XT, YT, ZT, PP, CA, SI, W} <: AbstractUpwindBiasedAdvectionScheme{N, FT} From 161d5d757e65f02c96708e91636c500ad23db966 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 10:45:17 -0400 Subject: [PATCH 073/152] try shared --- src/Advection/weno_interpolants.jl | 13 ++++++------- src/Advection/weno_reconstruction.jl | 29 ++++++++-------------------- 2 files changed, 14 insertions(+), 28 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 9d9d4889ab..6592a91ec9 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -304,13 +304,12 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, args...) where {N, FT} - - - scheme.wrk1[i, j, k] = zero(grid) - scheme.wrk2[i, j, k] = zero(grid) - scheme.wrk3[i, j, k] = zero(grid) - scheme.wrk4[i, j, k] = zero(grid) - scheme.wrk5[i, j, k] = zero(grid) + + wrk1 = @localmem FT (5, ) + wrk2 = @localmem FT (5, ) + wrk3 = @localmem FT (5, ) + wrk4 = @localmem FT (5, ) + wrk5 = @localmem FT (5, ) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) diff --git a/src/Advection/weno_reconstruction.jl b/src/Advection/weno_reconstruction.jl index 968a8605fc..1dd87f7584 100644 --- a/src/Advection/weno_reconstruction.jl +++ b/src/Advection/weno_reconstruction.jl @@ -3,7 +3,7 @@ ##### using Oceananigans.Fields: CenterField -struct WENO{N, FT, XT, YT, ZT, PP, CA, SI, W} <: AbstractUpwindBiasedAdvectionScheme{N, FT} +struct WENO{N, FT, XT, YT, ZT, PP, CA, SI} <: AbstractUpwindBiasedAdvectionScheme{N, FT} "Coefficient for ENO reconstruction on x-faces" coeff_xᶠᵃᵃ::XT @@ -26,24 +26,16 @@ struct WENO{N, FT, XT, YT, ZT, PP, CA, SI, W} <: AbstractUpwindBiasedAdvectionSc "Reconstruction scheme used for symmetric interpolation" advecting_velocity_scheme :: SI - wrk1 :: W - wrk2 :: W - wrk3 :: W - wrk4 :: W - wrk5 :: W - function WENO{N, FT}(coeff_xᶠᵃᵃ::XT, coeff_xᶜᵃᵃ::XT, coeff_yᵃᶠᵃ::YT, coeff_yᵃᶜᵃ::YT, coeff_zᵃᵃᶠ::ZT, coeff_zᵃᵃᶜ::ZT, bounds::PP, buffer_scheme::CA, - advecting_velocity_scheme :: SI, - wrk1::W, wrk2::W, wrk3::W, wrk4::W, wrk5::W) where {N, FT, XT, YT, ZT, PP, CA, SI, W} - - return new{N, FT, XT, YT, ZT, PP, CA, SI, W}(coeff_xᶠᵃᵃ, coeff_xᶜᵃᵃ, - coeff_yᵃᶠᵃ, coeff_yᵃᶜᵃ, - coeff_zᵃᵃᶠ, coeff_zᵃᵃᶜ, - bounds, buffer_scheme, advecting_velocity_scheme, - wrk1, wrk2, wrk3, wrk4, wrk5) + advecting_velocity_scheme :: SI) where {N, FT, XT, YT, ZT, PP, CA, SI} + + return new{N, FT, XT, YT, ZT, PP, CA, SI}(coeff_xᶠᵃᵃ, coeff_xᶜᵃᵃ, + coeff_yᵃᶠᵃ, coeff_yᵃᶜᵃ, + coeff_zᵃᵃᶠ, coeff_zᵃᵃᶜ, + bounds, buffer_scheme, advecting_velocity_scheme) end end @@ -171,12 +163,7 @@ Adapt.adapt_structure(to, scheme::WENO{N, FT, XT, YT, ZT}) where {N, FT, XT, YT, Adapt.adapt(to, scheme.coeff_zᵃᵃᶠ), Adapt.adapt(to, scheme.coeff_zᵃᵃᶜ), Adapt.adapt(to, scheme.bounds), Adapt.adapt(to, scheme.buffer_scheme), - Adapt.adapt(to, scheme.advecting_velocity_scheme), - Adapt.adapt(to, scheme.wrk1), - Adapt.adapt(to, scheme.wrk2), - Adapt.adapt(to, scheme.wrk3), - Adapt.adapt(to, scheme.wrk4), - Adapt.adapt(to, scheme.wrk5)) + Adapt.adapt(to, scheme.advecting_velocity_scheme)) on_architecture(to, scheme::WENO{N, FT, XT, YT, ZT}) where {N, FT, XT, YT, ZT} = WENO{N, FT}(on_architecture(to, scheme.coeff_xᶠᵃᵃ), on_architecture(to, scheme.coeff_xᶜᵃᵃ), From b50b7e6e66e73a5948531707912e2e87b44771f9 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 10:48:27 -0400 Subject: [PATCH 074/152] shared memory --- src/Advection/weno_interpolants.jl | 100 ++++++++++++++--------------- 1 file changed, 47 insertions(+), 53 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 6592a91ec9..721ae82fae 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -304,12 +304,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, args...) where {N, FT} - - wrk1 = @localmem FT (5, ) - wrk2 = @localmem FT (5, ) - wrk3 = @localmem FT (5, ) - wrk4 = @localmem FT (5, ) - wrk5 = @localmem FT (5, ) + + + M = @uniform @groupsize()[$dir] + + wrk = @localmem FT (5, M) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -317,29 +316,28 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - scheme.wrk1[i, j, k] += add_global_smoothness(β, Val(N), Val(s)) - scheme.wrk2[i, j, k] += ψ̅ * C - scheme.wrk3[i, j, k] += C - scheme.wrk4[i, j, k] += ψ̅ * α - scheme.wrk5[i, j, k] += α + wrk[1, tix] += add_global_smoothness(β, Val(N), Val(s)) + wrk[2, tix] += ψ̅ * C + wrk[3, tix] += C + wrk[4, tix] += ψ̅ * α + wrk[5, tix] += α end - scheme.wrk4[i, j, k] *= scheme.wrk1[i, j, k] - scheme.wrk5[i, j, k] *= scheme.wrk1[i, j, k] + wrk[4, tix] *= wrk[1, tix] + wrk[5, tix] *= wrk[1, tix] # Is glob squared here? - return (scheme.wrk2[i, j, k] + scheme.wrk4[i, j, k]) / (scheme.wrk3[i, j, k] + scheme.wrk5[i, j, k]) + return (wrk[2, tix] + wrk[4, tix]) / (wrk[3, tix] + wrk[5, tix]) end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} - scheme.wrk1[i, j, k] = zero(grid) - scheme.wrk2[i, j, k] = zero(grid) - scheme.wrk3[i, j, k] = zero(grid) - scheme.wrk4[i, j, k] = zero(grid) - scheme.wrk5[i, j, k] = zero(grid) + + M = @uniform @groupsize()[$dir] + + wrk = @localmem FT (5, M) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -347,29 +345,27 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - scheme.wrk1[i, j, k] += add_global_smoothness(β, Val(N), Val(s)) - scheme.wrk2[i, j, k] += ψ̅ * C - scheme.wrk3[i, j, k] += C - scheme.wrk4[i, j, k] += ψ̅ * α - scheme.wrk5[i, j, k] += α + wrk[1, tix] += add_global_smoothness(β, Val(N), Val(s)) + wrk[2, tix] += ψ̅ * C + wrk[3, tix] += C + wrk[4, tix] += ψ̅ * α + wrk[5, tix] += α end - scheme.wrk4[i, j, k] *= scheme.wrk1[i, j, k] - scheme.wrk5[i, j, k] *= scheme.wrk1[i, j, k] + wrk[4, tix] *= wrk[1, tix] + wrk[5, tix] *= wrk[1, tix] # Is glob squared here? - return (scheme.wrk2[i, j, k] + scheme.wrk4[i, j, k]) / (scheme.wrk3[i, j, k] + scheme.wrk5[i, j, k]) + return (wrk[2, tix] + wrk[4, tix]) / (wrk[3, tix] + wrk[5, tix]) end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, VI::VelocityStencil, u, v, args...) where {N, FT} - scheme.wrk1[i, j, k] = zero(grid) - scheme.wrk2[i, j, k] = zero(grid) - scheme.wrk3[i, j, k] = zero(grid) - scheme.wrk4[i, j, k] = zero(grid) - scheme.wrk5[i, j, k] = zero(grid) + M = @uniform @groupsize()[$dir] + + wrk = @localmem FT (5, M) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) @@ -381,29 +377,27 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - scheme.wrk1[i, j, k] += add_global_smoothness(βU, Val(N), Val(s)) - scheme.wrk2[i, j, k] += ψ̅ * C - scheme.wrk3[i, j, k] += C - scheme.wrk4[i, j, k] += ψ̅ * α - scheme.wrk5[i, j, k] += α + wrk[1, tix] += add_global_smoothness(βU, Val(N), Val(s)) + wrk[2, tix] += ψ̅ * C + wrk[3, tix] += C + wrk[4, tix] += ψ̅ * α + wrk[5, tix] += α end - scheme.wrk4[i, j, k] *= scheme.wrk1[i, j, k] - scheme.wrk5[i, j, k] *= scheme.wrk1[i, j, k] + wrk[4, tix] *= wrk[1, tix] + wrk[5, tix] *= wrk[1, tix] # Is glob squared here? - return (scheme.wrk2[i, j, k] + scheme.wrk4[i, j, k]) / (scheme.wrk3[i, j, k] + scheme.wrk5[i, j, k]) + return (wrk[2, tix] + wrk[4, tix]) / (wrk[3, tix] + wrk[5, tix]) end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} - scheme.wrk1[i, j, k] = zero(grid) - scheme.wrk2[i, j, k] = zero(grid) - scheme.wrk3[i, j, k] = zero(grid) - scheme.wrk4[i, j, k] = zero(grid) - scheme.wrk5[i, j, k] = zero(grid) + M = @uniform @groupsize()[$dir] + + wrk = @localmem FT (5, M) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -412,18 +406,18 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - scheme.wrk1[i, j, k] += add_global_smoothness(βϕ, Val(N), Val(s)) - scheme.wrk2[i, j, k] += ψ̅ * C - scheme.wrk3[i, j, k] += C - scheme.wrk4[i, j, k] += ψ̅ * α - scheme.wrk5[i, j, k] += α + wrk[1, tix] += add_global_smoothness(βϕ, Val(N), Val(s)) + wrk[2, tix] += ψ̅ * C + wrk[3, tix] += C + wrk[4, tix] += ψ̅ * α + wrk[5, tix] += α end - scheme.wrk4[i, j, k] *= scheme.wrk1[i, j, k] - scheme.wrk5[i, j, k] *= scheme.wrk1[i, j, k] + wrk[4, tix] *= wrk[1, tix] + wrk[5, tix] *= wrk[1, tix] # Is glob squared here? - return (scheme.wrk2[i, j, k] + scheme.wrk4[i, j, k]) / (scheme.wrk3[i, j, k] + scheme.wrk5[i, j, k]) + return (wrk[2, tix] + wrk[4, tix]) / (wrk[3, tix] + wrk[5, tix]) end end end From 0c58a85df262a3c9648cc34998fd62785c9cda63 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 10:49:43 -0400 Subject: [PATCH 075/152] try --- src/Advection/weno_interpolants.jl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 721ae82fae..9c4d480f1d 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -1,6 +1,6 @@ using Oceananigans.Fields: Field using Oceananigans.Operators: ℑyᵃᶠᵃ, ℑxᶠᵃᵃ -using KernelAbstractions: @localmem +using KernelAbstractions: @localmem, @index, @uniform, @groupsize # WENO reconstruction of order `M` entails reconstructions of order `N` # on `N` different stencils, where `N = (M + 1) / 2`. @@ -336,7 +336,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ M = @uniform @groupsize()[$dir] - + tix = @index(Local, NTuple) + tix = tix[$dir] wrk = @localmem FT (5, M) ntuple(Val(N)) do s Base.@_inline_meta @@ -364,7 +365,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, VI::VelocityStencil, u, v, args...) where {N, FT} M = @uniform @groupsize()[$dir] - + tix = @index(Local, NTuple) + tix = tix[$dir] wrk = @localmem FT (5, M) ntuple(Val(N)) do s Base.@_inline_meta @@ -396,7 +398,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} M = @uniform @groupsize()[$dir] - + tix = @index(Local, NTuple) + tix = tix[$dir] wrk = @localmem FT (5, M) ntuple(Val(N)) do s Base.@_inline_meta From f11b4fe1227fc177126e0d55aba345925c534b35 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 10:50:38 -0400 Subject: [PATCH 076/152] bugfix --- src/Advection/weno_interpolants.jl | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 9c4d480f1d..0a76b5159e 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -306,8 +306,9 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, args...) where {N, FT} - M = @uniform @groupsize()[$dir] - + M = @uniform @groupsize()[$dir] + tix = @index(Local, NTuple) + tix = tix[$dir] wrk = @localmem FT (5, M) ntuple(Val(N)) do s Base.@_inline_meta @@ -335,7 +336,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} - M = @uniform @groupsize()[$dir] + M = @uniform @groupsize()[$dir] tix = @index(Local, NTuple) tix = tix[$dir] wrk = @localmem FT (5, M) @@ -364,7 +365,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{N, FT}, ψ, idx, loc, VI::VelocityStencil, u, v, args...) where {N, FT} - M = @uniform @groupsize()[$dir] + M = @uniform @groupsize()[$dir] tix = @index(Local, NTuple) tix = tix[$dir] wrk = @localmem FT (5, M) @@ -397,7 +398,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{N, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} - M = @uniform @groupsize()[$dir] + M = @uniform @groupsize()[$dir] tix = @index(Local, NTuple) tix = tix[$dir] wrk = @localmem FT (5, M) From d5c9b8c4535076181abeb6a5e744bf3980c24914 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 10:52:07 -0400 Subject: [PATCH 077/152] back to correct weno --- src/Advection/weno_reconstruction.jl | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/Advection/weno_reconstruction.jl b/src/Advection/weno_reconstruction.jl index 1dd87f7584..b00f1a54ae 100644 --- a/src/Advection/weno_reconstruction.jl +++ b/src/Advection/weno_reconstruction.jl @@ -123,15 +123,8 @@ function WENO(FT::DataType=Float64; advecting_velocity_scheme = Centered(FT; grid, order = order - 1) end - wrk1 = CenterField(grid) - wrk2 = CenterField(grid) - wrk3 = CenterField(grid) - wrk4 = CenterField(grid) - wrk5 = CenterField(grid) - return WENO{N, FT}(weno_coefficients..., - bounds, buffer_scheme, advecting_velocity_scheme, - wrk1, wrk2, wrk3, wrk4, wrk5) + bounds, buffer_scheme, advecting_velocity_scheme) end WENO(grid, FT::DataType=Float64; kwargs...) = WENO(FT; grid, kwargs...) From 7e85c03d0b4d1c27ad76f4c439f14bd86f2566fc Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 10:58:46 -0400 Subject: [PATCH 078/152] try it out --- src/Advection/weno_interpolants.jl | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 0a76b5159e..1adf1e0446 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -306,10 +306,10 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, args...) where {N, FT} - M = @uniform @groupsize()[$dir] + # M = @uniform @groupsize()[$dir] tix = @index(Local, NTuple) tix = tix[$dir] - wrk = @localmem FT (5, M) + wrk = @localmem FT (5, 10) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -336,10 +336,10 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} - M = @uniform @groupsize()[$dir] + # M = @uniform @groupsize()[$dir] tix = @index(Local, NTuple) tix = tix[$dir] - wrk = @localmem FT (5, M) + wrk = @localmem FT (5, 10) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -365,10 +365,10 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{N, FT}, ψ, idx, loc, VI::VelocityStencil, u, v, args...) where {N, FT} - M = @uniform @groupsize()[$dir] + # M = @uniform @groupsize()[$dir] tix = @index(Local, NTuple) tix = tix[$dir] - wrk = @localmem FT (5, M) + wrk = @localmem FT (5, 10) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) @@ -398,10 +398,10 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{N, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} - M = @uniform @groupsize()[$dir] + # M = @uniform @groupsize()[$dir] tix = @index(Local, NTuple) tix = tix[$dir] - wrk = @localmem FT (5, M) + wrk = @localmem FT (5, 10) ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) From 880ea781869d807caba9427762a9f7aedee3c8ee Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 11:27:04 -0400 Subject: [PATCH 079/152] works? maybe... --- src/Advection/centered_advective_fluxes.jl | 24 +++---- src/Advection/reconstruction_coefficients.jl | 24 +++---- src/Advection/tracer_advection_operators.jl | 16 ++--- .../upwind_biased_advective_fluxes.jl | 72 +++++++++---------- src/Advection/upwind_biased_reconstruction.jl | 4 +- src/Advection/vector_invariant_advection.jl | 52 +++++++------- .../vector_invariant_self_upwinding.jl | 24 +++---- src/Advection/weno_interpolants.jl | 35 ++++----- ..._free_surface_tendency_kernel_functions.jl | 27 ++++++- 9 files changed, 145 insertions(+), 133 deletions(-) diff --git a/src/Advection/centered_advective_fluxes.jl b/src/Advection/centered_advective_fluxes.jl index c58255bb84..4431f41303 100644 --- a/src/Advection/centered_advective_fluxes.jl +++ b/src/Advection/centered_advective_fluxes.jl @@ -12,22 +12,22 @@ const CenteredScheme = AbstractCenteredAdvectionScheme ##### Note the convention "advective_momentum_flux_Ua" corresponds to the advection _of_ a _by_ U. ##### -@inline advective_momentum_flux_Uu(i, j, k, grid, scheme::CenteredScheme, U, u) = @inbounds Axᶜᶜᶜ(i, j, k, grid) * _symmetric_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, U) * _symmetric_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, u) -@inline advective_momentum_flux_Vu(i, j, k, grid, scheme::CenteredScheme, V, u) = @inbounds Ayᶠᶠᶜ(i, j, k, grid) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, V) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, u) -@inline advective_momentum_flux_Wu(i, j, k, grid, scheme::CenteredScheme, W, u) = @inbounds Azᶠᶜᶠ(i, j, k, grid) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, W) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, u) +@inline advective_momentum_flux_Uu(i, j, k, grid, scheme::CenteredScheme, U, u, tid, wrk) = @inbounds Axᶜᶜᶜ(i, j, k, grid) * _symmetric_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, U) * _symmetric_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, u) +@inline advective_momentum_flux_Vu(i, j, k, grid, scheme::CenteredScheme, V, u, tid, wrk) = @inbounds Ayᶠᶠᶜ(i, j, k, grid) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, V) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, u) +@inline advective_momentum_flux_Wu(i, j, k, grid, scheme::CenteredScheme, W, u, tid, wrk) = @inbounds Azᶠᶜᶠ(i, j, k, grid) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, W) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, u) -@inline advective_momentum_flux_Uv(i, j, k, grid, scheme::CenteredScheme, U, v) = @inbounds Axᶠᶠᶜ(i, j, k, grid) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, U) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, v) -@inline advective_momentum_flux_Vv(i, j, k, grid, scheme::CenteredScheme, V, v) = @inbounds Ayᶜᶜᶜ(i, j, k, grid) * _symmetric_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, V) * _symmetric_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, v) -@inline advective_momentum_flux_Wv(i, j, k, grid, scheme::CenteredScheme, W, v) = @inbounds Azᶜᶠᶠ(i, j, k, grid) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, W) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, v) +@inline advective_momentum_flux_Uv(i, j, k, grid, scheme::CenteredScheme, U, v, tid, wrk) = @inbounds Axᶠᶠᶜ(i, j, k, grid) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, U) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, v) +@inline advective_momentum_flux_Vv(i, j, k, grid, scheme::CenteredScheme, V, v, tid, wrk) = @inbounds Ayᶜᶜᶜ(i, j, k, grid) * _symmetric_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, V) * _symmetric_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, v) +@inline advective_momentum_flux_Wv(i, j, k, grid, scheme::CenteredScheme, W, v, tid, wrk) = @inbounds Azᶜᶠᶠ(i, j, k, grid) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, W) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, v) -@inline advective_momentum_flux_Uw(i, j, k, grid, scheme::CenteredScheme, U, w) = @inbounds Axᶠᶜᶠ(i, j, k, grid) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, U) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, w) -@inline advective_momentum_flux_Vw(i, j, k, grid, scheme::CenteredScheme, V, w) = @inbounds Ayᶜᶠᶠ(i, j, k, grid) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, V) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, w) -@inline advective_momentum_flux_Ww(i, j, k, grid, scheme::CenteredScheme, W, w) = @inbounds Azᶜᶜᶜ(i, j, k, grid) * _symmetric_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, W) * _symmetric_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, w) +@inline advective_momentum_flux_Uw(i, j, k, grid, scheme::CenteredScheme, U, w, tid, wrk) = @inbounds Axᶠᶜᶠ(i, j, k, grid) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, U) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, w) +@inline advective_momentum_flux_Vw(i, j, k, grid, scheme::CenteredScheme, V, w, tid, wrk) = @inbounds Ayᶜᶠᶠ(i, j, k, grid) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, V) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, w) +@inline advective_momentum_flux_Ww(i, j, k, grid, scheme::CenteredScheme, W, w, tid, wrk) = @inbounds Azᶜᶜᶜ(i, j, k, grid) * _symmetric_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, W) * _symmetric_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, w) ##### ##### Advective tracer flux operators ##### -@inline advective_tracer_flux_x(i, j, k, grid, scheme::CenteredScheme, U, c) = @inbounds Ax_qᶠᶜᶜ(i, j, k, grid, U) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, c) -@inline advective_tracer_flux_y(i, j, k, grid, scheme::CenteredScheme, V, c) = @inbounds Ay_qᶜᶠᶜ(i, j, k, grid, V) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, c) -@inline advective_tracer_flux_z(i, j, k, grid, scheme::CenteredScheme, W, c) = @inbounds Az_qᶜᶜᶠ(i, j, k, grid, W) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, c) +@inline advective_tracer_flux_x(i, j, k, grid, scheme::CenteredScheme, U, c, tid, wrk) = @inbounds Ax_qᶠᶜᶜ(i, j, k, grid, U) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, c) +@inline advective_tracer_flux_y(i, j, k, grid, scheme::CenteredScheme, V, c, tid, wrk) = @inbounds Ay_qᶜᶠᶜ(i, j, k, grid, V) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, c) +@inline advective_tracer_flux_z(i, j, k, grid, scheme::CenteredScheme, W, c, tid, wrk) = @inbounds Az_qᶜᶜᶠ(i, j, k, grid, W) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, c) diff --git a/src/Advection/reconstruction_coefficients.jl b/src/Advection/reconstruction_coefficients.jl index adcf18c925..6ddd709b4f 100644 --- a/src/Advection/reconstruction_coefficients.jl +++ b/src/Advection/reconstruction_coefficients.jl @@ -8,21 +8,21 @@ @inline symmetric_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, ψ, args...) = inner_symmetric_interpolate_yᵃᶠᵃ(i, j+1, k, grid, scheme, ψ, j, Center, args...) @inline symmetric_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, ψ, args...) = inner_symmetric_interpolate_zᵃᵃᶠ(i, j, k+1, grid, scheme, ψ, k, Center, args...) -@inline left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, ψ, args...) = inner_left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, ψ, i, Face, args...) -@inline left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, ψ, args...) = inner_left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, ψ, j, Face, args...) -@inline left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, ψ, args...) = inner_left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, ψ, k, Face, args...) +@inline left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, ψ, i, Face, args...) +@inline left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, ψ, j, Face, args...) +@inline left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, ψ, k, Face, args...) -@inline right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, ψ, args...) = inner_right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, ψ, i, Face, args...) -@inline right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, ψ, args...) = inner_right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, ψ, j, Face, args...) -@inline right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, ψ, args...) = inner_right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, ψ, k, Face, args...) +@inline right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, ψ, i, Face, args...) +@inline right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, ψ, j, Face, args...) +@inline right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, ψ, k, Face, args...) -@inline left_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, ψ, args...) = inner_left_biased_interpolate_xᶠᵃᵃ(i+1, j, k, grid, scheme, ψ, i, Center, args...) -@inline left_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, ψ, args...) = inner_left_biased_interpolate_yᵃᶠᵃ(i, j+1, k, grid, scheme, ψ, j, Center, args...) -@inline left_biased_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, ψ, args...) = inner_left_biased_interpolate_zᵃᵃᶠ(i, j, k+1, grid, scheme, ψ, k, Center, args...) +@inline left_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_left_biased_interpolate_xᶠᵃᵃ(i+1, j, k, grid, scheme, tid, wrk, ψ, i, Center, args...) +@inline left_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_left_biased_interpolate_yᵃᶠᵃ(i, j+1, k, grid, scheme, tid, wrk, ψ, j, Center, args...) +@inline left_biased_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_left_biased_interpolate_zᵃᵃᶠ(i, j, k+1, grid, scheme, tid, wrk, ψ, k, Center, args...) -@inline right_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, ψ, args...) = inner_right_biased_interpolate_xᶠᵃᵃ(i+1, j, k, grid, scheme, ψ, i, Center, args...) -@inline right_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, ψ, args...) = inner_right_biased_interpolate_yᵃᶠᵃ(i, j+1, k, grid, scheme, ψ, j, Center, args...) -@inline right_biased_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, ψ, args...) = inner_right_biased_interpolate_zᵃᵃᶠ(i, j, k+1, grid, scheme, ψ, k, Center, args...) +@inline right_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_right_biased_interpolate_xᶠᵃᵃ(i+1, j, k, grid, scheme, tid, wrk, ψ, i, Center, args...) +@inline right_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_right_biased_interpolate_yᵃᶠᵃ(i, j+1, k, grid, scheme, tid, wrk, ψ, j, Center, args...) +@inline right_biased_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_right_biased_interpolate_zᵃᵃᶠ(i, j, k+1, grid, scheme, tid, wrk, ψ, k, Center, args...) struct FirstDerivative end struct SecondDerivative end diff --git a/src/Advection/tracer_advection_operators.jl b/src/Advection/tracer_advection_operators.jl index 86cc43229b..995b4423a2 100644 --- a/src/Advection/tracer_advection_operators.jl +++ b/src/Advection/tracer_advection_operators.jl @@ -52,14 +52,14 @@ a velocity field, ``𝛁⋅(𝐯 c)``, ``` which ends up at the location `ccc`. """ -@inline function div_Uc(i, j, k, grid, advection, U, c) - return 1/Vᶜᶜᶜ(i, j, k, grid) * (δxᶜᵃᵃ(i, j, k, grid, _advective_tracer_flux_x, advection, U.u, c) + - δyᵃᶜᵃ(i, j, k, grid, _advective_tracer_flux_y, advection, U.v, c) + - δzᵃᵃᶜ(i, j, k, grid, _advective_tracer_flux_z, advection, U.w, c)) +@inline function div_Uc(i, j, k, grid, advection, U, c, tid, wrk) + return 1/Vᶜᶜᶜ(i, j, k, grid) * (δxᶜᵃᵃ(i, j, k, grid, _advective_tracer_flux_x, advection, U.u, c, tid, wrk) + + δyᵃᶜᵃ(i, j, k, grid, _advective_tracer_flux_y, advection, U.v, c, tid, wrk) + + δzᵃᵃᶜ(i, j, k, grid, _advective_tracer_flux_z, advection, U.w, c, tid, wrk)) end -@inline function div_Uc(i, j, k, grid, advection::TracerAdvection, U, c) - return 1/Vᶜᶜᶜ(i, j, k, grid) * (δxᶜᵃᵃ(i, j, k, grid, _advective_tracer_flux_x, advection.x, U.u, c) + - δyᵃᶜᵃ(i, j, k, grid, _advective_tracer_flux_y, advection.y, U.v, c) + - δzᵃᵃᶜ(i, j, k, grid, _advective_tracer_flux_z, advection.z, U.w, c)) +@inline function div_Uc(i, j, k, grid, advection::TracerAdvection, U, c, tid, wrk) + return 1/Vᶜᶜᶜ(i, j, k, grid) * (δxᶜᵃᵃ(i, j, k, grid, _advective_tracer_flux_x, advection.x, U.u, c, tid, wrk) + + δyᵃᶜᵃ(i, j, k, grid, _advective_tracer_flux_y, advection.y, U.v, c, tid, wrk) + + δzᵃᵃᶜ(i, j, k, grid, _advective_tracer_flux_z, advection.z, U.w, c, tid, wrk)) end diff --git a/src/Advection/upwind_biased_advective_fluxes.jl b/src/Advection/upwind_biased_advective_fluxes.jl index 701c266519..982e0c8d70 100644 --- a/src/Advection/upwind_biased_advective_fluxes.jl +++ b/src/Advection/upwind_biased_advective_fluxes.jl @@ -15,83 +15,83 @@ const UpwindScheme = AbstractUpwindBiasedAdvectionScheme ##### Note the convention "advective_momentum_flux_AB" corresponds to the advection _of_ B _by_ A. ##### -@inline function advective_momentum_flux_Uu(i, j, k, grid, scheme::UpwindScheme, U, u) +@inline function advective_momentum_flux_Uu(i, j, k, grid, scheme::UpwindScheme, U, u, tid, wrk) ũ = _symmetric_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, Ax_qᶠᶜᶜ, U) - uᴸ = _left_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, u) - uᴿ = _right_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, u) + uᴸ = _left_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, tid, wrk, u) + uᴿ = _right_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, tid, wrk, u) return upwind_biased_product(ũ, uᴸ, uᴿ) end -@inline function advective_momentum_flux_Vu(i, j, k, grid, scheme::UpwindScheme, V, u) +@inline function advective_momentum_flux_Vu(i, j, k, grid, scheme::UpwindScheme, V, u, tid, wrk) ṽ = _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, Ay_qᶜᶠᶜ, V) - uᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, u) - uᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, u) + uᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, u) + uᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, u) return upwind_biased_product(ṽ, uᴸ, uᴿ) end -@inline function advective_momentum_flux_Wu(i, j, k, grid, scheme::UpwindScheme, W, u) +@inline function advective_momentum_flux_Wu(i, j, k, grid, scheme::UpwindScheme, W, u, tid, wrk) w̃ = _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, Az_qᶜᶜᶠ, W) - uᴸ = _left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, u) - uᴿ = _right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, u) + uᴸ = _left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, u) + uᴿ = _right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, u) return upwind_biased_product(w̃, uᴸ, uᴿ) end -@inline function advective_momentum_flux_Uv(i, j, k, grid, scheme::UpwindScheme, U, v) +@inline function advective_momentum_flux_Uv(i, j, k, grid, scheme::UpwindScheme, U, v, tid, wrk) ũ = _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, Ax_qᶠᶜᶜ, U) - vᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, v) - vᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, v) + vᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, v) + vᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, v) return upwind_biased_product(ũ, vᴸ, vᴿ) end -@inline function advective_momentum_flux_Vv(i, j, k, grid, scheme::UpwindScheme, V, v) +@inline function advective_momentum_flux_Vv(i, j, k, grid, scheme::UpwindScheme, V, v, tid, wrk) ṽ = _symmetric_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, Ay_qᶜᶠᶜ, V) - vᴸ = _left_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, v) - vᴿ = _right_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, v) + vᴸ = _left_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, tid, wrk, v) + vᴿ = _right_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, tid, wrk, v) return upwind_biased_product(ṽ, vᴸ, vᴿ) end -@inline function advective_momentum_flux_Wv(i, j, k, grid, scheme::UpwindScheme, W, v) +@inline function advective_momentum_flux_Wv(i, j, k, grid, scheme::UpwindScheme, W, v, tid, wrk) w̃ = _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, Az_qᶜᶜᶠ, W) - vᴸ = _left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, v) - vᴿ = _right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, v) + vᴸ = _left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, v) + vᴿ = _right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, v) return upwind_biased_product(w̃, vᴸ, vᴿ) end -@inline function advective_momentum_flux_Uw(i, j, k, grid, scheme::UpwindScheme, U, w) +@inline function advective_momentum_flux_Uw(i, j, k, grid, scheme::UpwindScheme, U, w, tid, wrk) ũ = _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, Ax_qᶠᶜᶜ, U) - wᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, w) - wᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, w) + wᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, w) + wᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, w) return upwind_biased_product(ũ, wᴸ, wᴿ) end -@inline function advective_momentum_flux_Vw(i, j, k, grid, scheme::UpwindScheme, V, w) +@inline function advective_momentum_flux_Vw(i, j, k, grid, scheme::UpwindScheme, V, w, tid, wrk) ṽ = _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, Ay_qᶜᶠᶜ, V) - wᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, w) - wᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, w) + wᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, w) + wᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, w) return upwind_biased_product(ṽ, wᴸ, wᴿ) end -@inline function advective_momentum_flux_Ww(i, j, k, grid, scheme::UpwindScheme, W, w) +@inline function advective_momentum_flux_Ww(i, j, k, grid, scheme::UpwindScheme, W, w, tid, wrk) w̃ = _symmetric_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, Az_qᶜᶜᶠ, W) - wᴸ = _left_biased_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, w) - wᴿ = _right_biased_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, w) + wᴸ = _left_biased_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, tid, wrk, w) + wᴿ = _right_biased_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, tid, wrk, w) return upwind_biased_product(w̃, wᴸ, wᴿ) end @@ -100,29 +100,29 @@ end ##### Tracer advection operators ##### -@inline function advective_tracer_flux_x(i, j, k, grid, scheme::UpwindScheme, U, c) +@inline function advective_tracer_flux_x(i, j, k, grid, scheme::UpwindScheme, U, c, tid, wrk) @inbounds ũ = U[i, j, k] - cᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, c) - cᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, c) + cᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, c) + cᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, c) return Axᶠᶜᶜ(i, j, k, grid) * upwind_biased_product(ũ, cᴸ, cᴿ) end -@inline function advective_tracer_flux_y(i, j, k, grid, scheme::UpwindScheme, V, c) +@inline function advective_tracer_flux_y(i, j, k, grid, scheme::UpwindScheme, V, c, tid, wrk) @inbounds ṽ = V[i, j, k] - cᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, c) - cᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, c) + cᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, c) + cᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, c) return Ayᶜᶠᶜ(i, j, k, grid) * upwind_biased_product(ṽ, cᴸ, cᴿ) end -@inline function advective_tracer_flux_z(i, j, k, grid, scheme::UpwindScheme, W, c) +@inline function advective_tracer_flux_z(i, j, k, grid, scheme::UpwindScheme, W, c, tid, wrk) @inbounds w̃ = W[i, j, k] - cᴸ = _left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, c) - cᴿ = _right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, c) + cᴸ = _left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, c) + cᴿ = _right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, c) return Azᶜᶜᶠ(i, j, k, grid) * upwind_biased_product(w̃, cᴸ, cᴿ) end diff --git a/src/Advection/upwind_biased_reconstruction.jl b/src/Advection/upwind_biased_reconstruction.jl index e7b6955cc7..e2d4ae6452 100644 --- a/src/Advection/upwind_biased_reconstruction.jl +++ b/src/Advection/upwind_biased_reconstruction.jl @@ -136,8 +136,8 @@ for (sd, side) in enumerate((:left, :right)), (dir, ξ, val) in zip((:xᶠᵃᵃ for buffer in advection_buffers @eval begin - @inline $stencil(i, j, k, grid, scheme::UpwindBiased{$buffer, FT}, ψ, idx, loc, args...) where FT = @inbounds sum($(reconstruction_stencil(buffer, side, ξ, false)) .* retrieve_coeff(scheme, Val($sd), Val($val), idx, loc)) - @inline $stencil(i, j, k, grid, scheme::UpwindBiased{$buffer, FT}, ψ::Function, idx, loc, args...) where FT = @inbounds sum($(reconstruction_stencil(buffer, side, ξ, true)) .* retrieve_coeff(scheme, Val($sd), Val($val), idx, loc)) + @inline $stencil(i, j, k, grid, scheme::UpwindBiased{$buffer, FT}, tid, wrk, ψ, idx, loc, args...) where FT = @inbounds sum($(reconstruction_stencil(buffer, side, ξ, false)) .* retrieve_coeff(scheme, Val($sd), Val($val), idx, loc)) + @inline $stencil(i, j, k, grid, scheme::UpwindBiased{$buffer, FT}, tid, wrk, ψ::Function, idx, loc, args...) where FT = @inbounds sum($(reconstruction_stencil(buffer, side, ξ, true)) .* retrieve_coeff(scheme, Val($sd), Val($val), idx, loc)) end end end diff --git a/src/Advection/vector_invariant_advection.jl b/src/Advection/vector_invariant_advection.jl index 537dcf6eb3..90f501ba39 100644 --- a/src/Advection/vector_invariant_advection.jl +++ b/src/Advection/vector_invariant_advection.jl @@ -237,13 +237,13 @@ on_architecture(to, scheme::VectorInvariant{N, FT, M}) where {N, FT, M} = on_architecture(to, scheme.divergence_scheme), on_architecture(to, scheme.upwinding)) -@inline U_dot_∇u(i, j, k, grid, scheme::VectorInvariant, U) = horizontal_advection_U(i, j, k, grid, scheme, U.u, U.v) + - vertical_advection_U(i, j, k, grid, scheme, U) + - bernoulli_head_U(i, j, k, grid, scheme, U.u, U.v) +@inline U_dot_∇u(i, j, k, grid, scheme::VectorInvariant, U, ti, wrk) = horizontal_advection_U(i, j, k, grid, scheme, U.u, U.v, ti, wrk) + + vertical_advection_U(i, j, k, grid, scheme, U, ti, wrk) + + bernoulli_head_U(i, j, k, grid, scheme, U.u, U.v) -@inline U_dot_∇v(i, j, k, grid, scheme::VectorInvariant, U) = horizontal_advection_V(i, j, k, grid, scheme, U.u, U.v) + - vertical_advection_V(i, j, k, grid, scheme, U) + - bernoulli_head_V(i, j, k, grid, scheme, U.u, U.v) +@inline U_dot_∇v(i, j, k, grid, scheme::VectorInvariant, U, ti, wrk) = horizontal_advection_V(i, j, k, grid, scheme, U.u, U.v, ti, wrk) + + vertical_advection_V(i, j, k, grid, scheme, U, ti, wrk) + + bernoulli_head_V(i, j, k, grid, scheme, U.u, U.v, ti, wrk) # Extend interpolate functions for VectorInvariant to allow MultiDimensional reconstruction for bias in (:_left_biased, :_right_biased, :_symmetric) @@ -275,8 +275,8 @@ end @inline ϕ²(i, j, k, grid, ϕ) = @inbounds ϕ[i, j, k]^2 @inline Khᶜᶜᶜ(i, j, k, grid, u, v) = (ℑxᶜᵃᵃ(i, j, k, grid, ϕ², u) + ℑyᵃᶜᵃ(i, j, k, grid, ϕ², v)) / 2 -@inline bernoulli_head_U(i, j, k, grid, ::VectorInvariantKEGradientEnergyConserving, u, v) = ∂xᶠᶜᶜ(i, j, k, grid, Khᶜᶜᶜ, u, v) -@inline bernoulli_head_V(i, j, k, grid, ::VectorInvariantKEGradientEnergyConserving, u, v) = ∂yᶜᶠᶜ(i, j, k, grid, Khᶜᶜᶜ, u, v) +@inline bernoulli_head_U(i, j, k, grid, ::VectorInvariantKEGradientEnergyConserving, u, v, args...) = ∂xᶠᶜᶜ(i, j, k, grid, Khᶜᶜᶜ, u, v) +@inline bernoulli_head_V(i, j, k, grid, ::VectorInvariantKEGradientEnergyConserving, u, v, args...) = ∂yᶜᶠᶜ(i, j, k, grid, Khᶜᶜᶜ, u, v) ##### ##### Conservative vertical advection @@ -286,25 +286,25 @@ end @inbounds ζ₂wᶠᶜᶠ(i, j, k, grid, u, w) = ℑxᶠᵃᵃ(i, j, k, grid, Az_qᶜᶜᶠ, w) * ∂zᶠᶜᶠ(i, j, k, grid, u) @inbounds ζ₁wᶜᶠᶠ(i, j, k, grid, v, w) = ℑyᵃᶠᵃ(i, j, k, grid, Az_qᶜᶜᶠ, w) * ∂zᶜᶠᶠ(i, j, k, grid, v) -@inline vertical_advection_U(i, j, k, grid, ::VectorInvariantVerticalEnergyConserving, U) = ℑzᵃᵃᶜ(i, j, k, grid, ζ₂wᶠᶜᶠ, U.u, U.w) / Azᶠᶜᶜ(i, j, k, grid) -@inline vertical_advection_V(i, j, k, grid, ::VectorInvariantVerticalEnergyConserving, U) = ℑzᵃᵃᶜ(i, j, k, grid, ζ₁wᶜᶠᶠ, U.v, U.w) / Azᶜᶠᶜ(i, j, k, grid) +@inline vertical_advection_U(i, j, k, grid, ::VectorInvariantVerticalEnergyConserving, U, args...) = ℑzᵃᵃᶜ(i, j, k, grid, ζ₂wᶠᶜᶠ, U.u, U.w) / Azᶠᶜᶜ(i, j, k, grid) +@inline vertical_advection_V(i, j, k, grid, ::VectorInvariantVerticalEnergyConserving, U, args...) = ℑzᵃᵃᶜ(i, j, k, grid, ζ₁wᶜᶠᶠ, U.v, U.w) / Azᶜᶠᶜ(i, j, k, grid) ##### ##### Upwinding vertical advection (2. and 3.) ##### -@inline function vertical_advection_U(i, j, k, grid, scheme::VectorInvariant, U) +@inline function vertical_advection_U(i, j, k, grid, scheme::VectorInvariant, U, tid, wrk) - Φᵟ = upwinded_divergence_flux_Uᶠᶜᶜ(i, j, k, grid, scheme, U.u, U.v) - 𝒜ᶻ = δzᵃᵃᶜ(i, j, k, grid, _advective_momentum_flux_Wu, scheme.vertical_scheme, U.w, U.u) + Φᵟ = upwinded_divergence_flux_Uᶠᶜᶜ(i, j, k, grid, scheme, U.u, U.v, tid, wrk) + 𝒜ᶻ = δzᵃᵃᶜ(i, j, k, grid, _advective_momentum_flux_Wu, scheme.vertical_scheme, U.w, U.u, ti, wrk) return 1/Vᶠᶜᶜ(i, j, k, grid) * (Φᵟ + 𝒜ᶻ) end -@inline function vertical_advection_V(i, j, k, grid, scheme::VectorInvariant, U) +@inline function vertical_advection_V(i, j, k, grid, scheme::VectorInvariant, U, tid, wrk) - Φᵟ = upwinded_divergence_flux_Vᶜᶠᶜ(i, j, k, grid, scheme, U.u, U.v) - 𝒜ᶻ = δzᵃᵃᶜ(i, j, k, grid, _advective_momentum_flux_Wv, scheme.vertical_scheme, U.w, U.v) + Φᵟ = upwinded_divergence_flux_Vᶜᶠᶜ(i, j, k, grid, scheme, U.u, U.v, tid, wrk) + 𝒜ᶻ = δzᵃᵃᶜ(i, j, k, grid, _advective_momentum_flux_Wv, scheme.vertical_scheme, U.w, U.v, tid, wrk) return 1/Vᶜᶠᶜ(i, j, k, grid) * (Φᵟ + 𝒜ᶻ) end @@ -325,34 +325,34 @@ end @inline ζ_ℑx_vᶠᶠᵃ(i, j, k, grid, u, v) = ζ₃ᶠᶠᶜ(i, j, k, grid, u, v) * ℑxᶠᵃᵃ(i, j, k, grid, Δx_qᶜᶠᶜ, v) @inline ζ_ℑy_uᶠᶠᵃ(i, j, k, grid, u, v) = ζ₃ᶠᶠᶜ(i, j, k, grid, u, v) * ℑyᵃᶠᵃ(i, j, k, grid, Δy_qᶠᶜᶜ, u) -@inline horizontal_advection_U(i, j, k, grid, ::VectorInvariantEnergyConserving, u, v) = - ℑyᵃᶜᵃ(i, j, k, grid, ζ_ℑx_vᶠᶠᵃ, u, v) / Δxᶠᶜᶜ(i, j, k, grid) -@inline horizontal_advection_V(i, j, k, grid, ::VectorInvariantEnergyConserving, u, v) = + ℑxᶜᵃᵃ(i, j, k, grid, ζ_ℑy_uᶠᶠᵃ, u, v) / Δyᶜᶠᶜ(i, j, k, grid) +@inline horizontal_advection_U(i, j, k, grid, ::VectorInvariantEnergyConserving, u, v, args...) = - ℑyᵃᶜᵃ(i, j, k, grid, ζ_ℑx_vᶠᶠᵃ, u, v) / Δxᶠᶜᶜ(i, j, k, grid) +@inline horizontal_advection_V(i, j, k, grid, ::VectorInvariantEnergyConserving, u, v, args...) = + ℑxᶜᵃᵃ(i, j, k, grid, ζ_ℑy_uᶠᶠᵃ, u, v) / Δyᶜᶠᶜ(i, j, k, grid) -@inline horizontal_advection_U(i, j, k, grid, ::VectorInvariantEnstrophyConserving, u, v) = - ℑyᵃᶜᵃ(i, j, k, grid, ζ₃ᶠᶠᶜ, u, v) * ℑxᶠᵃᵃ(i, j, k, grid, ℑyᵃᶜᵃ, Δx_qᶜᶠᶜ, v) / Δxᶠᶜᶜ(i, j, k, grid) -@inline horizontal_advection_V(i, j, k, grid, ::VectorInvariantEnstrophyConserving, u, v) = + ℑxᶜᵃᵃ(i, j, k, grid, ζ₃ᶠᶠᶜ, u, v) * ℑyᵃᶠᵃ(i, j, k, grid, ℑxᶜᵃᵃ, Δy_qᶠᶜᶜ, u) / Δyᶜᶠᶜ(i, j, k, grid) +@inline horizontal_advection_U(i, j, k, grid, ::VectorInvariantEnstrophyConserving, u, v, args...) = - ℑyᵃᶜᵃ(i, j, k, grid, ζ₃ᶠᶠᶜ, u, v) * ℑxᶠᵃᵃ(i, j, k, grid, ℑyᵃᶜᵃ, Δx_qᶜᶠᶜ, v) / Δxᶠᶜᶜ(i, j, k, grid) +@inline horizontal_advection_V(i, j, k, grid, ::VectorInvariantEnstrophyConserving, u, v, args...) = + ℑxᶜᵃᵃ(i, j, k, grid, ζ₃ᶠᶠᶜ, u, v) * ℑyᵃᶠᵃ(i, j, k, grid, ℑxᶜᵃᵃ, Δy_qᶠᶜᶜ, u) / Δyᶜᶠᶜ(i, j, k, grid) ##### ##### Upwinding schemes (3. and 4.) ##### -@inline function horizontal_advection_U(i, j, k, grid, scheme::VectorInvariantUpwindVorticity, u, v) +@inline function horizontal_advection_U(i, j, k, grid, scheme::VectorInvariantUpwindVorticity, u, v, tid, wrk) Sζ = scheme.vorticity_stencil @inbounds v̂ = ℑxᶠᵃᵃ(i, j, k, grid, ℑyᵃᶜᵃ, Δx_qᶜᶠᶜ, v) / Δxᶠᶜᶜ(i, j, k, grid) - ζᴸ = _left_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, scheme.vorticity_scheme, ζ₃ᶠᶠᶜ, Sζ, u, v) - ζᴿ = _right_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, scheme.vorticity_scheme, ζ₃ᶠᶠᶜ, Sζ, u, v) + ζᴸ = _left_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, scheme.vorticity_scheme, tid, wrk, ζ₃ᶠᶠᶜ, Sζ, u, v) + ζᴿ = _right_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, scheme.vorticity_scheme, tid, wrk, ζ₃ᶠᶠᶜ, Sζ, u, v) return - upwind_biased_product(v̂, ζᴸ, ζᴿ) end -@inline function horizontal_advection_V(i, j, k, grid, scheme::VectorInvariantUpwindVorticity, u, v) +@inline function horizontal_advection_V(i, j, k, grid, scheme::VectorInvariantUpwindVorticity, u, v, tid, wrk) Sζ = scheme.vorticity_stencil @inbounds û = ℑyᵃᶠᵃ(i, j, k, grid, ℑxᶜᵃᵃ, Δy_qᶠᶜᶜ, u) / Δyᶜᶠᶜ(i, j, k, grid) - ζᴸ = _left_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, scheme.vorticity_scheme, ζ₃ᶠᶠᶜ, Sζ, u, v) - ζᴿ = _right_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, scheme.vorticity_scheme, ζ₃ᶠᶠᶜ, Sζ, u, v) + ζᴸ = _left_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, scheme.vorticity_scheme, tid, wrk, ζ₃ᶠᶠᶜ, Sζ, u, v) + ζᴿ = _right_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, scheme.vorticity_scheme, tid, wrk, ζ₃ᶠᶠᶜ, Sζ, u, v) return + upwind_biased_product(û, ζᴸ, ζᴿ) end diff --git a/src/Advection/vector_invariant_self_upwinding.jl b/src/Advection/vector_invariant_self_upwinding.jl index d8f798006e..b7d62c8971 100644 --- a/src/Advection/vector_invariant_self_upwinding.jl +++ b/src/Advection/vector_invariant_self_upwinding.jl @@ -12,28 +12,28 @@ # Divergence smoothness for divergence upwinding @inline divergence_smoothness(i, j, k, grid, u, v) = δx_U(i, j, k, grid, u, v) + δy_V(i, j, k, grid, u, v) -@inline function upwinded_divergence_flux_Uᶠᶜᶜ(i, j, k, grid, scheme::VectorInvariantSelfVerticalUpwinding, u, v) +@inline function upwinded_divergence_flux_Uᶠᶜᶜ(i, j, k, grid, scheme::VectorInvariantSelfVerticalUpwinding, u, v, tid, wrk) δU_stencil = scheme.upwinding.δU_stencil cross_scheme = scheme.upwinding.cross_scheme @inbounds û = u[i, j, k] δvˢ = _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, cross_scheme, δy_V, u, v) - δuᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, scheme.divergence_scheme, δx_U, δU_stencil, u, v) - δuᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, scheme.divergence_scheme, δx_U, δU_stencil, u, v) + δuᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, scheme.divergence_scheme, tid, wrk, δx_U, δU_stencil, u, v) + δuᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, scheme.divergence_scheme, tid, wrk, δx_U, δU_stencil, u, v) return upwind_biased_product(û, δuᴸ, δuᴿ) + û * δvˢ end -@inline function upwinded_divergence_flux_Vᶜᶠᶜ(i, j, k, grid, scheme::VectorInvariantSelfVerticalUpwinding, u, v) +@inline function upwinded_divergence_flux_Vᶜᶠᶜ(i, j, k, grid, scheme::VectorInvariantSelfVerticalUpwinding, u, v, tid, wrk) δV_stencil = scheme.upwinding.δV_stencil cross_scheme = scheme.upwinding.cross_scheme @inbounds v̂ = v[i, j, k] δuˢ = _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, cross_scheme, δx_U, u, v) - δvᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, scheme.divergence_scheme, δy_V, δV_stencil, u, v) - δvᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, scheme.divergence_scheme, δy_V, δV_stencil, u, v) + δvᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, scheme.divergence_scheme, tid, wrk, δy_V, δV_stencil, u, v) + δvᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, scheme.divergence_scheme, tid, wrk, δy_V, δV_stencil, u, v) return upwind_biased_product(v̂, δvᴸ, δvᴿ) + v̂ * δuˢ end @@ -53,7 +53,7 @@ end @inline u_smoothness(i, j, k, grid, u, v) = ℑxᶜᵃᵃ(i, j, k, grid, u) @inline v_smoothness(i, j, k, grid, u, v) = ℑyᵃᶜᵃ(i, j, k, grid, v) -@inline function bernoulli_head_U(i, j, k, grid, scheme::VectorInvariantKineticEnergyUpwinding, u, v) +@inline function bernoulli_head_U(i, j, k, grid, scheme::VectorInvariantKineticEnergyUpwinding, u, v, tid, wrk) @inbounds û = u[i, j, k] @@ -61,8 +61,8 @@ end cross_scheme = scheme.upwinding.cross_scheme δKvˢ = _symmetric_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, cross_scheme, δx_v², u, v) - δKuᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, scheme.kinetic_energy_gradient_scheme, δx_u², δu²_stencil, u, v) - δKuᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, scheme.kinetic_energy_gradient_scheme, δx_u², δu²_stencil, u, v) + δKuᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, scheme.kinetic_energy_gradient_scheme, tid, wrk, δx_u², δu²_stencil, u, v) + δKuᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, scheme.kinetic_energy_gradient_scheme, tid, wrk, δx_u², δu²_stencil, u, v) ∂Kᴸ = (δKuᴸ + δKvˢ) / Δxᶠᶜᶜ(i, j, k, grid) ∂Kᴿ = (δKuᴿ + δKvˢ) / Δxᶠᶜᶜ(i, j, k, grid) @@ -70,7 +70,7 @@ end return ifelse(û > 0, ∂Kᴸ, ∂Kᴿ) end -@inline function bernoulli_head_V(i, j, k, grid, scheme::VectorInvariantKineticEnergyUpwinding, u, v) +@inline function bernoulli_head_V(i, j, k, grid, scheme::VectorInvariantKineticEnergyUpwinding, u, v, tid, wrk) @inbounds v̂ = v[i, j, k] @@ -78,8 +78,8 @@ end cross_scheme = scheme.upwinding.cross_scheme δKuˢ = _symmetric_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, cross_scheme, δy_u², u, v) - δKvᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, scheme.kinetic_energy_gradient_scheme, δy_v², δv²_stencil, u, v) - δKvᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, scheme.kinetic_energy_gradient_scheme, δy_v², δv²_stencil, u, v) + δKvᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, scheme.kinetic_energy_gradient_scheme, tid, wrk, δy_v², δv²_stencil, u, v) + δKvᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, scheme.kinetic_energy_gradient_scheme, tid, wrk, δy_v², δv²_stencil, u, v) ∂Kᴸ = (δKvᴸ + δKuˢ) / Δyᶜᶠᶜ(i, j, k, grid) ∂Kᴿ = (δKvᴿ + δKuˢ) / Δyᶜᶠᶜ(i, j, k, grid) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 1adf1e0446..599e3857ad 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -302,14 +302,12 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin # The WENO-Z solution here is @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{N, FT}, + scheme::WENO{N, FT}, ti, wr, ψ, idx, loc, args...) where {N, FT} - # M = @uniform @groupsize()[$dir] - tix = @index(Local, NTuple) - tix = tix[$dir] - wrk = @localmem FT (5, 10) + tix = ti[$dir] + wrk = wr[$dir] ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -332,14 +330,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{N, FT}, + scheme::WENO{N, FT}, ti, wr, ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} - - # M = @uniform @groupsize()[$dir] - tix = @index(Local, NTuple) - tix = tix[$dir] - wrk = @localmem FT (5, 10) + tix = ti[$dir] + wrk = wr[$dir] ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -362,13 +357,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{N, FT}, - ψ, idx, loc, VI::VelocityStencil, u, v, args...) where {N, FT} + scheme::WENO{N, FT}, ti, wr, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {N, FT} - # M = @uniform @groupsize()[$dir] - tix = @index(Local, NTuple) - tix = tix[$dir] - wrk = @localmem FT (5, 10) + tix = ti[$dir] + wrk = wr[$dir] ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) @@ -395,13 +388,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{N, FT}, + scheme::WENO{N, FT}, ti, wr, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} - # M = @uniform @groupsize()[$dir] - tix = @index(Local, NTuple) - tix = tix[$dir] - wrk = @localmem FT (5, 10) + tix = ti[$dir] + wrk = wr[$dir] ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) diff --git a/src/Models/HydrostaticFreeSurfaceModels/hydrostatic_free_surface_tendency_kernel_functions.jl b/src/Models/HydrostaticFreeSurfaceModels/hydrostatic_free_surface_tendency_kernel_functions.jl index adfd3faac8..af83dd30d3 100644 --- a/src/Models/HydrostaticFreeSurfaceModels/hydrostatic_free_surface_tendency_kernel_functions.jl +++ b/src/Models/HydrostaticFreeSurfaceModels/hydrostatic_free_surface_tendency_kernel_functions.jl @@ -43,7 +43,14 @@ implicitly during time-stepping. model_fields = merge(hydrostatic_fields(velocities, free_surface, tracers), auxiliary_fields) - return ( - U_dot_∇u(i, j, k, grid, advection, velocities) + FT = eltype(grid) + M = @uniform @groupsize() + ti = @index(Local, NTuple) + wrkx = @localmem FT (5, M[1]) + wrky = @localmem FT (5, M[2]) + wrkz = @localmem FT (5, M[3]) + + return ( - U_dot_∇u(i, j, k, grid, advection, velocities, ti, (wrkx, wrky, wrkz)) - explicit_barotropic_pressure_x_gradient(i, j, k, grid, free_surface) - x_f_cross_U(i, j, k, grid, coriolis, velocities) - ∂xᶠᶜᶜ(i, j, k, grid, hydrostatic_pressure_anomaly) @@ -82,7 +89,14 @@ implicitly during time-stepping. model_fields = merge(hydrostatic_fields(velocities, free_surface, tracers), auxiliary_fields) - return ( - U_dot_∇v(i, j, k, grid, advection, velocities) + FT = eltype(grid) + M = @uniform @groupsize() + ti = @index(Local, NTuple) + wrkx = @localmem FT (5, M[1]) + wrky = @localmem FT (5, M[2]) + wrkz = @localmem FT (5, M[3]) + + return ( - U_dot_∇v(i, j, k, grid, advection, velocities, ti, (wrkx, wrky, wrkz)) - explicit_barotropic_pressure_y_gradient(i, j, k, grid, free_surface) - y_f_cross_U(i, j, k, grid, coriolis, velocities) - ∂yᶜᶠᶜ(i, j, k, grid, hydrostatic_pressure_anomaly) @@ -120,6 +134,13 @@ where `c = C[tracer_index]`. forcing, clock) where tracer_index + FT = eltype(grid) + M = @uniform @groupsize() + ti = @index(Local, NTuple) + wrkx = @localmem FT (5, M[1]) + wrky = @localmem FT (5, M[2]) + wrkz = @localmem FT (5, M[3]) + @inbounds c = tracers[tracer_index] model_fields = merge(hydrostatic_fields(velocities, free_surface, tracers), auxiliary_fields) @@ -131,7 +152,7 @@ where `c = C[tracer_index]`. total_velocities = with_advective_forcing(forcing, total_velocities) - return ( - div_Uc(i, j, k, grid, advection, total_velocities, c) + return ( - div_Uc(i, j, k, grid, advection, total_velocities, c, ti, (wrkx, wrky, wrkz)) - ∇_dot_qᶜ(i, j, k, grid, closure, diffusivities, val_tracer_index, c, clock, model_fields, buoyancy) - immersed_∇_dot_qᶜ(i, j, k, grid, c, c_immersed_bc, closure, diffusivities, val_tracer_index, clock, model_fields) + biogeochemical_transition(i, j, k, grid, biogeochemistry, val_tracer_name, clock, model_fields) From a23e066e938e5baf2cf0c5b02154c28869f2a073 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 11:39:30 -0400 Subject: [PATCH 080/152] shared mem let's go --- src/Advection/vector_invariant_advection.jl | 14 ++-- src/Advection/weno_interpolants.jl | 16 ++-- ...ute_hydrostatic_free_surface_tendencies.jl | 73 +++++++++++++++++-- ..._free_surface_tendency_kernel_functions.jl | 36 ++------- 4 files changed, 88 insertions(+), 51 deletions(-) diff --git a/src/Advection/vector_invariant_advection.jl b/src/Advection/vector_invariant_advection.jl index 90f501ba39..73b29e44c4 100644 --- a/src/Advection/vector_invariant_advection.jl +++ b/src/Advection/vector_invariant_advection.jl @@ -237,13 +237,13 @@ on_architecture(to, scheme::VectorInvariant{N, FT, M}) where {N, FT, M} = on_architecture(to, scheme.divergence_scheme), on_architecture(to, scheme.upwinding)) -@inline U_dot_∇u(i, j, k, grid, scheme::VectorInvariant, U, ti, wrk) = horizontal_advection_U(i, j, k, grid, scheme, U.u, U.v, ti, wrk) + - vertical_advection_U(i, j, k, grid, scheme, U, ti, wrk) + - bernoulli_head_U(i, j, k, grid, scheme, U.u, U.v) +@inline U_dot_∇u(i, j, k, grid, scheme::VectorInvariant, U, tid, wrk) = horizontal_advection_U(i, j, k, grid, scheme, U.u, U.v, tid, wrk) + + vertical_advection_U(i, j, k, grid, scheme, U, tid, wrk) + + bernoulli_head_U(i, j, k, grid, scheme, U.u, U.v, tid, wrk) -@inline U_dot_∇v(i, j, k, grid, scheme::VectorInvariant, U, ti, wrk) = horizontal_advection_V(i, j, k, grid, scheme, U.u, U.v, ti, wrk) + - vertical_advection_V(i, j, k, grid, scheme, U, ti, wrk) + - bernoulli_head_V(i, j, k, grid, scheme, U.u, U.v, ti, wrk) +@inline U_dot_∇v(i, j, k, grid, scheme::VectorInvariant, U, tid, wrk) = horizontal_advection_V(i, j, k, grid, scheme, U.u, U.v, tid, wrk) + + vertical_advection_V(i, j, k, grid, scheme, U, tid, wrk) + + bernoulli_head_V(i, j, k, grid, scheme, U.u, U.v, tid, wrk) # Extend interpolate functions for VectorInvariant to allow MultiDimensional reconstruction for bias in (:_left_biased, :_right_biased, :_symmetric) @@ -296,7 +296,7 @@ end @inline function vertical_advection_U(i, j, k, grid, scheme::VectorInvariant, U, tid, wrk) Φᵟ = upwinded_divergence_flux_Uᶠᶜᶜ(i, j, k, grid, scheme, U.u, U.v, tid, wrk) - 𝒜ᶻ = δzᵃᵃᶜ(i, j, k, grid, _advective_momentum_flux_Wu, scheme.vertical_scheme, U.w, U.u, ti, wrk) + 𝒜ᶻ = δzᵃᵃᶜ(i, j, k, grid, _advective_momentum_flux_Wu, scheme.vertical_scheme, U.w, U.u, tid, wrk) return 1/Vᶠᶜᶜ(i, j, k, grid) * (Φᵟ + 𝒜ᶻ) end diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 599e3857ad..d8d818a0e4 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -306,8 +306,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, args...) where {N, FT} - tix = ti[$dir] - wrk = wr[$dir] + tix = ti[$val] + wrk = wr[$val] ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -333,8 +333,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{N, FT}, ti, wr, ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} - tix = ti[$dir] - wrk = wr[$dir] + tix = ti[$val] + wrk = wr[$val] ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -360,8 +360,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{N, FT}, ti, wr, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {N, FT} - tix = ti[$dir] - wrk = wr[$dir] + tix = ti[$val] + wrk = wr[$val] ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) @@ -391,8 +391,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{N, FT}, ti, wr, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} - tix = ti[$dir] - wrk = wr[$dir] + tix = ti[$val] + wrk = wr[$val] ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) diff --git a/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl b/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl index dc330fa1fd..314b9d3eae 100644 --- a/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl +++ b/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl @@ -16,6 +16,9 @@ import Oceananigans.Models: interior_tendency_kernel_parameters using Oceananigans.ImmersedBoundaries: active_interior_map, ActiveCellsIBG, InteriorMap, active_linear_index_to_tuple +using KernelAbstractions: @private, @uniform, @groupsize, @index, @localmem + + """ compute_tendencies!(model::HydrostaticFreeSurfaceModel, callbacks) @@ -230,25 +233,53 @@ end """ Calculate the right-hand-side of the u-velocity equation. """ @kernel function compute_hydrostatic_free_surface_Gu!(Gu, grid, map, args) i, j, k = @index(Global, NTuple) - @inbounds Gu[i, j, k] = hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, args...) + + M = @uniform @groupsize() + tid = @index(Local, NTuple) + wrkx = @localmem Float64 (5, M[1]) + wrky = @localmem Float64 (5, M[2]) + wrkz = @localmem Float64 (5, M[3]) + + @inbounds Gu[i, j, k] = hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, tid, (wrkx, wrky, wrkz), args...) end @kernel function compute_hydrostatic_free_surface_Gu!(Gu, grid::ActiveCellsIBG, map, args) idx = @index(Global, Linear) i, j, k = active_linear_index_to_tuple(idx, map, grid) + + M = @uniform @groupsize() + tid = @index(Local, NTuple) + wrkx = @localmem Float64 (5, M[1]) + wrky = @localmem Float64 (5, M[2]) + wrkz = @localmem Float64 (5, M[3]) + @inbounds Gu[i, j, k] = hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, args...) end """ Calculate the right-hand-side of the v-velocity equation. """ @kernel function compute_hydrostatic_free_surface_Gv!(Gv, grid, map, args) i, j, k = @index(Global, NTuple) - @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, args...) + + M = @uniform @groupsize() + tid = @index(Local, NTuple) + wrkx = @localmem Float64 (5, M[1]) + wrky = @localmem Float64 (5, M[2]) + wrkz = @localmem Float64 (5, M[3]) + + @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, tid, (wrkx, wrky, wrkz), args...) end @kernel function compute_hydrostatic_free_surface_Gv!(Gv, grid::ActiveCellsIBG, map, args) idx = @index(Global, Linear) i, j, k = active_linear_index_to_tuple(idx, map, grid) - @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, args...) + + M = @uniform @groupsize() + tid = @index(Local, NTuple) + wrkx = @localmem Float64 (5, M[1]) + wrky = @localmem Float64 (5, M[2]) + wrkz = @localmem Float64 (5, M[3]) + + @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, tid, (wrkx, wrky, wrkz), args...) end ##### @@ -258,25 +289,53 @@ end """ Calculate the right-hand-side of the tracer advection-diffusion equation. """ @kernel function compute_hydrostatic_free_surface_Gc!(Gc, grid, map, args) i, j, k = @index(Global, NTuple) - @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, args...) + + M = @uniform @groupsize() + tid = @index(Local, NTuple) + wrkx = @localmem Float64 (5, M[1]) + wrky = @localmem Float64 (5, M[2]) + wrkz = @localmem Float64 (5, M[3]) + + @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, tid, (wrkx, wrky, wrkz), args...) end @kernel function compute_hydrostatic_free_surface_Gc!(Gc, grid::ActiveCellsIBG, map, args) idx = @index(Global, Linear) i, j, k = active_linear_index_to_tuple(idx, map, grid) - @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, args...) + + M = @uniform @groupsize() + tid = @index(Local, NTuple) + wrkx = @localmem Float64 (5, M[1]) + wrky = @localmem Float64 (5, M[2]) + wrkz = @localmem Float64 (5, M[3]) + + @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, tid, (wrkx, wrky, wrkz), args...) end """ Calculate the right-hand-side of the subgrid scale energy equation. """ @kernel function compute_hydrostatic_free_surface_Ge!(Ge, grid, map, args) i, j, k = @index(Global, NTuple) - @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, args...) + + M = @uniform @groupsize() + tid = @index(Local, NTuple) + wrkx = @localmem Float64 (5, M[1]) + wrky = @localmem Float64 (5, M[2]) + wrkz = @localmem Float64 (5, M[3]) + + @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, tid, (wrkx, wrky, wrkz), args...) end @kernel function compute_hydrostatic_free_surface_Ge!(Ge, grid::ActiveCellsIBG, map, args) idx = @index(Global, Linear) i, j, k = active_linear_index_to_tuple(idx, map, grid) - @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, args...) + + M = @uniform @groupsize() + tid = @index(Local, NTuple) + wrkx = @localmem Float64 (5, M[1]) + wrky = @localmem Float64 (5, M[2]) + wrkz = @localmem Float64 (5, M[3]) + + @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, tid, (wrkx, wrky, wrkz), args...) end ##### diff --git a/src/Models/HydrostaticFreeSurfaceModels/hydrostatic_free_surface_tendency_kernel_functions.jl b/src/Models/HydrostaticFreeSurfaceModels/hydrostatic_free_surface_tendency_kernel_functions.jl index af83dd30d3..93ba12530a 100644 --- a/src/Models/HydrostaticFreeSurfaceModels/hydrostatic_free_surface_tendency_kernel_functions.jl +++ b/src/Models/HydrostaticFreeSurfaceModels/hydrostatic_free_surface_tendency_kernel_functions.jl @@ -9,7 +9,6 @@ using Oceananigans.Advection: div_Uc, U_dot_∇u, U_dot_∇v using Oceananigans.Forcings: with_advective_forcing using Oceananigans.TurbulenceClosures: shear_production, buoyancy_flux, dissipation using Oceananigans.Utils: SumOfArrays -using KernelAbstractions: @private import Oceananigans.TurbulenceClosures: hydrostatic_turbulent_kinetic_energy_tendency @@ -26,7 +25,7 @@ The tendency for ``u`` is called ``G_u`` and defined via where `p_n` is the part of the barotropic kinematic pressure that's treated implicitly during time-stepping. """ -@inline function hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, +@inline function hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, tid, wrk, advection, coriolis, closure, @@ -43,14 +42,7 @@ implicitly during time-stepping. model_fields = merge(hydrostatic_fields(velocities, free_surface, tracers), auxiliary_fields) - FT = eltype(grid) - M = @uniform @groupsize() - ti = @index(Local, NTuple) - wrkx = @localmem FT (5, M[1]) - wrky = @localmem FT (5, M[2]) - wrkz = @localmem FT (5, M[3]) - - return ( - U_dot_∇u(i, j, k, grid, advection, velocities, ti, (wrkx, wrky, wrkz)) + return ( - U_dot_∇u(i, j, k, grid, advection, velocities, tid, wrk) - explicit_barotropic_pressure_x_gradient(i, j, k, grid, free_surface) - x_f_cross_U(i, j, k, grid, coriolis, velocities) - ∂xᶠᶜᶜ(i, j, k, grid, hydrostatic_pressure_anomaly) @@ -69,10 +61,10 @@ The tendency for ``v`` is called ``G_v`` and defined via ∂_t v = G_v - ∂_y p_n ``` -where `p_n` is the part of the barotropic kinematic pressure that's treated +where `p_n` is the part of the barotropic kinematic pressure that's treated implicitly during time-stepping. """ -@inline function hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, +@inline function hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, tid, wrk, advection, coriolis, closure, @@ -89,14 +81,7 @@ implicitly during time-stepping. model_fields = merge(hydrostatic_fields(velocities, free_surface, tracers), auxiliary_fields) - FT = eltype(grid) - M = @uniform @groupsize() - ti = @index(Local, NTuple) - wrkx = @localmem FT (5, M[1]) - wrky = @localmem FT (5, M[2]) - wrkz = @localmem FT (5, M[3]) - - return ( - U_dot_∇v(i, j, k, grid, advection, velocities, ti, (wrkx, wrky, wrkz)) + return ( - U_dot_∇v(i, j, k, grid, advection, velocities, tid, wrk) - explicit_barotropic_pressure_y_gradient(i, j, k, grid, free_surface) - y_f_cross_U(i, j, k, grid, coriolis, velocities) - ∂yᶜᶠᶜ(i, j, k, grid, hydrostatic_pressure_anomaly) @@ -117,7 +102,7 @@ The tendency is called ``G_c`` and defined via where `c = C[tracer_index]`. """ -@inline function hydrostatic_free_surface_tracer_tendency(i, j, k, grid, +@inline function hydrostatic_free_surface_tracer_tendency(i, j, k, grid, tid, wrk, val_tracer_index::Val{tracer_index}, val_tracer_name, advection, @@ -134,13 +119,6 @@ where `c = C[tracer_index]`. forcing, clock) where tracer_index - FT = eltype(grid) - M = @uniform @groupsize() - ti = @index(Local, NTuple) - wrkx = @localmem FT (5, M[1]) - wrky = @localmem FT (5, M[2]) - wrkz = @localmem FT (5, M[3]) - @inbounds c = tracers[tracer_index] model_fields = merge(hydrostatic_fields(velocities, free_surface, tracers), auxiliary_fields) @@ -152,7 +130,7 @@ where `c = C[tracer_index]`. total_velocities = with_advective_forcing(forcing, total_velocities) - return ( - div_Uc(i, j, k, grid, advection, total_velocities, c, ti, (wrkx, wrky, wrkz)) + return ( - div_Uc(i, j, k, grid, advection, total_velocities, c, tid, wrk) - ∇_dot_qᶜ(i, j, k, grid, closure, diffusivities, val_tracer_index, c, clock, model_fields, buoyancy) - immersed_∇_dot_qᶜ(i, j, k, grid, c, c_immersed_bc, closure, diffusivities, val_tracer_index, clock, model_fields) + biogeochemical_transition(i, j, k, grid, biogeochemistry, val_tracer_name, clock, model_fields) From 0b41b2222e39ac1c1eeb4ee11d4bd34414c095e0 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 11:47:08 -0400 Subject: [PATCH 081/152] only some shared mem --- .../vector_invariant_self_upwinding.jl | 2 +- src/Advection/weno_interpolants.jl | 20 ++--- ...ute_hydrostatic_free_surface_tendencies.jl | 76 +++++++++---------- 3 files changed, 43 insertions(+), 55 deletions(-) diff --git a/src/Advection/vector_invariant_self_upwinding.jl b/src/Advection/vector_invariant_self_upwinding.jl index b7d62c8971..93bf176a15 100644 --- a/src/Advection/vector_invariant_self_upwinding.jl +++ b/src/Advection/vector_invariant_self_upwinding.jl @@ -26,7 +26,7 @@ end @inline function upwinded_divergence_flux_Vᶜᶠᶜ(i, j, k, grid, scheme::VectorInvariantSelfVerticalUpwinding, u, v, tid, wrk) - + δV_stencil = scheme.upwinding.δV_stencil cross_scheme = scheme.upwinding.cross_scheme diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index d8d818a0e4..68376b074c 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -302,12 +302,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin # The WENO-Z solution here is @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{N, FT}, ti, wr, + scheme::WENO{N, FT}, tid, wrk, ψ, idx, loc, args...) where {N, FT} - tix = ti[$val] - wrk = wr[$val] + tix = tid[$val] ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -330,11 +329,10 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{N, FT}, ti, wr, + scheme::WENO{N, FT}, tid, wrk, ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} - tix = ti[$val] - wrk = wr[$val] + tix = tid[$val] ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -357,11 +355,10 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{N, FT}, ti, wr, + scheme::WENO{N, FT}, tid, wrk, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {N, FT} - tix = ti[$val] - wrk = wr[$val] + tix = tid[$val] ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) @@ -388,11 +385,10 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{N, FT}, ti, wr, + scheme::WENO{N, FT}, tid, wrk, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} - tix = ti[$val] - wrk = wr[$val] + tix = tid[$val] ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) diff --git a/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl b/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl index 314b9d3eae..46e191e484 100644 --- a/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl +++ b/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl @@ -234,52 +234,48 @@ end @kernel function compute_hydrostatic_free_surface_Gu!(Gu, grid, map, args) i, j, k = @index(Global, NTuple) - M = @uniform @groupsize() + Mtot = @uniform @groupsize() tid = @index(Local, NTuple) - wrkx = @localmem Float64 (5, M[1]) - wrky = @localmem Float64 (5, M[2]) - wrkz = @localmem Float64 (5, M[3]) - - @inbounds Gu[i, j, k] = hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, tid, (wrkx, wrky, wrkz), args...) + M = @uniform maximum(Mtot) + wrk = @localmem Float64 (5, M) + + @inbounds Gu[i, j, k] = hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, tid, wrk, args...) end @kernel function compute_hydrostatic_free_surface_Gu!(Gu, grid::ActiveCellsIBG, map, args) idx = @index(Global, Linear) i, j, k = active_linear_index_to_tuple(idx, map, grid) - M = @uniform @groupsize() + Mtot = @uniform @groupsize() tid = @index(Local, NTuple) - wrkx = @localmem Float64 (5, M[1]) - wrky = @localmem Float64 (5, M[2]) - wrkz = @localmem Float64 (5, M[3]) + M = @uniform maximum(Mtot) + wrk = @localmem Float64 (5, M) - @inbounds Gu[i, j, k] = hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, args...) + @inbounds Gu[i, j, k] = hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, tid, wrk, args...) end """ Calculate the right-hand-side of the v-velocity equation. """ @kernel function compute_hydrostatic_free_surface_Gv!(Gv, grid, map, args) i, j, k = @index(Global, NTuple) - M = @uniform @groupsize() + Mtot = @uniform @groupsize() tid = @index(Local, NTuple) - wrkx = @localmem Float64 (5, M[1]) - wrky = @localmem Float64 (5, M[2]) - wrkz = @localmem Float64 (5, M[3]) + M = @uniform maximum(Mtot) + wrk = @localmem Float64 (5, M) - @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, tid, (wrkx, wrky, wrkz), args...) + @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, tid, wrk, args...) end @kernel function compute_hydrostatic_free_surface_Gv!(Gv, grid::ActiveCellsIBG, map, args) idx = @index(Global, Linear) i, j, k = active_linear_index_to_tuple(idx, map, grid) - M = @uniform @groupsize() + Mtot = @uniform @groupsize() tid = @index(Local, NTuple) - wrkx = @localmem Float64 (5, M[1]) - wrky = @localmem Float64 (5, M[2]) - wrkz = @localmem Float64 (5, M[3]) + M = @uniform maximum(Mtot) + wrk = @localmem Float64 (5, M) - @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, tid, (wrkx, wrky, wrkz), args...) + @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, tid, wrk, args...) end ##### @@ -290,52 +286,48 @@ end @kernel function compute_hydrostatic_free_surface_Gc!(Gc, grid, map, args) i, j, k = @index(Global, NTuple) - M = @uniform @groupsize() - tid = @index(Local, NTuple) - wrkx = @localmem Float64 (5, M[1]) - wrky = @localmem Float64 (5, M[2]) - wrkz = @localmem Float64 (5, M[3]) + Mtot = @uniform @groupsize() + tid = @index(Local, NTuple) + M = @uniform maximum(Mtot) + wrk = @localmem Float64 (5, M) - @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, tid, (wrkx, wrky, wrkz), args...) + @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, tid, wrk, args...) end @kernel function compute_hydrostatic_free_surface_Gc!(Gc, grid::ActiveCellsIBG, map, args) idx = @index(Global, Linear) i, j, k = active_linear_index_to_tuple(idx, map, grid) - M = @uniform @groupsize() + Mtot = @uniform @groupsize() tid = @index(Local, NTuple) - wrkx = @localmem Float64 (5, M[1]) - wrky = @localmem Float64 (5, M[2]) - wrkz = @localmem Float64 (5, M[3]) + M = @uniform maximum(Mtot) + wrk = @localmem Float64 (5, M) - @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, tid, (wrkx, wrky, wrkz), args...) + @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, tid, wrk, args...) end """ Calculate the right-hand-side of the subgrid scale energy equation. """ @kernel function compute_hydrostatic_free_surface_Ge!(Ge, grid, map, args) i, j, k = @index(Global, NTuple) - M = @uniform @groupsize() + Mtot = @uniform @groupsize() tid = @index(Local, NTuple) - wrkx = @localmem Float64 (5, M[1]) - wrky = @localmem Float64 (5, M[2]) - wrkz = @localmem Float64 (5, M[3]) + M = @uniform maximum(Mtot) + wrk = @localmem Float64 (5, M) - @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, tid, (wrkx, wrky, wrkz), args...) + @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, tid, wrk, args...) end @kernel function compute_hydrostatic_free_surface_Ge!(Ge, grid::ActiveCellsIBG, map, args) idx = @index(Global, Linear) i, j, k = active_linear_index_to_tuple(idx, map, grid) - M = @uniform @groupsize() + Mtot = @uniform @groupsize() tid = @index(Local, NTuple) - wrkx = @localmem Float64 (5, M[1]) - wrky = @localmem Float64 (5, M[2]) - wrkz = @localmem Float64 (5, M[3]) + M = @uniform maximum(Mtot) + wrk = @localmem Float64 (5, M) - @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, tid, (wrkx, wrky, wrkz), args...) + @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, tid, wrk, args...) end ##### From ed6b35726c65db23b8e5affce0904954b4f73e49 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 11:50:29 -0400 Subject: [PATCH 082/152] probably it will not work? --- ...ute_hydrostatic_free_surface_tendencies.jl | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl b/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl index 46e191e484..9004fce985 100644 --- a/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl +++ b/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl @@ -234,10 +234,11 @@ end @kernel function compute_hydrostatic_free_surface_Gu!(Gu, grid, map, args) i, j, k = @index(Global, NTuple) + FT = @uniform eltype(grid) Mtot = @uniform @groupsize() tid = @index(Local, NTuple) M = @uniform maximum(Mtot) - wrk = @localmem Float64 (5, M) + wrk = @localmem FT (5, M) @inbounds Gu[i, j, k] = hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, tid, wrk, args...) end @@ -246,10 +247,11 @@ end idx = @index(Global, Linear) i, j, k = active_linear_index_to_tuple(idx, map, grid) + FT = @uniform eltype(grid) Mtot = @uniform @groupsize() tid = @index(Local, NTuple) M = @uniform maximum(Mtot) - wrk = @localmem Float64 (5, M) + wrk = @localmem FT (5, M) @inbounds Gu[i, j, k] = hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, tid, wrk, args...) end @@ -258,10 +260,11 @@ end @kernel function compute_hydrostatic_free_surface_Gv!(Gv, grid, map, args) i, j, k = @index(Global, NTuple) + FT = @uniform eltype(grid) Mtot = @uniform @groupsize() tid = @index(Local, NTuple) M = @uniform maximum(Mtot) - wrk = @localmem Float64 (5, M) + wrk = @localmem FT (5, M) @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, tid, wrk, args...) end @@ -270,10 +273,11 @@ end idx = @index(Global, Linear) i, j, k = active_linear_index_to_tuple(idx, map, grid) + FT = @uniform eltype(grid) Mtot = @uniform @groupsize() tid = @index(Local, NTuple) M = @uniform maximum(Mtot) - wrk = @localmem Float64 (5, M) + wrk = @localmem FT (5, M) @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, tid, wrk, args...) end @@ -286,10 +290,11 @@ end @kernel function compute_hydrostatic_free_surface_Gc!(Gc, grid, map, args) i, j, k = @index(Global, NTuple) + FT = @uniform eltype(grid) Mtot = @uniform @groupsize() tid = @index(Local, NTuple) M = @uniform maximum(Mtot) - wrk = @localmem Float64 (5, M) + wrk = @localmem FT (5, M) @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, tid, wrk, args...) end @@ -298,10 +303,11 @@ end idx = @index(Global, Linear) i, j, k = active_linear_index_to_tuple(idx, map, grid) + FT = @uniform eltype(grid) Mtot = @uniform @groupsize() tid = @index(Local, NTuple) M = @uniform maximum(Mtot) - wrk = @localmem Float64 (5, M) + wrk = @localmem FT (5, M) @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, tid, wrk, args...) end @@ -310,10 +316,11 @@ end @kernel function compute_hydrostatic_free_surface_Ge!(Ge, grid, map, args) i, j, k = @index(Global, NTuple) + FT = @uniform eltype(grid) Mtot = @uniform @groupsize() tid = @index(Local, NTuple) M = @uniform maximum(Mtot) - wrk = @localmem Float64 (5, M) + wrk = @localmem FT (5, M) @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, tid, wrk, args...) end @@ -322,10 +329,11 @@ end idx = @index(Global, Linear) i, j, k = active_linear_index_to_tuple(idx, map, grid) + FT = @uniform eltype(grid) Mtot = @uniform @groupsize() tid = @index(Local, NTuple) M = @uniform maximum(Mtot) - wrk = @localmem Float64 (5, M) + wrk = @localmem FT (5, M) @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, tid, wrk, args...) end From bc5b1d94e46fc7431e263d480b382ef0cf62d4c0 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 12:01:07 -0400 Subject: [PATCH 083/152] test it out --- src/Advection/weno_interpolants.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 68376b074c..1c79df0f2b 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -302,7 +302,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin # The WENO-Z solution here is @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{N, FT}, tid, wrk, + scheme::WENO{N, FT}, tid, wrk, ψ, idx, loc, args...) where {N, FT} From f84d2574feb184c12cf59d4392fc017d5bc3dbf8 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 12:20:35 -0400 Subject: [PATCH 084/152] this should work? --- src/Advection/weno_interpolants.jl | 98 +++++------------ ...ute_hydrostatic_free_surface_tendencies.jl | 100 ++++++++++-------- 2 files changed, 85 insertions(+), 113 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 1c79df0f2b..164f1444e5 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -184,30 +184,11 @@ for buffer in [2, 3, 4, 5, 6] end # Global smoothness indicator τ₂ᵣ₋₁ taken from "Accuracy of the weighted essentially non-oscillatory conservative finite difference schemes", Don & Borges, 2013 -@inline add_global_smoothness(β, ::Val{2}, ::Val{1}) = + β -@inline add_global_smoothness(β, ::Val{2}, ::Val{2}) = - β - -@inline add_global_smoothness(β, ::Val{3}, ::Val{1}) = + β -@inline add_global_smoothness(β, ::Val{3}, ::Val{2}) = 0 -@inline add_global_smoothness(β, ::Val{3}, ::Val{3}) = - β - -@inline add_global_smoothness(β, ::Val{4}, ::Val{1}) = + β -@inline add_global_smoothness(β, ::Val{4}, ::Val{2}) = + 3β -@inline add_global_smoothness(β, ::Val{4}, ::Val{3}) = - 3β -@inline add_global_smoothness(β, ::Val{4}, ::Val{4}) = - β - -@inline add_global_smoothness(β, ::Val{5}, ::Val{1}) = + β -@inline add_global_smoothness(β, ::Val{5}, ::Val{2}) = + 2β -@inline add_global_smoothness(β, ::Val{5}, ::Val{3}) = - 6β -@inline add_global_smoothness(β, ::Val{5}, ::Val{4}) = + 2β -@inline add_global_smoothness(β, ::Val{5}, ::Val{5}) = + β - -@inline add_global_smoothness(β, ::Val{6}, ::Val{1}) = + β -@inline add_global_smoothness(β, ::Val{6}, ::Val{2}) = + β -@inline add_global_smoothness(β, ::Val{6}, ::Val{3}) = - 8β -@inline add_global_smoothness(β, ::Val{6}, ::Val{4}) = + 8β -@inline add_global_smoothness(β, ::Val{6}, ::Val{5}) = - β -@inline add_global_smoothness(β, ::Val{6}, ::Val{6}) = - β +@inline global_smoothness_indicator(::Val{2}, β) = @inbounds abs(β[1] - β[2]) +@inline global_smoothness_indicator(::Val{3}, β) = @inbounds abs(β[1] - β[3]) +@inline global_smoothness_indicator(::Val{4}, β) = @inbounds abs(β[1] + 3β[2] - 3β[3] - β[4]) +@inline global_smoothness_indicator(::Val{5}, β) = @inbounds abs(β[1] + 2β[2] - 6β[3] + 2β[4] + β[5]) +@inline global_smoothness_indicator(::Val{6}, β) = @inbounds abs(β[1] + β[2] - 8β[3] + 8β[4] - β[5] - β[6]) """ calc_weno_stencil(buffer, shift, dir, func::Bool = false) @@ -304,62 +285,48 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, tid, wrk, ψ, idx, loc, args...) where {N, FT} - - - tix = tid[$val] - ntuple(Val(N)) do s + + wrk = ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) β = $biased_β(ψs, scheme, Val(s-1)) C = FT($coeff(scheme, Val(s-1))) α = @inbounds @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - wrk[1, tix] += add_global_smoothness(β, Val(N), Val(s)) - wrk[2, tix] += ψ̅ * C - wrk[3, tix] += C - wrk[4, tix] += ψ̅ * α - wrk[5, tix] += α + (β, C, α, ψ̅ * C, ψ̅ * α) end - wrk[4, tix] *= wrk[1, tix] - wrk[5, tix] *= wrk[1, tix] - + τ = global_smoothness_indicator(Val(N), β) + # Is glob squared here? - return (wrk[2, tix] + wrk[4, tix]) / (wrk[3, tix] + wrk[5, tix]) + return (sum(ψ̅C) + sum(ψ̅α) * τ) / (sum(C) + sum(α) * τ) end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, tid, wrk, - ψ, idx, loc, VI::AbstractSmoothnessStencil, args...) where {N, FT} + ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {N, FT} - tix = tid[$val] - ntuple(Val(N)) do s + β, C, α, ψ̅C, ψ̅α = ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) β = $biased_β(ψs, scheme, Val(s-1)) C = FT($coeff(scheme, Val(s-1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - wrk[1, tix] += add_global_smoothness(β, Val(N), Val(s)) - wrk[2, tix] += ψ̅ * C - wrk[3, tix] += C - wrk[4, tix] += ψ̅ * α - wrk[5, tix] += α + (β, C, α, ψ̅ * C, ψ̅ * α) end - wrk[4, tix] *= wrk[1, tix] - wrk[5, tix] *= wrk[1, tix] - + τ = global_smoothness_indicator(Val(N), β) + # Is glob squared here? - return (wrk[2, tix] + wrk[4, tix]) / (wrk[3, tix] + wrk[5, tix]) + return (sum(ψ̅C) + sum(ψ̅α) * τ) / (sum(C) + sum(α) * τ) end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, tid, wrk, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {N, FT} - tix = tid[$val] - ntuple(Val(N)) do s + β, C, α, ψ̅C, ψ̅α = ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) us = $stencil_u(i, j, k, scheme, Val(s), Val($val), grid, u) @@ -370,26 +337,20 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - wrk[1, tix] += add_global_smoothness(βU, Val(N), Val(s)) - wrk[2, tix] += ψ̅ * C - wrk[3, tix] += C - wrk[4, tix] += ψ̅ * α - wrk[5, tix] += α + (βU, C, α, ψ̅ * C, ψ̅ * α) end - wrk[4, tix] *= wrk[1, tix] - wrk[5, tix] *= wrk[1, tix] - + τ = global_smoothness_indicator(Val(N), β) + # Is glob squared here? - return (wrk[2, tix] + wrk[4, tix]) / (wrk[3, tix] + wrk[5, tix]) + return (sum(ψ̅C) + sum(ψ̅α) * τ) / (sum(C) + sum(α) * τ) end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{N, FT}, tid, wrk, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} - tix = tid[$val] - ntuple(Val(N)) do s + β, C, α, ψ̅C, ψ̅α = ntuple(Val(N)) do s Base.@_inline_meta ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) ϕs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) @@ -397,18 +358,13 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(s-1))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - wrk[1, tix] += add_global_smoothness(βϕ, Val(N), Val(s)) - wrk[2, tix] += ψ̅ * C - wrk[3, tix] += C - wrk[4, tix] += ψ̅ * α - wrk[5, tix] += α + (βϕ, C, α, ψ̅ * C, ψ̅ * α) end - wrk[4, tix] *= wrk[1, tix] - wrk[5, tix] *= wrk[1, tix] - + τ = global_smoothness_indicator(Val(N), β) + # Is glob squared here? - return (wrk[2, tix] + wrk[4, tix]) / (wrk[3, tix] + wrk[5, tix]) + return (sum(ψ̅C) + sum(ψ̅α) * τ) / (sum(C) + sum(α) * τ) end end end diff --git a/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl b/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl index 9004fce985..5ebb7ddc18 100644 --- a/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl +++ b/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl @@ -234,12 +234,14 @@ end @kernel function compute_hydrostatic_free_surface_Gu!(Gu, grid, map, args) i, j, k = @index(Global, NTuple) - FT = @uniform eltype(grid) - Mtot = @uniform @groupsize() - tid = @index(Local, NTuple) - M = @uniform maximum(Mtot) - wrk = @localmem FT (5, M) - + # FT = @uniform eltype(grid) + # Mtot = @uniform @groupsize() + # tid = @index(Local, NTuple) + # M = @uniform maximum(Mtot) + # wrk = @localmem FT (5, M) + tid = nothing + wrk = nothing + @inbounds Gu[i, j, k] = hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, tid, wrk, args...) end @@ -247,11 +249,13 @@ end idx = @index(Global, Linear) i, j, k = active_linear_index_to_tuple(idx, map, grid) - FT = @uniform eltype(grid) - Mtot = @uniform @groupsize() - tid = @index(Local, NTuple) - M = @uniform maximum(Mtot) - wrk = @localmem FT (5, M) + # FT = @uniform eltype(grid) + # Mtot = @uniform @groupsize() + # tid = @index(Local, NTuple) + # M = @uniform maximum(Mtot) + # wrk = @localmem FT (5, M) + tid = nothing + wrk = nothing @inbounds Gu[i, j, k] = hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, tid, wrk, args...) end @@ -260,11 +264,13 @@ end @kernel function compute_hydrostatic_free_surface_Gv!(Gv, grid, map, args) i, j, k = @index(Global, NTuple) - FT = @uniform eltype(grid) - Mtot = @uniform @groupsize() - tid = @index(Local, NTuple) - M = @uniform maximum(Mtot) - wrk = @localmem FT (5, M) + # FT = @uniform eltype(grid) + # Mtot = @uniform @groupsize() + # tid = @index(Local, NTuple) + # M = @uniform maximum(Mtot) + # wrk = @localmem FT (5, M) + tid = nothing + wrk = nothing @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, tid, wrk, args...) end @@ -273,11 +279,13 @@ end idx = @index(Global, Linear) i, j, k = active_linear_index_to_tuple(idx, map, grid) - FT = @uniform eltype(grid) - Mtot = @uniform @groupsize() - tid = @index(Local, NTuple) - M = @uniform maximum(Mtot) - wrk = @localmem FT (5, M) + # FT = @uniform eltype(grid) + # Mtot = @uniform @groupsize() + # tid = @index(Local, NTuple) + # M = @uniform maximum(Mtot) + # wrk = @localmem FT (5, M) + tid = nothing + wrk = nothing @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, tid, wrk, args...) end @@ -290,11 +298,13 @@ end @kernel function compute_hydrostatic_free_surface_Gc!(Gc, grid, map, args) i, j, k = @index(Global, NTuple) - FT = @uniform eltype(grid) - Mtot = @uniform @groupsize() - tid = @index(Local, NTuple) - M = @uniform maximum(Mtot) - wrk = @localmem FT (5, M) + # FT = @uniform eltype(grid) + # Mtot = @uniform @groupsize() + # tid = @index(Local, NTuple) + # M = @uniform maximum(Mtot) + # wrk = @localmem FT (5, M) + tid = nothing + wrk = nothing @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, tid, wrk, args...) end @@ -303,11 +313,13 @@ end idx = @index(Global, Linear) i, j, k = active_linear_index_to_tuple(idx, map, grid) - FT = @uniform eltype(grid) - Mtot = @uniform @groupsize() - tid = @index(Local, NTuple) - M = @uniform maximum(Mtot) - wrk = @localmem FT (5, M) + # FT = @uniform eltype(grid) + # Mtot = @uniform @groupsize() + # tid = @index(Local, NTuple) + # M = @uniform maximum(Mtot) + # wrk = @localmem FT (5, M) + tid = nothing + wrk = nothing @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, tid, wrk, args...) end @@ -316,11 +328,13 @@ end @kernel function compute_hydrostatic_free_surface_Ge!(Ge, grid, map, args) i, j, k = @index(Global, NTuple) - FT = @uniform eltype(grid) - Mtot = @uniform @groupsize() - tid = @index(Local, NTuple) - M = @uniform maximum(Mtot) - wrk = @localmem FT (5, M) + # FT = @uniform eltype(grid) + # Mtot = @uniform @groupsize() + # tid = @index(Local, NTuple) + # M = @uniform maximum(Mtot) + # wrk = @localmem FT (5, M) + tid = nothing + wrk = nothing @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, tid, wrk, args...) end @@ -329,12 +343,14 @@ end idx = @index(Global, Linear) i, j, k = active_linear_index_to_tuple(idx, map, grid) - FT = @uniform eltype(grid) - Mtot = @uniform @groupsize() - tid = @index(Local, NTuple) - M = @uniform maximum(Mtot) - wrk = @localmem FT (5, M) - + # FT = @uniform eltype(grid) + # Mtot = @uniform @groupsize() + # tid = @index(Local, NTuple) + # M = @uniform maximum(Mtot) + # wrk = @localmem FT (5, M) + tid = nothing + wrk = nothing + @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, tid, wrk, args...) end From c1475990ba04b65653a4237c6921bb2cf1ddfac4 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 12:29:14 -0400 Subject: [PATCH 085/152] retry unrolling --- src/Advection/Advection.jl | 10 +- src/Advection/weno_2.jl | 17 ++- src/Advection/weno_3.jl | 24 ++-- src/Advection/weno_4.jl | 32 ++--- src/Advection/weno_5.jl | 40 +++--- src/Advection/weno_interpolants.jl | 207 ++++++++++++++++------------- 6 files changed, 178 insertions(+), 152 deletions(-) diff --git a/src/Advection/Advection.jl b/src/Advection/Advection.jl index d8e36dd9ef..02b27ea60a 100644 --- a/src/Advection/Advection.jl +++ b/src/Advection/Advection.jl @@ -67,11 +67,11 @@ include("centered_reconstruction.jl") include("upwind_biased_reconstruction.jl") include("weno_reconstruction.jl") include("weno_interpolants.jl") -# include("weno_2.jl") -# include("weno_3.jl") -# include("weno_4.jl") -# include("weno_5.jl") -# include("weno_6.jl") +include("weno_2.jl") +include("weno_3.jl") +include("weno_4.jl") +include("weno_5.jl") +include("weno_6.jl") include("stretched_weno_smoothness.jl") include("multi_dimensional_reconstruction.jl") include("vector_invariant_upwinding.jl") diff --git a/src/Advection/weno_2.jl b/src/Advection/weno_2.jl index 18d835b5eb..92f45b69c0 100644 --- a/src/Advection/weno_2.jl +++ b/src/Advection/weno_2.jl @@ -9,7 +9,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT}, + scheme::WENO{2, FT}, tid, wrk, ψ, idx, loc, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -28,7 +28,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(2), Val(1)) + glob += add_global_smoothness(β, Val(2), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -39,7 +39,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT}, + scheme::WENO{2, FT}, tid, wrk, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -58,7 +58,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(2), Val(1)) + glob += add_global_smoothness(β, Val(2), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -69,7 +69,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT}, + scheme::WENO{2, FT}, tid, wrk, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} @@ -97,19 +97,18 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(2), Val(1)) + glob += add_global_smoothness(βU, Val(2), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - # Is glob squared here? return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT}, + scheme::WENO{2, FT}, tid, wrk, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -130,7 +129,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(2), Val(1)) + glob += add_global_smoothness(βϕ, Val(2), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl index b938c6a618..c278376757 100644 --- a/src/Advection/weno_3.jl +++ b/src/Advection/weno_3.jl @@ -9,7 +9,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT}, + scheme::WENO{3, FT}, tid, wrk, ψ, idx, loc, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -28,7 +28,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(3), Val(1)) + glob += add_global_smoothness(β, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -39,7 +39,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(3), Val(2)) + glob += add_global_smoothness(β, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -50,7 +50,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT}, + scheme::WENO{3, FT}, tid, wrk, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -69,7 +69,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(3), Val(1)) + glob += add_global_smoothness(β, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -80,7 +80,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(3), Val(2)) + glob += add_global_smoothness(β, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -91,7 +91,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT}, + scheme::WENO{3, FT}, tid, wrk, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} @@ -119,7 +119,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(3), Val(1)) + glob += add_global_smoothness(βU, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -134,7 +134,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(3), Val(2)) + glob += add_global_smoothness(βU, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -145,7 +145,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT}, + scheme::WENO{3, FT}, tid, wrk, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -166,7 +166,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(3), Val(1)) + glob += add_global_smoothness(βϕ, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -178,7 +178,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(3), Val(2)) + glob += add_global_smoothness(βϕ, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index e5078225dc..d755c0ae18 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -9,7 +9,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, + scheme::WENO{4, FT}, tid, wrk, ψ, idx, loc, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -28,7 +28,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(4), Val(1)) + glob += add_global_smoothness(β, Val(4), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -39,7 +39,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(4), Val(2)) + glob += add_global_smoothness(β, Val(4), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -50,7 +50,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(4), Val(3)) + glob += add_global_smoothness(β, Val(4), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -61,7 +61,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, + scheme::WENO{4, FT}, tid, wrk, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -80,7 +80,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(4), Val(1)) + glob += add_global_smoothness(β, Val(4), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -91,7 +91,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(4), Val(2)) + glob += add_global_smoothness(β, Val(4), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -102,7 +102,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(4), Val(3)) + glob += add_global_smoothness(β, Val(4), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -113,7 +113,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, + scheme::WENO{4, FT}, tid, wrk, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} @@ -141,7 +141,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(4), Val(1)) + glob += add_global_smoothness(βU, Val(4), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -156,7 +156,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(4), Val(2)) + glob += add_global_smoothness(βU, Val(4), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -171,7 +171,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(4), Val(3)) + glob += add_global_smoothness(βU, Val(4), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -182,7 +182,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, + scheme::WENO{4, FT}, tid, wrk, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -203,7 +203,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(4), Val(1)) + glob += add_global_smoothness(βϕ, Val(4), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -215,7 +215,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(4), Val(2)) + glob += add_global_smoothness(βϕ, Val(4), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -227,7 +227,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(4), Val(3)) + glob += add_global_smoothness(βϕ, Val(4), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl index 6381c6e4e6..b75861b379 100644 --- a/src/Advection/weno_5.jl +++ b/src/Advection/weno_5.jl @@ -9,7 +9,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT}, + scheme::WENO{5, FT}, tid, wrk, ψ, idx, loc, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -28,7 +28,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(5), Val(1)) + glob += add_global_smoothness(β, Val(5), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -39,7 +39,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(5), Val(2)) + glob += add_global_smoothness(β, Val(5), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -50,7 +50,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(5), Val(3)) + glob += add_global_smoothness(β, Val(5), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -61,7 +61,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(4))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(5), Val(4)) + glob += add_global_smoothness(β, Val(5), Val(4)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -72,7 +72,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT}, + scheme::WENO{5, FT}, tid, wrk, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -91,7 +91,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(5), Val(1)) + glob += add_global_smoothness(β, Val(5), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -102,7 +102,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(5), Val(2)) + glob += add_global_smoothness(β, Val(5), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -113,7 +113,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(5), Val(3)) + glob += add_global_smoothness(β, Val(5), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -124,7 +124,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(4))) α = @fastmath C / (β + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, β, Val(5), Val(4)) + glob += add_global_smoothness(β, Val(5), Val(4)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -135,7 +135,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT}, + scheme::WENO{5, FT}, tid, wrk, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) @@ -162,7 +162,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(5), Val(1)) + glob += add_global_smoothness(βU, Val(5), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -177,7 +177,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(5), Val(2)) + glob += add_global_smoothness(βU, Val(5), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -192,7 +192,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(5), Val(3)) + glob += add_global_smoothness(βU, Val(5), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -207,7 +207,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(4))) α = @fastmath C / (βU + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βU, Val(5), Val(4)) + glob += add_global_smoothness(βU, Val(5), Val(4)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -218,7 +218,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT}, + scheme::WENO{5, FT}, tid, wrk, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -239,7 +239,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(5), Val(1)) + glob += add_global_smoothness(βϕ, Val(5), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -251,7 +251,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(5), Val(2)) + glob += add_global_smoothness(βϕ, Val(5), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -263,7 +263,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(3))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(5), Val(3)) + glob += add_global_smoothness(βϕ, Val(5), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -275,7 +275,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ C = FT($coeff(scheme, Val(4))) α = @fastmath C / (βϕ + FT(ε))^2 ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(glob, βϕ, Val(5), Val(4)) + glob += add_global_smoothness(βϕ, Val(5), Val(4)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 164f1444e5..cb1fc7582a 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -190,6 +190,31 @@ end @inline global_smoothness_indicator(::Val{5}, β) = @inbounds abs(β[1] + 2β[2] - 6β[3] + 2β[4] + β[5]) @inline global_smoothness_indicator(::Val{6}, β) = @inbounds abs(β[1] + β[2] - 8β[3] + 8β[4] - β[5] - β[6]) +@inline add_global_smoothness(β, ::Val{2}, ::Val{1}) = + β +@inline add_global_smoothness(β, ::Val{2}, ::Val{2}) = - β + +@inline add_global_smoothness(β, ::Val{3}, ::Val{1}) = + β +@inline add_global_smoothness(β, ::Val{3}, ::Val{2}) = 0 +@inline add_global_smoothness(β, ::Val{3}, ::Val{3}) = - β + +@inline add_global_smoothness(β, ::Val{4}, ::Val{1}) = + β +@inline add_global_smoothness(β, ::Val{4}, ::Val{2}) = + 3β +@inline add_global_smoothness(β, ::Val{4}, ::Val{3}) = - 3β +@inline add_global_smoothness(β, ::Val{4}, ::Val{4}) = - β + +@inline add_global_smoothness(β, ::Val{5}, ::Val{1}) = + β +@inline add_global_smoothness(β, ::Val{5}, ::Val{2}) = + 2β +@inline add_global_smoothness(β, ::Val{5}, ::Val{3}) = - 6β +@inline add_global_smoothness(β, ::Val{5}, ::Val{4}) = + 2β +@inline add_global_smoothness(β, ::Val{5}, ::Val{5}) = + β + +@inline add_global_smoothness(β, ::Val{6}, ::Val{1}) = + β +@inline add_global_smoothness(β, ::Val{6}, ::Val{2}) = + β +@inline add_global_smoothness(β, ::Val{6}, ::Val{3}) = - 8β +@inline add_global_smoothness(β, ::Val{6}, ::Val{4}) = + 8β +@inline add_global_smoothness(β, ::Val{6}, ::Val{5}) = - β +@inline add_global_smoothness(β, ::Val{6}, ::Val{6}) = - β + """ calc_weno_stencil(buffer, shift, dir, func::Bool = false) @@ -271,100 +296,102 @@ end @inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, grid, v) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) @inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, grid, v) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) -for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) - - @eval begin - # The WENO-Z solution here is - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{N, FT}, tid, wrk, - ψ, idx, loc, args...) where {N, FT} +# for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) +# biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) +# biased_β = Symbol(side, :_biased_β) +# biased_p = Symbol(side, :_biased_p) +# coeff = Symbol(:coeff_, side) +# stencil = Symbol(side, :_stencil_, dir) +# stencil_u = Symbol(:tangential_, side, :_stencil_u) +# stencil_v = Symbol(:tangential_, side, :_stencil_v) + +# @eval begin +# # The WENO-Z solution here is +# @inline function $biased_interpolate(i, j, k, grid, +# scheme::WENO{N, FT}, tid, wrk, +# ψ, idx, loc, args...) where {N, FT} - wrk = ntuple(Val(N)) do s - Base.@_inline_meta - ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(s-1)) - C = FT($coeff(scheme, Val(s-1))) - α = @inbounds @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - (β, C, α, ψ̅ * C, ψ̅ * α) - end - - τ = global_smoothness_indicator(Val(N), β) +# wrk = ntuple(Val(N)) do s +# Base.@_inline_meta +# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) +# β = $biased_β(ψs, scheme, Val(s-1)) +# C = FT($coeff(scheme, Val(s-1))) +# α = @inbounds @fastmath C / (β + FT(ε))^2 +# ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) +# (β, C, α, ψ̅ * C, ψ̅ * α) +# end + +# τ = global_smoothness_indicator(Val(N), β) - # Is glob squared here? - return (sum(ψ̅C) + sum(ψ̅α) * τ) / (sum(C) + sum(α) * τ) - end +# # Is glob squared here? +# return (sum(ψ̅C) + sum(ψ̅α) * τ) / (sum(C) + sum(α) * τ) +# end - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{N, FT}, tid, wrk, - ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {N, FT} +# @inline function $biased_interpolate(i, j, k, grid, +# scheme::WENO{N, FT}, tid, wrk, +# ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {N, FT} - β, C, α, ψ̅C, ψ̅α = ntuple(Val(N)) do s - Base.@_inline_meta - ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(s-1)) - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - (β, C, α, ψ̅ * C, ψ̅ * α) - end - - τ = global_smoothness_indicator(Val(N), β) +# β, C, α, ψ̅C, ψ̅α = ntuple(Val(N)) do s +# Base.@_inline_meta +# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) +# β = $biased_β(ψs, scheme, Val(s-1)) +# C = FT($coeff(scheme, Val(s-1))) +# α = @fastmath C / (β + FT(ε))^2 +# ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) +# (β, C, α, ψ̅ * C, ψ̅ * α) +# end + +# τ = global_smoothness_indicator(Val(N), β) - # Is glob squared here? - return (sum(ψ̅C) + sum(ψ̅α) * τ) / (sum(C) + sum(α) * τ) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{N, FT}, tid, wrk, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {N, FT} - - β, C, α, ψ̅C, ψ̅α = ntuple(Val(N)) do s - Base.@_inline_meta - ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(s), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(s), Val($val), grid, v) - βu = $biased_β(us, scheme, Val(s-1)) - βv = $biased_β(vs, scheme, Val(s-1)) - βU = 0.5 * (βu + βv) - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (βU + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - (βU, C, α, ψ̅ * C, ψ̅ * α) - end - - τ = global_smoothness_indicator(Val(N), β) +# # Is glob squared here? +# return (sum(ψ̅C) + sum(ψ̅α) * τ) / (sum(C) + sum(α) * τ) +# end + +# @inline function $biased_interpolate(i, j, k, grid, +# scheme::WENO{N, FT}, tid, wrk, +# ψ, idx, loc, ::VelocityStencil, u, v, args...) where {N, FT} + +# β, C, α, ψ̅C, ψ̅α = ntuple(Val(N)) do s +# Base.@_inline_meta +# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) +# us = $stencil_u(i, j, k, scheme, Val(s), Val($val), grid, u) +# vs = $stencil_v(i, j, k, scheme, Val(s), Val($val), grid, v) +# βu = $biased_β(us, scheme, Val(s-1)) +# βv = $biased_β(vs, scheme, Val(s-1)) +# βU = 0.5 * (βu + βv) +# C = FT($coeff(scheme, Val(s-1))) +# α = @fastmath C / (βU + FT(ε))^2 +# ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) +# (βU, C, α, ψ̅ * C, ψ̅ * α) +# end + +# τ = global_smoothness_indicator(Val(N), β) - # Is glob squared here? - return (sum(ψ̅C) + sum(ψ̅α) * τ) / (sum(C) + sum(α) * τ) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{N, FT}, tid, wrk, - ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} - - β, C, α, ψ̅C, ψ̅α = ntuple(Val(N)) do s - Base.@_inline_meta - ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) - ϕs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) - βϕ = $biased_β(ϕs, scheme, Val(s-1)) - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (βϕ + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) - (βϕ, C, α, ψ̅ * C, ψ̅ * α) - end - - τ = global_smoothness_indicator(Val(N), β) +# # Is glob squared here? +# return (sum(ψ̅C) + sum(ψ̅α) * τ) / (sum(C) + sum(α) * τ) +# end + +# @inline function $biased_interpolate(i, j, k, grid, +# scheme::WENO{N, FT}, tid, wrk, +# ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} + +# β, C, α, ψ̅C, ψ̅α = ntuple(Val(N)) do s +# Base.@_inline_meta +# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) +# ϕs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) +# βϕ = $biased_β(ϕs, scheme, Val(s-1)) +# C = FT($coeff(scheme, Val(s-1))) +# α = @fastmath C / (βϕ + FT(ε))^2 +# ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) +# @show (βϕ, C, α, ψ̅ * C, ψ̅ * α) +# (βϕ, C, α, ψ̅ * C, ψ̅ * α) +# end + + +# τ = global_smoothness_indicator(Val(N), β) - # Is glob squared here? - return (sum(ψ̅C) + sum(ψ̅α) * τ) / (sum(C) + sum(α) * τ) - end - end -end +# # Is glob squared here? +# return (sum(ψ̅C) + sum(ψ̅α) * τ) / (sum(C) + sum(α) * τ) +# end +# end +# end From 3ab1b7d92337ebe9a0ca76793e32f16fb9fa04e3 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 12:39:56 -0400 Subject: [PATCH 086/152] let's try it out --- src/Advection/weno_2.jl | 32 ++++++++--------- src/Advection/weno_3.jl | 42 +++++++++++----------- src/Advection/weno_4.jl | 64 ++++++++++++++++----------------- src/Advection/weno_5.jl | 80 ++++++++++++++++++++--------------------- 4 files changed, 109 insertions(+), 109 deletions(-) diff --git a/src/Advection/weno_2.jl b/src/Advection/weno_2.jl index 92f45b69c0..0b04eab0ef 100644 --- a/src/Advection/weno_2.jl +++ b/src/Advection/weno_2.jl @@ -73,14 +73,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) - βu = $biased_β(us, scheme, Val(0)) - βv = $biased_β(vs, scheme, Val(0)) + ψs = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) + βu = $biased_β(ψs, scheme, Val(0)) + ψs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) + βv = $biased_β(ψs, scheme, Val(0)) βU = 0.5 * (βu + βv) C = FT($coeff(scheme, Val(0))) α = @fastmath C / (βU + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) glob = βU sol1 = ψ̅ * C @@ -88,14 +88,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(2), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(2), Val($val), grid, v) - βu = $biased_β(us, scheme, Val(1)) - βv = $biased_β(vs, scheme, Val(1)) + ψs = $stencil_u(i, j, k, scheme, Val(2), Val($val), grid, u) + βu = $biased_β(ψs, scheme, Val(1)) + ψs = $stencil_v(i, j, k, scheme, Val(2), Val($val), grid, v) + βv = $biased_β(ψs, scheme, Val(1)) βU = 0.5 * (βu + βv) C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βU + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, u, v, args...) ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βU, Val(2), Val(1)) sol1 += ψ̅ * C @@ -111,11 +111,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{2, FT}, tid, wrk, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) - βϕ = $biased_β(ϕs, scheme, Val(0)) + ψs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) + βϕ = $biased_β(ψs, scheme, Val(0)) C = FT($coeff(scheme, Val(0))) α = @fastmath C / (βϕ + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) glob = βϕ sol1 = ψ̅ * C @@ -123,11 +123,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) - ϕs = $stencil(i, j, k, scheme, Val(2), VI.func, grid, args...) - βϕ = $biased_β(ϕs, scheme, Val(1)) + ψs = $stencil(i, j, k, scheme, Val(2), VI.func, grid, args...) + βϕ = $biased_β(ψs, scheme, Val(1)) C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βϕ + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βϕ, Val(2), Val(1)) sol1 += ψ̅ * C diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl index c278376757..2882a60dab 100644 --- a/src/Advection/weno_3.jl +++ b/src/Advection/weno_3.jl @@ -95,14 +95,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) - βu = $biased_β(us, scheme, Val(0)) - βv = $biased_β(vs, scheme, Val(0)) + ψs = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) + βu = $biased_β(ψs, scheme, Val(0)) + ψs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) + βv = $biased_β(ψs, scheme, Val(0)) βU = 0.5 * (βu + βv) C = FT($coeff(scheme, Val(0))) α = @fastmath C / (βU + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) glob = βU sol1 = ψ̅ * C @@ -110,14 +110,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(2), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(2), Val($val), grid, v) - βu = $biased_β(us, scheme, Val(1)) - βv = $biased_β(vs, scheme, Val(1)) + ψs = $stencil_u(i, j, k, scheme, Val(2), Val($val), grid, u) + βu = $biased_β(ψs, scheme, Val(1)) + ψs = $stencil_v(i, j, k, scheme, Val(2), Val($val), grid, v) + βv = $biased_β(ψs, scheme, Val(1)) βU = 0.5 * (βu + βv) C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βU + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, u, v, args...) ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βU, Val(3), Val(1)) sol1 += ψ̅ * C @@ -125,14 +125,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(3), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(3), Val($val), grid, v) - βu = $biased_β(us, scheme, Val(2)) - βv = $biased_β(vs, scheme, Val(2)) + ψs = $stencil_u(i, j, k, scheme, Val(3), Val($val), grid, u) + βu = $biased_β(ψs, scheme, Val(2)) + ψs = $stencil_v(i, j, k, scheme, Val(3), Val($val), grid, v) + βv = $biased_β(ψs, scheme, Val(2)) βU = 0.5 * (βu + βv) C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βU + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, u, v, args...) ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βU, Val(3), Val(2)) sol1 += ψ̅ * C @@ -148,36 +148,36 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{3, FT}, tid, wrk, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) βϕ = $biased_β(ϕs, scheme, Val(0)) C = FT($coeff(scheme, Val(0))) α = @fastmath C / (βϕ + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + ϕs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + ψ̅ = $biased_p(scheme, Val(0), ϕs, Nothing, Val($val), idx, loc) glob = βϕ sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) ϕs = $stencil(i, j, k, scheme, Val(2), VI.func, grid, args...) βϕ = $biased_β(ϕs, scheme, Val(1)) C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βϕ + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + ϕs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) + ψ̅ = $biased_p(scheme, Val(1), ϕs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βϕ, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) ϕs = $stencil(i, j, k, scheme, Val(3), VI.func, grid, args...) βϕ = $biased_β(ϕs, scheme, Val(2)) C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βϕ + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + ϕs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) + ψ̅ = $biased_p(scheme, Val(2), ϕs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βϕ, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index d755c0ae18..e4f03ba1db 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -117,14 +117,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) - βu = $biased_β(us, scheme, Val(0)) - βv = $biased_β(vs, scheme, Val(0)) + ψs = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) + βu = $biased_β(ψs, scheme, Val(0)) + ψs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) + βv = $biased_β(ψs, scheme, Val(0)) βU = 0.5 * (βu + βv) C = FT($coeff(scheme, Val(0))) α = @fastmath C / (βU + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) glob = βU sol1 = ψ̅ * C @@ -132,14 +132,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(2), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(2), Val($val), grid, v) - βu = $biased_β(us, scheme, Val(1)) - βv = $biased_β(vs, scheme, Val(1)) + ψs = $stencil_u(i, j, k, scheme, Val(2), Val($val), grid, u) + βu = $biased_β(ψs, scheme, Val(1)) + ψs = $stencil_v(i, j, k, scheme, Val(2), Val($val), grid, v) + βv = $biased_β(ψs, scheme, Val(1)) βU = 0.5 * (βu + βv) C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βU + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, u, v, args...) ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βU, Val(4), Val(1)) sol1 += ψ̅ * C @@ -147,14 +147,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(3), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(3), Val($val), grid, v) - βu = $biased_β(us, scheme, Val(2)) - βv = $biased_β(vs, scheme, Val(2)) + ψs = $stencil_u(i, j, k, scheme, Val(3), Val($val), grid, u) + βu = $biased_β(ψs, scheme, Val(2)) + ψs = $stencil_v(i, j, k, scheme, Val(3), Val($val), grid, v) + βv = $biased_β(ψs, scheme, Val(2)) βU = 0.5 * (βu + βv) C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βU + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, u, v, args...) ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βU, Val(4), Val(2)) sol1 += ψ̅ * C @@ -162,14 +162,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(4), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(4), Val($val), grid, v) - βu = $biased_β(us, scheme, Val(3)) - βv = $biased_β(vs, scheme, Val(3)) + ψs = $stencil_u(i, j, k, scheme, Val(4), Val($val), grid, u) + βu = $biased_β(ψs, scheme, Val(3)) + ψs = $stencil_v(i, j, k, scheme, Val(4), Val($val), grid, v) + βv = $biased_β(ψs, scheme, Val(3)) βU = 0.5 * (βu + βv) C = FT($coeff(scheme, Val(3))) α = @fastmath C / (βU + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, u, v, args...) ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βU, Val(4), Val(3)) sol1 += ψ̅ * C @@ -185,11 +185,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{4, FT}, tid, wrk, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) - βϕ = $biased_β(ϕs, scheme, Val(0)) + ψs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) + βϕ = $biased_β(ψs, scheme, Val(0)) C = FT($coeff(scheme, Val(0))) α = @fastmath C / (βϕ + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) glob = βϕ sol1 = ψ̅ * C @@ -197,11 +197,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) - ϕs = $stencil(i, j, k, scheme, Val(2), VI.func, grid, args...) - βϕ = $biased_β(ϕs, scheme, Val(1)) + ψs = $stencil(i, j, k, scheme, Val(2), VI.func, grid, args...) + βϕ = $biased_β(ψs, scheme, Val(1)) C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βϕ + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βϕ, Val(4), Val(1)) sol1 += ψ̅ * C @@ -209,11 +209,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) - ϕs = $stencil(i, j, k, scheme, Val(3), VI.func, grid, args...) - βϕ = $biased_β(ϕs, scheme, Val(2)) + ψs = $stencil(i, j, k, scheme, Val(3), VI.func, grid, args...) + βϕ = $biased_β(ψs, scheme, Val(2)) C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βϕ + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βϕ, Val(4), Val(2)) sol1 += ψ̅ * C @@ -221,11 +221,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) - ϕs = $stencil(i, j, k, scheme, Val(4), VI.func, grid, args...) - βϕ = $biased_β(ϕs, scheme, Val(3)) + ψs = $stencil(i, j, k, scheme, Val(4), VI.func, grid, args...) + βϕ = $biased_β(ψs, scheme, Val(3)) C = FT($coeff(scheme, Val(3))) α = @fastmath C / (βϕ + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βϕ, Val(4), Val(3)) sol1 += ψ̅ * C diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl index b75861b379..c7d84c921b 100644 --- a/src/Advection/weno_5.jl +++ b/src/Advection/weno_5.jl @@ -138,14 +138,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{5, FT}, tid, wrk, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) - βu = $biased_β(us, scheme, Val(0)) - βv = $biased_β(vs, scheme, Val(0)) + ψs = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) + βu = $biased_β(ψs, scheme, Val(0)) + ψs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) + βv = $biased_β(ψs, scheme, Val(0)) βU = 0.5 * (βu + βv) C = FT($coeff(scheme, Val(0))) α = @fastmath C / (βU + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) glob = βU sol1 = ψ̅ * C @@ -153,14 +153,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(2), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(2), Val($val), grid, v) - βu = $biased_β(us, scheme, Val(1)) - βv = $biased_β(vs, scheme, Val(1)) + ψs = $stencil_u(i, j, k, scheme, Val(2), Val($val), grid, u) + βu = $biased_β(ψs, scheme, Val(1)) + ψs = $stencil_v(i, j, k, scheme, Val(2), Val($val), grid, v) + βv = $biased_β(ψs, scheme, Val(1)) βU = 0.5 * (βu + βv) C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βU + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, u, v, args...) ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βU, Val(5), Val(1)) sol1 += ψ̅ * C @@ -168,14 +168,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(3), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(3), Val($val), grid, v) - βu = $biased_β(us, scheme, Val(2)) - βv = $biased_β(vs, scheme, Val(2)) + ψs = $stencil_u(i, j, k, scheme, Val(3), Val($val), grid, u) + βu = $biased_β(ψs, scheme, Val(2)) + ψs = $stencil_v(i, j, k, scheme, Val(3), Val($val), grid, v) + βv = $biased_β(ψs, scheme, Val(2)) βU = 0.5 * (βu + βv) C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βU + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, u, v, args...) ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βU, Val(5), Val(2)) sol1 += ψ̅ * C @@ -183,14 +183,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(4), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(4), Val($val), grid, v) - βu = $biased_β(us, scheme, Val(3)) - βv = $biased_β(vs, scheme, Val(3)) + ψs = $stencil_u(i, j, k, scheme, Val(4), Val($val), grid, u) + βu = $biased_β(ψs, scheme, Val(3)) + ψs = $stencil_v(i, j, k, scheme, Val(4), Val($val), grid, v) + βv = $biased_β(ψs, scheme, Val(3)) βU = 0.5 * (βu + βv) C = FT($coeff(scheme, Val(3))) α = @fastmath C / (βU + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, u, v, args...) ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βU, Val(5), Val(3)) sol1 += ψ̅ * C @@ -198,14 +198,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(5), ψ, grid, u, v, args...) - us = $stencil_u(i, j, k, scheme, Val(5), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(5), Val($val), grid, v) - βu = $biased_β(us, scheme, Val(4)) - βv = $biased_β(vs, scheme, Val(4)) + ψs = $stencil_u(i, j, k, scheme, Val(5), Val($val), grid, u) + βu = $biased_β(ψs, scheme, Val(4)) + ψs = $stencil_v(i, j, k, scheme, Val(5), Val($val), grid, v) + βv = $biased_β(ψs, scheme, Val(4)) βU = 0.5 * (βu + βv) C = FT($coeff(scheme, Val(4))) α = @fastmath C / (βU + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(5), ψ, grid, u, v, args...) ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βU, Val(5), Val(4)) sol1 += ψ̅ * C @@ -221,11 +221,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{5, FT}, tid, wrk, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) - βϕ = $biased_β(ϕs, scheme, Val(0)) + ψs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) + βϕ = $biased_β(ψs, scheme, Val(0)) C = FT($coeff(scheme, Val(0))) α = @fastmath C / (βϕ + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) glob = βϕ sol1 = ψ̅ * C @@ -233,11 +233,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) - ϕs = $stencil(i, j, k, scheme, Val(2), VI.func, grid, args...) - βϕ = $biased_β(ϕs, scheme, Val(1)) + ψs = $stencil(i, j, k, scheme, Val(2), VI.func, grid, args...) + βϕ = $biased_β(ψs, scheme, Val(1)) C = FT($coeff(scheme, Val(1))) α = @fastmath C / (βϕ + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βϕ, Val(5), Val(1)) sol1 += ψ̅ * C @@ -245,11 +245,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) - ϕs = $stencil(i, j, k, scheme, Val(3), VI.func, grid, args...) - βϕ = $biased_β(ϕs, scheme, Val(2)) + ψs = $stencil(i, j, k, scheme, Val(3), VI.func, grid, args...) + βϕ = $biased_β(ψs, scheme, Val(2)) C = FT($coeff(scheme, Val(2))) α = @fastmath C / (βϕ + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βϕ, Val(5), Val(2)) sol1 += ψ̅ * C @@ -257,11 +257,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) - ϕs = $stencil(i, j, k, scheme, Val(4), VI.func, grid, args...) - βϕ = $biased_β(ϕs, scheme, Val(3)) + ψs = $stencil(i, j, k, scheme, Val(4), VI.func, grid, args...) + βϕ = $biased_β(ψs, scheme, Val(3)) C = FT($coeff(scheme, Val(3))) α = @fastmath C / (βϕ + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βϕ, Val(5), Val(3)) sol1 += ψ̅ * C @@ -269,11 +269,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(5), ψ, grid, args...) - ϕs = $stencil(i, j, k, scheme, Val(5), VI.func, grid, args...) - βϕ = $biased_β(ϕs, scheme, Val(4)) + ψs = $stencil(i, j, k, scheme, Val(5), VI.func, grid, args...) + βϕ = $biased_β(ψs, scheme, Val(4)) C = FT($coeff(scheme, Val(4))) α = @fastmath C / (βϕ + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(5), ψ, grid, args...) ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) glob += add_global_smoothness(βϕ, Val(5), Val(4)) sol1 += ψ̅ * C From 83778eaba5365a7d4a32a30255b522a65f3021a4 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 13:24:20 -0400 Subject: [PATCH 087/152] remove tid and wrk --- src/Advection/centered_advective_fluxes.jl | 24 +++---- src/Advection/reconstruction_coefficients.jl | 24 +++---- src/Advection/tracer_advection_operators.jl | 17 ++--- .../upwind_biased_advective_fluxes.jl | 72 +++++++++---------- src/Advection/vector_invariant_advection.jl | 52 +++++++------- .../vector_invariant_self_upwinding.jl | 24 +++---- src/Advection/weno_2.jl | 9 ++- src/Advection/weno_3.jl | 1 - src/Advection/weno_4.jl | 1 - ...ute_hydrostatic_free_surface_tendencies.jl | 16 ++--- ..._free_surface_tendency_kernel_functions.jl | 12 ++-- 11 files changed, 125 insertions(+), 127 deletions(-) diff --git a/src/Advection/centered_advective_fluxes.jl b/src/Advection/centered_advective_fluxes.jl index 4431f41303..c58255bb84 100644 --- a/src/Advection/centered_advective_fluxes.jl +++ b/src/Advection/centered_advective_fluxes.jl @@ -12,22 +12,22 @@ const CenteredScheme = AbstractCenteredAdvectionScheme ##### Note the convention "advective_momentum_flux_Ua" corresponds to the advection _of_ a _by_ U. ##### -@inline advective_momentum_flux_Uu(i, j, k, grid, scheme::CenteredScheme, U, u, tid, wrk) = @inbounds Axᶜᶜᶜ(i, j, k, grid) * _symmetric_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, U) * _symmetric_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, u) -@inline advective_momentum_flux_Vu(i, j, k, grid, scheme::CenteredScheme, V, u, tid, wrk) = @inbounds Ayᶠᶠᶜ(i, j, k, grid) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, V) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, u) -@inline advective_momentum_flux_Wu(i, j, k, grid, scheme::CenteredScheme, W, u, tid, wrk) = @inbounds Azᶠᶜᶠ(i, j, k, grid) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, W) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, u) +@inline advective_momentum_flux_Uu(i, j, k, grid, scheme::CenteredScheme, U, u) = @inbounds Axᶜᶜᶜ(i, j, k, grid) * _symmetric_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, U) * _symmetric_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, u) +@inline advective_momentum_flux_Vu(i, j, k, grid, scheme::CenteredScheme, V, u) = @inbounds Ayᶠᶠᶜ(i, j, k, grid) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, V) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, u) +@inline advective_momentum_flux_Wu(i, j, k, grid, scheme::CenteredScheme, W, u) = @inbounds Azᶠᶜᶠ(i, j, k, grid) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, W) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, u) -@inline advective_momentum_flux_Uv(i, j, k, grid, scheme::CenteredScheme, U, v, tid, wrk) = @inbounds Axᶠᶠᶜ(i, j, k, grid) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, U) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, v) -@inline advective_momentum_flux_Vv(i, j, k, grid, scheme::CenteredScheme, V, v, tid, wrk) = @inbounds Ayᶜᶜᶜ(i, j, k, grid) * _symmetric_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, V) * _symmetric_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, v) -@inline advective_momentum_flux_Wv(i, j, k, grid, scheme::CenteredScheme, W, v, tid, wrk) = @inbounds Azᶜᶠᶠ(i, j, k, grid) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, W) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, v) +@inline advective_momentum_flux_Uv(i, j, k, grid, scheme::CenteredScheme, U, v) = @inbounds Axᶠᶠᶜ(i, j, k, grid) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, U) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, v) +@inline advective_momentum_flux_Vv(i, j, k, grid, scheme::CenteredScheme, V, v) = @inbounds Ayᶜᶜᶜ(i, j, k, grid) * _symmetric_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, V) * _symmetric_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, v) +@inline advective_momentum_flux_Wv(i, j, k, grid, scheme::CenteredScheme, W, v) = @inbounds Azᶜᶠᶠ(i, j, k, grid) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, W) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, v) -@inline advective_momentum_flux_Uw(i, j, k, grid, scheme::CenteredScheme, U, w, tid, wrk) = @inbounds Axᶠᶜᶠ(i, j, k, grid) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, U) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, w) -@inline advective_momentum_flux_Vw(i, j, k, grid, scheme::CenteredScheme, V, w, tid, wrk) = @inbounds Ayᶜᶠᶠ(i, j, k, grid) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, V) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, w) -@inline advective_momentum_flux_Ww(i, j, k, grid, scheme::CenteredScheme, W, w, tid, wrk) = @inbounds Azᶜᶜᶜ(i, j, k, grid) * _symmetric_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, W) * _symmetric_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, w) +@inline advective_momentum_flux_Uw(i, j, k, grid, scheme::CenteredScheme, U, w) = @inbounds Axᶠᶜᶠ(i, j, k, grid) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, U) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, w) +@inline advective_momentum_flux_Vw(i, j, k, grid, scheme::CenteredScheme, V, w) = @inbounds Ayᶜᶠᶠ(i, j, k, grid) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, V) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, w) +@inline advective_momentum_flux_Ww(i, j, k, grid, scheme::CenteredScheme, W, w) = @inbounds Azᶜᶜᶜ(i, j, k, grid) * _symmetric_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, W) * _symmetric_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, w) ##### ##### Advective tracer flux operators ##### -@inline advective_tracer_flux_x(i, j, k, grid, scheme::CenteredScheme, U, c, tid, wrk) = @inbounds Ax_qᶠᶜᶜ(i, j, k, grid, U) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, c) -@inline advective_tracer_flux_y(i, j, k, grid, scheme::CenteredScheme, V, c, tid, wrk) = @inbounds Ay_qᶜᶠᶜ(i, j, k, grid, V) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, c) -@inline advective_tracer_flux_z(i, j, k, grid, scheme::CenteredScheme, W, c, tid, wrk) = @inbounds Az_qᶜᶜᶠ(i, j, k, grid, W) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, c) +@inline advective_tracer_flux_x(i, j, k, grid, scheme::CenteredScheme, U, c) = @inbounds Ax_qᶠᶜᶜ(i, j, k, grid, U) * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, c) +@inline advective_tracer_flux_y(i, j, k, grid, scheme::CenteredScheme, V, c) = @inbounds Ay_qᶜᶠᶜ(i, j, k, grid, V) * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, c) +@inline advective_tracer_flux_z(i, j, k, grid, scheme::CenteredScheme, W, c) = @inbounds Az_qᶜᶜᶠ(i, j, k, grid, W) * _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, c) diff --git a/src/Advection/reconstruction_coefficients.jl b/src/Advection/reconstruction_coefficients.jl index 6ddd709b4f..adcf18c925 100644 --- a/src/Advection/reconstruction_coefficients.jl +++ b/src/Advection/reconstruction_coefficients.jl @@ -8,21 +8,21 @@ @inline symmetric_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, ψ, args...) = inner_symmetric_interpolate_yᵃᶠᵃ(i, j+1, k, grid, scheme, ψ, j, Center, args...) @inline symmetric_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, ψ, args...) = inner_symmetric_interpolate_zᵃᵃᶠ(i, j, k+1, grid, scheme, ψ, k, Center, args...) -@inline left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, ψ, i, Face, args...) -@inline left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, ψ, j, Face, args...) -@inline left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, ψ, k, Face, args...) +@inline left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, ψ, args...) = inner_left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, ψ, i, Face, args...) +@inline left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, ψ, args...) = inner_left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, ψ, j, Face, args...) +@inline left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, ψ, args...) = inner_left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, ψ, k, Face, args...) -@inline right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, ψ, i, Face, args...) -@inline right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, ψ, j, Face, args...) -@inline right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, ψ, k, Face, args...) +@inline right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, ψ, args...) = inner_right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, ψ, i, Face, args...) +@inline right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, ψ, args...) = inner_right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, ψ, j, Face, args...) +@inline right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, ψ, args...) = inner_right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, ψ, k, Face, args...) -@inline left_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_left_biased_interpolate_xᶠᵃᵃ(i+1, j, k, grid, scheme, tid, wrk, ψ, i, Center, args...) -@inline left_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_left_biased_interpolate_yᵃᶠᵃ(i, j+1, k, grid, scheme, tid, wrk, ψ, j, Center, args...) -@inline left_biased_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_left_biased_interpolate_zᵃᵃᶠ(i, j, k+1, grid, scheme, tid, wrk, ψ, k, Center, args...) +@inline left_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, ψ, args...) = inner_left_biased_interpolate_xᶠᵃᵃ(i+1, j, k, grid, scheme, ψ, i, Center, args...) +@inline left_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, ψ, args...) = inner_left_biased_interpolate_yᵃᶠᵃ(i, j+1, k, grid, scheme, ψ, j, Center, args...) +@inline left_biased_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, ψ, args...) = inner_left_biased_interpolate_zᵃᵃᶠ(i, j, k+1, grid, scheme, ψ, k, Center, args...) -@inline right_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_right_biased_interpolate_xᶠᵃᵃ(i+1, j, k, grid, scheme, tid, wrk, ψ, i, Center, args...) -@inline right_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_right_biased_interpolate_yᵃᶠᵃ(i, j+1, k, grid, scheme, tid, wrk, ψ, j, Center, args...) -@inline right_biased_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, tid, wrk, ψ, args...) = inner_right_biased_interpolate_zᵃᵃᶠ(i, j, k+1, grid, scheme, tid, wrk, ψ, k, Center, args...) +@inline right_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, ψ, args...) = inner_right_biased_interpolate_xᶠᵃᵃ(i+1, j, k, grid, scheme, ψ, i, Center, args...) +@inline right_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, ψ, args...) = inner_right_biased_interpolate_yᵃᶠᵃ(i, j+1, k, grid, scheme, ψ, j, Center, args...) +@inline right_biased_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, ψ, args...) = inner_right_biased_interpolate_zᵃᵃᶠ(i, j, k+1, grid, scheme, ψ, k, Center, args...) struct FirstDerivative end struct SecondDerivative end diff --git a/src/Advection/tracer_advection_operators.jl b/src/Advection/tracer_advection_operators.jl index 995b4423a2..deb6501857 100644 --- a/src/Advection/tracer_advection_operators.jl +++ b/src/Advection/tracer_advection_operators.jl @@ -41,6 +41,7 @@ end ##### Tracer advection operator ##### + """ div_uc(i, j, k, grid, advection, U, c) @@ -52,14 +53,14 @@ a velocity field, ``𝛁⋅(𝐯 c)``, ``` which ends up at the location `ccc`. """ -@inline function div_Uc(i, j, k, grid, advection, U, c, tid, wrk) - return 1/Vᶜᶜᶜ(i, j, k, grid) * (δxᶜᵃᵃ(i, j, k, grid, _advective_tracer_flux_x, advection, U.u, c, tid, wrk) + - δyᵃᶜᵃ(i, j, k, grid, _advective_tracer_flux_y, advection, U.v, c, tid, wrk) + - δzᵃᵃᶜ(i, j, k, grid, _advective_tracer_flux_z, advection, U.w, c, tid, wrk)) +@inline function div_Uc(i, j, k, grid, advection, U, c) + return 1/Vᶜᶜᶜ(i, j, k, grid) * (δxᶜᵃᵃ(i, j, k, grid, _advective_tracer_flux_x, advection, U.u, c) + + δyᵃᶜᵃ(i, j, k, grid, _advective_tracer_flux_y, advection, U.v, c) + + δzᵃᵃᶜ(i, j, k, grid, _advective_tracer_flux_z, advection, U.w, c)) end -@inline function div_Uc(i, j, k, grid, advection::TracerAdvection, U, c, tid, wrk) - return 1/Vᶜᶜᶜ(i, j, k, grid) * (δxᶜᵃᵃ(i, j, k, grid, _advective_tracer_flux_x, advection.x, U.u, c, tid, wrk) + - δyᵃᶜᵃ(i, j, k, grid, _advective_tracer_flux_y, advection.y, U.v, c, tid, wrk) + - δzᵃᵃᶜ(i, j, k, grid, _advective_tracer_flux_z, advection.z, U.w, c, tid, wrk)) +@inline function div_Uc(i, j, k, grid, advection::TracerAdvection, U, c) + return 1/Vᶜᶜᶜ(i, j, k, grid) * (δxᶜᵃᵃ(i, j, k, grid, _advective_tracer_flux_x, advection.x, U.u, c) + + δyᵃᶜᵃ(i, j, k, grid, _advective_tracer_flux_y, advection.y, U.v, c) + + δzᵃᵃᶜ(i, j, k, grid, _advective_tracer_flux_z, advection.z, U.w, c)) end diff --git a/src/Advection/upwind_biased_advective_fluxes.jl b/src/Advection/upwind_biased_advective_fluxes.jl index 982e0c8d70..d6ff6687db 100644 --- a/src/Advection/upwind_biased_advective_fluxes.jl +++ b/src/Advection/upwind_biased_advective_fluxes.jl @@ -15,83 +15,83 @@ const UpwindScheme = AbstractUpwindBiasedAdvectionScheme ##### Note the convention "advective_momentum_flux_AB" corresponds to the advection _of_ B _by_ A. ##### -@inline function advective_momentum_flux_Uu(i, j, k, grid, scheme::UpwindScheme, U, u, tid, wrk) +@inline function advective_momentum_flux_Uu(i, j, k, grid, scheme::UpwindScheme, U, u) ũ = _symmetric_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, Ax_qᶠᶜᶜ, U) - uᴸ = _left_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, tid, wrk, u) - uᴿ = _right_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, tid, wrk, u) + uᴸ = _left_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, u) + uᴿ = _right_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, u) return upwind_biased_product(ũ, uᴸ, uᴿ) end -@inline function advective_momentum_flux_Vu(i, j, k, grid, scheme::UpwindScheme, V, u, tid, wrk) +@inline function advective_momentum_flux_Vu(i, j, k, grid, scheme::UpwindScheme, V, u) ṽ = _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, Ay_qᶜᶠᶜ, V) - uᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, u) - uᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, u) + uᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, u) + uᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, u) return upwind_biased_product(ṽ, uᴸ, uᴿ) end -@inline function advective_momentum_flux_Wu(i, j, k, grid, scheme::UpwindScheme, W, u, tid, wrk) +@inline function advective_momentum_flux_Wu(i, j, k, grid, scheme::UpwindScheme, W, u) w̃ = _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, Az_qᶜᶜᶠ, W) - uᴸ = _left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, u) - uᴿ = _right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, u) + uᴸ = _left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, u) + uᴿ = _right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, u) return upwind_biased_product(w̃, uᴸ, uᴿ) end -@inline function advective_momentum_flux_Uv(i, j, k, grid, scheme::UpwindScheme, U, v, tid, wrk) +@inline function advective_momentum_flux_Uv(i, j, k, grid, scheme::UpwindScheme, U, v) ũ = _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, Ax_qᶠᶜᶜ, U) - vᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, v) - vᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, v) + vᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, v) + vᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, v) return upwind_biased_product(ũ, vᴸ, vᴿ) end -@inline function advective_momentum_flux_Vv(i, j, k, grid, scheme::UpwindScheme, V, v, tid, wrk) +@inline function advective_momentum_flux_Vv(i, j, k, grid, scheme::UpwindScheme, V, v) ṽ = _symmetric_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, Ay_qᶜᶠᶜ, V) - vᴸ = _left_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, tid, wrk, v) - vᴿ = _right_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, tid, wrk, v) + vᴸ = _left_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, v) + vᴿ = _right_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, v) return upwind_biased_product(ṽ, vᴸ, vᴿ) end -@inline function advective_momentum_flux_Wv(i, j, k, grid, scheme::UpwindScheme, W, v, tid, wrk) +@inline function advective_momentum_flux_Wv(i, j, k, grid, scheme::UpwindScheme, W, v) w̃ = _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, Az_qᶜᶜᶠ, W) - vᴸ = _left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, v) - vᴿ = _right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, v) + vᴸ = _left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, v) + vᴿ = _right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, v) return upwind_biased_product(w̃, vᴸ, vᴿ) end -@inline function advective_momentum_flux_Uw(i, j, k, grid, scheme::UpwindScheme, U, w, tid, wrk) +@inline function advective_momentum_flux_Uw(i, j, k, grid, scheme::UpwindScheme, U, w) ũ = _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, Ax_qᶠᶜᶜ, U) - wᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, w) - wᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, w) + wᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, w) + wᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, w) return upwind_biased_product(ũ, wᴸ, wᴿ) end -@inline function advective_momentum_flux_Vw(i, j, k, grid, scheme::UpwindScheme, V, w, tid, wrk) +@inline function advective_momentum_flux_Vw(i, j, k, grid, scheme::UpwindScheme, V, w) ṽ = _symmetric_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, Ay_qᶜᶠᶜ, V) - wᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, w) - wᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, w) + wᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, w) + wᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, w) return upwind_biased_product(ṽ, wᴸ, wᴿ) end -@inline function advective_momentum_flux_Ww(i, j, k, grid, scheme::UpwindScheme, W, w, tid, wrk) +@inline function advective_momentum_flux_Ww(i, j, k, grid, scheme::UpwindScheme, W, w) w̃ = _symmetric_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, Az_qᶜᶜᶠ, W) - wᴸ = _left_biased_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, tid, wrk, w) - wᴿ = _right_biased_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, tid, wrk, w) + wᴸ = _left_biased_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, w) + wᴿ = _right_biased_interpolate_zᵃᵃᶜ(i, j, k, grid, scheme, w) return upwind_biased_product(w̃, wᴸ, wᴿ) end @@ -100,29 +100,29 @@ end ##### Tracer advection operators ##### -@inline function advective_tracer_flux_x(i, j, k, grid, scheme::UpwindScheme, U, c, tid, wrk) +@inline function advective_tracer_flux_x(i, j, k, grid, scheme::UpwindScheme, U, c) @inbounds ũ = U[i, j, k] - cᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, c) - cᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, tid, wrk, c) + cᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, c) + cᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, c) return Axᶠᶜᶜ(i, j, k, grid) * upwind_biased_product(ũ, cᴸ, cᴿ) end -@inline function advective_tracer_flux_y(i, j, k, grid, scheme::UpwindScheme, V, c, tid, wrk) +@inline function advective_tracer_flux_y(i, j, k, grid, scheme::UpwindScheme, V, c) @inbounds ṽ = V[i, j, k] - cᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, c) - cᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, tid, wrk, c) + cᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, c) + cᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, c) return Ayᶜᶠᶜ(i, j, k, grid) * upwind_biased_product(ṽ, cᴸ, cᴿ) end -@inline function advective_tracer_flux_z(i, j, k, grid, scheme::UpwindScheme, W, c, tid, wrk) +@inline function advective_tracer_flux_z(i, j, k, grid, scheme::UpwindScheme, W, c) @inbounds w̃ = W[i, j, k] - cᴸ = _left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, c) - cᴿ = _right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, tid, wrk, c) + cᴸ = _left_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, c) + cᴿ = _right_biased_interpolate_zᵃᵃᶠ(i, j, k, grid, scheme, c) return Azᶜᶜᶠ(i, j, k, grid) * upwind_biased_product(w̃, cᴸ, cᴿ) end diff --git a/src/Advection/vector_invariant_advection.jl b/src/Advection/vector_invariant_advection.jl index 73b29e44c4..d216f5391a 100644 --- a/src/Advection/vector_invariant_advection.jl +++ b/src/Advection/vector_invariant_advection.jl @@ -237,13 +237,13 @@ on_architecture(to, scheme::VectorInvariant{N, FT, M}) where {N, FT, M} = on_architecture(to, scheme.divergence_scheme), on_architecture(to, scheme.upwinding)) -@inline U_dot_∇u(i, j, k, grid, scheme::VectorInvariant, U, tid, wrk) = horizontal_advection_U(i, j, k, grid, scheme, U.u, U.v, tid, wrk) + - vertical_advection_U(i, j, k, grid, scheme, U, tid, wrk) + - bernoulli_head_U(i, j, k, grid, scheme, U.u, U.v, tid, wrk) +@inline U_dot_∇u(i, j, k, grid, scheme::VectorInvariant, U) = horizontal_advection_U(i, j, k, grid, scheme, U.u, U.v) + + vertical_advection_U(i, j, k, grid, scheme, U) + + bernoulli_head_U(i, j, k, grid, scheme, U.u, U.v) -@inline U_dot_∇v(i, j, k, grid, scheme::VectorInvariant, U, tid, wrk) = horizontal_advection_V(i, j, k, grid, scheme, U.u, U.v, tid, wrk) + - vertical_advection_V(i, j, k, grid, scheme, U, tid, wrk) + - bernoulli_head_V(i, j, k, grid, scheme, U.u, U.v, tid, wrk) +@inline U_dot_∇v(i, j, k, grid, scheme::VectorInvariant, U) = horizontal_advection_V(i, j, k, grid, scheme, U.u, U.v) + + vertical_advection_V(i, j, k, grid, scheme, U) + + bernoulli_head_V(i, j, k, grid, scheme, U.u, U.v) # Extend interpolate functions for VectorInvariant to allow MultiDimensional reconstruction for bias in (:_left_biased, :_right_biased, :_symmetric) @@ -275,8 +275,8 @@ end @inline ϕ²(i, j, k, grid, ϕ) = @inbounds ϕ[i, j, k]^2 @inline Khᶜᶜᶜ(i, j, k, grid, u, v) = (ℑxᶜᵃᵃ(i, j, k, grid, ϕ², u) + ℑyᵃᶜᵃ(i, j, k, grid, ϕ², v)) / 2 -@inline bernoulli_head_U(i, j, k, grid, ::VectorInvariantKEGradientEnergyConserving, u, v, args...) = ∂xᶠᶜᶜ(i, j, k, grid, Khᶜᶜᶜ, u, v) -@inline bernoulli_head_V(i, j, k, grid, ::VectorInvariantKEGradientEnergyConserving, u, v, args...) = ∂yᶜᶠᶜ(i, j, k, grid, Khᶜᶜᶜ, u, v) +@inline bernoulli_head_U(i, j, k, grid, ::VectorInvariantKEGradientEnergyConserving, u, v) = ∂xᶠᶜᶜ(i, j, k, grid, Khᶜᶜᶜ, u, v) +@inline bernoulli_head_V(i, j, k, grid, ::VectorInvariantKEGradientEnergyConserving, u, v) = ∂yᶜᶠᶜ(i, j, k, grid, Khᶜᶜᶜ, u, v) ##### ##### Conservative vertical advection @@ -286,25 +286,25 @@ end @inbounds ζ₂wᶠᶜᶠ(i, j, k, grid, u, w) = ℑxᶠᵃᵃ(i, j, k, grid, Az_qᶜᶜᶠ, w) * ∂zᶠᶜᶠ(i, j, k, grid, u) @inbounds ζ₁wᶜᶠᶠ(i, j, k, grid, v, w) = ℑyᵃᶠᵃ(i, j, k, grid, Az_qᶜᶜᶠ, w) * ∂zᶜᶠᶠ(i, j, k, grid, v) -@inline vertical_advection_U(i, j, k, grid, ::VectorInvariantVerticalEnergyConserving, U, args...) = ℑzᵃᵃᶜ(i, j, k, grid, ζ₂wᶠᶜᶠ, U.u, U.w) / Azᶠᶜᶜ(i, j, k, grid) -@inline vertical_advection_V(i, j, k, grid, ::VectorInvariantVerticalEnergyConserving, U, args...) = ℑzᵃᵃᶜ(i, j, k, grid, ζ₁wᶜᶠᶠ, U.v, U.w) / Azᶜᶠᶜ(i, j, k, grid) +@inline vertical_advection_U(i, j, k, grid, ::VectorInvariantVerticalEnergyConserving, U) = ℑzᵃᵃᶜ(i, j, k, grid, ζ₂wᶠᶜᶠ, U.u, U.w) / Azᶠᶜᶜ(i, j, k, grid) +@inline vertical_advection_V(i, j, k, grid, ::VectorInvariantVerticalEnergyConserving, U) = ℑzᵃᵃᶜ(i, j, k, grid, ζ₁wᶜᶠᶠ, U.v, U.w) / Azᶜᶠᶜ(i, j, k, grid) ##### ##### Upwinding vertical advection (2. and 3.) ##### -@inline function vertical_advection_U(i, j, k, grid, scheme::VectorInvariant, U, tid, wrk) +@inline function vertical_advection_U(i, j, k, grid, scheme::VectorInvariant, U) - Φᵟ = upwinded_divergence_flux_Uᶠᶜᶜ(i, j, k, grid, scheme, U.u, U.v, tid, wrk) - 𝒜ᶻ = δzᵃᵃᶜ(i, j, k, grid, _advective_momentum_flux_Wu, scheme.vertical_scheme, U.w, U.u, tid, wrk) + Φᵟ = upwinded_divergence_flux_Uᶠᶜᶜ(i, j, k, grid, scheme, U.u, U.v) + 𝒜ᶻ = δzᵃᵃᶜ(i, j, k, grid, _advective_momentum_flux_Wu, scheme.vertical_scheme, U.w, U.u) return 1/Vᶠᶜᶜ(i, j, k, grid) * (Φᵟ + 𝒜ᶻ) end -@inline function vertical_advection_V(i, j, k, grid, scheme::VectorInvariant, U, tid, wrk) +@inline function vertical_advection_V(i, j, k, grid, scheme::VectorInvariant, U) - Φᵟ = upwinded_divergence_flux_Vᶜᶠᶜ(i, j, k, grid, scheme, U.u, U.v, tid, wrk) - 𝒜ᶻ = δzᵃᵃᶜ(i, j, k, grid, _advective_momentum_flux_Wv, scheme.vertical_scheme, U.w, U.v, tid, wrk) + Φᵟ = upwinded_divergence_flux_Vᶜᶠᶜ(i, j, k, grid, scheme, U.u, U.v) + 𝒜ᶻ = δzᵃᵃᶜ(i, j, k, grid, _advective_momentum_flux_Wv, scheme.vertical_scheme, U.w, U.v) return 1/Vᶜᶠᶜ(i, j, k, grid) * (Φᵟ + 𝒜ᶻ) end @@ -325,34 +325,34 @@ end @inline ζ_ℑx_vᶠᶠᵃ(i, j, k, grid, u, v) = ζ₃ᶠᶠᶜ(i, j, k, grid, u, v) * ℑxᶠᵃᵃ(i, j, k, grid, Δx_qᶜᶠᶜ, v) @inline ζ_ℑy_uᶠᶠᵃ(i, j, k, grid, u, v) = ζ₃ᶠᶠᶜ(i, j, k, grid, u, v) * ℑyᵃᶠᵃ(i, j, k, grid, Δy_qᶠᶜᶜ, u) -@inline horizontal_advection_U(i, j, k, grid, ::VectorInvariantEnergyConserving, u, v, args...) = - ℑyᵃᶜᵃ(i, j, k, grid, ζ_ℑx_vᶠᶠᵃ, u, v) / Δxᶠᶜᶜ(i, j, k, grid) -@inline horizontal_advection_V(i, j, k, grid, ::VectorInvariantEnergyConserving, u, v, args...) = + ℑxᶜᵃᵃ(i, j, k, grid, ζ_ℑy_uᶠᶠᵃ, u, v) / Δyᶜᶠᶜ(i, j, k, grid) +@inline horizontal_advection_U(i, j, k, grid, ::VectorInvariantEnergyConserving, u, v) = - ℑyᵃᶜᵃ(i, j, k, grid, ζ_ℑx_vᶠᶠᵃ, u, v) / Δxᶠᶜᶜ(i, j, k, grid) +@inline horizontal_advection_V(i, j, k, grid, ::VectorInvariantEnergyConserving, u, v) = + ℑxᶜᵃᵃ(i, j, k, grid, ζ_ℑy_uᶠᶠᵃ, u, v) / Δyᶜᶠᶜ(i, j, k, grid) -@inline horizontal_advection_U(i, j, k, grid, ::VectorInvariantEnstrophyConserving, u, v, args...) = - ℑyᵃᶜᵃ(i, j, k, grid, ζ₃ᶠᶠᶜ, u, v) * ℑxᶠᵃᵃ(i, j, k, grid, ℑyᵃᶜᵃ, Δx_qᶜᶠᶜ, v) / Δxᶠᶜᶜ(i, j, k, grid) -@inline horizontal_advection_V(i, j, k, grid, ::VectorInvariantEnstrophyConserving, u, v, args...) = + ℑxᶜᵃᵃ(i, j, k, grid, ζ₃ᶠᶠᶜ, u, v) * ℑyᵃᶠᵃ(i, j, k, grid, ℑxᶜᵃᵃ, Δy_qᶠᶜᶜ, u) / Δyᶜᶠᶜ(i, j, k, grid) +@inline horizontal_advection_U(i, j, k, grid, ::VectorInvariantEnstrophyConserving, u, v) = - ℑyᵃᶜᵃ(i, j, k, grid, ζ₃ᶠᶠᶜ, u, v) * ℑxᶠᵃᵃ(i, j, k, grid, ℑyᵃᶜᵃ, Δx_qᶜᶠᶜ, v) / Δxᶠᶜᶜ(i, j, k, grid) +@inline horizontal_advection_V(i, j, k, grid, ::VectorInvariantEnstrophyConserving, u, v) = + ℑxᶜᵃᵃ(i, j, k, grid, ζ₃ᶠᶠᶜ, u, v) * ℑyᵃᶠᵃ(i, j, k, grid, ℑxᶜᵃᵃ, Δy_qᶠᶜᶜ, u) / Δyᶜᶠᶜ(i, j, k, grid) ##### ##### Upwinding schemes (3. and 4.) ##### -@inline function horizontal_advection_U(i, j, k, grid, scheme::VectorInvariantUpwindVorticity, u, v, tid, wrk) +@inline function horizontal_advection_U(i, j, k, grid, scheme::VectorInvariantUpwindVorticity, u, v) Sζ = scheme.vorticity_stencil @inbounds v̂ = ℑxᶠᵃᵃ(i, j, k, grid, ℑyᵃᶜᵃ, Δx_qᶜᶠᶜ, v) / Δxᶠᶜᶜ(i, j, k, grid) - ζᴸ = _left_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, scheme.vorticity_scheme, tid, wrk, ζ₃ᶠᶠᶜ, Sζ, u, v) - ζᴿ = _right_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, scheme.vorticity_scheme, tid, wrk, ζ₃ᶠᶠᶜ, Sζ, u, v) + ζᴸ = _left_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, scheme.vorticity_scheme, ζ₃ᶠᶠᶜ, Sζ, u, v) + ζᴿ = _right_biased_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, scheme.vorticity_scheme, ζ₃ᶠᶠᶜ, Sζ, u, v) return - upwind_biased_product(v̂, ζᴸ, ζᴿ) end -@inline function horizontal_advection_V(i, j, k, grid, scheme::VectorInvariantUpwindVorticity, u, v, tid, wrk) +@inline function horizontal_advection_V(i, j, k, grid, scheme::VectorInvariantUpwindVorticity, u, v) Sζ = scheme.vorticity_stencil @inbounds û = ℑyᵃᶠᵃ(i, j, k, grid, ℑxᶜᵃᵃ, Δy_qᶠᶜᶜ, u) / Δyᶜᶠᶜ(i, j, k, grid) - ζᴸ = _left_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, scheme.vorticity_scheme, tid, wrk, ζ₃ᶠᶠᶜ, Sζ, u, v) - ζᴿ = _right_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, scheme.vorticity_scheme, tid, wrk, ζ₃ᶠᶠᶜ, Sζ, u, v) + ζᴸ = _left_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, scheme.vorticity_scheme, ζ₃ᶠᶠᶜ, Sζ, u, v) + ζᴿ = _right_biased_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, scheme.vorticity_scheme, ζ₃ᶠᶠᶜ, Sζ, u, v) return + upwind_biased_product(û, ζᴸ, ζᴿ) end diff --git a/src/Advection/vector_invariant_self_upwinding.jl b/src/Advection/vector_invariant_self_upwinding.jl index 93bf176a15..daaa9f6534 100644 --- a/src/Advection/vector_invariant_self_upwinding.jl +++ b/src/Advection/vector_invariant_self_upwinding.jl @@ -12,28 +12,28 @@ # Divergence smoothness for divergence upwinding @inline divergence_smoothness(i, j, k, grid, u, v) = δx_U(i, j, k, grid, u, v) + δy_V(i, j, k, grid, u, v) -@inline function upwinded_divergence_flux_Uᶠᶜᶜ(i, j, k, grid, scheme::VectorInvariantSelfVerticalUpwinding, u, v, tid, wrk) +@inline function upwinded_divergence_flux_Uᶠᶜᶜ(i, j, k, grid, scheme::VectorInvariantSelfVerticalUpwinding, u, v) δU_stencil = scheme.upwinding.δU_stencil cross_scheme = scheme.upwinding.cross_scheme @inbounds û = u[i, j, k] δvˢ = _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, cross_scheme, δy_V, u, v) - δuᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, scheme.divergence_scheme, tid, wrk, δx_U, δU_stencil, u, v) - δuᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, scheme.divergence_scheme, tid, wrk, δx_U, δU_stencil, u, v) + δuᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, scheme.divergence_scheme, δx_U, δU_stencil, u, v) + δuᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, scheme.divergence_scheme, δx_U, δU_stencil, u, v) return upwind_biased_product(û, δuᴸ, δuᴿ) + û * δvˢ end -@inline function upwinded_divergence_flux_Vᶜᶠᶜ(i, j, k, grid, scheme::VectorInvariantSelfVerticalUpwinding, u, v, tid, wrk) +@inline function upwinded_divergence_flux_Vᶜᶠᶜ(i, j, k, grid, scheme::VectorInvariantSelfVerticalUpwinding, u, v) δV_stencil = scheme.upwinding.δV_stencil cross_scheme = scheme.upwinding.cross_scheme @inbounds v̂ = v[i, j, k] δuˢ = _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, cross_scheme, δx_U, u, v) - δvᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, scheme.divergence_scheme, tid, wrk, δy_V, δV_stencil, u, v) - δvᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, scheme.divergence_scheme, tid, wrk, δy_V, δV_stencil, u, v) + δvᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, scheme.divergence_scheme, δy_V, δV_stencil, u, v) + δvᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, scheme.divergence_scheme, δy_V, δV_stencil, u, v) return upwind_biased_product(v̂, δvᴸ, δvᴿ) + v̂ * δuˢ end @@ -53,7 +53,7 @@ end @inline u_smoothness(i, j, k, grid, u, v) = ℑxᶜᵃᵃ(i, j, k, grid, u) @inline v_smoothness(i, j, k, grid, u, v) = ℑyᵃᶜᵃ(i, j, k, grid, v) -@inline function bernoulli_head_U(i, j, k, grid, scheme::VectorInvariantKineticEnergyUpwinding, u, v, tid, wrk) +@inline function bernoulli_head_U(i, j, k, grid, scheme::VectorInvariantKineticEnergyUpwinding, u, v) @inbounds û = u[i, j, k] @@ -61,8 +61,8 @@ end cross_scheme = scheme.upwinding.cross_scheme δKvˢ = _symmetric_interpolate_yᵃᶜᵃ(i, j, k, grid, scheme, cross_scheme, δx_v², u, v) - δKuᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, scheme.kinetic_energy_gradient_scheme, tid, wrk, δx_u², δu²_stencil, u, v) - δKuᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, scheme.kinetic_energy_gradient_scheme, tid, wrk, δx_u², δu²_stencil, u, v) + δKuᴸ = _left_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, scheme.kinetic_energy_gradient_scheme, δx_u², δu²_stencil, u, v) + δKuᴿ = _right_biased_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme, scheme.kinetic_energy_gradient_scheme, δx_u², δu²_stencil, u, v) ∂Kᴸ = (δKuᴸ + δKvˢ) / Δxᶠᶜᶜ(i, j, k, grid) ∂Kᴿ = (δKuᴿ + δKvˢ) / Δxᶠᶜᶜ(i, j, k, grid) @@ -70,7 +70,7 @@ end return ifelse(û > 0, ∂Kᴸ, ∂Kᴿ) end -@inline function bernoulli_head_V(i, j, k, grid, scheme::VectorInvariantKineticEnergyUpwinding, u, v, tid, wrk) +@inline function bernoulli_head_V(i, j, k, grid, scheme::VectorInvariantKineticEnergyUpwinding, u, v) @inbounds v̂ = v[i, j, k] @@ -78,8 +78,8 @@ end cross_scheme = scheme.upwinding.cross_scheme δKuˢ = _symmetric_interpolate_xᶜᵃᵃ(i, j, k, grid, scheme, cross_scheme, δy_u², u, v) - δKvᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, scheme.kinetic_energy_gradient_scheme, tid, wrk, δy_v², δv²_stencil, u, v) - δKvᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, scheme.kinetic_energy_gradient_scheme, tid, wrk, δy_v², δv²_stencil, u, v) + δKvᴸ = _left_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, scheme.kinetic_energy_gradient_scheme, δy_v², δv²_stencil, u, v) + δKvᴿ = _right_biased_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme, scheme.kinetic_energy_gradient_scheme, δy_v², δv²_stencil, u, v) ∂Kᴸ = (δKvᴸ + δKuˢ) / Δyᶜᶠᶜ(i, j, k, grid) ∂Kᴿ = (δKvᴿ + δKuˢ) / Δyᶜᶠᶜ(i, j, k, grid) diff --git a/src/Advection/weno_2.jl b/src/Advection/weno_2.jl index 0b04eab0ef..62ae35596f 100644 --- a/src/Advection/weno_2.jl +++ b/src/Advection/weno_2.jl @@ -9,7 +9,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT}, tid, wrk, + scheme::WENO{2, FT}, ψ, idx, loc, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -39,7 +39,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT}, tid, wrk, + scheme::WENO{2, FT}, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -69,10 +69,9 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT}, tid, wrk, + scheme::WENO{2, FT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - ψs = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) βu = $biased_β(ψs, scheme, Val(0)) ψs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) @@ -108,7 +107,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT}, tid, wrk, + scheme::WENO{2, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl index 2882a60dab..b75349f0c0 100644 --- a/src/Advection/weno_3.jl +++ b/src/Advection/weno_3.jl @@ -94,7 +94,6 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{3, FT}, tid, wrk, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - ψs = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) βu = $biased_β(ψs, scheme, Val(0)) ψs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index e4f03ba1db..616caf8655 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -116,7 +116,6 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{4, FT}, tid, wrk, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - ψs = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) βu = $biased_β(ψs, scheme, Val(0)) ψs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) diff --git a/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl b/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl index 5ebb7ddc18..96682e10b9 100644 --- a/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl +++ b/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl @@ -242,7 +242,7 @@ end tid = nothing wrk = nothing - @inbounds Gu[i, j, k] = hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, tid, wrk, args...) + @inbounds Gu[i, j, k] = hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, args...) end @kernel function compute_hydrostatic_free_surface_Gu!(Gu, grid::ActiveCellsIBG, map, args) @@ -257,7 +257,7 @@ end tid = nothing wrk = nothing - @inbounds Gu[i, j, k] = hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, tid, wrk, args...) + @inbounds Gu[i, j, k] = hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, args...) end """ Calculate the right-hand-side of the v-velocity equation. """ @@ -272,7 +272,7 @@ end tid = nothing wrk = nothing - @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, tid, wrk, args...) + @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, args...) end @kernel function compute_hydrostatic_free_surface_Gv!(Gv, grid::ActiveCellsIBG, map, args) @@ -287,7 +287,7 @@ end tid = nothing wrk = nothing - @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, tid, wrk, args...) + @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, args...) end ##### @@ -306,7 +306,7 @@ end tid = nothing wrk = nothing - @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, tid, wrk, args...) + @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, args...) end @kernel function compute_hydrostatic_free_surface_Gc!(Gc, grid::ActiveCellsIBG, map, args) @@ -321,7 +321,7 @@ end tid = nothing wrk = nothing - @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, tid, wrk, args...) + @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, args...) end """ Calculate the right-hand-side of the subgrid scale energy equation. """ @@ -336,7 +336,7 @@ end tid = nothing wrk = nothing - @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, tid, wrk, args...) + @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, args...) end @kernel function compute_hydrostatic_free_surface_Ge!(Ge, grid::ActiveCellsIBG, map, args) @@ -351,7 +351,7 @@ end tid = nothing wrk = nothing - @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, tid, wrk, args...) + @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, args...) end ##### diff --git a/src/Models/HydrostaticFreeSurfaceModels/hydrostatic_free_surface_tendency_kernel_functions.jl b/src/Models/HydrostaticFreeSurfaceModels/hydrostatic_free_surface_tendency_kernel_functions.jl index 93ba12530a..3d67aad4ed 100644 --- a/src/Models/HydrostaticFreeSurfaceModels/hydrostatic_free_surface_tendency_kernel_functions.jl +++ b/src/Models/HydrostaticFreeSurfaceModels/hydrostatic_free_surface_tendency_kernel_functions.jl @@ -25,7 +25,7 @@ The tendency for ``u`` is called ``G_u`` and defined via where `p_n` is the part of the barotropic kinematic pressure that's treated implicitly during time-stepping. """ -@inline function hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, tid, wrk, +@inline function hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, advection, coriolis, closure, @@ -42,7 +42,7 @@ implicitly during time-stepping. model_fields = merge(hydrostatic_fields(velocities, free_surface, tracers), auxiliary_fields) - return ( - U_dot_∇u(i, j, k, grid, advection, velocities, tid, wrk) + return ( - U_dot_∇u(i, j, k, grid, advection, velocities) - explicit_barotropic_pressure_x_gradient(i, j, k, grid, free_surface) - x_f_cross_U(i, j, k, grid, coriolis, velocities) - ∂xᶠᶜᶜ(i, j, k, grid, hydrostatic_pressure_anomaly) @@ -64,7 +64,7 @@ The tendency for ``v`` is called ``G_v`` and defined via where `p_n` is the part of the barotropic kinematic pressure that's treated implicitly during time-stepping. """ -@inline function hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, tid, wrk, +@inline function hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, advection, coriolis, closure, @@ -81,7 +81,7 @@ implicitly during time-stepping. model_fields = merge(hydrostatic_fields(velocities, free_surface, tracers), auxiliary_fields) - return ( - U_dot_∇v(i, j, k, grid, advection, velocities, tid, wrk) + return ( - U_dot_∇v(i, j, k, grid, advection, velocities) - explicit_barotropic_pressure_y_gradient(i, j, k, grid, free_surface) - y_f_cross_U(i, j, k, grid, coriolis, velocities) - ∂yᶜᶠᶜ(i, j, k, grid, hydrostatic_pressure_anomaly) @@ -102,7 +102,7 @@ The tendency is called ``G_c`` and defined via where `c = C[tracer_index]`. """ -@inline function hydrostatic_free_surface_tracer_tendency(i, j, k, grid, tid, wrk, +@inline function hydrostatic_free_surface_tracer_tendency(i, j, k, grid, val_tracer_index::Val{tracer_index}, val_tracer_name, advection, @@ -130,7 +130,7 @@ where `c = C[tracer_index]`. total_velocities = with_advective_forcing(forcing, total_velocities) - return ( - div_Uc(i, j, k, grid, advection, total_velocities, c, tid, wrk) + return ( - div_Uc(i, j, k, grid, advection, total_velocities, c) - ∇_dot_qᶜ(i, j, k, grid, closure, diffusivities, val_tracer_index, c, clock, model_fields, buoyancy) - immersed_∇_dot_qᶜ(i, j, k, grid, c, c_immersed_bc, closure, diffusivities, val_tracer_index, clock, model_fields) + biogeochemical_transition(i, j, k, grid, biogeochemistry, val_tracer_name, clock, model_fields) From defdb8819c4a435dc69f9e83fcfc7555f8267bc9 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 13:41:30 -0400 Subject: [PATCH 088/152] rmeove tid wrk --- src/Advection/weno_3.jl | 8 ++++---- src/Advection/weno_4.jl | 2 +- src/Advection/weno_5.jl | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl index b75349f0c0..83924fd1c9 100644 --- a/src/Advection/weno_3.jl +++ b/src/Advection/weno_3.jl @@ -9,7 +9,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT}, tid, wrk, + scheme::WENO{3, FT}, ψ, idx, loc, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -50,7 +50,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT}, tid, wrk, + scheme::WENO{3, FT}, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -91,7 +91,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT}, tid, wrk, + scheme::WENO{3, FT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} ψs = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) @@ -144,7 +144,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT}, tid, wrk, + scheme::WENO{3, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index 616caf8655..406b2d9618 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -181,7 +181,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, tid, wrk, + scheme::WENO{4, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl index c7d84c921b..cb3a727162 100644 --- a/src/Advection/weno_5.jl +++ b/src/Advection/weno_5.jl @@ -9,7 +9,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT}, tid, wrk, + scheme::WENO{5, FT}, ψ, idx, loc, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -72,7 +72,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT}, tid, wrk, + scheme::WENO{5, FT}, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -135,7 +135,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT}, tid, wrk, + scheme::WENO{5, FT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} ψs = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) @@ -218,7 +218,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT}, tid, wrk, + scheme::WENO{5, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) From 746b4f4b3b9a15368c504734cb469a4fac268388 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 13:46:10 -0400 Subject: [PATCH 089/152] remove all this --- ...pute_hydrostatic_free_surface_tendencies.jl | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl b/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl index 96682e10b9..c4acd40504 100644 --- a/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl +++ b/src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl @@ -239,8 +239,6 @@ end # tid = @index(Local, NTuple) # M = @uniform maximum(Mtot) # wrk = @localmem FT (5, M) - tid = nothing - wrk = nothing @inbounds Gu[i, j, k] = hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, args...) end @@ -254,8 +252,6 @@ end # tid = @index(Local, NTuple) # M = @uniform maximum(Mtot) # wrk = @localmem FT (5, M) - tid = nothing - wrk = nothing @inbounds Gu[i, j, k] = hydrostatic_free_surface_u_velocity_tendency(i, j, k, grid, args...) end @@ -269,8 +265,6 @@ end # tid = @index(Local, NTuple) # M = @uniform maximum(Mtot) # wrk = @localmem FT (5, M) - tid = nothing - wrk = nothing @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, args...) end @@ -284,8 +278,6 @@ end # tid = @index(Local, NTuple) # M = @uniform maximum(Mtot) # wrk = @localmem FT (5, M) - tid = nothing - wrk = nothing @inbounds Gv[i, j, k] = hydrostatic_free_surface_v_velocity_tendency(i, j, k, grid, args...) end @@ -303,8 +295,6 @@ end # tid = @index(Local, NTuple) # M = @uniform maximum(Mtot) # wrk = @localmem FT (5, M) - tid = nothing - wrk = nothing @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, args...) end @@ -318,8 +308,6 @@ end # tid = @index(Local, NTuple) # M = @uniform maximum(Mtot) # wrk = @localmem FT (5, M) - tid = nothing - wrk = nothing @inbounds Gc[i, j, k] = hydrostatic_free_surface_tracer_tendency(i, j, k, grid, args...) end @@ -333,8 +321,6 @@ end # tid = @index(Local, NTuple) # M = @uniform maximum(Mtot) # wrk = @localmem FT (5, M) - tid = nothing - wrk = nothing @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, args...) end @@ -348,9 +334,7 @@ end # tid = @index(Local, NTuple) # M = @uniform maximum(Mtot) # wrk = @localmem FT (5, M) - tid = nothing - wrk = nothing - + @inbounds Ge[i, j, k] = hydrostatic_turbulent_kinetic_energy_tendency(i, j, k, grid, args...) end From 86d074845b6d5da8251dcacfd7e90953478d40f6 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 13:51:32 -0400 Subject: [PATCH 090/152] small correction --- src/Advection/weno_4.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index 406b2d9618..d8d75faa60 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -9,7 +9,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, tid, wrk, + scheme::WENO{4, FT}, ψ, idx, loc, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -61,7 +61,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, tid, wrk, + scheme::WENO{4, FT}, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -113,7 +113,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, tid, wrk, + scheme::WENO{4, FT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} ψs = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) From 0e3df4d0aa1b4979a4ca180e6bfedf79db4c2233 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 13 Mar 2024 14:17:35 -0400 Subject: [PATCH 091/152] show registers --- src/Utils/kernel_launching.jl | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/Utils/kernel_launching.jl b/src/Utils/kernel_launching.jl index b0d3338669..6b2f1b8280 100644 --- a/src/Utils/kernel_launching.jl +++ b/src/Utils/kernel_launching.jl @@ -309,3 +309,35 @@ function partition(kernel::OffsetKernel, inrange, ingroupsize) return iterspace, dynamic end + +using KernelAbstractions: Kernel, backend, mkcontext, workgroupsize, launch_config, workgroupsize +using CUDA: launch_configuration, registers + +function show_registers(obj::Kernel{CUDABackend}, args...; ndrange=nothing, workgroupsize=nothing) + backend = backend(obj) + + ndrange, workgroupsize, iterspace, dynamic = launch_config(obj, ndrange, workgroupsize) + # this might not be the final context, since we may tune the workgroupsize + ctx = mkcontext(obj, ndrange, iterspace) + + # If the kernel is statically sized we can tell the compiler about that + if workgroupsize(obj) <: StaticSize + maxthreads = prod(get(workgroupsize(obj))) + else + maxthreads = nothing + end + + kernel = @cuda launch=false always_inline=backend.always_inline maxthreads=maxthreads obj.f(ctx, args...) + + blocks = length(blocks(iterspace)) + threads = length(workitems(iterspace)) + + if blocks == 0 + return nothing + end + + # Launch kernel + kernel(ctx, args...; threads, blocks) + + return registers(kernel) +end From 4bf023ad1e18d78d718bb172b0939b637a5a4cb7 Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Wed, 13 Mar 2024 15:41:08 -0400 Subject: [PATCH 092/152] test registers --- src/Advection/weno_2.jl | 72 +++---------- src/Advection/weno_3.jl | 102 ++++-------------- src/Advection/weno_4.jl | 137 +++++------------------ src/Advection/weno_5.jl | 167 ++++++----------------------- src/Advection/weno_interpolants.jl | 35 ++++++ src/Utils/kernel_launching.jl | 29 ++--- test_gpu.jl | 95 ++++++++++++++++ 7 files changed, 229 insertions(+), 408 deletions(-) create mode 100644 test_gpu.jl diff --git a/src/Advection/weno_2.jl b/src/Advection/weno_2.jl index 62ae35596f..f5ccc319cc 100644 --- a/src/Advection/weno_2.jl +++ b/src/Advection/weno_2.jl @@ -1,3 +1,4 @@ + for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) biased_β = Symbol(side, :_biased_β) @@ -12,22 +13,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{2, FT}, ψ, idx, loc, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(0)) - C = FT($coeff(scheme, Val(0))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(1)) - C = FT($coeff(scheme, Val(1))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(2), Val(1)) sol1 += ψ̅ * C wei1 += C @@ -39,32 +32,23 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT}, - ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} + scheme::WENO{2}, + ψ, idx, loc, ::AbstractSmoothnessStencil, args...) - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(0)) - C = FT($coeff(scheme, Val(0))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(1)) - C = FT($coeff(scheme, Val(1))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(2), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - # Is glob squared here? return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) end @@ -72,31 +56,15 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{2, FT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - ψs = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) - βu = $biased_β(ψs, scheme, Val(0)) - ψs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) - βv = $biased_β(ψs, scheme, Val(0)) - βU = 0.5 * (βu + βv) - C = FT($coeff(scheme, Val(0))) - α = @fastmath C / (βU + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) - ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob = βU + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - ψs = $stencil_u(i, j, k, scheme, Val(2), Val($val), grid, u) - βu = $biased_β(ψs, scheme, Val(1)) - ψs = $stencil_v(i, j, k, scheme, Val(2), Val($val), grid, v) - βv = $biased_β(ψs, scheme, Val(1)) - βU = 0.5 * (βu + βv) - C = FT($coeff(scheme, Val(1))) - α = @fastmath C / (βU + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, u, v, args...) - ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βU, Val(2), Val(1)) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + glob += add_global_smoothness(β, Val(2), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -110,25 +78,15 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{2, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) - βϕ = $biased_β(ψs, scheme, Val(0)) - C = FT($coeff(scheme, Val(0))) - α = @fastmath C / (βϕ + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob = βϕ + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), VI.func, grid, args...) - βϕ = $biased_β(ψs, scheme, Val(1)) - C = FT($coeff(scheme, Val(1))) - α = @fastmath C / (βϕ + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) - ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βϕ, Val(2), Val(1)) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + glob += add_global_smoothness(β, Val(2), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl index 83924fd1c9..c8680cf720 100644 --- a/src/Advection/weno_3.jl +++ b/src/Advection/weno_3.jl @@ -9,36 +9,24 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT}, + scheme::WENO{3}, ψ, idx, loc, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(0)) - C = FT($coeff(scheme, Val(0))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(1)) - C = FT($coeff(scheme, Val(1))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(2)) - C = FT($coeff(scheme, Val(2))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C @@ -53,33 +41,21 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{3, FT}, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(0)) - C = FT($coeff(scheme, Val(0))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(1)) - C = FT($coeff(scheme, Val(1))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(2)) - C = FT($coeff(scheme, Val(2))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C @@ -94,46 +70,23 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{3, FT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - ψs = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) - βu = $biased_β(ψs, scheme, Val(0)) - ψs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) - βv = $biased_β(ψs, scheme, Val(0)) - βU = 0.5 * (βu + βv) - C = FT($coeff(scheme, Val(0))) - α = @fastmath C / (βU + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) - ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob = βU + + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - ψs = $stencil_u(i, j, k, scheme, Val(2), Val($val), grid, u) - βu = $biased_β(ψs, scheme, Val(1)) - ψs = $stencil_v(i, j, k, scheme, Val(2), Val($val), grid, v) - βv = $biased_β(ψs, scheme, Val(1)) - βU = 0.5 * (βu + βv) - C = FT($coeff(scheme, Val(1))) - α = @fastmath C / (βU + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, u, v, args...) - ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βU, Val(3), Val(1)) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + glob += add_global_smoothness(β, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil_u(i, j, k, scheme, Val(3), Val($val), grid, u) - βu = $biased_β(ψs, scheme, Val(2)) - ψs = $stencil_v(i, j, k, scheme, Val(3), Val($val), grid, v) - βv = $biased_β(ψs, scheme, Val(2)) - βU = 0.5 * (βu + βv) - C = FT($coeff(scheme, Val(2))) - α = @fastmath C / (βU + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, u, v, args...) - ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βU, Val(3), Val(2)) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) + glob += add_global_smoothness(β, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -147,37 +100,22 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{3, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} - ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) - βϕ = $biased_β(ϕs, scheme, Val(0)) - C = FT($coeff(scheme, Val(0))) - α = @fastmath C / (βϕ + FT(ε))^2 - ϕs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - ψ̅ = $biased_p(scheme, Val(0), ϕs, Nothing, Val($val), idx, loc) - glob = βϕ + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - ϕs = $stencil(i, j, k, scheme, Val(2), VI.func, grid, args...) - βϕ = $biased_β(ϕs, scheme, Val(1)) - C = FT($coeff(scheme, Val(1))) - α = @fastmath C / (βϕ + FT(ε))^2 - ϕs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) - ψ̅ = $biased_p(scheme, Val(1), ϕs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βϕ, Val(3), Val(1)) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + glob += add_global_smoothness(β, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ϕs = $stencil(i, j, k, scheme, Val(3), VI.func, grid, args...) - βϕ = $biased_β(ϕs, scheme, Val(2)) - C = FT($coeff(scheme, Val(2))) - α = @fastmath C / (βϕ + FT(ε))^2 - ϕs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) - ψ̅ = $biased_p(scheme, Val(2), ϕs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βϕ, Val(3), Val(2)) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + glob += add_global_smoothness(β, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index d8d75faa60..693e1ec1f7 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -12,44 +12,28 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{4, FT}, ψ, idx, loc, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(0)) - C = FT($coeff(scheme, Val(0))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(1)) - C = FT($coeff(scheme, Val(1))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(4), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(2)) - C = FT($coeff(scheme, Val(2))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(4), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(3)) - C = FT($coeff(scheme, Val(3))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(4), Val(3)) sol1 += ψ̅ * C wei1 += C @@ -63,45 +47,29 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{4, FT}, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} - - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(0)) - C = FT($coeff(scheme, Val(0))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(1)) - C = FT($coeff(scheme, Val(1))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(4), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(2)) - C = FT($coeff(scheme, Val(2))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(4), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(3)) - C = FT($coeff(scheme, Val(3))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(4), Val(3)) sol1 += ψ̅ * C wei1 += C @@ -116,66 +84,34 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{4, FT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - ψs = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) - βu = $biased_β(ψs, scheme, Val(0)) - ψs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) - βv = $biased_β(ψs, scheme, Val(0)) - βU = 0.5 * (βu + βv) - C = FT($coeff(scheme, Val(0))) - α = @fastmath C / (βU + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) - ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob = βU + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - ψs = $stencil_u(i, j, k, scheme, Val(2), Val($val), grid, u) - βu = $biased_β(ψs, scheme, Val(1)) - ψs = $stencil_v(i, j, k, scheme, Val(2), Val($val), grid, v) - βv = $biased_β(ψs, scheme, Val(1)) - βU = 0.5 * (βu + βv) - C = FT($coeff(scheme, Val(1))) - α = @fastmath C / (βU + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, u, v, args...) - ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βU, Val(4), Val(1)) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + glob += add_global_smoothness(β, Val(4), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil_u(i, j, k, scheme, Val(3), Val($val), grid, u) - βu = $biased_β(ψs, scheme, Val(2)) - ψs = $stencil_v(i, j, k, scheme, Val(3), Val($val), grid, v) - βv = $biased_β(ψs, scheme, Val(2)) - βU = 0.5 * (βu + βv) - C = FT($coeff(scheme, Val(2))) - α = @fastmath C / (βU + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, u, v, args...) - ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βU, Val(4), Val(2)) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) + glob += add_global_smoothness(β, Val(4), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil_u(i, j, k, scheme, Val(4), Val($val), grid, u) - βu = $biased_β(ψs, scheme, Val(3)) - ψs = $stencil_v(i, j, k, scheme, Val(4), Val($val), grid, v) - βv = $biased_β(ψs, scheme, Val(3)) - βU = 0.5 * (βu + βv) - C = FT($coeff(scheme, Val(3))) - α = @fastmath C / (βU + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, u, v, args...) - ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βU, Val(4), Val(3)) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) + glob += add_global_smoothness(β, Val(4), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - + # Is glob squared here? return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) end @@ -184,49 +120,30 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{4, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) - βϕ = $biased_β(ψs, scheme, Val(0)) - C = FT($coeff(scheme, Val(0))) - α = @fastmath C / (βϕ + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob = βϕ + + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, VI,args...) + glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), VI.func, grid, args...) - βϕ = $biased_β(ψs, scheme, Val(1)) - C = FT($coeff(scheme, Val(1))) - α = @fastmath C / (βϕ + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) - ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βϕ, Val(4), Val(1)) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, VI,args...) + glob += add_global_smoothness(β, Val(4), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(3), VI.func, grid, args...) - βϕ = $biased_β(ψs, scheme, Val(2)) - C = FT($coeff(scheme, Val(2))) - α = @fastmath C / (βϕ + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) - ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βϕ, Val(4), Val(2)) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, VI,args...) + glob += add_global_smoothness(β, Val(4), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(4), VI.func, grid, args...) - βϕ = $biased_β(ψs, scheme, Val(3)) - C = FT($coeff(scheme, Val(3))) - α = @fastmath C / (βϕ + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) - ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βϕ, Val(4), Val(3)) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + glob += add_global_smoothness(β, Val(4), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl index cb3a727162..5344840610 100644 --- a/src/Advection/weno_5.jl +++ b/src/Advection/weno_5.jl @@ -12,55 +12,35 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{5, FT}, ψ, idx, loc, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(0)) - C = FT($coeff(scheme, Val(0))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(1)) - C = FT($coeff(scheme, Val(1))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(2)) - C = FT($coeff(scheme, Val(2))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(3)) - C = FT($coeff(scheme, Val(3))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(5), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(4)) - C = FT($coeff(scheme, Val(4))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 5, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(4)) sol1 += ψ̅ * C wei1 += C @@ -74,56 +54,36 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{5, FT}, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} - - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(0)) - C = FT($coeff(scheme, Val(0))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(1)) - C = FT($coeff(scheme, Val(1))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(2)) - C = FT($coeff(scheme, Val(2))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(3)) - C = FT($coeff(scheme, Val(3))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(5), ψ, grid, args...) - β = $biased_β(ψs, scheme, Val(4)) - C = FT($coeff(scheme, Val(4))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 5, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(4)) sol1 += ψ̅ * C wei1 += C @@ -138,76 +98,36 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{5, FT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - ψs = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) - βu = $biased_β(ψs, scheme, Val(0)) - ψs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) - βv = $biased_β(ψs, scheme, Val(0)) - βU = 0.5 * (βu + βv) - C = FT($coeff(scheme, Val(0))) - α = @fastmath C / (βU + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) - ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob = βU + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - ψs = $stencil_u(i, j, k, scheme, Val(2), Val($val), grid, u) - βu = $biased_β(ψs, scheme, Val(1)) - ψs = $stencil_v(i, j, k, scheme, Val(2), Val($val), grid, v) - βv = $biased_β(ψs, scheme, Val(1)) - βU = 0.5 * (βu + βv) - C = FT($coeff(scheme, Val(1))) - α = @fastmath C / (βU + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, u, v, args...) - ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βU, Val(5), Val(1)) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + glob += add_global_smoothness(β, Val(5), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil_u(i, j, k, scheme, Val(3), Val($val), grid, u) - βu = $biased_β(ψs, scheme, Val(2)) - ψs = $stencil_v(i, j, k, scheme, Val(3), Val($val), grid, v) - βv = $biased_β(ψs, scheme, Val(2)) - βU = 0.5 * (βu + βv) - C = FT($coeff(scheme, Val(2))) - α = @fastmath C / (βU + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, u, v, args...) - ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βU, Val(5), Val(2)) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) + glob += add_global_smoothness(β, Val(5), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil_u(i, j, k, scheme, Val(4), Val($val), grid, u) - βu = $biased_β(ψs, scheme, Val(3)) - ψs = $stencil_v(i, j, k, scheme, Val(4), Val($val), grid, v) - βv = $biased_β(ψs, scheme, Val(3)) - βU = 0.5 * (βu + βv) - C = FT($coeff(scheme, Val(3))) - α = @fastmath C / (βU + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, u, v, args...) - ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βU, Val(5), Val(3)) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) + glob += add_global_smoothness(β, Val(5), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil_u(i, j, k, scheme, Val(5), Val($val), grid, u) - βu = $biased_β(ψs, scheme, Val(4)) - ψs = $stencil_v(i, j, k, scheme, Val(5), Val($val), grid, v) - βv = $biased_β(ψs, scheme, Val(4)) - βU = 0.5 * (βu + βv) - C = FT($coeff(scheme, Val(4))) - α = @fastmath C / (βU + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(5), ψ, grid, u, v, args...) - ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βU, Val(5), Val(4)) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 5, i, j, k, grid, scheme, ψ, idx, loc, args...) + glob += add_global_smoothness(β, Val(5), Val(4)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α @@ -221,61 +141,36 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{5, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} - ψs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) - βϕ = $biased_β(ψs, scheme, Val(0)) - C = FT($coeff(scheme, Val(0))) - α = @fastmath C / (βϕ + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - ψ̅ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) - glob = βϕ + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - ψs = $stencil(i, j, k, scheme, Val(2), VI.func, grid, args...) - βϕ = $biased_β(ψs, scheme, Val(1)) - C = FT($coeff(scheme, Val(1))) - α = @fastmath C / (βϕ + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(2), ψ, grid, args...) - ψ̅ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βϕ, Val(5), Val(1)) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + glob += add_global_smoothness(β, Val(5), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(3), VI.func, grid, args...) - βϕ = $biased_β(ψs, scheme, Val(2)) - C = FT($coeff(scheme, Val(2))) - α = @fastmath C / (βϕ + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(3), ψ, grid, args...) - ψ̅ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βϕ, Val(5), Val(2)) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + glob += add_global_smoothness(β, Val(5), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(4), VI.func, grid, args...) - βϕ = $biased_β(ψs, scheme, Val(3)) - C = FT($coeff(scheme, Val(3))) - α = @fastmath C / (βϕ + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(4), ψ, grid, args...) - ψ̅ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βϕ, Val(5), Val(3)) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + glob += add_global_smoothness(β, Val(5), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - ψs = $stencil(i, j, k, scheme, Val(5), VI.func, grid, args...) - βϕ = $biased_β(ψs, scheme, Val(4)) - C = FT($coeff(scheme, Val(4))) - α = @fastmath C / (βϕ + FT(ε))^2 - ψs = $stencil(i, j, k, scheme, Val(5), ψ, grid, args...) - ψ̅ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) - glob += add_global_smoothness(βϕ, Val(5), Val(4)) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 5, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + glob += add_global_smoothness(β, Val(5), Val(4)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index cb1fc7582a..f199976431 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -296,6 +296,41 @@ end @inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, grid, v) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) @inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, grid, v) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) +function weno_substep(stencil_func, biased_β, coeff, val, s, i, j, k, grid, scheme::WENO{<:Any, FT}, ψ, idx, loc, args...) where FT + ψs = stencil_func(i, j, k, scheme, Val(s), ψ, grid, args...) + β = biased_β(ψs, scheme, Val(s-0x1)) + C = FT(coeff(scheme, Val(s-0x1))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = biased_p(scheme, Val(s-0x1), ψs, Nothing, Val(val), idx, loc) + + return β, ψ̅, C, α +end + +function weno_substep(stencil_func, stencil_u, stencil_v, biased_β, coeff, val, s, i, j, k, grid, scheme::WENO{<:Any, FT}, ψ, idx, loc, u, v, args...) where FT + ψs = stencil_u(i, j, k, scheme, Val(s), Val(val), grid, u) + βu = biased_β(ψs, scheme, Val(s-0x1)) + ψs = stencil_v(i, j, k, scheme, Val(s), Val(val), grid, v) + βu = biased_β(ψs, scheme, Val(s-0x1)) + βU = 0.5 * (βu + βv) + C = FT(coeff(scheme, Val(s-0x1))) + α = @fastmath C / (βU + FT(ε))^2 + ψs = stencil_func(i, j, k, scheme, Val(s), ψ, grid, args...) + ψ̅ = biased_p(scheme, Val(s-0x1), ψs, Nothing, Val(val), idx, loc) + + return βU, ψ̅, C, α +end + +function weno_substep(stencil_func, biased_β, coeff, val, s, i, j, k, grid, scheme::WENO{<:Any, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where FT + ψs = stencil_func(i, j, k, scheme, Val(s), VI.func, grid, args...) + β = biased_β(ψs, scheme, Val(s-0x1)) + C = FT(coeff(scheme, Val(s-0x1))) + α = @fastmath C / (β + FT(ε))^2 + ψs = stencil_func(i, j, k, scheme, Val(s), ψ, grid, args...) + ψ̅ = biased_p(scheme, Val(s-0x1), ψs, Nothing, Val(val), idx, loc) + + return β, ψ̅, C, α +end + # for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) # biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) # biased_β = Symbol(side, :_biased_β) diff --git a/src/Utils/kernel_launching.jl b/src/Utils/kernel_launching.jl index 6b2f1b8280..5b77c5125e 100644 --- a/src/Utils/kernel_launching.jl +++ b/src/Utils/kernel_launching.jl @@ -158,7 +158,6 @@ If the worksize is 0 after adjusting for active cells, the function returns `not - `active_cells_map`: A map indicating the active cells in the grid. If the map is not a nothing, the workspec will be disregarded and the kernel is configured as a linear kernel with a worksize equal to the length of the active cell map. Default is `nothing`. """ - function configured_kernel(arch, grid, workspec, kernel!; include_right_boundaries = false, reduced_dimensions = (), @@ -311,33 +310,17 @@ function partition(kernel::OffsetKernel, inrange, ingroupsize) end using KernelAbstractions: Kernel, backend, mkcontext, workgroupsize, launch_config, workgroupsize -using CUDA: launch_configuration, registers +using CUDA: launch_configuration, registers, @cuda, CUDABackend -function show_registers(obj::Kernel{CUDABackend}, args...; ndrange=nothing, workgroupsize=nothing) - backend = backend(obj) +function retrieve_kernel(obj::Kernel{CUDABackend}, args...; ndrange=nothing, workgroupsize=nothing) + back = backend(obj) ndrange, workgroupsize, iterspace, dynamic = launch_config(obj, ndrange, workgroupsize) # this might not be the final context, since we may tune the workgroupsize ctx = mkcontext(obj, ndrange, iterspace) + maxthreads = nothing - # If the kernel is statically sized we can tell the compiler about that - if workgroupsize(obj) <: StaticSize - maxthreads = prod(get(workgroupsize(obj))) - else - maxthreads = nothing - end - - kernel = @cuda launch=false always_inline=backend.always_inline maxthreads=maxthreads obj.f(ctx, args...) - - blocks = length(blocks(iterspace)) - threads = length(workitems(iterspace)) - - if blocks == 0 - return nothing - end - - # Launch kernel - kernel(ctx, args...; threads, blocks) + kernel = @cuda launch=false always_inline=back.always_inline maxthreads=maxthreads obj.f(ctx, args...) - return registers(kernel) + return kernel end diff --git a/test_gpu.jl b/test_gpu.jl new file mode 100644 index 0000000000..e561ad4071 --- /dev/null +++ b/test_gpu.jl @@ -0,0 +1,95 @@ +using Oceananigans +using Oceananigans.Advection: DefaultStencil, OnlySelfUpwinding +using Oceananigans.Architectures: architecture +using Oceananigans.Utils: configured_kernel +using Oceananigans.Models.HydrostaticFreeSurfaceModels: + immersed_boundary_condition, + top_tracer_boundary_conditions, + compute_hydrostatic_free_surface_Gu!, + compute_hydrostatic_free_surface_Gv!, + compute_hydrostatic_free_surface_Gc! + +using Oceananigans.ImmersedBoundaries: active_interior_map + +using CUDA +CUDA.device!(1) +a = CPU() + +grid = LatitudeLongitudeGrid(a, size = (20, 20, 20), latitude = (-1, 1), longitude = (-1, 1), z = (0, 1), halo = (7, 7, 7)) +# grid = ImmersedBoundaryGrid(grid, GridFittedBottom((x, y)->x); active_cells_map = true) + +momentum_advection = VectorInvariant(vorticity_scheme = WENO(; order = 9), + divergence_scheme = WENO(), + vertical_scheme = Centered()) #, vorticity_stencil = DefaultStencil()) + +tracer_advection = Oceananigans.Advection.TracerAdvection(WENO(; order = 7), WENO(; order = 7), Centered()) + +# momentum_advection = nothing + +model = HydrostaticFreeSurfaceModel(; grid, momentum_advection) #, tracer_advection) + +arch = architecture(grid) +velocities = model.velocities + +u_immersed_bc = immersed_boundary_condition(velocities.u) +v_immersed_bc = immersed_boundary_condition(velocities.v) + +start_momentum_kernel_args = (model.advection.momentum, + model.coriolis, + model.closure) + +end_momentum_kernel_args = (velocities, + model.free_surface, + model.tracers, + model.buoyancy, + model.diffusivity_fields, + model.pressure.pHY′, + model.auxiliary_fields, + model.forcing, + model.clock) + +u_kernel_args = tuple(start_momentum_kernel_args..., u_immersed_bc, end_momentum_kernel_args...) +v_kernel_args = tuple(start_momentum_kernel_args..., v_immersed_bc, end_momentum_kernel_args...) + +c_immersed_bc = immersed_boundary_condition(model.tracers.T) +top_tracer_bcs = top_tracer_boundary_conditions(grid, model.tracers) + +T_kernel_args = tuple(Val(1), + Val(:T), + model.advection.T, + nothing, + c_immersed_bc, + model.buoyancy, + model.biogeochemistry, + model.velocities, + model.free_surface, + model.tracers, + top_tracer_bcs, + model.diffusivity_fields, + model.auxiliary_fields, + model.forcing.T, + model.clock) + +active_cells_map = active_interior_map(model.grid) + +loop_u! = configured_kernel(arch, grid, :xyz, + compute_hydrostatic_free_surface_Gu!; + active_cells_map) + +loop_v! = configured_kernel(arch, grid, :xyz, + compute_hydrostatic_free_surface_Gv!; + active_cells_map) + +loop_T! = configured_kernel(arch, grid, :xyz, + compute_hydrostatic_free_surface_Gc!; + active_cells_map) + +@show "Kernels are configured" + +kernel_u = Oceananigans.Utils.retrieve_kernel(loop_u!, model.timestepper.Gⁿ.u, grid, active_cells_map, u_kernel_args) +kernel_v = Oceananigans.Utils.retrieve_kernel(loop_v!, model.timestepper.Gⁿ.v, grid, active_cells_map, v_kernel_args) +kernel_T = Oceananigans.Utils.retrieve_kernel(loop_T!, model.timestepper.Gⁿ.T, grid, active_cells_map, T_kernel_args) + +@show CUDA.registers(kernel_u) CUDA.registers(kernel_v) CUDA.registers(kernel_T) + +nothing From b5e7fd9c91260a3713cc1f071265f87676395719 Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Wed, 13 Mar 2024 16:11:57 -0400 Subject: [PATCH 093/152] chnage stuff --- src/Advection/weno_2.jl | 16 ++++++------ src/Advection/weno_3.jl | 24 +++++++++--------- src/Advection/weno_4.jl | 32 ++++++++++++------------ src/Advection/weno_5.jl | 40 +++++++++++++++--------------- src/Advection/weno_interpolants.jl | 28 ++++++++++----------- src/Utils/kernel_launching.jl | 2 +- 6 files changed, 71 insertions(+), 71 deletions(-) diff --git a/src/Advection/weno_2.jl b/src/Advection/weno_2.jl index f5ccc319cc..eff600f94c 100644 --- a/src/Advection/weno_2.jl +++ b/src/Advection/weno_2.jl @@ -13,14 +13,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{2, FT}, ψ, idx, loc, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(2), Val(1)) sol1 += ψ̅ * C wei1 += C @@ -35,14 +35,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{2}, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(2), Val(1)) sol1 += ψ̅ * C wei1 += C @@ -56,14 +56,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{2, FT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) glob += add_global_smoothness(β, Val(2), Val(1)) sol1 += ψ̅ * C wei1 += C @@ -78,14 +78,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{2, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) glob += add_global_smoothness(β, Val(2), Val(1)) sol1 += ψ̅ * C wei1 += C diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl index c8680cf720..de88d7ea64 100644 --- a/src/Advection/weno_3.jl +++ b/src/Advection/weno_3.jl @@ -12,21 +12,21 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{3}, ψ, idx, loc, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C @@ -41,21 +41,21 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{3, FT}, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C @@ -71,21 +71,21 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) glob += add_global_smoothness(β, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) glob += add_global_smoothness(β, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C @@ -100,21 +100,21 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{3, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) glob += add_global_smoothness(β, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) glob += add_global_smoothness(β, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index 693e1ec1f7..2fc79811f6 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -12,28 +12,28 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{4, FT}, ψ, idx, loc, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(4), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(4), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(4), Val(3)) sol1 += ψ̅ * C wei1 += C @@ -48,28 +48,28 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{4, FT}, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(4), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(4), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(4), Val(3)) sol1 += ψ̅ * C wei1 += C @@ -84,28 +84,28 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{4, FT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) glob += add_global_smoothness(β, Val(4), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) glob += add_global_smoothness(β, Val(4), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) glob += add_global_smoothness(β, Val(4), Val(3)) sol1 += ψ̅ * C wei1 += C @@ -121,28 +121,28 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, VI::FunctionStencil, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, VI,args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, VI,args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, VI,args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, VI,args...) glob += add_global_smoothness(β, Val(4), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, VI,args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, VI,args...) glob += add_global_smoothness(β, Val(4), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) glob += add_global_smoothness(β, Val(4), Val(3)) sol1 += ψ̅ * C wei1 += C diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl index 5344840610..f2c218dbfd 100644 --- a/src/Advection/weno_5.jl +++ b/src/Advection/weno_5.jl @@ -12,35 +12,35 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{5, FT}, ψ, idx, loc, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 5, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 5, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(4)) sol1 += ψ̅ * C wei1 += C @@ -55,35 +55,35 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{5, FT}, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 5, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 5, i, j, k, grid, scheme, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(4)) sol1 += ψ̅ * C wei1 += C @@ -98,35 +98,35 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{5, FT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) glob += add_global_smoothness(β, Val(5), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) glob += add_global_smoothness(β, Val(5), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) glob += add_global_smoothness(β, Val(5), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $coeff, $val, 5, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 5, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) glob += add_global_smoothness(β, Val(5), Val(4)) sol1 += ψ̅ * C wei1 += C @@ -141,35 +141,35 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{5, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) glob += add_global_smoothness(β, Val(5), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) glob += add_global_smoothness(β, Val(5), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) glob += add_global_smoothness(β, Val(5), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $coeff, $val, 5, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 5, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) glob += add_global_smoothness(β, Val(5), Val(4)) sol1 += ψ̅ * C wei1 += C diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index f199976431..868900a9c3 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -296,37 +296,37 @@ end @inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, grid, v) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) @inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, grid, v) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) -function weno_substep(stencil_func, biased_β, coeff, val, s, i, j, k, grid, scheme::WENO{<:Any, FT}, ψ, idx, loc, args...) where FT +function weno_substep(stencil_func, biased_β, biased_p, coeff, val, s, i, j, k, grid, scheme::WENO{<:Any, FT}, ψ, idx, loc, args...) where FT ψs = stencil_func(i, j, k, scheme, Val(s), ψ, grid, args...) - β = biased_β(ψs, scheme, Val(s-0x1)) - C = FT(coeff(scheme, Val(s-0x1))) + β = biased_β(ψs, scheme, Val(s-1)) + C = FT(coeff(scheme, Val(s-1))) α = @fastmath C / (β + FT(ε))^2 - ψ̅ = biased_p(scheme, Val(s-0x1), ψs, Nothing, Val(val), idx, loc) + ψ̅ = biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) return β, ψ̅, C, α end -function weno_substep(stencil_func, stencil_u, stencil_v, biased_β, coeff, val, s, i, j, k, grid, scheme::WENO{<:Any, FT}, ψ, idx, loc, u, v, args...) where FT +function weno_substep(stencil_func, stencil_u, stencil_v, biased_β, biased_p, coeff, val, s, i, j, k, grid, scheme::WENO{<:Any, FT}, ψ, idx, loc, u, v, args...) where FT ψs = stencil_u(i, j, k, scheme, Val(s), Val(val), grid, u) - βu = biased_β(ψs, scheme, Val(s-0x1)) + βu = biased_β(ψs, scheme, Val(s-1)) ψs = stencil_v(i, j, k, scheme, Val(s), Val(val), grid, v) - βu = biased_β(ψs, scheme, Val(s-0x1)) + βv = biased_β(ψs, scheme, Val(s-1)) βU = 0.5 * (βu + βv) - C = FT(coeff(scheme, Val(s-0x1))) + C = FT(coeff(scheme, Val(s-1))) α = @fastmath C / (βU + FT(ε))^2 - ψs = stencil_func(i, j, k, scheme, Val(s), ψ, grid, args...) - ψ̅ = biased_p(scheme, Val(s-0x1), ψs, Nothing, Val(val), idx, loc) + ψs = stencil_func(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) + ψ̅ = biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) return βU, ψ̅, C, α end -function weno_substep(stencil_func, biased_β, coeff, val, s, i, j, k, grid, scheme::WENO{<:Any, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where FT +function weno_substep(stencil_func, biased_β, biased_p, coeff, val, s, i, j, k, grid, scheme::WENO{<:Any, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where FT ψs = stencil_func(i, j, k, scheme, Val(s), VI.func, grid, args...) - β = biased_β(ψs, scheme, Val(s-0x1)) - C = FT(coeff(scheme, Val(s-0x1))) + β = biased_β(ψs, scheme, Val(s-1)) + C = FT(coeff(scheme, Val(s-1))) α = @fastmath C / (β + FT(ε))^2 ψs = stencil_func(i, j, k, scheme, Val(s), ψ, grid, args...) - ψ̅ = biased_p(scheme, Val(s-0x1), ψs, Nothing, Val(val), idx, loc) + ψ̅ = biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) return β, ψ̅, C, α end diff --git a/src/Utils/kernel_launching.jl b/src/Utils/kernel_launching.jl index 5b77c5125e..3f4b5906c7 100644 --- a/src/Utils/kernel_launching.jl +++ b/src/Utils/kernel_launching.jl @@ -323,4 +323,4 @@ function retrieve_kernel(obj::Kernel{CUDABackend}, args...; ndrange=nothing, wor kernel = @cuda launch=false always_inline=back.always_inline maxthreads=maxthreads obj.f(ctx, args...) return kernel -end +end \ No newline at end of file From 73a4c47ca9e09bee473ea01825b23f5441a1392f Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Wed, 13 Mar 2024 16:25:38 -0400 Subject: [PATCH 094/152] this should go here --- src/Advection/upwind_biased_reconstruction.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Advection/upwind_biased_reconstruction.jl b/src/Advection/upwind_biased_reconstruction.jl index e2d4ae6452..e7b6955cc7 100644 --- a/src/Advection/upwind_biased_reconstruction.jl +++ b/src/Advection/upwind_biased_reconstruction.jl @@ -136,8 +136,8 @@ for (sd, side) in enumerate((:left, :right)), (dir, ξ, val) in zip((:xᶠᵃᵃ for buffer in advection_buffers @eval begin - @inline $stencil(i, j, k, grid, scheme::UpwindBiased{$buffer, FT}, tid, wrk, ψ, idx, loc, args...) where FT = @inbounds sum($(reconstruction_stencil(buffer, side, ξ, false)) .* retrieve_coeff(scheme, Val($sd), Val($val), idx, loc)) - @inline $stencil(i, j, k, grid, scheme::UpwindBiased{$buffer, FT}, tid, wrk, ψ::Function, idx, loc, args...) where FT = @inbounds sum($(reconstruction_stencil(buffer, side, ξ, true)) .* retrieve_coeff(scheme, Val($sd), Val($val), idx, loc)) + @inline $stencil(i, j, k, grid, scheme::UpwindBiased{$buffer, FT}, ψ, idx, loc, args...) where FT = @inbounds sum($(reconstruction_stencil(buffer, side, ξ, false)) .* retrieve_coeff(scheme, Val($sd), Val($val), idx, loc)) + @inline $stencil(i, j, k, grid, scheme::UpwindBiased{$buffer, FT}, ψ::Function, idx, loc, args...) where FT = @inbounds sum($(reconstruction_stencil(buffer, side, ξ, true)) .* retrieve_coeff(scheme, Val($sd), Val($val), idx, loc)) end end end From d72670a799e55b49c40e2f26329407074c031883 Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Wed, 13 Mar 2024 16:35:40 -0400 Subject: [PATCH 095/152] final version? --- src/Advection/weno_2.jl | 82 ++--------------- src/Advection/weno_3.jl | 97 ++------------------ src/Advection/weno_4.jl | 118 ++---------------------- src/Advection/weno_5.jl | 140 ++--------------------------- src/Advection/weno_interpolants.jl | 83 ++++++++++------- 5 files changed, 78 insertions(+), 442 deletions(-) diff --git a/src/Advection/weno_2.jl b/src/Advection/weno_2.jl index eff600f94c..657f920c5d 100644 --- a/src/Advection/weno_2.jl +++ b/src/Advection/weno_2.jl @@ -1,91 +1,27 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + weno_substep = Symbol(side, :_weno_substep_, dir) @eval begin @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{2, FT}, ψ, idx, loc, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(2), Val(1)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - # Is glob squared here? - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2}, - ψ, idx, loc, ::AbstractSmoothnessStencil, args...) - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob = β - sol1 = ψ̅ * C - wei1 = C - sol2 = ψ̅ * α - wei2 = α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(2), Val(1)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) - glob = β - sol1 = ψ̅ * C - wei1 = C - sol2 = ψ̅ * α - wei2 = α - - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) - glob += add_global_smoothness(β, Val(2), Val(1)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - # Is glob squared here? - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT}, - ψ, idx, loc, VI::FunctionStencil, args...) where {FT} - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) - glob = β - sol1 = ψ̅ * C - wei1 = C - sol2 = ψ̅ * α - wei2 = α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(2), Val(1)) sol1 += ψ̅ * C wei1 += C diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl index de88d7ea64..24c9011635 100644 --- a/src/Advection/weno_3.jl +++ b/src/Advection/weno_3.jl @@ -6,115 +6,28 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ stencil = Symbol(side, :_stencil_, dir) stencil_u = Symbol(:tangential_, side, :_stencil_u) stencil_v = Symbol(:tangential_, side, :_stencil_v) + weno_substep = Symbol(side, :_weno_substep_, dir) @eval begin @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{3}, - ψ, idx, loc, args...) where {FT} + ψ, idx, loc, args...) - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(3), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(3), Val(2)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - # Is glob squared here? - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT}, - ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob = β - sol1 = ψ̅ * C - wei1 = C - sol2 = ψ̅ * α - wei2 = α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(3), Val(1)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(3), Val(2)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - # Is glob squared here? - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - - - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) - glob = β - sol1 = ψ̅ * C - wei1 = C - sol2 = ψ̅ * α - wei2 = α - - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) - glob += add_global_smoothness(β, Val(3), Val(1)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) - glob += add_global_smoothness(β, Val(3), Val(2)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - # Is glob squared here? - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT}, - ψ, idx, loc, VI::FunctionStencil, args...) where {FT} - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) - glob = β - sol1 = ψ̅ * C - wei1 = C - sol2 = ψ̅ * α - wei2 = α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) - glob += add_global_smoothness(β, Val(3), Val(1)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + β, ψ̅, C, α = $weno_substep(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(3), Val(2)) sol1 += ψ̅ * C wei1 += C diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index 2fc79811f6..56e0456870 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -6,143 +6,35 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ stencil = Symbol(side, :_stencil_, dir) stencil_u = Symbol(:tangential_, side, :_stencil_u) stencil_v = Symbol(:tangential_, side, :_stencil_v) + weno_substep = Symbol(side, :_weno_substep_, dir) @eval begin @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{4, FT}, ψ, idx, loc, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(4), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_substep(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(4), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(4), Val(3)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - # Is glob squared here? - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, - ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob = β - sol1 = ψ̅ * C - wei1 = C - sol2 = ψ̅ * α - wei2 = α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(4), Val(1)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(4), Val(2)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(4), Val(3)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - # Is glob squared here? - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) - glob = β - sol1 = ψ̅ * C - wei1 = C - sol2 = ψ̅ * α - wei2 = α - - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) - glob += add_global_smoothness(β, Val(4), Val(1)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) - glob += add_global_smoothness(β, Val(4), Val(2)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) - glob += add_global_smoothness(β, Val(4), Val(3)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - # Is glob squared here? - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, - ψ, idx, loc, VI::FunctionStencil, args...) where {FT} - - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, VI,args...) - glob = β - sol1 = ψ̅ * C - wei1 = C - sol2 = ψ̅ * α - wei2 = α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, VI,args...) - glob += add_global_smoothness(β, Val(4), Val(1)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, VI,args...) - glob += add_global_smoothness(β, Val(4), Val(2)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + β, ψ̅, C, α = $weno_substep(i, j, k, 4, grid, scheme, $val, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(4), Val(3)) sol1 += ψ̅ * C wei1 += C diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl index f2c218dbfd..518be592c0 100644 --- a/src/Advection/weno_5.jl +++ b/src/Advection/weno_5.jl @@ -6,170 +6,42 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ stencil = Symbol(side, :_stencil_, dir) stencil_u = Symbol(:tangential_, side, :_stencil_u) stencil_v = Symbol(:tangential_, side, :_stencil_v) + weno_substep = Symbol(side, :_weno_substep_, dir) @eval begin @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{5, FT}, ψ, idx, loc, args...) where {FT} - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) glob = β sol1 = ψ̅ * C wei1 = C sol2 = ψ̅ * α wei2 = α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(1)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_substep(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(2)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_substep(i, j, k, 4, grid, scheme, $val, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(3)) sol1 += ψ̅ * C wei1 += C sol2 += ψ̅ * α wei2 += α - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 5, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(5), Val(4)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - # Is glob squared here? - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT}, - ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT} - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob = β - sol1 = ψ̅ * C - wei1 = C - sol2 = ψ̅ * α - wei2 = α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(5), Val(1)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(5), Val(2)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(5), Val(3)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 5, i, j, k, grid, scheme, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(5), Val(4)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - # Is glob squared here? - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT} - - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) - glob = β - sol1 = ψ̅ * C - wei1 = C - sol2 = ψ̅ * α - wei2 = α - - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) - glob += add_global_smoothness(β, Val(5), Val(1)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) - glob += add_global_smoothness(β, Val(5), Val(2)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) - glob += add_global_smoothness(β, Val(5), Val(3)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $stencil_u, $stencil_v, $biased_β, $biased_p, $coeff, $val, 5, i, j, k, grid, scheme, ψ, idx, loc, u, v, args...) - glob += add_global_smoothness(β, Val(5), Val(4)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - # Is glob squared here? - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT}, - ψ, idx, loc, VI::FunctionStencil, args...) where {FT} - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 1, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) - glob = β - sol1 = ψ̅ * C - wei1 = C - sol2 = ψ̅ * α - wei2 = α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 2, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) - glob += add_global_smoothness(β, Val(5), Val(1)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 3, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) - glob += add_global_smoothness(β, Val(5), Val(2)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 4, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) - glob += add_global_smoothness(β, Val(5), Val(3)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α - - β, ψ̅, C, α = weno_substep($stencil, $biased_β, $biased_p, $coeff, $val, 5, i, j, k, grid, scheme, ψ, idx, loc, VI, args...) + β, ψ̅, C, α = $weno_substep(i, j, k, 5, grid, scheme, $val, ψ, idx, loc, args...) glob += add_global_smoothness(β, Val(5), Val(4)) sol1 += ψ̅ * C wei1 += C diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 868900a9c3..8a0fca7323 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -296,39 +296,62 @@ end @inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, grid, v) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) @inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, grid, v) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) -function weno_substep(stencil_func, biased_β, biased_p, coeff, val, s, i, j, k, grid, scheme::WENO{<:Any, FT}, ψ, idx, loc, args...) where FT - ψs = stencil_func(i, j, k, scheme, Val(s), ψ, grid, args...) - β = biased_β(ψs, scheme, Val(s-1)) - C = FT(coeff(scheme, Val(s-1))) - α = @fastmath C / (β + FT(ε))^2 - ψ̅ = biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) - - return β, ψ̅, C, α -end -function weno_substep(stencil_func, stencil_u, stencil_v, biased_β, biased_p, coeff, val, s, i, j, k, grid, scheme::WENO{<:Any, FT}, ψ, idx, loc, u, v, args...) where FT - ψs = stencil_u(i, j, k, scheme, Val(s), Val(val), grid, u) - βu = biased_β(ψs, scheme, Val(s-1)) - ψs = stencil_v(i, j, k, scheme, Val(s), Val(val), grid, v) - βv = biased_β(ψs, scheme, Val(s-1)) - βU = 0.5 * (βu + βv) - C = FT(coeff(scheme, Val(s-1))) - α = @fastmath C / (βU + FT(ε))^2 - ψs = stencil_func(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) - ψ̅ = biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) - - return βU, ψ̅, C, α -end +for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) + weno_substep = Symbol(side, :_weno_substep_, dir) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + + @eval begin + function $weno_substep(i, j, k, grid, s, scheme::WENO{<:Any, FT}, val, ψ, idx, loc, args...) where FT + ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(s-1)) + C = FT($coeff(scheme, Val(s-1))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) + + return β, ψ̅, C, α + end + + function $weno_substep(i, j, k, grid, s, scheme::WENO{<:Any, FT}, val, ψ, idx, loc, ::AbstractSmoothnessStencil,args...) where FT + ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) + β = $biased_β(ψs, scheme, Val(s-1)) + C = FT($coeff(scheme, Val(s-1))) + α = @fastmath C / (β + FT(ε))^2 + ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) -function weno_substep(stencil_func, biased_β, biased_p, coeff, val, s, i, j, k, grid, scheme::WENO{<:Any, FT}, ψ, idx, loc, VI::FunctionStencil, args...) where FT - ψs = stencil_func(i, j, k, scheme, Val(s), VI.func, grid, args...) - β = biased_β(ψs, scheme, Val(s-1)) - C = FT(coeff(scheme, Val(s-1))) - α = @fastmath C / (β + FT(ε))^2 - ψs = stencil_func(i, j, k, scheme, Val(s), ψ, grid, args...) - ψ̅ = biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) + return β, ψ̅, C, α + end + + function $weno_substep(i, j, k, grid, s, scheme::WENO{<:Any, FT}, val, ψ, idx, loc, ::VelocityStencil, args...) where FT + ψs = $stencil_u(i, j, k, scheme, Val(s), Val(val), grid, u) + βu = $biased_β(ψs, scheme, Val(s-1)) + ψs = $stencil_v(i, j, k, scheme, Val(s), Val(val), grid, v) + βv = $biased_β(ψs, scheme, Val(s-1)) + βU = 0.5 * (βu + βv) + C = FT($coeff(scheme, Val(s-1))) + α = @fastmath C / (βU + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) + ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) + + return βU, ψ̅, C, α + end - return β, ψ̅, C, α + function $weno_substep(i, j, k, grid, s, scheme::WENO{<:Any, FT}, val, ψ, idx, loc, VI::FunctionStencil, args...) where FT + ψs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) + β = $biased_β(ψs, scheme, Val(s-1)) + C = FT($coeff(scheme, Val(s-1))) + α = @fastmath C / (β + FT(ε))^2 + ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) + ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) + + return β, ψ̅, C, α + end + end end # for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) From bd4d1dd7ea203edcccf99ef4a65b69d2f8294356 Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Wed, 13 Mar 2024 16:36:26 -0400 Subject: [PATCH 096/152] some cleaning up --- src/Advection/weno_3.jl | 12 ++++++------ src/Advection/weno_4.jl | 12 ++++++------ src/Advection/weno_5.jl | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl index 24c9011635..21830ee8e3 100644 --- a/src/Advection/weno_3.jl +++ b/src/Advection/weno_3.jl @@ -1,11 +1,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) weno_substep = Symbol(side, :_weno_substep_, dir) @eval begin diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index 56e0456870..49bec0de03 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -1,11 +1,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) weno_substep = Symbol(side, :_weno_substep_, dir) @eval begin diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl index 518be592c0..5c2a040d38 100644 --- a/src/Advection/weno_5.jl +++ b/src/Advection/weno_5.jl @@ -1,11 +1,11 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) weno_substep = Symbol(side, :_weno_substep_, dir) @eval begin From a46a942af973b8cf1fad4b025f004206c29fad97 Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Thu, 14 Mar 2024 10:53:47 -0400 Subject: [PATCH 097/152] still a problem on GPUs --- src/Advection/weno_2.jl | 23 +++-- src/Advection/weno_3.jl | 33 +++---- src/Advection/weno_4.jl | 42 ++++---- src/Advection/weno_5.jl | 52 +++++----- src/Advection/weno_interpolants.jl | 154 +++++++++-------------------- 5 files changed, 122 insertions(+), 182 deletions(-) diff --git a/src/Advection/weno_2.jl b/src/Advection/weno_2.jl index 657f920c5d..2b8bca6e0e 100644 --- a/src/Advection/weno_2.jl +++ b/src/Advection/weno_2.jl @@ -15,21 +15,20 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, args...) where {FT} β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) - glob = β - sol1 = ψ̅ * C - wei1 = C - sol2 = ψ̅ * α - wei2 = α + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(2), Val(1)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α + τ += add_global_smoothness(β, Val(2), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α - # Is glob squared here? - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end end end \ No newline at end of file diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl index 21830ee8e3..433b124c58 100644 --- a/src/Advection/weno_3.jl +++ b/src/Advection/weno_3.jl @@ -14,28 +14,27 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, args...) β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) - glob = β - sol1 = ψ̅ * C - wei1 = C - sol2 = ψ̅ * α - wei2 = α + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(3), Val(1)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α + τ += add_global_smoothness(β, Val(3), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α β, ψ̅, C, α = $weno_substep(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(3), Val(2)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α + τ += add_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α - # Is glob squared here? - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end end end \ No newline at end of file diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index 49bec0de03..6c0fcdb7df 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -14,35 +14,35 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, args...) where {FT} β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) - glob = β - sol1 = ψ̅ * C - wei1 = C - sol2 = ψ̅ * α - wei2 = α + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(4), Val(1)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α + τ += add_global_smoothness(β, Val(4), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α β, ψ̅, C, α = $weno_substep(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(4), Val(2)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α + τ += add_global_smoothness(β, Val(4), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α β, ψ̅, C, α = $weno_substep(i, j, k, 4, grid, scheme, $val, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(4), Val(3)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α + τ += add_global_smoothness(β, Val(4), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α # Is glob squared here? - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end end end \ No newline at end of file diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl index 5c2a040d38..eaa9348c26 100644 --- a/src/Advection/weno_5.jl +++ b/src/Advection/weno_5.jl @@ -14,42 +14,42 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, args...) where {FT} β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) - glob = β - sol1 = ψ̅ * C - wei1 = C - sol2 = ψ̅ * α - wei2 = α + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(5), Val(1)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α + τ += add_global_smoothness(β, Val(5), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α β, ψ̅, C, α = $weno_substep(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(5), Val(2)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α + τ += add_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α β, ψ̅, C, α = $weno_substep(i, j, k, 4, grid, scheme, $val, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(5), Val(3)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α + τ += add_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α β, ψ̅, C, α = $weno_substep(i, j, k, 5, grid, scheme, $val, ψ, idx, loc, args...) - glob += add_global_smoothness(β, Val(5), Val(4)) - sol1 += ψ̅ * C - wei1 += C - sol2 += ψ̅ * α - wei2 += α + τ += add_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α # Is glob squared here? - return (sol1 + sol2 * glob) / (wei1 + wei2 * glob) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end end end \ No newline at end of file diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 8a0fca7323..139964e11f 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -307,149 +307,91 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ stencil_v = Symbol(:tangential_, side, :_stencil_v) @eval begin - function $weno_substep(i, j, k, grid, s, scheme::WENO{<:Any, FT}, val, ψ, idx, loc, args...) where FT + function $weno_substep(i, j, k, s, grid, scheme::WENO{<:Any, FT}, val, ψ, idx, loc, args...) where FT + + # Retrieve stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) + + # Calculate smoothness of stencil `s` β = $biased_β(ψs, scheme, Val(s-1)) + + # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) α = @fastmath C / (β + FT(ε))^2 + + # Reconstruction of `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) return β, ψ̅, C, α end - function $weno_substep(i, j, k, grid, s, scheme::WENO{<:Any, FT}, val, ψ, idx, loc, ::AbstractSmoothnessStencil,args...) where FT + # If the smoothness stencil is not used (aka it's a `DefaultStencil`) use the same formulation as above + function $weno_substep(i, j, k, s, grid, scheme::WENO{<:Any, FT}, val, ψ, idx, loc, ::AbstractSmoothnessStencil,args...) where FT + + # Retrieve stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) + + # Calculate smoothness of stencil `s` β = $biased_β(ψs, scheme, Val(s-1)) + + # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) α = @fastmath C / (β + FT(ε))^2 + + # Reconstruction of `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) return β, ψ̅, C, α end - function $weno_substep(i, j, k, grid, s, scheme::WENO{<:Any, FT}, val, ψ, idx, loc, ::VelocityStencil, args...) where FT + # Using velocity interpolated at `(Face, Face, Center)` to assess smoothness. + # Can be used only for `(Face, Face, Center)` variables like vorticity + function $weno_substep(i, j, k, s, grid, scheme::WENO{<:Any, FT}, val, ψ, idx, loc, ::VelocityStencil, u, v, args...) where FT + + # Retrieve x-velocity stencil `s` ψs = $stencil_u(i, j, k, scheme, Val(s), Val(val), grid, u) + + # Calculate x-velocity smoothness at stencil `s` βu = $biased_β(ψs, scheme, Val(s-1)) + + # Retrieve y-velocity stencil `s` ψs = $stencil_v(i, j, k, scheme, Val(s), Val(val), grid, v) + + # Calculate y-velocity smoothness at stencil `s` βv = $biased_β(ψs, scheme, Val(s-1)) - βU = 0.5 * (βu + βv) + + # total smoothness + βU = (βu + βv) / 2 + + # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) α = @fastmath C / (βU + FT(ε))^2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) return βU, ψ̅, C, α end - function $weno_substep(i, j, k, grid, s, scheme::WENO{<:Any, FT}, val, ψ, idx, loc, VI::FunctionStencil, args...) where FT + # The smoothness is assessed using the stencil calculated from the function `VI.func(i, j, k, grid, args...)` + function $weno_substep(i, j, k, s, grid, scheme::WENO{<:Any, FT}, val, ψ, idx, loc, VI::FunctionStencil, args...) where FT + + # Retrieve smoothness stencil ϕ at `s` ψs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) + + # Calculate `ϕ` smoothness at `s` β = $biased_β(ψs, scheme, Val(s-1)) + + # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) α = @fastmath C / (β + FT(ε))^2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) return β, ψ̅, C, α end end -end - -# for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) -# biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) -# biased_β = Symbol(side, :_biased_β) -# biased_p = Symbol(side, :_biased_p) -# coeff = Symbol(:coeff_, side) -# stencil = Symbol(side, :_stencil_, dir) -# stencil_u = Symbol(:tangential_, side, :_stencil_u) -# stencil_v = Symbol(:tangential_, side, :_stencil_v) - -# @eval begin -# # The WENO-Z solution here is -# @inline function $biased_interpolate(i, j, k, grid, -# scheme::WENO{N, FT}, tid, wrk, -# ψ, idx, loc, args...) where {N, FT} - -# wrk = ntuple(Val(N)) do s -# Base.@_inline_meta -# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) -# β = $biased_β(ψs, scheme, Val(s-1)) -# C = FT($coeff(scheme, Val(s-1))) -# α = @inbounds @fastmath C / (β + FT(ε))^2 -# ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) -# (β, C, α, ψ̅ * C, ψ̅ * α) -# end - -# τ = global_smoothness_indicator(Val(N), β) - -# # Is glob squared here? -# return (sum(ψ̅C) + sum(ψ̅α) * τ) / (sum(C) + sum(α) * τ) -# end - -# @inline function $biased_interpolate(i, j, k, grid, -# scheme::WENO{N, FT}, tid, wrk, -# ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {N, FT} - -# β, C, α, ψ̅C, ψ̅α = ntuple(Val(N)) do s -# Base.@_inline_meta -# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) -# β = $biased_β(ψs, scheme, Val(s-1)) -# C = FT($coeff(scheme, Val(s-1))) -# α = @fastmath C / (β + FT(ε))^2 -# ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) -# (β, C, α, ψ̅ * C, ψ̅ * α) -# end - -# τ = global_smoothness_indicator(Val(N), β) - -# # Is glob squared here? -# return (sum(ψ̅C) + sum(ψ̅α) * τ) / (sum(C) + sum(α) * τ) -# end - -# @inline function $biased_interpolate(i, j, k, grid, -# scheme::WENO{N, FT}, tid, wrk, -# ψ, idx, loc, ::VelocityStencil, u, v, args...) where {N, FT} - -# β, C, α, ψ̅C, ψ̅α = ntuple(Val(N)) do s -# Base.@_inline_meta -# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) -# us = $stencil_u(i, j, k, scheme, Val(s), Val($val), grid, u) -# vs = $stencil_v(i, j, k, scheme, Val(s), Val($val), grid, v) -# βu = $biased_β(us, scheme, Val(s-1)) -# βv = $biased_β(vs, scheme, Val(s-1)) -# βU = 0.5 * (βu + βv) -# C = FT($coeff(scheme, Val(s-1))) -# α = @fastmath C / (βU + FT(ε))^2 -# ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) -# (βU, C, α, ψ̅ * C, ψ̅ * α) -# end - -# τ = global_smoothness_indicator(Val(N), β) - -# # Is glob squared here? -# return (sum(ψ̅C) + sum(ψ̅α) * τ) / (sum(C) + sum(α) * τ) -# end - -# @inline function $biased_interpolate(i, j, k, grid, -# scheme::WENO{N, FT}, tid, wrk, -# ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT} - -# β, C, α, ψ̅C, ψ̅α = ntuple(Val(N)) do s -# Base.@_inline_meta -# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) -# ϕs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) -# βϕ = $biased_β(ϕs, scheme, Val(s-1)) -# C = FT($coeff(scheme, Val(s-1))) -# α = @fastmath C / (βϕ + FT(ε))^2 -# ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val($val), idx, loc) -# @show (βϕ, C, α, ψ̅ * C, ψ̅ * α) -# (βϕ, C, α, ψ̅ * C, ψ̅ * α) -# end - - -# τ = global_smoothness_indicator(Val(N), β) - -# # Is glob squared here? -# return (sum(ψ̅C) + sum(ψ̅α) * τ) / (sum(C) + sum(α) * τ) -# end -# end -# end +end \ No newline at end of file From 7fa896843ab3fa96772098570f20c7394f5ef152 Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Thu, 14 Mar 2024 11:21:07 -0400 Subject: [PATCH 098/152] some changes --- src/Advection/weno_2.jl | 4 +-- src/Advection/weno_4.jl | 4 +-- src/Advection/weno_5.jl | 4 +-- src/Advection/weno_interpolants.jl | 42 +++++++++++++++--------------- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/Advection/weno_2.jl b/src/Advection/weno_2.jl index 2b8bca6e0e..b40e3531cd 100644 --- a/src/Advection/weno_2.jl +++ b/src/Advection/weno_2.jl @@ -11,8 +11,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT}, - ψ, idx, loc, args...) where {FT} + scheme::WENO{2}, + ψ, idx, loc, args...) β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) τ = β diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index 6c0fcdb7df..8f21f0b900 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -10,8 +10,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, - ψ, idx, loc, args...) where {FT} + scheme::WENO{4}, + ψ, idx, loc, args...) β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) τ = β diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl index eaa9348c26..e1d6483453 100644 --- a/src/Advection/weno_5.jl +++ b/src/Advection/weno_5.jl @@ -10,8 +10,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT}, - ψ, idx, loc, args...) where {FT} + scheme::WENO{5}, + ψ, idx, loc, args...) β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) τ = β diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 139964e11f..a368569f02 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -277,8 +277,8 @@ for side in (:left, :right), dir in (:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ) for buffer in [2, 3, 4, 5, 6] for stencil in 1:buffer @eval begin - @inline $retrieve_stencil(i, j, k, scheme::WENO{$buffer}, ::Val{$stencil}, ψ, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, false)[stencil]) - @inline $retrieve_stencil(i, j, k, scheme::WENO{$buffer}, ::Val{$stencil}, ψ::Function, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, true)[stencil]) + @inline $retrieve_stencil(i, j, k, ::WENO{$buffer}, ::Val{$stencil}, ψ, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, false)[stencil]) + @inline $retrieve_stencil(i, j, k, ::WENO{$buffer}, ::Val{$stencil}, ψ::Function, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, true)[stencil]) end end end @@ -297,7 +297,7 @@ end @inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, grid, v) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) -for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) +for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) weno_substep = Symbol(side, :_weno_substep_, dir) biased_β = Symbol(side, :_biased_β) biased_p = Symbol(side, :_biased_p) @@ -307,26 +307,26 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ stencil_v = Symbol(:tangential_, side, :_stencil_v) @eval begin - function $weno_substep(i, j, k, s, grid, scheme::WENO{<:Any, FT}, val, ψ, idx, loc, args...) where FT + function $weno_substep(i, j, k, s, grid, scheme::WENO{<:Any, FT, XT, YT, ZT}, val, ψ, idx, loc, args...) where {FT, XT, YT, ZT} - # Retrieve stencil `s` + # # Retrieve stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) - # Calculate smoothness of stencil `s` + # # Calculate smoothness of stencil `s` β = $biased_β(ψs, scheme, Val(s-1)) - # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (β + FT(ε))^2 + # # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation + # C = FT($coeff(scheme, Val(s-1))) + # α = @fastmath C / (β + FT(ε))^2 - # Reconstruction of `ψ` from stencil `s` - ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) + # # Reconstruction of `ψ` from stencil `s` + # ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) - return β, ψ̅, C, α + return 1, 1, 1, 1 #β, ψ̅, C, α end # If the smoothness stencil is not used (aka it's a `DefaultStencil`) use the same formulation as above - function $weno_substep(i, j, k, s, grid, scheme::WENO{<:Any, FT}, val, ψ, idx, loc, ::AbstractSmoothnessStencil,args...) where FT + function $weno_substep(i, j, k, s, grid, scheme::WENO{<:Any, FT, XT, YT, ZT}, val, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT, XT, YT, ZT} # Retrieve stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -339,14 +339,14 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ α = @fastmath C / (β + FT(ε))^2 # Reconstruction of `ψ` from stencil `s` - ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) + ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) return β, ψ̅, C, α end # Using velocity interpolated at `(Face, Face, Center)` to assess smoothness. # Can be used only for `(Face, Face, Center)` variables like vorticity - function $weno_substep(i, j, k, s, grid, scheme::WENO{<:Any, FT}, val, ψ, idx, loc, ::VelocityStencil, u, v, args...) where FT + function $weno_substep(i, j, k, s, grid, scheme::WENO{<:Any, FT, XT, YT, ZT}, val, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} # Retrieve x-velocity stencil `s` ψs = $stencil_u(i, j, k, scheme, Val(s), Val(val), grid, u) @@ -361,21 +361,21 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ βv = $biased_β(ψs, scheme, Val(s-1)) # total smoothness - βU = (βu + βv) / 2 + βvelocity = (βu + βv) / 2 # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (βU + FT(ε))^2 + α = @fastmath C / (βvelocity + FT(ε))^2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) - ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) + ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) - return βU, ψ̅, C, α + return βvelocity, ψ̅, C, α end # The smoothness is assessed using the stencil calculated from the function `VI.func(i, j, k, grid, args...)` - function $weno_substep(i, j, k, s, grid, scheme::WENO{<:Any, FT}, val, ψ, idx, loc, VI::FunctionStencil, args...) where FT + function $weno_substep(i, j, k, s, grid, scheme::WENO{<:Any, FT, XT, YT, ZT}, val, ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # Retrieve smoothness stencil ϕ at `s` ψs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) @@ -389,7 +389,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) - ψ̅ = $biased_p(scheme, Val(s-1), ψs, Nothing, Val(val), idx, loc) + ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) return β, ψ̅, C, α end From bd2eb0153d0d1806a9b5f77672f8d589cdd476ed Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Thu, 14 Mar 2024 12:07:35 -0400 Subject: [PATCH 099/152] let's try it out! --- src/Advection/weno_interpolants.jl | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index a368569f02..3d92c8c192 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -307,26 +307,26 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z stencil_v = Symbol(:tangential_, side, :_stencil_v) @eval begin - function $weno_substep(i, j, k, s, grid, scheme::WENO{<:Any, FT, XT, YT, ZT}, val, ψ, idx, loc, args...) where {FT, XT, YT, ZT} + @inline function $weno_substep(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, args...) where {N, FT, XT, YT, ZT} - # # Retrieve stencil `s` + # Retrieve stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) - # # Calculate smoothness of stencil `s` + # Calculate smoothness of stencil `s` β = $biased_β(ψs, scheme, Val(s-1)) - # # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation - # C = FT($coeff(scheme, Val(s-1))) - # α = @fastmath C / (β + FT(ε))^2 + # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation + C = FT($coeff(scheme, Val(s-1))) + α = @fastmath C / (β + FT(ε))^2 - # # Reconstruction of `ψ` from stencil `s` - # ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) + # Reconstruction of `ψ` from stencil `s` + ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) - return 1, 1, 1, 1 #β, ψ̅, C, α + return β, ψ̅, C, α end # If the smoothness stencil is not used (aka it's a `DefaultStencil`) use the same formulation as above - function $weno_substep(i, j, k, s, grid, scheme::WENO{<:Any, FT, XT, YT, ZT}, val, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {FT, XT, YT, ZT} + @inline function $weno_substep(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {N, FT, XT, YT, ZT} # Retrieve stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -346,7 +346,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Using velocity interpolated at `(Face, Face, Center)` to assess smoothness. # Can be used only for `(Face, Face, Center)` variables like vorticity - function $weno_substep(i, j, k, s, grid, scheme::WENO{<:Any, FT, XT, YT, ZT}, val, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} + @inline function $weno_substep(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {N, FT, XT, YT, ZT} # Retrieve x-velocity stencil `s` ψs = $stencil_u(i, j, k, scheme, Val(s), Val(val), grid, u) @@ -375,7 +375,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z end # The smoothness is assessed using the stencil calculated from the function `VI.func(i, j, k, grid, args...)` - function $weno_substep(i, j, k, s, grid, scheme::WENO{<:Any, FT, XT, YT, ZT}, val, ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} + @inline function $weno_substep(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT, XT, YT, ZT} # Retrieve smoothness stencil ϕ at `s` ψs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) From b1fffa01231a6421f19ffca319f4578847ce2f76 Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Thu, 14 Mar 2024 12:14:48 -0400 Subject: [PATCH 100/152] some comments --- src/Advection/weno_2.jl | 2 ++ src/Advection/weno_3.jl | 3 ++ src/Advection/weno_4.jl | 5 ++- src/Advection/weno_5.jl | 6 +++- src/Advection/weno_6.jl | 67 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 81 insertions(+), 2 deletions(-) diff --git a/src/Advection/weno_2.jl b/src/Advection/weno_2.jl index b40e3531cd..88ca708c6a 100644 --- a/src/Advection/weno_2.jl +++ b/src/Advection/weno_2.jl @@ -14,6 +14,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{2}, ψ, idx, loc, args...) + # Stencil S₀ β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) τ = β ψ̂₁ = ψ̅ * C @@ -21,6 +22,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ̂₂ = ψ̅ * α w₂ = α + # Stencil S₁ β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(2), Val(1)) ψ̂₁ += ψ̅ * C diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl index 433b124c58..7f1d17495b 100644 --- a/src/Advection/weno_3.jl +++ b/src/Advection/weno_3.jl @@ -13,6 +13,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{3}, ψ, idx, loc, args...) + # Stencil S₀ β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) τ = β ψ̂₁ = ψ̅ * C @@ -20,6 +21,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ̂₂ = ψ̅ * α w₂ = α + # Stencil S₁ β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(3), Val(1)) ψ̂₁ += ψ̅ * C @@ -27,6 +29,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ̂₂ += ψ̅ * α w₂ += α + # Stencil S₂ β, ψ̅, C, α = $weno_substep(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(3), Val(2)) ψ̂₁ += ψ̅ * C diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index 8f21f0b900..6404da49cd 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -13,6 +13,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{4}, ψ, idx, loc, args...) + # Stencil S₀ β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) τ = β ψ̂₁ = ψ̅ * C @@ -20,6 +21,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ̂₂ = ψ̅ * α w₂ = α + # Stencil S₁ β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(4), Val(1)) ψ̂₁ += ψ̅ * C @@ -27,6 +29,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ̂₂ += ψ̅ * α w₂ += α + # Stencil S₂ β, ψ̅, C, α = $weno_substep(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(4), Val(2)) ψ̂₁ += ψ̅ * C @@ -34,6 +37,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ̂₂ += ψ̅ * α w₂ += α + # Stencil S₃ β, ψ̅, C, α = $weno_substep(i, j, k, 4, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(4), Val(3)) ψ̂₁ += ψ̅ * C @@ -41,7 +45,6 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ̂₂ += ψ̅ * α w₂ += α - # Is glob squared here? return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end end diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl index e1d6483453..6f65f12e92 100644 --- a/src/Advection/weno_5.jl +++ b/src/Advection/weno_5.jl @@ -13,6 +13,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ scheme::WENO{5}, ψ, idx, loc, args...) + # Stencil S₀ β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) τ = β ψ̂₁ = ψ̅ * C @@ -20,6 +21,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ̂₂ = ψ̅ * α w₂ = α + # Stencil S₁ β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(5), Val(1)) ψ̂₁ += ψ̅ * C @@ -27,6 +29,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ̂₂ += ψ̅ * α w₂ += α + # Stencil S₂ β, ψ̅, C, α = $weno_substep(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(5), Val(2)) ψ̂₁ += ψ̅ * C @@ -34,6 +37,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ̂₂ += ψ̅ * α w₂ += α + # Stencil S₃ β, ψ̅, C, α = $weno_substep(i, j, k, 4, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(5), Val(3)) ψ̂₁ += ψ̅ * C @@ -41,6 +45,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ̂₂ += ψ̅ * α w₂ += α + # Stencil S₄ β, ψ̅, C, α = $weno_substep(i, j, k, 5, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(5), Val(4)) ψ̂₁ += ψ̅ * C @@ -48,7 +53,6 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ̂₂ += ψ̅ * α w₂ += α - # Is glob squared here? return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end end diff --git a/src/Advection/weno_6.jl b/src/Advection/weno_6.jl index e69de29bb2..53e3d65e1d 100644 --- a/src/Advection/weno_6.jl +++ b/src/Advection/weno_6.jl @@ -0,0 +1,67 @@ +for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + weno_substep = Symbol(side, :_weno_substep_, dir) + + @eval begin + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{6}, + ψ, idx, loc, args...) + + # Stencil S₀ + β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + # Stencil S₁ + β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) + τ += add_global_smoothness(β, Val(5), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₂ + β, ψ̅, C, α = $weno_substep(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) + τ += add_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₃ + β, ψ̅, C, α = $weno_substep(i, j, k, 4, grid, scheme, $val, ψ, idx, loc, args...) + τ += add_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₄ + β, ψ̅, C, α = $weno_substep(i, j, k, 5, grid, scheme, $val, ψ, idx, loc, args...) + τ += add_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₅ + β, ψ̅, C, α = $weno_substep(i, j, k, 6, grid, scheme, $val, ψ, idx, loc, args...) + τ += add_global_smoothness(β, Val(6), Val(5)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + end + end +end \ No newline at end of file From bc01a9fe626fefd3639527a362977cb6c246e10a Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Thu, 14 Mar 2024 13:55:05 -0400 Subject: [PATCH 101/152] good show method --- src/Advection/vector_invariant_advection.jl | 40 +++++++++++++++------ 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/src/Advection/vector_invariant_advection.jl b/src/Advection/vector_invariant_advection.jl index d216f5391a..28dd870e1a 100644 --- a/src/Advection/vector_invariant_advection.jl +++ b/src/Advection/vector_invariant_advection.jl @@ -108,9 +108,9 @@ Vector Invariant, Dimension-by-dimension reconstruction └── smoothness δv²: FunctionStencil f = v_smoothness ``` """ -function VectorInvariant(; vorticity_scheme = EnstrophyConserving(), +function VectorInvariant(; vorticity_scheme = EnstrophyConserving(), vorticity_stencil = VelocityStencil(), - vertical_scheme = EnergyConserving(), + vertical_scheme = EnergyConserving(), divergence_scheme = vertical_scheme, kinetic_energy_gradient_scheme = divergence_scheme, upwinding = OnlySelfUpwinding(; cross_scheme = divergence_scheme), @@ -152,15 +152,33 @@ const VectorInvariantVelocityVerticalUpwinding = VectorInvariant{<:Any, <:Any, Base.summary(a::VectorInvariant) = string("Vector Invariant, Dimension-by-dimension reconstruction") Base.summary(a::MultiDimensionalVectorInvariant) = string("Vector Invariant, Multidimensional reconstruction") -Base.show(io::IO, a::VectorInvariant{N, FT}) where {N, FT} = - print(io, summary(a), " \n", - " Vorticity flux scheme: ", "\n", - " $(a.vorticity_scheme isa WENO ? "├" : "└")── $(summary(a.vorticity_scheme))", - " $(a.vorticity_scheme isa WENO ? "\n └── smoothness ζ: $(a.vorticity_stencil)\n" : "\n")", - " Vertical advection / Divergence flux scheme: ", "\n", - " $(a.vertical_scheme isa WENO ? "├" : "└")── $(summary(a.vertical_scheme))", - "$(a.vertical_scheme isa AbstractUpwindBiasedAdvectionScheme ? - "\n └── upwinding treatment: $(a.upwinding)" : "")") +function Base.show(io::IO, a::VectorInvariant{N, FT}) where {N, FT} + + δscheme = a.divergence_scheme + vscheme = a.vertical_scheme + ζscheme = a.vorticity_scheme + kscheme = a.kinetic_energy_gradient_scheme + + msg1 = " Vorticity flux scheme: \n" + msg2 = "└── $(summary(ζscheme)) \n" + msg3 = " Kinetic energy gradient flux scheme: \n" + msg4 = "└── $(summary(kscheme)) \n" + msg5 = " Vertical advection scheme: \n" + msg6 = "└── $(summary(vscheme)) \n" + msg7 = (a.vertical_scheme isa EnergyConserving) ? "" : " Divergence flux scheme: \n" + msg8 = isempty(msg7) ? "" : "└── $(summary(a.divergence_scheme)) \n" + + upwinding = (δscheme isa WENO) || (kscheme isa WENO) || (ζscheme isa WENO) + + msg9 = upwinding ? " WENO smoothness stencils: \n" : "" + msg10 = !(ζscheme isa WENO) ? "" : "└── smoothness ζ: $(a.vorticity_stencil)\n" + msg11 = !(δscheme isa WENO) ? "" : "└── smoothness δx_U : $(a.upwinding.δU_stencil)\n" + msg12 = !(δscheme isa WENO) ? "" : "└── smoothness δy_V : $(a.upwinding.δV_stencil)\n" + msg11 = !(kscheme isa WENO) ? "" : "└── smoothness δx_u² : $(a.upwinding.δu²_stencil)\n" + msg12 = !(kscheme isa WENO) ? "" : "└── smoothness δy_v² : $(a.upwinding.δv²_stencil)\n" + + return print(io, summary(a), msg1, msg2, msg3, msg4, msg5, msg6, msg7, msg8, msg9, msg10, msg11, msg12) +end ##### ##### Convenience for WENO Vector Invariant From b2ae5707d20f481690548effef395bd24671baca Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Thu, 14 Mar 2024 14:51:45 -0400 Subject: [PATCH 102/152] changes --- src/Advection/vector_invariant_advection.jl | 4 ++++ src/Advection/weno_2.jl | 2 ++ src/Advection/weno_3.jl | 2 ++ src/Advection/weno_4.jl | 2 ++ src/Advection/weno_5.jl | 2 ++ src/Advection/weno_6.jl | 2 ++ 6 files changed, 14 insertions(+) diff --git a/src/Advection/vector_invariant_advection.jl b/src/Advection/vector_invariant_advection.jl index 28dd870e1a..6e1a237ab4 100644 --- a/src/Advection/vector_invariant_advection.jl +++ b/src/Advection/vector_invariant_advection.jl @@ -327,6 +327,10 @@ end return 1/Vᶜᶠᶜ(i, j, k, grid) * (Φᵟ + 𝒜ᶻ) end +# Fallback for centered advection schemes +@inline upwinded_divergence_flux_Uᶠᶜᶜ(i, j, k, grid, scheme, u, v) = @inbounds u[i, j, k] * _symmetric_interpolate_xᶠᵃᵃ(i, j, k, grid, scheme.divergence_scheme, flux_div_xyᶜᶜᶜ, u, v) +@inline upwinded_divergence_flux_Vᶜᶠᶜ(i, j, k, grid, scheme, u, v) = @inbounds v[i, j, k] * _symmetric_interpolate_yᵃᶠᵃ(i, j, k, grid, scheme.divergence_scheme, flux_div_xyᶜᶜᶜ, u, v) + ##### ##### Horizontal advection 4 formulations: ##### 1. Energy conservative diff --git a/src/Advection/weno_2.jl b/src/Advection/weno_2.jl index 88ca708c6a..016087bf57 100644 --- a/src/Advection/weno_2.jl +++ b/src/Advection/weno_2.jl @@ -30,6 +30,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ̂₂ += ψ̅ * α w₂ += α + τ = abs(τ) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end end diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl index 7f1d17495b..6b074a6b64 100644 --- a/src/Advection/weno_3.jl +++ b/src/Advection/weno_3.jl @@ -37,6 +37,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ̂₂ += ψ̅ * α w₂ += α + τ = abs(τ) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end end diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index 6404da49cd..504c13c27b 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -45,6 +45,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ̂₂ += ψ̅ * α w₂ += α + τ = abs(τ) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end end diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl index 6f65f12e92..2c27a13b63 100644 --- a/src/Advection/weno_5.jl +++ b/src/Advection/weno_5.jl @@ -53,6 +53,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ̂₂ += ψ̅ * α w₂ += α + τ = abs(τ) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end end diff --git a/src/Advection/weno_6.jl b/src/Advection/weno_6.jl index 53e3d65e1d..ea7e6fb556 100644 --- a/src/Advection/weno_6.jl +++ b/src/Advection/weno_6.jl @@ -61,6 +61,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ̂₂ += ψ̅ * α w₂ += α + τ = abs(τ) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end end From 20b4dd2f04ce6979db7f1c9f25e688f28a8e3bec Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Thu, 14 Mar 2024 20:35:59 -0400 Subject: [PATCH 103/152] some change --- src/Advection/weno_2.jl | 18 +++++++++--------- src/Advection/weno_3.jl | 20 ++++++++++---------- src/Advection/weno_4.jl | 22 +++++++++++----------- src/Advection/weno_5.jl | 24 ++++++++++++------------ src/Advection/weno_6.jl | 26 +++++++++++++------------- src/Advection/weno_interpolants.jl | 23 ++++++++++++----------- 6 files changed, 67 insertions(+), 66 deletions(-) diff --git a/src/Advection/weno_2.jl b/src/Advection/weno_2.jl index 016087bf57..6449b4de71 100644 --- a/src/Advection/weno_2.jl +++ b/src/Advection/weno_2.jl @@ -1,13 +1,13 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) - weno_substep = Symbol(side, :_weno_substep_, dir) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + weno_interpolant = Symbol(side, :_weno_interpolant_, dir) @eval begin @inline function $biased_interpolate(i, j, k, grid, @@ -15,7 +15,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, args...) # Stencil S₀ - β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) τ = β ψ̂₁ = ψ̅ * C w₁ = C @@ -23,7 +23,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ w₂ = α # Stencil S₁ - β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(2), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl index 6b074a6b64..a4a8e21186 100644 --- a/src/Advection/weno_3.jl +++ b/src/Advection/weno_3.jl @@ -1,12 +1,12 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) - weno_substep = Symbol(side, :_weno_substep_, dir) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + weno_interpolant = Symbol(side, :_weno_interpolant_, dir) @eval begin @inline function $biased_interpolate(i, j, k, grid, @@ -14,7 +14,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, args...) # Stencil S₀ - β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) τ = β ψ̂₁ = ψ̅ * C w₁ = C @@ -22,7 +22,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ w₂ = α # Stencil S₁ - β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(3), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C @@ -30,7 +30,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ w₂ += α # Stencil S₂ - β, ψ̅, C, α = $weno_substep(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(3), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl index 504c13c27b..a97fe40a84 100644 --- a/src/Advection/weno_4.jl +++ b/src/Advection/weno_4.jl @@ -1,12 +1,12 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) - weno_substep = Symbol(side, :_weno_substep_, dir) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + weno_interpolant = Symbol(side, :_weno_interpolant_, dir) @eval begin @inline function $biased_interpolate(i, j, k, grid, @@ -14,7 +14,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, args...) # Stencil S₀ - β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) τ = β ψ̂₁ = ψ̅ * C w₁ = C @@ -22,7 +22,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ w₂ = α # Stencil S₁ - β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(4), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C @@ -30,7 +30,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ w₂ += α # Stencil S₂ - β, ψ̅, C, α = $weno_substep(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(4), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C @@ -38,7 +38,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ w₂ += α # Stencil S₃ - β, ψ̅, C, α = $weno_substep(i, j, k, 4, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 4, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(4), Val(3)) ψ̂₁ += ψ̅ * C w₁ += C diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl index 2c27a13b63..f77508d207 100644 --- a/src/Advection/weno_5.jl +++ b/src/Advection/weno_5.jl @@ -1,12 +1,12 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) - weno_substep = Symbol(side, :_weno_substep_, dir) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + weno_interpolant = Symbol(side, :_weno_interpolant_, dir) @eval begin @inline function $biased_interpolate(i, j, k, grid, @@ -14,7 +14,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, args...) # Stencil S₀ - β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) τ = β ψ̂₁ = ψ̅ * C w₁ = C @@ -22,7 +22,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ w₂ = α # Stencil S₁ - β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(5), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C @@ -30,7 +30,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ w₂ += α # Stencil S₂ - β, ψ̅, C, α = $weno_substep(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(5), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C @@ -38,7 +38,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ w₂ += α # Stencil S₃ - β, ψ̅, C, α = $weno_substep(i, j, k, 4, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 4, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(5), Val(3)) ψ̂₁ += ψ̅ * C w₁ += C @@ -46,7 +46,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ w₂ += α # Stencil S₄ - β, ψ̅, C, α = $weno_substep(i, j, k, 5, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 5, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(5), Val(4)) ψ̂₁ += ψ̅ * C w₁ += C diff --git a/src/Advection/weno_6.jl b/src/Advection/weno_6.jl index ea7e6fb556..874d9a9580 100644 --- a/src/Advection/weno_6.jl +++ b/src/Advection/weno_6.jl @@ -1,12 +1,12 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) - weno_substep = Symbol(side, :_weno_substep_, dir) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + weno_interpolant = Symbol(side, :_weno_interpolant_, dir) @eval begin @inline function $biased_interpolate(i, j, k, grid, @@ -14,7 +14,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ ψ, idx, loc, args...) # Stencil S₀ - β, ψ̅, C, α = $weno_substep(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) τ = β ψ̂₁ = ψ̅ * C w₁ = C @@ -22,7 +22,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ w₂ = α # Stencil S₁ - β, ψ̅, C, α = $weno_substep(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(5), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C @@ -30,7 +30,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ w₂ += α # Stencil S₂ - β, ψ̅, C, α = $weno_substep(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(5), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C @@ -38,7 +38,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ w₂ += α # Stencil S₃ - β, ψ̅, C, α = $weno_substep(i, j, k, 4, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 4, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(5), Val(3)) ψ̂₁ += ψ̅ * C w₁ += C @@ -46,7 +46,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ w₂ += α # Stencil S₄ - β, ψ̅, C, α = $weno_substep(i, j, k, 5, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 5, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(5), Val(4)) ψ̂₁ += ψ̅ * C w₁ += C @@ -54,7 +54,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ w₂ += α # Stencil S₅ - β, ψ̅, C, α = $weno_substep(i, j, k, 6, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(i, j, k, 6, grid, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(6), Val(5)) ψ̂₁ += ψ̅ * C w₁ += C diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 3d92c8c192..78892e7b02 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -298,16 +298,17 @@ end for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) - weno_substep = Symbol(side, :_weno_substep_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) + weno_interpolant = Symbol(side, :_weno_interpolant_, dir) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) @eval begin - @inline function $weno_substep(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, args...) where {N, FT, XT, YT, ZT} + # Standard weno reconstruction at `i, j, k` for stencil `s` where `1 ≤ s ≤ N` + @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, args...) where {N, FT, XT, YT, ZT} # Retrieve stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -326,7 +327,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z end # If the smoothness stencil is not used (aka it's a `DefaultStencil`) use the same formulation as above - @inline function $weno_substep(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {N, FT, XT, YT, ZT} + @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {N, FT, XT, YT, ZT} # Retrieve stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -346,7 +347,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Using velocity interpolated at `(Face, Face, Center)` to assess smoothness. # Can be used only for `(Face, Face, Center)` variables like vorticity - @inline function $weno_substep(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {N, FT, XT, YT, ZT} + @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {N, FT, XT, YT, ZT} # Retrieve x-velocity stencil `s` ψs = $stencil_u(i, j, k, scheme, Val(s), Val(val), grid, u) @@ -375,7 +376,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z end # The smoothness is assessed using the stencil calculated from the function `VI.func(i, j, k, grid, args...)` - @inline function $weno_substep(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT, XT, YT, ZT} + @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT, XT, YT, ZT} # Retrieve smoothness stencil ϕ at `s` ψs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) From 3adc569571f315ba5654695d5fbdeba4b8ee3d30 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Thu, 14 Mar 2024 21:08:05 -0400 Subject: [PATCH 104/152] small correction --- src/Advection/weno_interpolants.jl | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 78892e7b02..62d8490bb7 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -314,14 +314,14 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) # Calculate smoothness of stencil `s` - β = $biased_β(ψs, scheme, Val(s-1)) + β = $biased_β(ψs, scheme, Val(s-1)) # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (β + FT(ε))^2 + C = FT($coeff(scheme, Val(s-1))) + α = @fastmath C / (β + FT(ε))^2 # Reconstruction of `ψ` from stencil `s` - ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) + ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) return β, ψ̅, C, α end @@ -333,14 +333,14 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) # Calculate smoothness of stencil `s` - β = $biased_β(ψs, scheme, Val(s-1)) + β = $biased_β(ψs, scheme, Val(s-1)) # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (β + FT(ε))^2 + C = FT($coeff(scheme, Val(s-1))) + α = @fastmath C / (β + FT(ε))^2 # Reconstruction of `ψ` from stencil `s` - ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) + ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) return β, ψ̅, C, α end @@ -362,17 +362,17 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z βv = $biased_β(ψs, scheme, Val(s-1)) # total smoothness - βvelocity = (βu + βv) / 2 + βᵁ = (βu + βv) / 2 # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (βvelocity + FT(ε))^2 + C = FT($coeff(scheme, Val(s-1))) + α = @fastmath C / (βᵁ + FT(ε))^2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) - return βvelocity, ψ̅, C, α + return βᵁ, ψ̅, C, α end # The smoothness is assessed using the stencil calculated from the function `VI.func(i, j, k, grid, args...)` @@ -382,17 +382,17 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z ψs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) # Calculate `ϕ` smoothness at `s` - β = $biased_β(ψs, scheme, Val(s-1)) + βᵠ = $biased_β(ψs, scheme, Val(s-1)) # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (β + FT(ε))^2 + α = @fastmath C / (βᵠ + FT(ε))^2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) - return β, ψ̅, C, α + return βᵠ, ψ̅, C, α end end end \ No newline at end of file From c0343c957d89e3b06949d0ad89e81a222003998c Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Sat, 16 Mar 2024 16:43:03 -0400 Subject: [PATCH 105/152] unravel even more --- src/Advection/Advection.jl | 13 +- src/Advection/weno_default.jl | 192 ++++++++++++++++++ src/Advection/weno_interpolants.jl | 169 ++++++++-------- src/Advection/weno_phi.jl | 206 +++++++++++++++++++ src/Advection/weno_vi.jl | 312 +++++++++++++++++++++++++++++ 5 files changed, 802 insertions(+), 90 deletions(-) create mode 100644 src/Advection/weno_default.jl create mode 100644 src/Advection/weno_phi.jl create mode 100644 src/Advection/weno_vi.jl diff --git a/src/Advection/Advection.jl b/src/Advection/Advection.jl index 02b27ea60a..eee24bfe35 100644 --- a/src/Advection/Advection.jl +++ b/src/Advection/Advection.jl @@ -67,11 +67,14 @@ include("centered_reconstruction.jl") include("upwind_biased_reconstruction.jl") include("weno_reconstruction.jl") include("weno_interpolants.jl") -include("weno_2.jl") -include("weno_3.jl") -include("weno_4.jl") -include("weno_5.jl") -include("weno_6.jl") +# include("weno_2.jl") +# include("weno_3.jl") +# include("weno_4.jl") +# include("weno_5.jl") +# include("weno_6.jl") +include("weno_vi.jl") +include("weno_phi.jl") +include("weno_default.jl") include("stretched_weno_smoothness.jl") include("multi_dimensional_reconstruction.jl") include("vector_invariant_upwinding.jl") diff --git a/src/Advection/weno_default.jl b/src/Advection/weno_default.jl new file mode 100644 index 0000000000..de9f096858 --- /dev/null +++ b/src/Advection/weno_default.jl @@ -0,0 +1,192 @@ +for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + new_stencil = Symbol(:new_stencil_, side, dir) + + @eval begin + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{2}, + ψ, idx, loc, VI::FunctionStencil, args...) + + # Stencil S₀ + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₀ = $biased_β(ψs, scheme, Val(0)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₁ + ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₁ = $biased_β(ψs, scheme, Val(1)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + + τ = global_smoothness_indicator(Val(2), (β₀, β₁)) + + α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) + α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) + + return (ψ₀ * α₀ + ψ₁ * α₁) / (α₀ + α₁) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{3}, + ψ, idx, loc, VI::FunctionStencil, args...) + + # Stencil S₀ + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₀ = $biased_β(ψs, scheme, Val(0)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₁ + ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₁ = $biased_β(ψs, scheme, Val(1)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₂ + ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₂ = $biased_β(ψs, scheme, Val(2)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + + τ = global_smoothness_indicator(Val(3), (β₀, β₁, β₂)) + + α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) + α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) + α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) + + return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂) / (α₀ + α₁ + α₂) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4}, + ψ, idx, loc, VI::FunctionStencil, args...) + + # Stencil S₀ + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₀ = $biased_β(ψs, scheme, Val(0)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₁ + ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₁ = $biased_β(ψs, scheme, Val(1)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₂ + ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₂ = $biased_β(ψs, scheme, Val(2)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₃ + ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₃ = $biased_β(ψs, scheme, Val(3)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val(val), idx, loc) + + τ = global_smoothness_indicator(Val(4), (β₀, β₁, β₂, β₃)) + + α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) + α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) + α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) + α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) + + return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃) / (α₀ + α₁ + α₂ + α₃) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{5}, + ψ, idx, loc, VI::FunctionStencil, args...) + + # Stencil S₀ + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₀ = $biased_β(ψs, scheme, Val(0)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₁ + ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₁ = $biased_β(ψs, scheme, Val(1)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₂ + ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₂ = $biased_β(ψs, scheme, Val(2)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₃ + ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₃ = $biased_β(ψs, scheme, Val(3)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val(val), idx, loc) + + # Stencil S₄ + ψs = $new_stencil(i, j, k, scheme, Val(5), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₄ = $biased_β(ψs, scheme, Val(4)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₄ = $biased_p(scheme, Val(4), ψs, Nothing, Val(val), idx, loc) + + τ = global_smoothness_indicator(Val(5), (β₀, β₁, β₂, β₃, β₄)) + + α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) + α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) + α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) + α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) + α₄ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) + + return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄) / (α₀ + α₁ + α₂ + α₃ + α₄) + end + end +end \ No newline at end of file diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 62d8490bb7..e397382ef8 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -155,7 +155,7 @@ end # Smoothness indicators for stencil `stencil` for left and right biased reconstruction for buffer in [2, 3, 4, 5, 6] @eval begin - @inline smoothness_sum(scheme::WENO{$buffer}, ψ, C) = @inbounds @fastmath $(metaprogrammed_smoothness_sum(buffer)) + @inline smoothness_sum(scheme::WENO{$buffer}, ψ, C) = @inbounds $(metaprogrammed_smoothness_sum(buffer)) end for stencil in [0, 1, 2, 3, 4, 5] @@ -286,113 +286,112 @@ end # Stencil for vector invariant calculation of smoothness indicators in the horizontal direction # Parallel to the interpolation direction! (same as left/right stencil) -@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{1}, grid, u) = @inbounds @fastmath left_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) -@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{2}, grid, u) = @inbounds @fastmath left_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) -@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{1}, grid, v) = @inbounds @fastmath left_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) -@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{2}, grid, v) = @inbounds @fastmath left_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) - -@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{1}, grid, u) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) -@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{2}, grid, u) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) -@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, grid, v) = @inbounds @fastmath right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) -@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, grid, v) = @inbounds @fastmath right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) - - -for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) - weno_interpolant = Symbol(side, :_weno_interpolant_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) - - @eval begin - # Standard weno reconstruction at `i, j, k` for stencil `s` where `1 ≤ s ≤ N` - @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, args...) where {N, FT, XT, YT, ZT} +@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{1}, grid, u) = @inbounds left_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) +@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{2}, grid, u) = @inbounds left_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) +@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{1}, grid, v) = @inbounds left_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) +@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{2}, grid, v) = @inbounds left_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) + +@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{1}, grid, u) = @inbounds right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) +@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{2}, grid, u) = @inbounds right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) +@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, grid, v) = @inbounds right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) +@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, grid, v) = @inbounds right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) + +# for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) +# weno_interpolant = Symbol(side, :_weno_interpolant_, dir) +# biased_β = Symbol(side, :_biased_β) +# biased_p = Symbol(side, :_biased_p) +# coeff = Symbol(:coeff_, side) +# stencil = Symbol(side, :_stencil_, dir) +# stencil_u = Symbol(:tangential_, side, :_stencil_u) +# stencil_v = Symbol(:tangential_, side, :_stencil_v) + +# @eval begin +# # Standard weno reconstruction at `i, j, k` for stencil `s` where `1 ≤ s ≤ N` +# @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, args...) where {N, FT, XT, YT, ZT} - # Retrieve stencil `s` - ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) +# # Retrieve stencil `s` +# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) - # Calculate smoothness of stencil `s` - β = $biased_β(ψs, scheme, Val(s-1)) +# # Calculate smoothness of stencil `s` +# β = $biased_β(ψs, scheme, Val(s-1)) - # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (β + FT(ε))^2 +# # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation +# C = FT($coeff(scheme, Val(s-1))) +# α = C / (β + FT(ε))^2 - # Reconstruction of `ψ` from stencil `s` - ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) +# # Reconstruction of `ψ` from stencil `s` +# ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) - return β, ψ̅, C, α - end +# return β, ψ̅, C, α +# end - # If the smoothness stencil is not used (aka it's a `DefaultStencil`) use the same formulation as above - @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {N, FT, XT, YT, ZT} +# # If the smoothness stencil is not used (aka it's a `DefaultStencil`) use the same formulation as above +# @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {N, FT, XT, YT, ZT} - # Retrieve stencil `s` - ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) +# # Retrieve stencil `s` +# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) - # Calculate smoothness of stencil `s` - β = $biased_β(ψs, scheme, Val(s-1)) +# # Calculate smoothness of stencil `s` +# β = $biased_β(ψs, scheme, Val(s-1)) - # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (β + FT(ε))^2 +# # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation +# C = FT($coeff(scheme, Val(s-1))) +# α = C / (β + FT(ε))^2 - # Reconstruction of `ψ` from stencil `s` - ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) +# # Reconstruction of `ψ` from stencil `s` +# ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) - return β, ψ̅, C, α - end +# return β, ψ̅, C, α +# end - # Using velocity interpolated at `(Face, Face, Center)` to assess smoothness. - # Can be used only for `(Face, Face, Center)` variables like vorticity - @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {N, FT, XT, YT, ZT} +# # Using velocity interpolated at `(Face, Face, Center)` to assess smoothness. +# # Can be used only for `(Face, Face, Center)` variables like vorticity +# @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {N, FT, XT, YT, ZT} - # Retrieve x-velocity stencil `s` - ψs = $stencil_u(i, j, k, scheme, Val(s), Val(val), grid, u) +# # Retrieve x-velocity stencil `s` +# ψs = $stencil_u(i, j, k, scheme, Val(s), Val(val), grid, u) - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(ψs, scheme, Val(s-1)) +# # Calculate x-velocity smoothness at stencil `s` +# βu = $biased_β(ψs, scheme, Val(s-1)) - # Retrieve y-velocity stencil `s` - ψs = $stencil_v(i, j, k, scheme, Val(s), Val(val), grid, v) +# # Retrieve y-velocity stencil `s` +# ψs = $stencil_v(i, j, k, scheme, Val(s), Val(val), grid, v) - # Calculate y-velocity smoothness at stencil `s` - βv = $biased_β(ψs, scheme, Val(s-1)) +# # Calculate y-velocity smoothness at stencil `s` +# βv = $biased_β(ψs, scheme, Val(s-1)) - # total smoothness - βᵁ = (βu + βv) / 2 +# # total smoothness +# βᵁ = (βu + βv) / 2 - # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (βᵁ + FT(ε))^2 +# # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation +# C = FT($coeff(scheme, Val(s-1))) +# α = C / (βᵁ + FT(ε))^2 - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) - ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) +# # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` +# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) +# ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) - return βᵁ, ψ̅, C, α - end +# return βᵁ, ψ̅, C, α +# end - # The smoothness is assessed using the stencil calculated from the function `VI.func(i, j, k, grid, args...)` - @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT, XT, YT, ZT} +# # The smoothness is assessed using the stencil calculated from the function `VI.func(i, j, k, grid, args...)` +# @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT, XT, YT, ZT} - # Retrieve smoothness stencil ϕ at `s` - ψs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) +# # Retrieve smoothness stencil ϕ at `s` +# ψs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) - # Calculate `ϕ` smoothness at `s` - βᵠ = $biased_β(ψs, scheme, Val(s-1)) +# # Calculate `ϕ` smoothness at `s` +# βᵠ = $biased_β(ψs, scheme, Val(s-1)) - # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (βᵠ + FT(ε))^2 +# # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation +# C = FT($coeff(scheme, Val(s-1))) +# α = C / (βᵠ + FT(ε))^2 - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) - ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) +# # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` +# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) +# ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) - return βᵠ, ψ̅, C, α - end - end -end \ No newline at end of file +# return βᵠ, ψ̅, C, α +# end +# end +# end diff --git a/src/Advection/weno_phi.jl b/src/Advection/weno_phi.jl new file mode 100644 index 0000000000..fa33a0221c --- /dev/null +++ b/src/Advection/weno_phi.jl @@ -0,0 +1,206 @@ +for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + new_stencil = Symbol(:new_stencil_, side, dir) + + @eval begin + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{2}, + ψ, idx, loc, VI::FunctionStencil, args...) + + # Stencil S₀ + ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₀ = $biased_β(ϕs, scheme, Val(0)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₁ + ϕs = $new_stencil(i, j, k, scheme, Val(2), ϕs, VI.func, grid, args...) + ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₁ = $biased_β(ϕs, scheme, Val(1)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + + τ = global_smoothness_indicator(Val(2), (β₀, β₁)) + + α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) + α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) + + return (ψ₀ * α₀ + ψ₁ * α₁) / (α₀ + α₁) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{3}, + ψ, idx, loc, VI::FunctionStencil, args...) + + # Stencil S₀ + ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₀ = $biased_β(ϕs, scheme, Val(0)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₁ + ϕs = $new_stencil(i, j, k, scheme, Val(2), ϕs, VI.func, grid, args...) + ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₁ = $biased_β(ϕs, scheme, Val(1)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₂ + ϕs = $new_stencil(i, j, k, scheme, Val(3), ϕs, VI.func, grid, args...) + ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₂ = $biased_β(ϕs, scheme, Val(2)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + + τ = global_smoothness_indicator(Val(3), (β₀, β₁, β₂)) + + α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) + α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) + α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) + + return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂) / (α₀ + α₁ + α₂) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4}, + ψ, idx, loc, VI::FunctionStencil, args...) + + # Stencil S₀ + ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₀ = $biased_β(ϕs, scheme, Val(0)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₁ + ϕs = $new_stencil(i, j, k, scheme, Val(2), ϕs, VI.func, grid, args...) + ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₁ = $biased_β(ϕs, scheme, Val(1)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₂ + ϕs = $new_stencil(i, j, k, scheme, Val(3), ϕs, VI.func, grid, args...) + ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₂ = $biased_β(ϕs, scheme, Val(2)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₃ + ϕs = $new_stencil(i, j, k, scheme, Val(4), ϕs, VI.func, grid, args...) + ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₃ = $biased_β(ϕs, scheme, Val(3)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val(val), idx, loc) + + τ = global_smoothness_indicator(Val(4), (β₀, β₁, β₂, β₃)) + + α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) + α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) + α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) + α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) + + return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃) / (α₀ + α₁ + α₂ + α₃) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{5}, + ψ, idx, loc, VI::FunctionStencil, args...) + + # Stencil S₀ + ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₀ = $biased_β(ϕs, scheme, Val(0)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₁ + ϕs = $new_stencil(i, j, k, scheme, Val(2), ϕs, VI.func, grid, args...) + ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₁ = $biased_β(ϕs, scheme, Val(1)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₂ + ϕs = $new_stencil(i, j, k, scheme, Val(3), ϕs, VI.func, grid, args...) + ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₂ = $biased_β(ϕs, scheme, Val(2)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₃ + ϕs = $new_stencil(i, j, k, scheme, Val(4), ϕs, VI.func, grid, args...) + ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₃ = $biased_β(ϕs, scheme, Val(3)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val(val), idx, loc) + + # Stencil S₄ + ϕs = $new_stencil(i, j, k, scheme, Val(5), ϕs, VI.func, grid, args...) + ψs = $new_stencil(i, j, k, scheme, Val(5), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₄ = $biased_β(ϕs, scheme, Val(4)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₄ = $biased_p(scheme, Val(4), ψs, Nothing, Val(val), idx, loc) + + τ = global_smoothness_indicator(Val(5), (β₀, β₁, β₂, β₃, β₄)) + + α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) + α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) + α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) + α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) + α₄ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) + + return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄) / (α₀ + α₁ + α₂ + α₃ + α₄) + end + end +end \ No newline at end of file diff --git a/src/Advection/weno_vi.jl b/src/Advection/weno_vi.jl new file mode 100644 index 0000000000..151b7bbc74 --- /dev/null +++ b/src/Advection/weno_vi.jl @@ -0,0 +1,312 @@ +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-2, j, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-3, j, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-4, j, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-5, j, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-6, j, k, grid, args...), ψs[1:N-1]...) + +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-2, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-3, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-4, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-5, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-6, k, grid, args...), ψs[1:N-1]...) + +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-2, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-3, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-4, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-5, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-6, grid, args...), ψs[1:N-1]...) + +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ, args...) where N = @inbounds (ψ[i-2, j, k], ψs[1:N-1]...) +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ, args...) where N = @inbounds (ψ[i-3, j, k], ψs[1:N-1]...) +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ, args...) where N = @inbounds (ψ[i-4, j, k], ψs[1:N-1]...) +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ, args...) where N = @inbounds (ψ[i-5, j, k], ψs[1:N-1]...) +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ, args...) where N = @inbounds (ψ[i-6, j, k], ψs[1:N-1]...) + +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-2, k], ψs[1:N-1]...) +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-3, k], ψs[1:N-1]...) +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-4, k], ψs[1:N-1]...) +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-5, k], ψs[1:N-1]...) +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-6, k], ψs[1:N-1]...) + +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψargs...) where N = @inbounds (ψ[i, j, k-2], ψs[1:N-1]...) +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψargs...) where N = @inbounds (ψ[i, j, k-3], ψs[1:N-1]...) +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψargs...) where N = @inbounds (ψ[i, j, k-4], ψs[1:N-1]...) +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψargs...) where N = @inbounds (ψ[i, j, k-5], ψs[1:N-1]...) +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψargs...) where N = @inbounds (ψ[i, j, k-6], ψs[1:N-1]...) + +for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + new_stencil = Symbol(:new_stencil_, side, dir) + + @eval begin + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{2}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) + + # Stencil S₀ + us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(0)) + βv = $biased_β(vs, scheme, Val(0)) + + # total smoothness + β₀ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₁ + us = $new_stencil(i, j, k, scheme, Val(2), us, ℑyᵃᶠᵃ, grid, u) + vs = $new_stencil(i, j, k, scheme, Val(2), vs, ℑxᶠᵃᵃ, grid, v) + ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(1)) + βv = $biased_β(vs, scheme, Val(1)) + + # total smoothness + β₁ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + + τ = global_smoothness_indicator(Val(2), (β₀, β₁)) + + α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) + α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) + + return (ψ₀ * α₀ + ψ₁ * α₁) / (α₀ + α₁) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{3}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) + + # Stencil S₀ + us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(0)) + βv = $biased_β(vs, scheme, Val(0)) + + # total smoothness + β₀ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₁ + us = $new_stencil(i, j, k, scheme, Val(2), us, ℑyᵃᶠᵃ, grid, u) + vs = $new_stencil(i, j, k, scheme, Val(2), vs, ℑxᶠᵃᵃ, grid, v) + ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(1)) + βv = $biased_β(vs, scheme, Val(1)) + + # total smoothness + β₁ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₂ + us = $new_stencil(i, j, k, scheme, Val(3), us, ℑyᵃᶠᵃ, grid, u) + vs = $new_stencil(i, j, k, scheme, Val(3), vs, ℑxᶠᵃᵃ, grid, v) + ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(2)) + βv = $biased_β(vs, scheme, Val(2)) + + # total smoothness + β₂ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + + τ = global_smoothness_indicator(Val(3), (β₀, β₁, β₂)) + + α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) + α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) + α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) + + return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂) / (α₀ + α₁ + α₂) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) + + # Stencil S₀ + us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(0)) + βv = $biased_β(vs, scheme, Val(0)) + + # total smoothness + β₀ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₁ + us = $new_stencil(i, j, k, scheme, Val(2), us, ℑyᵃᶠᵃ, grid, u) + vs = $new_stencil(i, j, k, scheme, Val(2), vs, ℑxᶠᵃᵃ, grid, v) + ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(1)) + βv = $biased_β(vs, scheme, Val(1)) + + # total smoothness + β₁ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₂ + us = $new_stencil(i, j, k, scheme, Val(3), us, ℑyᵃᶠᵃ, grid, u) + vs = $new_stencil(i, j, k, scheme, Val(3), vs, ℑxᶠᵃᵃ, grid, v) + ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(2)) + βv = $biased_β(vs, scheme, Val(2)) + + # total smoothness + β₂ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₃ + us = $new_stencil(i, j, k, scheme, Val(4), us, ℑyᵃᶠᵃ, grid, u) + vs = $new_stencil(i, j, k, scheme, Val(4), vs, ℑxᶠᵃᵃ, grid, v) + ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(3)) + βv = $biased_β(vs, scheme, Val(3)) + + # total smoothness + β₃ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + + τ = global_smoothness_indicator(Val(4), (β₀, β₁, β₂, β₃)) + + α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) + α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) + α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) + α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) + + return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃) / (α₀ + α₁ + α₂ + α₃) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{5}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) + + # Stencil S₀ + us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(0)) + βv = $biased_β(vs, scheme, Val(0)) + + # total smoothness + β₀ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₁ + us = $new_stencil(i, j, k, scheme, Val(2), us, ℑyᵃᶠᵃ, grid, u) + vs = $new_stencil(i, j, k, scheme, Val(2), vs, ℑxᶠᵃᵃ, grid, v) + ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(1)) + βv = $biased_β(vs, scheme, Val(1)) + + # total smoothness + β₁ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₂ + us = $new_stencil(i, j, k, scheme, Val(3), us, ℑyᵃᶠᵃ, grid, u) + vs = $new_stencil(i, j, k, scheme, Val(3), vs, ℑxᶠᵃᵃ, grid, v) + ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(2)) + βv = $biased_β(vs, scheme, Val(2)) + + # total smoothness + β₂ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₃ + us = $new_stencil(i, j, k, scheme, Val(4), us, ℑyᵃᶠᵃ, grid, u) + vs = $new_stencil(i, j, k, scheme, Val(4), vs, ℑxᶠᵃᵃ, grid, v) + ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(3)) + βv = $biased_β(vs, scheme, Val(3)) + + # total smoothness + β₃ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + + # Stencil S₄ + us = $new_stencil(i, j, k, scheme, Val(5), us, ℑyᵃᶠᵃ, grid, u) + vs = $new_stencil(i, j, k, scheme, Val(5), vs, ℑxᶠᵃᵃ, grid, v) + ψs = $new_stencil(i, j, k, scheme, Val(5), ψs, ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(4)) + βv = $biased_β(vs, scheme, Val(4)) + + # total smoothness + β₄ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₄ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) + + τ = global_smoothness_indicator(Val(5), (β₀, β₁, β₂, β₃, β₄)) + + α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) + α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) + α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) + α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) + α₄ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) + + return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄) / (α₀ + α₁ + α₂ + α₃ + α₄) + end + end +end \ No newline at end of file From d876733a062ff8c0c1e8d1334f2a506b9de90946 Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Sat, 16 Mar 2024 17:00:58 -0400 Subject: [PATCH 106/152] now it should work? --- src/Advection/weno_default.jl | 37 ++++++--- src/Advection/weno_interpolants.jl | 120 +++++++++++++++++++++++------ src/Advection/weno_phi.jl | 24 +++--- src/Advection/weno_vi.jl | 54 +++---------- 4 files changed, 142 insertions(+), 93 deletions(-) diff --git a/src/Advection/weno_default.jl b/src/Advection/weno_default.jl index de9f096858..0d495d0006 100644 --- a/src/Advection/weno_default.jl +++ b/src/Advection/weno_default.jl @@ -6,12 +6,25 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ stencil = Symbol(side, :_stencil_, dir) stencil_u = Symbol(:tangential_, side, :_stencil_u) stencil_v = Symbol(:tangential_, side, :_stencil_v) - new_stencil = Symbol(:new_stencil_, side, dir) + new_stencil = Symbol(:new_stencil_, side, :_, dir) @eval begin + + # Fallback for DefaultStencil formulations and disambiguation + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{2}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{3}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{4}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{5}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{6}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2}, - ψ, idx, loc, VI::FunctionStencil, args...) + scheme::WENO{2, FT}, + ψ, idx, loc, args...) where FT # Stencil S₀ ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -40,8 +53,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3}, - ψ, idx, loc, VI::FunctionStencil, args...) + scheme::WENO{3, FT}, + ψ, idx, loc, args...) where FT # Stencil S₀ ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -80,8 +93,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4}, - ψ, idx, loc, VI::FunctionStencil, args...) + scheme::WENO{4, FT}, + ψ, idx, loc, args...) where FT # Stencil S₀ ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -117,7 +130,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₃ = $biased_β(ψs, scheme, Val(3)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val(val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) τ = global_smoothness_indicator(Val(4), (β₀, β₁, β₂, β₃)) @@ -130,8 +143,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5}, - ψ, idx, loc, VI::FunctionStencil, args...) + scheme::WENO{5, FT}, + ψ, idx, loc, args...) where FT # Stencil S₀ ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -167,7 +180,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₃ = $biased_β(ψs, scheme, Val(3)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val(val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) # Stencil S₄ ψs = $new_stencil(i, j, k, scheme, Val(5), ψs, ψ, grid, args...) @@ -176,7 +189,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₄ = $biased_β(ψs, scheme, Val(4)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₄ = $biased_p(scheme, Val(4), ψs, Nothing, Val(val), idx, loc) + ψ₄ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) τ = global_smoothness_indicator(Val(5), (β₀, β₁, β₂, β₃, β₄)) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index e397382ef8..83740b9aa4 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -190,30 +190,30 @@ end @inline global_smoothness_indicator(::Val{5}, β) = @inbounds abs(β[1] + 2β[2] - 6β[3] + 2β[4] + β[5]) @inline global_smoothness_indicator(::Val{6}, β) = @inbounds abs(β[1] + β[2] - 8β[3] + 8β[4] - β[5] - β[6]) -@inline add_global_smoothness(β, ::Val{2}, ::Val{1}) = + β -@inline add_global_smoothness(β, ::Val{2}, ::Val{2}) = - β - -@inline add_global_smoothness(β, ::Val{3}, ::Val{1}) = + β -@inline add_global_smoothness(β, ::Val{3}, ::Val{2}) = 0 -@inline add_global_smoothness(β, ::Val{3}, ::Val{3}) = - β - -@inline add_global_smoothness(β, ::Val{4}, ::Val{1}) = + β -@inline add_global_smoothness(β, ::Val{4}, ::Val{2}) = + 3β -@inline add_global_smoothness(β, ::Val{4}, ::Val{3}) = - 3β -@inline add_global_smoothness(β, ::Val{4}, ::Val{4}) = - β - -@inline add_global_smoothness(β, ::Val{5}, ::Val{1}) = + β -@inline add_global_smoothness(β, ::Val{5}, ::Val{2}) = + 2β -@inline add_global_smoothness(β, ::Val{5}, ::Val{3}) = - 6β -@inline add_global_smoothness(β, ::Val{5}, ::Val{4}) = + 2β -@inline add_global_smoothness(β, ::Val{5}, ::Val{5}) = + β - -@inline add_global_smoothness(β, ::Val{6}, ::Val{1}) = + β -@inline add_global_smoothness(β, ::Val{6}, ::Val{2}) = + β -@inline add_global_smoothness(β, ::Val{6}, ::Val{3}) = - 8β -@inline add_global_smoothness(β, ::Val{6}, ::Val{4}) = + 8β -@inline add_global_smoothness(β, ::Val{6}, ::Val{5}) = - β -@inline add_global_smoothness(β, ::Val{6}, ::Val{6}) = - β +# @inline add_global_smoothness(β, ::Val{2}, ::Val{1}) = + β +# @inline add_global_smoothness(β, ::Val{2}, ::Val{2}) = - β + +# @inline add_global_smoothness(β, ::Val{3}, ::Val{1}) = + β +# @inline add_global_smoothness(β, ::Val{3}, ::Val{2}) = 0 +# @inline add_global_smoothness(β, ::Val{3}, ::Val{3}) = - β + +# @inline add_global_smoothness(β, ::Val{4}, ::Val{1}) = + β +# @inline add_global_smoothness(β, ::Val{4}, ::Val{2}) = + 3β +# @inline add_global_smoothness(β, ::Val{4}, ::Val{3}) = - 3β +# @inline add_global_smoothness(β, ::Val{4}, ::Val{4}) = - β + +# @inline add_global_smoothness(β, ::Val{5}, ::Val{1}) = + β +# @inline add_global_smoothness(β, ::Val{5}, ::Val{2}) = + 2β +# @inline add_global_smoothness(β, ::Val{5}, ::Val{3}) = - 6β +# @inline add_global_smoothness(β, ::Val{5}, ::Val{4}) = + 2β +# @inline add_global_smoothness(β, ::Val{5}, ::Val{5}) = + β + +# @inline add_global_smoothness(β, ::Val{6}, ::Val{1}) = + β +# @inline add_global_smoothness(β, ::Val{6}, ::Val{2}) = + β +# @inline add_global_smoothness(β, ::Val{6}, ::Val{3}) = - 8β +# @inline add_global_smoothness(β, ::Val{6}, ::Val{4}) = + 8β +# @inline add_global_smoothness(β, ::Val{6}, ::Val{5}) = - β +# @inline add_global_smoothness(β, ::Val{6}, ::Val{6}) = - β """ calc_weno_stencil(buffer, shift, dir, func::Bool = false) @@ -296,6 +296,78 @@ end @inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, grid, v) = @inbounds right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) @inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, grid, v) = @inbounds right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-2, j, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-3, j, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-4, j, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-5, j, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-6, j, k, grid, args...), ψs[1:N-1]...) + +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-2, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-3, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-4, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-5, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-6, k, grid, args...), ψs[1:N-1]...) + +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-2, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-3, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-4, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-5, grid, args...), ψs[1:N-1]...) +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-6, grid, args...), ψs[1:N-1]...) + +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ, args...) where N = @inbounds (ψ[i-2, j, k], ψs[1:N-1]...) +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ, args...) where N = @inbounds (ψ[i-3, j, k], ψs[1:N-1]...) +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ, args...) where N = @inbounds (ψ[i-4, j, k], ψs[1:N-1]...) +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ, args...) where N = @inbounds (ψ[i-5, j, k], ψs[1:N-1]...) +@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ, args...) where N = @inbounds (ψ[i-6, j, k], ψs[1:N-1]...) + +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-2, k], ψs[1:N-1]...) +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-3, k], ψs[1:N-1]...) +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-4, k], ψs[1:N-1]...) +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-5, k], ψs[1:N-1]...) +@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-6, k], ψs[1:N-1]...) + +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-2], ψs[1:N-1]...) +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-3], ψs[1:N-1]...) +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-4], ψs[1:N-1]...) +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-5], ψs[1:N-1]...) +@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-6], ψs[1:N-1]...) + +@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-1, j, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-2, j, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-3, j, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-4, j, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-5, j, k, grid, args...), ψs[1:N-1]...) + +@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-1, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-2, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-3, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-4, k, grid, args...), ψs[1:N-1]...) +@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-5, k, grid, args...), ψs[1:N-1]...) + +@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-1, grid, args...), ψs[1:N-1]...) +@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-2, grid, args...), ψs[1:N-1]...) +@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-3, grid, args...), ψs[1:N-1]...) +@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-4, grid, args...), ψs[1:N-1]...) +@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-5, grid, args...), ψs[1:N-1]...) + +@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ, args...) where N = @inbounds (ψ[i-1, j, k], ψs[1:N-1]...) +@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ, args...) where N = @inbounds (ψ[i-2, j, k], ψs[1:N-1]...) +@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ, args...) where N = @inbounds (ψ[i-3, j, k], ψs[1:N-1]...) +@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ, args...) where N = @inbounds (ψ[i-4, j, k], ψs[1:N-1]...) +@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ, args...) where N = @inbounds (ψ[i-5, j, k], ψs[1:N-1]...) + +@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-1, k], ψs[1:N-1]...) +@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-2, k], ψs[1:N-1]...) +@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-3, k], ψs[1:N-1]...) +@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-4, k], ψs[1:N-1]...) +@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-5, k], ψs[1:N-1]...) + +@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-1], ψs[1:N-1]...) +@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-2], ψs[1:N-1]...) +@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-3], ψs[1:N-1]...) +@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-4], ψs[1:N-1]...) +@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-5], ψs[1:N-1]...) + # for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) # weno_interpolant = Symbol(side, :_weno_interpolant_, dir) # biased_β = Symbol(side, :_biased_β) diff --git a/src/Advection/weno_phi.jl b/src/Advection/weno_phi.jl index fa33a0221c..c46e1f4fe8 100644 --- a/src/Advection/weno_phi.jl +++ b/src/Advection/weno_phi.jl @@ -6,12 +6,12 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ stencil = Symbol(side, :_stencil_, dir) stencil_u = Symbol(:tangential_, side, :_stencil_u) stencil_v = Symbol(:tangential_, side, :_stencil_v) - new_stencil = Symbol(:new_stencil_, side, dir) + new_stencil = Symbol(:new_stencil_, side, :_, dir) @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2}, - ψ, idx, loc, VI::FunctionStencil, args...) + scheme::WENO{2, FT}, + ψ, idx, loc, VI::FunctionStencil, args...) where FT # Stencil S₀ ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) @@ -42,8 +42,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3}, - ψ, idx, loc, VI::FunctionStencil, args...) + scheme::WENO{3, FT}, + ψ, idx, loc, VI::FunctionStencil, args...) where FT # Stencil S₀ ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) @@ -85,8 +85,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4}, - ψ, idx, loc, VI::FunctionStencil, args...) + scheme::WENO{4, FT}, + ψ, idx, loc, VI::FunctionStencil, args...) where FT # Stencil S₀ ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) @@ -126,7 +126,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₃ = $biased_β(ϕs, scheme, Val(3)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val(val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) τ = global_smoothness_indicator(Val(4), (β₀, β₁, β₂, β₃)) @@ -139,8 +139,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5}, - ψ, idx, loc, VI::FunctionStencil, args...) + scheme::WENO{5, FT}, + ψ, idx, loc, VI::FunctionStencil, args...) where FT # Stencil S₀ ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) @@ -180,7 +180,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₃ = $biased_β(ϕs, scheme, Val(3)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val(val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) # Stencil S₄ ϕs = $new_stencil(i, j, k, scheme, Val(5), ϕs, VI.func, grid, args...) @@ -190,7 +190,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₄ = $biased_β(ϕs, scheme, Val(4)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₄ = $biased_p(scheme, Val(4), ψs, Nothing, Val(val), idx, loc) + ψ₄ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) τ = global_smoothness_indicator(Val(5), (β₀, β₁, β₂, β₃, β₄)) diff --git a/src/Advection/weno_vi.jl b/src/Advection/weno_vi.jl index 151b7bbc74..d0595384e0 100644 --- a/src/Advection/weno_vi.jl +++ b/src/Advection/weno_vi.jl @@ -1,39 +1,3 @@ -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-2, j, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-3, j, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-4, j, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-5, j, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-6, j, k, grid, args...), ψs[1:N-1]...) - -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-2, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-3, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-4, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-5, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-6, k, grid, args...), ψs[1:N-1]...) - -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-2, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-3, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-4, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-5, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-6, grid, args...), ψs[1:N-1]...) - -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ, args...) where N = @inbounds (ψ[i-2, j, k], ψs[1:N-1]...) -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ, args...) where N = @inbounds (ψ[i-3, j, k], ψs[1:N-1]...) -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ, args...) where N = @inbounds (ψ[i-4, j, k], ψs[1:N-1]...) -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ, args...) where N = @inbounds (ψ[i-5, j, k], ψs[1:N-1]...) -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ, args...) where N = @inbounds (ψ[i-6, j, k], ψs[1:N-1]...) - -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-2, k], ψs[1:N-1]...) -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-3, k], ψs[1:N-1]...) -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-4, k], ψs[1:N-1]...) -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-5, k], ψs[1:N-1]...) -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-6, k], ψs[1:N-1]...) - -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψargs...) where N = @inbounds (ψ[i, j, k-2], ψs[1:N-1]...) -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψargs...) where N = @inbounds (ψ[i, j, k-3], ψs[1:N-1]...) -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψargs...) where N = @inbounds (ψ[i, j, k-4], ψs[1:N-1]...) -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψargs...) where N = @inbounds (ψ[i, j, k-5], ψs[1:N-1]...) -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψargs...) where N = @inbounds (ψ[i, j, k-6], ψs[1:N-1]...) - for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) biased_β = Symbol(side, :_biased_β) @@ -42,12 +6,12 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ stencil = Symbol(side, :_stencil_, dir) stencil_u = Symbol(:tangential_, side, :_stencil_u) stencil_v = Symbol(:tangential_, side, :_stencil_v) - new_stencil = Symbol(:new_stencil_, side, dir) + new_stencil = Symbol(:new_stencil_, side, :_, dir) @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) + scheme::WENO{2, FT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where FT # Stencil S₀ us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) @@ -88,8 +52,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) + scheme::WENO{3, FT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where FT # Stencil S₀ us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) @@ -146,8 +110,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) + scheme::WENO{4, FT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where FT # Stencil S₀ us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) @@ -220,8 +184,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) + scheme::WENO{5, FT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where FT # Stencil S₀ us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) From 0a9f530cc130f21a1ec33fc9ff3f6a2eb5008c93 Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Sat, 16 Mar 2024 17:12:58 -0400 Subject: [PATCH 107/152] let's see if tests pass --- src/Advection/weno_default.jl | 46 +++++++++++++++++------------------ src/Advection/weno_phi.jl | 46 +++++++++++++++++------------------ src/Advection/weno_vi.jl | 46 +++++++++++++++++------------------ 3 files changed, 69 insertions(+), 69 deletions(-) diff --git a/src/Advection/weno_default.jl b/src/Advection/weno_default.jl index 0d495d0006..90136c987f 100644 --- a/src/Advection/weno_default.jl +++ b/src/Advection/weno_default.jl @@ -1,4 +1,4 @@ -for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) +for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) biased_β = Symbol(side, :_biased_β) biased_p = Symbol(side, :_biased_p) @@ -23,8 +23,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT}, - ψ, idx, loc, args...) where FT + scheme::WENO{2, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} # Stencil S₀ ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -33,7 +33,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₀ = $biased_β(ψs, scheme, Val(0)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) # Stencil S₁ ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) @@ -42,7 +42,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₁ = $biased_β(ψs, scheme, Val(1)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(2), (β₀, β₁)) @@ -53,8 +53,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT}, - ψ, idx, loc, args...) where FT + scheme::WENO{3, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} # Stencil S₀ ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -63,7 +63,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₀ = $biased_β(ψs, scheme, Val(0)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) # Stencil S₁ ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) @@ -72,7 +72,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₁ = $biased_β(ψs, scheme, Val(1)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) # Stencil S₂ ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) @@ -81,7 +81,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₂ = $biased_β(ψs, scheme, Val(2)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(3), (β₀, β₁, β₂)) @@ -93,8 +93,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, - ψ, idx, loc, args...) where FT + scheme::WENO{4, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} # Stencil S₀ ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -103,7 +103,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₀ = $biased_β(ψs, scheme, Val(0)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) # Stencil S₁ ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) @@ -112,7 +112,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₁ = $biased_β(ψs, scheme, Val(1)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) # Stencil S₂ ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) @@ -121,7 +121,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₂ = $biased_β(ψs, scheme, Val(2)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) # Stencil S₃ ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, args...) @@ -130,7 +130,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₃ = $biased_β(ψs, scheme, Val(3)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(4), (β₀, β₁, β₂, β₃)) @@ -143,8 +143,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT}, - ψ, idx, loc, args...) where FT + scheme::WENO{5, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} # Stencil S₀ ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) @@ -153,7 +153,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₀ = $biased_β(ψs, scheme, Val(0)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) # Stencil S₁ ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) @@ -162,7 +162,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₁ = $biased_β(ψs, scheme, Val(1)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) # Stencil S₂ ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) @@ -171,7 +171,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₂ = $biased_β(ψs, scheme, Val(2)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) # Stencil S₃ ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, args...) @@ -180,7 +180,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₃ = $biased_β(ψs, scheme, Val(3)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) # Stencil S₄ ψs = $new_stencil(i, j, k, scheme, Val(5), ψs, ψ, grid, args...) @@ -189,7 +189,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₄ = $biased_β(ψs, scheme, Val(4)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₄ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) + ψ₄ = $biased_p(scheme, Val(4), ψs, $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(5), (β₀, β₁, β₂, β₃, β₄)) diff --git a/src/Advection/weno_phi.jl b/src/Advection/weno_phi.jl index c46e1f4fe8..f07ff8c2d8 100644 --- a/src/Advection/weno_phi.jl +++ b/src/Advection/weno_phi.jl @@ -1,4 +1,4 @@ -for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) +for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) biased_β = Symbol(side, :_biased_β) biased_p = Symbol(side, :_biased_p) @@ -10,8 +10,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT}, - ψ, idx, loc, VI::FunctionStencil, args...) where FT + scheme::WENO{2, FT, XT, YT, ZT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # Stencil S₀ ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) @@ -21,7 +21,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₀ = $biased_β(ϕs, scheme, Val(0)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) # Stencil S₁ ϕs = $new_stencil(i, j, k, scheme, Val(2), ϕs, VI.func, grid, args...) @@ -31,7 +31,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₁ = $biased_β(ϕs, scheme, Val(1)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(2), (β₀, β₁)) @@ -42,8 +42,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT}, - ψ, idx, loc, VI::FunctionStencil, args...) where FT + scheme::WENO{3, FT, XT, YT, ZT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # Stencil S₀ ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) @@ -53,7 +53,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₀ = $biased_β(ϕs, scheme, Val(0)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) # Stencil S₁ ϕs = $new_stencil(i, j, k, scheme, Val(2), ϕs, VI.func, grid, args...) @@ -63,7 +63,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₁ = $biased_β(ϕs, scheme, Val(1)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) # Stencil S₂ ϕs = $new_stencil(i, j, k, scheme, Val(3), ϕs, VI.func, grid, args...) @@ -73,7 +73,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₂ = $biased_β(ϕs, scheme, Val(2)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(3), (β₀, β₁, β₂)) @@ -85,8 +85,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, - ψ, idx, loc, VI::FunctionStencil, args...) where FT + scheme::WENO{4, FT, XT, YT, ZT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # Stencil S₀ ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) @@ -96,7 +96,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₀ = $biased_β(ϕs, scheme, Val(0)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) # Stencil S₁ ϕs = $new_stencil(i, j, k, scheme, Val(2), ϕs, VI.func, grid, args...) @@ -106,7 +106,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₁ = $biased_β(ϕs, scheme, Val(1)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) # Stencil S₂ ϕs = $new_stencil(i, j, k, scheme, Val(3), ϕs, VI.func, grid, args...) @@ -116,7 +116,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₂ = $biased_β(ϕs, scheme, Val(2)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) # Stencil S₃ ϕs = $new_stencil(i, j, k, scheme, Val(4), ϕs, VI.func, grid, args...) @@ -126,7 +126,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₃ = $biased_β(ϕs, scheme, Val(3)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(4), (β₀, β₁, β₂, β₃)) @@ -139,8 +139,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT}, - ψ, idx, loc, VI::FunctionStencil, args...) where FT + scheme::WENO{5, FT, XT, YT, ZT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # Stencil S₀ ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) @@ -150,7 +150,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₀ = $biased_β(ϕs, scheme, Val(0)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) # Stencil S₁ ϕs = $new_stencil(i, j, k, scheme, Val(2), ϕs, VI.func, grid, args...) @@ -160,7 +160,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₁ = $biased_β(ϕs, scheme, Val(1)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) # Stencil S₂ ϕs = $new_stencil(i, j, k, scheme, Val(3), ϕs, VI.func, grid, args...) @@ -170,7 +170,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₂ = $biased_β(ϕs, scheme, Val(2)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) # Stencil S₃ ϕs = $new_stencil(i, j, k, scheme, Val(4), ϕs, VI.func, grid, args...) @@ -180,7 +180,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₃ = $biased_β(ϕs, scheme, Val(3)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) # Stencil S₄ ϕs = $new_stencil(i, j, k, scheme, Val(5), ϕs, VI.func, grid, args...) @@ -190,7 +190,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₄ = $biased_β(ϕs, scheme, Val(4)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₄ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) + ψ₄ = $biased_p(scheme, Val(4), ψs, $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(5), (β₀, β₁, β₂, β₃, β₄)) diff --git a/src/Advection/weno_vi.jl b/src/Advection/weno_vi.jl index d0595384e0..46041c295c 100644 --- a/src/Advection/weno_vi.jl +++ b/src/Advection/weno_vi.jl @@ -1,4 +1,4 @@ -for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) +for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) biased_β = Symbol(side, :_biased_β) biased_p = Symbol(side, :_biased_p) @@ -10,8 +10,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where FT + scheme::WENO{2, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} # Stencil S₀ us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) @@ -26,7 +26,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₀ = (βu + βv) / 2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) # Stencil S₁ us = $new_stencil(i, j, k, scheme, Val(2), us, ℑyᵃᶠᵃ, grid, u) @@ -41,7 +41,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₁ = (βu + βv) / 2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(2), (β₀, β₁)) @@ -52,8 +52,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where FT + scheme::WENO{3, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} # Stencil S₀ us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) @@ -68,7 +68,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₀ = (βu + βv) / 2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) # Stencil S₁ us = $new_stencil(i, j, k, scheme, Val(2), us, ℑyᵃᶠᵃ, grid, u) @@ -83,7 +83,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₁ = (βu + βv) / 2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) # Stencil S₂ us = $new_stencil(i, j, k, scheme, Val(3), us, ℑyᵃᶠᵃ, grid, u) @@ -98,7 +98,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₂ = (βu + βv) / 2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(3), (β₀, β₁, β₂)) @@ -110,8 +110,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where FT + scheme::WENO{4, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} # Stencil S₀ us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) @@ -126,7 +126,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₀ = (βu + βv) / 2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) # Stencil S₁ us = $new_stencil(i, j, k, scheme, Val(2), us, ℑyᵃᶠᵃ, grid, u) @@ -141,7 +141,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₁ = (βu + βv) / 2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) # Stencil S₂ us = $new_stencil(i, j, k, scheme, Val(3), us, ℑyᵃᶠᵃ, grid, u) @@ -156,7 +156,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₂ = (βu + βv) / 2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) # Stencil S₃ us = $new_stencil(i, j, k, scheme, Val(4), us, ℑyᵃᶠᵃ, grid, u) @@ -171,7 +171,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₃ = (βu + βv) / 2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(4), (β₀, β₁, β₂, β₃)) @@ -184,8 +184,8 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where FT + scheme::WENO{5, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} # Stencil S₀ us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) @@ -200,7 +200,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₀ = (βu + βv) / 2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, Nothing, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) # Stencil S₁ us = $new_stencil(i, j, k, scheme, Val(2), us, ℑyᵃᶠᵃ, grid, u) @@ -215,7 +215,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₁ = (βu + βv) / 2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, Nothing, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) # Stencil S₂ us = $new_stencil(i, j, k, scheme, Val(3), us, ℑyᵃᶠᵃ, grid, u) @@ -230,7 +230,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₂ = (βu + βv) / 2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, Nothing, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) # Stencil S₃ us = $new_stencil(i, j, k, scheme, Val(4), us, ℑyᵃᶠᵃ, grid, u) @@ -245,7 +245,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₃ = (βu + βv) / 2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, Nothing, Val($val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) # Stencil S₄ us = $new_stencil(i, j, k, scheme, Val(5), us, ℑyᵃᶠᵃ, grid, u) @@ -260,7 +260,7 @@ for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃ β₄ = (βu + βv) / 2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₄ = $biased_p(scheme, Val(4), ψs, Nothing, Val($val), idx, loc) + ψ₄ = $biased_p(scheme, Val(4), ψs, $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(5), (β₀, β₁, β₂, β₃, β₄)) From 6efe4f4bd66e99da85a97c8e9a001436e5755f66 Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Sat, 16 Mar 2024 17:17:41 -0400 Subject: [PATCH 108/152] all the way to weno 6 --- src/Advection/weno_default.jl | 70 ++++++++++++++++++++++ src/Advection/weno_phi.jl | 76 ++++++++++++++++++++++++ src/Advection/weno_vi.jl | 106 ++++++++++++++++++++++++++++++++++ 3 files changed, 252 insertions(+) diff --git a/src/Advection/weno_default.jl b/src/Advection/weno_default.jl index 90136c987f..c7337dcf13 100644 --- a/src/Advection/weno_default.jl +++ b/src/Advection/weno_default.jl @@ -201,5 +201,75 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄) / (α₀ + α₁ + α₂ + α₃ + α₄) end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{6, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} + + # Stencil S₀ + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₀ = $biased_β(ψs, scheme, Val(0)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) + + # Stencil S₁ + ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₁ = $biased_β(ψs, scheme, Val(1)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) + + # Stencil S₂ + ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₂ = $biased_β(ψs, scheme, Val(2)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) + + # Stencil S₃ + ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₃ = $biased_β(ψs, scheme, Val(3)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) + + # Stencil S₄ + ψs = $new_stencil(i, j, k, scheme, Val(5), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₄ = $biased_β(ψs, scheme, Val(4)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₄ = $biased_p(scheme, Val(4), ψs, $CT, Val($val), idx, loc) + + # Stencil S₄ + ψs = $new_stencil(i, j, k, scheme, Val(6), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₅ = $biased_β(ψs, scheme, Val(5)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₅ = $biased_p(scheme, Val(5), ψs, $CT, Val($val), idx, loc) + + τ = global_smoothness_indicator(Val(6), (β₀, β₁, β₂, β₃, β₄, β₅)) + + α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) + α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) + α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) + α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) + α₄ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) + α₅ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) + + return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄ + ψ₅ * α₅) / (α₀ + α₁ + α₂ + α₃ + α₄ + α₅) + end end end \ No newline at end of file diff --git a/src/Advection/weno_phi.jl b/src/Advection/weno_phi.jl index f07ff8c2d8..132f49f167 100644 --- a/src/Advection/weno_phi.jl +++ b/src/Advection/weno_phi.jl @@ -202,5 +202,81 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄) / (α₀ + α₁ + α₂ + α₃ + α₄) end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{6, FT, XT, YT, ZT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} + + # Stencil S₀ + ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₀ = $biased_β(ϕs, scheme, Val(0)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) + + # Stencil S₁ + ϕs = $new_stencil(i, j, k, scheme, Val(2), ϕs, VI.func, grid, args...) + ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₁ = $biased_β(ϕs, scheme, Val(1)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) + + # Stencil S₂ + ϕs = $new_stencil(i, j, k, scheme, Val(3), ϕs, VI.func, grid, args...) + ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₂ = $biased_β(ϕs, scheme, Val(2)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) + + # Stencil S₃ + ϕs = $new_stencil(i, j, k, scheme, Val(4), ϕs, VI.func, grid, args...) + ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₃ = $biased_β(ϕs, scheme, Val(3)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) + + # Stencil S₄ + ϕs = $new_stencil(i, j, k, scheme, Val(5), ϕs, VI.func, grid, args...) + ψs = $new_stencil(i, j, k, scheme, Val(5), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₄ = $biased_β(ϕs, scheme, Val(4)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₄ = $biased_p(scheme, Val(4), ψs, $CT, Val($val), idx, loc) + + # Stencil S₄ + ϕs = $new_stencil(i, j, k, scheme, Val(6), ϕs, VI.func, grid, args...) + ψs = $new_stencil(i, j, k, scheme, Val(6), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + β₅ = $biased_β(ϕs, scheme, Val(5)) + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₅ = $biased_p(scheme, Val(5), ψs, $CT, Val($val), idx, loc) + + τ = global_smoothness_indicator(Val(6), (β₀, β₁, β₂, β₃, β₄, β₅)) + + α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) + α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) + α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) + α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) + α₄ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) + α₅ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) + + return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄ + ψ₅ * α₅) / (α₀ + α₁ + α₂ + α₃ + α₄ + α₅) + end end end \ No newline at end of file diff --git a/src/Advection/weno_vi.jl b/src/Advection/weno_vi.jl index 46041c295c..c33c0c3658 100644 --- a/src/Advection/weno_vi.jl +++ b/src/Advection/weno_vi.jl @@ -272,5 +272,111 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄) / (α₀ + α₁ + α₂ + α₃ + α₄) end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{6, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} + + # Stencil S₀ + us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) + vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) + ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(0)) + βv = $biased_β(vs, scheme, Val(0)) + + # total smoothness + β₀ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) + + # Stencil S₁ + us = $new_stencil(i, j, k, scheme, Val(2), us, ℑyᵃᶠᵃ, grid, u) + vs = $new_stencil(i, j, k, scheme, Val(2), vs, ℑxᶠᵃᵃ, grid, v) + ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(1)) + βv = $biased_β(vs, scheme, Val(1)) + + # total smoothness + β₁ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) + + # Stencil S₂ + us = $new_stencil(i, j, k, scheme, Val(3), us, ℑyᵃᶠᵃ, grid, u) + vs = $new_stencil(i, j, k, scheme, Val(3), vs, ℑxᶠᵃᵃ, grid, v) + ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(2)) + βv = $biased_β(vs, scheme, Val(2)) + + # total smoothness + β₂ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) + + # Stencil S₃ + us = $new_stencil(i, j, k, scheme, Val(4), us, ℑyᵃᶠᵃ, grid, u) + vs = $new_stencil(i, j, k, scheme, Val(4), vs, ℑxᶠᵃᵃ, grid, v) + ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(3)) + βv = $biased_β(vs, scheme, Val(3)) + + # total smoothness + β₃ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) + + # Stencil S₄ + us = $new_stencil(i, j, k, scheme, Val(5), us, ℑyᵃᶠᵃ, grid, u) + vs = $new_stencil(i, j, k, scheme, Val(5), vs, ℑxᶠᵃᵃ, grid, v) + ψs = $new_stencil(i, j, k, scheme, Val(5), ψs, ψ, grid, u, v, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(4)) + βv = $biased_β(vs, scheme, Val(4)) + + # total smoothness + β₄ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₄ = $biased_p(scheme, Val(4), ψs, $CT, Val($val), idx, loc) + + # Stencil S₅ + us = $new_stencil(i, j, k, scheme, Val(6), us, ℑyᵃᶠᵃ, grid, u) + vs = $new_stencil(i, j, k, scheme, Val(6), vs, ℑxᶠᵃᵃ, grid, v) + ψs = $new_stencil(i, j, k, scheme, Val(6), ψs, ψ, grid, args...) + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(5)) + βv = $biased_β(vs, scheme, Val(5)) + + # total smoothness + β₅ = (βu + βv) / 2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ₅ = $biased_p(scheme, Val(5), ψs, $CT, Val($val), idx, loc) + + τ = global_smoothness_indicator(Val(6), (β₀, β₁, β₂, β₃, β₄, β₅)) + + α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) + α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) + α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) + α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) + α₄ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) + α₅ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) + + return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄ + ψ₅ * α₅) / (α₀ + α₁ + α₂ + α₃ + α₄ + α₅) + end end end \ No newline at end of file From 1ae94278be86a76b3b792f8a2f595e32919adece Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Sat, 16 Mar 2024 17:21:57 -0400 Subject: [PATCH 109/152] possibility of doing it another way --- src/Advection/weno_interpolants.jl | 48 +++++++++++++++--------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 83740b9aa4..c6b6ea4714 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -190,30 +190,30 @@ end @inline global_smoothness_indicator(::Val{5}, β) = @inbounds abs(β[1] + 2β[2] - 6β[3] + 2β[4] + β[5]) @inline global_smoothness_indicator(::Val{6}, β) = @inbounds abs(β[1] + β[2] - 8β[3] + 8β[4] - β[5] - β[6]) -# @inline add_global_smoothness(β, ::Val{2}, ::Val{1}) = + β -# @inline add_global_smoothness(β, ::Val{2}, ::Val{2}) = - β - -# @inline add_global_smoothness(β, ::Val{3}, ::Val{1}) = + β -# @inline add_global_smoothness(β, ::Val{3}, ::Val{2}) = 0 -# @inline add_global_smoothness(β, ::Val{3}, ::Val{3}) = - β - -# @inline add_global_smoothness(β, ::Val{4}, ::Val{1}) = + β -# @inline add_global_smoothness(β, ::Val{4}, ::Val{2}) = + 3β -# @inline add_global_smoothness(β, ::Val{4}, ::Val{3}) = - 3β -# @inline add_global_smoothness(β, ::Val{4}, ::Val{4}) = - β - -# @inline add_global_smoothness(β, ::Val{5}, ::Val{1}) = + β -# @inline add_global_smoothness(β, ::Val{5}, ::Val{2}) = + 2β -# @inline add_global_smoothness(β, ::Val{5}, ::Val{3}) = - 6β -# @inline add_global_smoothness(β, ::Val{5}, ::Val{4}) = + 2β -# @inline add_global_smoothness(β, ::Val{5}, ::Val{5}) = + β - -# @inline add_global_smoothness(β, ::Val{6}, ::Val{1}) = + β -# @inline add_global_smoothness(β, ::Val{6}, ::Val{2}) = + β -# @inline add_global_smoothness(β, ::Val{6}, ::Val{3}) = - 8β -# @inline add_global_smoothness(β, ::Val{6}, ::Val{4}) = + 8β -# @inline add_global_smoothness(β, ::Val{6}, ::Val{5}) = - β -# @inline add_global_smoothness(β, ::Val{6}, ::Val{6}) = - β +@inline add_global_smoothness(β, ::Val{2}, ::Val{1}) = + β +@inline add_global_smoothness(β, ::Val{2}, ::Val{2}) = - β + +@inline add_global_smoothness(β, ::Val{3}, ::Val{1}) = + β +@inline add_global_smoothness(β, ::Val{3}, ::Val{2}) = 0 +@inline add_global_smoothness(β, ::Val{3}, ::Val{3}) = - β + +@inline add_global_smoothness(β, ::Val{4}, ::Val{1}) = + β +@inline add_global_smoothness(β, ::Val{4}, ::Val{2}) = + 3β +@inline add_global_smoothness(β, ::Val{4}, ::Val{3}) = - 3β +@inline add_global_smoothness(β, ::Val{4}, ::Val{4}) = - β + +@inline add_global_smoothness(β, ::Val{5}, ::Val{1}) = + β +@inline add_global_smoothness(β, ::Val{5}, ::Val{2}) = + 2β +@inline add_global_smoothness(β, ::Val{5}, ::Val{3}) = - 6β +@inline add_global_smoothness(β, ::Val{5}, ::Val{4}) = + 2β +@inline add_global_smoothness(β, ::Val{5}, ::Val{5}) = + β + +@inline add_global_smoothness(β, ::Val{6}, ::Val{1}) = + β +@inline add_global_smoothness(β, ::Val{6}, ::Val{2}) = + β +@inline add_global_smoothness(β, ::Val{6}, ::Val{3}) = - 8β +@inline add_global_smoothness(β, ::Val{6}, ::Val{4}) = + 8β +@inline add_global_smoothness(β, ::Val{6}, ::Val{5}) = - β +@inline add_global_smoothness(β, ::Val{6}, ::Val{6}) = - β """ calc_weno_stencil(buffer, shift, dir, func::Bool = false) From b3dd2c411db5e4ba40197138a4f02b135a648a81 Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Sat, 16 Mar 2024 18:34:51 -0400 Subject: [PATCH 110/152] mah --- src/Advection/Advection.jl | 16 +- src/Advection/weno_default.jl | 242 +++++---------- src/Advection/weno_interpolants.jl | 146 ++++----- src/Advection/weno_phi.jl | 256 +++++----------- src/Advection/weno_vi.jl | 464 +++++++++++------------------ 5 files changed, 417 insertions(+), 707 deletions(-) diff --git a/src/Advection/Advection.jl b/src/Advection/Advection.jl index eee24bfe35..5c37288732 100644 --- a/src/Advection/Advection.jl +++ b/src/Advection/Advection.jl @@ -67,14 +67,14 @@ include("centered_reconstruction.jl") include("upwind_biased_reconstruction.jl") include("weno_reconstruction.jl") include("weno_interpolants.jl") -# include("weno_2.jl") -# include("weno_3.jl") -# include("weno_4.jl") -# include("weno_5.jl") -# include("weno_6.jl") -include("weno_vi.jl") -include("weno_phi.jl") -include("weno_default.jl") +include("weno_2.jl") +include("weno_3.jl") +include("weno_4.jl") +include("weno_5.jl") +include("weno_6.jl") +# include("weno_default.jl") +# include("weno_vi.jl") +# include("weno_phi.jl") include("stretched_weno_smoothness.jl") include("multi_dimensional_reconstruction.jl") include("vector_invariant_upwinding.jl") diff --git a/src/Advection/weno_default.jl b/src/Advection/weno_default.jl index c7337dcf13..3d73d47a64 100644 --- a/src/Advection/weno_default.jl +++ b/src/Advection/weno_default.jl @@ -1,3 +1,34 @@ +@inline function ψ_reconstruction_stencil(buffer, shift, dir, func::Bool = false) + N = buffer * 2 + order = shift == :symmetric ? N : N - 1 + if shift != :symmetric + N = N .- 1 + end + rng = 1:N + if shift == :right + rng = rng .+ 1 + end + stencil_full = Vector(undef, N) + coeff = Symbol(:coeff, order, :_, shift) + for (idx, n) in enumerate(rng) + c = n - buffer - 1 + if func + stencil_full[idx] = dir == :x ? + :(ψ(i + $c, j, k, grid, args...)) : + dir == :y ? + :(ψ(i, j + $c, k, grid, args...)) : + :(ψ(i, j, k + $c, grid, args...)) + else + stencil_full[idx] = dir == :x ? + :(ψ[i + $c, j, k]) : + dir == :y ? + :(ψ[i, j + $c, k]) : + :(ψ[i, j, k + $c]) + end + end + return :($(stencil_full...),) +end + for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) biased_β = Symbol(side, :_biased_β) @@ -25,24 +56,17 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{2, FT, XT, YT, ZT}, ψ, idx, loc, args...) where {FT, XT, YT, ZT} - - # Stencil S₀ - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ψs, scheme, Val(0)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) + # All stencils + ψs = $(ψ_reconstruction_stencil(2, side, dir)) - # Stencil S₁ - ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) - # Calculate x-velocity smoothness at stencil `s` - β₁ = $biased_β(ψs, scheme, Val(1)) - + β₀ = $biased_β(ψs[2:3], scheme, Val(0)) + β₁ = $biased_β(ψs[1:2], scheme, Val(1)) + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs[2:3], $CT, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs[1:2], $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(2), (β₀, β₁)) @@ -56,33 +80,18 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z scheme::WENO{3, FT, XT, YT, ZT}, ψ, idx, loc, args...) where {FT, XT, YT, ZT} - # Stencil S₀ - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - + ψs = $(ψ_reconstruction_stencil(3, side, dir)) + # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ψs, scheme, Val(0)) + β₀ = $biased_β(ψs[3:5], scheme, Val(0)) + β₁ = $biased_β(ψs[2:4], scheme, Val(1)) + β₂ = $biased_β(ψs[1:3], scheme, Val(2)) # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs[3:5], $CT, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs[2:4], $CT, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs[1:3], $CT, Val($val), idx, loc) - # Stencil S₁ - ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₁ = $biased_β(ψs, scheme, Val(1)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) - - # Stencil S₂ - ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₂ = $biased_β(ψs, scheme, Val(2)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) - τ = global_smoothness_indicator(Val(3), (β₀, β₁, β₂)) α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) @@ -96,41 +105,19 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z scheme::WENO{4, FT, XT, YT, ZT}, ψ, idx, loc, args...) where {FT, XT, YT, ZT} - # Stencil S₀ - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ψs, scheme, Val(0)) + ψs = $(ψ_reconstruction_stencil(4, side, dir)) - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) - - # Stencil S₁ - ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₁ = $biased_β(ψs, scheme, Val(1)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) - - # Stencil S₂ - ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) - # Calculate x-velocity smoothness at stencil `s` - β₂ = $biased_β(ψs, scheme, Val(2)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) - - # Stencil S₃ - ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₃ = $biased_β(ψs, scheme, Val(3)) - + β₀ = $biased_β(ψs[4:7], scheme, Val(0)) + β₁ = $biased_β(ψs[3:6], scheme, Val(1)) + β₂ = $biased_β(ψs[2:5], scheme, Val(2)) + β₃ = $biased_β(ψs[1:4], scheme, Val(3)) + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs[4:7], $CT, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs[3:6], $CT, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs[2:5], $CT, Val($val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs[1:4], $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(4), (β₀, β₁, β₂, β₃)) @@ -146,50 +133,21 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z scheme::WENO{5, FT, XT, YT, ZT}, ψ, idx, loc, args...) where {FT, XT, YT, ZT} - # Stencil S₀ - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ψs, scheme, Val(0)) + ψs = $(ψ_reconstruction_stencil(5, side, dir)) - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) - - # Stencil S₁ - ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₁ = $biased_β(ψs, scheme, Val(1)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) - - # Stencil S₂ - ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₂ = $biased_β(ψs, scheme, Val(2)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) - - # Stencil S₃ - ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, args...) - # Calculate x-velocity smoothness at stencil `s` - β₃ = $biased_β(ψs, scheme, Val(3)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) - - # Stencil S₄ - ψs = $new_stencil(i, j, k, scheme, Val(5), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₄ = $biased_β(ψs, scheme, Val(4)) - + β₀ = $biased_β(ψs[5:9], scheme, Val(0)) + β₁ = $biased_β(ψs[4:8], scheme, Val(1)) + β₂ = $biased_β(ψs[3:7], scheme, Val(2)) + β₃ = $biased_β(ψs[2:6], scheme, Val(3)) + β₄ = $biased_β(ψs[1:5], scheme, Val(4)) + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₄ = $biased_p(scheme, Val(4), ψs, $CT, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs[5:9], $CT, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs[4:8], $CT, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs[3:7], $CT, Val($val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs[2:6], $CT, Val($val), idx, loc) + ψ₄ = $biased_p(scheme, Val(4), ψs[1:5], $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(5), (β₀, β₁, β₂, β₃, β₄)) @@ -206,59 +164,23 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z scheme::WENO{6, FT, XT, YT, ZT}, ψ, idx, loc, args...) where {FT, XT, YT, ZT} - # Stencil S₀ - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ψs, scheme, Val(0)) + ψs = $(ψ_reconstruction_stencil(6, side, dir)) - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) - - # Stencil S₁ - ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₁ = $biased_β(ψs, scheme, Val(1)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) - - # Stencil S₂ - ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₂ = $biased_β(ψs, scheme, Val(2)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) - - # Stencil S₃ - ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, args...) - # Calculate x-velocity smoothness at stencil `s` - β₃ = $biased_β(ψs, scheme, Val(3)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) + β₀ = $biased_β(ψs[6:11], scheme, Val(0)) + β₁ = $biased_β(ψs[5:10], scheme, Val(1)) + β₂ = $biased_β(ψs[4:9], scheme, Val(2)) + β₃ = $biased_β(ψs[3:8], scheme, Val(3)) + β₄ = $biased_β(ψs[2:7], scheme, Val(4)) + β₅ = $biased_β(ψs[1:6], scheme, Val(5)) - # Stencil S₄ - ψs = $new_stencil(i, j, k, scheme, Val(5), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₄ = $biased_β(ψs, scheme, Val(4)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₄ = $biased_p(scheme, Val(4), ψs, $CT, Val($val), idx, loc) - - # Stencil S₄ - ψs = $new_stencil(i, j, k, scheme, Val(6), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₅ = $biased_β(ψs, scheme, Val(5)) - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₅ = $biased_p(scheme, Val(5), ψs, $CT, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs[6:11], $CT, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs[5:10], $CT, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs[4:9], $CT, Val($val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs[3:8], $CT, Val($val), idx, loc) + ψ₄ = $biased_p(scheme, Val(4), ψs[2:7], $CT, Val($val), idx, loc) + ψ₅ = $biased_p(scheme, Val(5), ψs[1:6], $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(6), (β₀, β₁, β₂, β₃, β₄, β₅)) @@ -267,7 +189,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) α₄ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) - α₅ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) + α₅ = FT($coeff(scheme, Val(5))) * (1 + τ / (β₅ + FT(ε))^2) return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄ + ψ₅ * α₅) / (α₀ + α₁ + α₂ + α₃ + α₄ + α₅) end diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index c6b6ea4714..f32fee3221 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -368,102 +368,102 @@ end @inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-4], ψs[1:N-1]...) @inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-5], ψs[1:N-1]...) -# for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) -# weno_interpolant = Symbol(side, :_weno_interpolant_, dir) -# biased_β = Symbol(side, :_biased_β) -# biased_p = Symbol(side, :_biased_p) -# coeff = Symbol(:coeff_, side) -# stencil = Symbol(side, :_stencil_, dir) -# stencil_u = Symbol(:tangential_, side, :_stencil_u) -# stencil_v = Symbol(:tangential_, side, :_stencil_v) - -# @eval begin -# # Standard weno reconstruction at `i, j, k` for stencil `s` where `1 ≤ s ≤ N` -# @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, args...) where {N, FT, XT, YT, ZT} +for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) + weno_interpolant = Symbol(side, :_weno_interpolant_, dir) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + stencil = Symbol(side, :_stencil_, dir) + stencil_u = Symbol(:tangential_, side, :_stencil_u) + stencil_v = Symbol(:tangential_, side, :_stencil_v) + + @eval begin + # Standard weno reconstruction at `i, j, k` for stencil `s` where `1 ≤ s ≤ N` + @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, args...) where {N, FT, XT, YT, ZT} -# # Retrieve stencil `s` -# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) + # Retrieve stencil `s` + ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) -# # Calculate smoothness of stencil `s` -# β = $biased_β(ψs, scheme, Val(s-1)) + # Calculate smoothness of stencil `s` + β = $biased_β(ψs, scheme, Val(s-1)) -# # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation -# C = FT($coeff(scheme, Val(s-1))) -# α = C / (β + FT(ε))^2 + # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation + C = FT($coeff(scheme, Val(s-1))) + α = C / (β + FT(ε))^2 -# # Reconstruction of `ψ` from stencil `s` -# ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) + # Reconstruction of `ψ` from stencil `s` + ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) -# return β, ψ̅, C, α -# end + return β, ψ̅, C, α + end -# # If the smoothness stencil is not used (aka it's a `DefaultStencil`) use the same formulation as above -# @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {N, FT, XT, YT, ZT} + # If the smoothness stencil is not used (aka it's a `DefaultStencil`) use the same formulation as above + @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {N, FT, XT, YT, ZT} -# # Retrieve stencil `s` -# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) + # Retrieve stencil `s` + ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) -# # Calculate smoothness of stencil `s` -# β = $biased_β(ψs, scheme, Val(s-1)) + # Calculate smoothness of stencil `s` + β = $biased_β(ψs, scheme, Val(s-1)) -# # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation -# C = FT($coeff(scheme, Val(s-1))) -# α = C / (β + FT(ε))^2 + # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation + C = FT($coeff(scheme, Val(s-1))) + α = C / (β + FT(ε))^2 -# # Reconstruction of `ψ` from stencil `s` -# ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) + # Reconstruction of `ψ` from stencil `s` + ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) -# return β, ψ̅, C, α -# end + return β, ψ̅, C, α + end -# # Using velocity interpolated at `(Face, Face, Center)` to assess smoothness. -# # Can be used only for `(Face, Face, Center)` variables like vorticity -# @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {N, FT, XT, YT, ZT} + # Using velocity interpolated at `(Face, Face, Center)` to assess smoothness. + # Can be used only for `(Face, Face, Center)` variables like vorticity + @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {N, FT, XT, YT, ZT} -# # Retrieve x-velocity stencil `s` -# ψs = $stencil_u(i, j, k, scheme, Val(s), Val(val), grid, u) + # Retrieve x-velocity stencil `s` + ψs = $stencil_u(i, j, k, scheme, Val(s), Val(val), grid, u) -# # Calculate x-velocity smoothness at stencil `s` -# βu = $biased_β(ψs, scheme, Val(s-1)) + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(ψs, scheme, Val(s-1)) -# # Retrieve y-velocity stencil `s` -# ψs = $stencil_v(i, j, k, scheme, Val(s), Val(val), grid, v) + # Retrieve y-velocity stencil `s` + ψs = $stencil_v(i, j, k, scheme, Val(s), Val(val), grid, v) -# # Calculate y-velocity smoothness at stencil `s` -# βv = $biased_β(ψs, scheme, Val(s-1)) + # Calculate y-velocity smoothness at stencil `s` + βv = $biased_β(ψs, scheme, Val(s-1)) -# # total smoothness -# βᵁ = (βu + βv) / 2 + # total smoothness + βᵁ = (βu + βv) / 2 -# # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation -# C = FT($coeff(scheme, Val(s-1))) -# α = C / (βᵁ + FT(ε))^2 + # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation + C = FT($coeff(scheme, Val(s-1))) + α = C / (βᵁ + FT(ε))^2 -# # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` -# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) -# ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) + ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) -# return βᵁ, ψ̅, C, α -# end + return βᵁ, ψ̅, C, α + end -# # The smoothness is assessed using the stencil calculated from the function `VI.func(i, j, k, grid, args...)` -# @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT, XT, YT, ZT} + # The smoothness is assessed using the stencil calculated from the function `VI.func(i, j, k, grid, args...)` + @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT, XT, YT, ZT} -# # Retrieve smoothness stencil ϕ at `s` -# ψs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) + # Retrieve smoothness stencil ϕ at `s` + ψs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) -# # Calculate `ϕ` smoothness at `s` -# βᵠ = $biased_β(ψs, scheme, Val(s-1)) + # Calculate `ϕ` smoothness at `s` + βᵠ = $biased_β(ψs, scheme, Val(s-1)) -# # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation -# C = FT($coeff(scheme, Val(s-1))) -# α = C / (βᵠ + FT(ε))^2 + # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation + C = FT($coeff(scheme, Val(s-1))) + α = C / (βᵠ + FT(ε))^2 -# # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` -# ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) -# ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) + ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) -# return βᵠ, ψ̅, C, α -# end -# end -# end + return βᵠ, ψ̅, C, α + end + end +end diff --git a/src/Advection/weno_phi.jl b/src/Advection/weno_phi.jl index 132f49f167..546cdd5700 100644 --- a/src/Advection/weno_phi.jl +++ b/src/Advection/weno_phi.jl @@ -1,3 +1,26 @@ +@inline function ϕ_reconstruction_stencil(buffer, shift, dir) + N = buffer * 2 + order = shift == :symmetric ? N : N - 1 + if shift != :symmetric + N = N .- 1 + end + rng = 1:N + if shift == :right + rng = rng .+ 1 + end + stencil_full = Vector(undef, N) + coeff = Symbol(:coeff, order, :_, shift) + for (idx, n) in enumerate(rng) + c = n - buffer - 1 + stencil_full[idx] = dir == :x ? + :(VI.func(i + $c, j, k, grid, args...)) : + dir == :y ? + :(VI.func(i, j + $c, k, grid, args...)) : + :(VI.func(i, j, k + $c, grid, args...)) + end + return :($(stencil_full...),) +end + for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) biased_β = Symbol(side, :_biased_β) @@ -12,26 +35,19 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{2, FT, XT, YT, ZT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - - # Stencil S₀ - ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ϕs, scheme, Val(0)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) + # All stencils + ψs = $(ϕ_reconstruction_stencil(2, side, dir)) - # Stencil S₁ - ϕs = $new_stencil(i, j, k, scheme, Val(2), ϕs, VI.func, grid, args...) - ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) - # Calculate x-velocity smoothness at stencil `s` - β₁ = $biased_β(ϕs, scheme, Val(1)) - + β₀ = $biased_β(ψs[2:3], scheme, Val(0)) + β₁ = $biased_β(ψs[1:2], scheme, Val(1)) + + ψs = $(ψ_reconstruction_stencil(2, side, dir, true)) + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs[2:3], $CT, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs[1:2], $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(2), (β₀, β₁)) @@ -45,36 +61,20 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z scheme::WENO{3, FT, XT, YT, ZT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - # Stencil S₀ - ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ϕs, scheme, Val(0)) + ψs = $(ϕ_reconstruction_stencil(3, side, dir)) - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) - - # Stencil S₁ - ϕs = $new_stencil(i, j, k, scheme, Val(2), ϕs, VI.func, grid, args...) - ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) - # Calculate x-velocity smoothness at stencil `s` - β₁ = $biased_β(ϕs, scheme, Val(1)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) + β₀ = $biased_β(ψs[3:5], scheme, Val(0)) + β₁ = $biased_β(ψs[2:4], scheme, Val(1)) + β₂ = $biased_β(ψs[1:3], scheme, Val(2)) - # Stencil S₂ - ϕs = $new_stencil(i, j, k, scheme, Val(3), ϕs, VI.func, grid, args...) - ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) + ψs = $(ψ_reconstruction_stencil(3, side, dir, true)) - # Calculate x-velocity smoothness at stencil `s` - β₂ = $biased_β(ϕs, scheme, Val(2)) - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) - + ψ₀ = $biased_p(scheme, Val(0), ψs[3:5], $CT, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs[2:4], $CT, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs[1:3], $CT, Val($val), idx, loc) + τ = global_smoothness_indicator(Val(3), (β₀, β₁, β₂)) α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) @@ -85,48 +85,24 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT, XT, YT, ZT}, - ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} + scheme::WENO{4, FT, XT, YT, ZT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - # Stencil S₀ - ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) + ψs = $(ϕ_reconstruction_stencil(4, side, dir)) # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ϕs, scheme, Val(0)) + β₀ = $biased_β(ψs[4:7], scheme, Val(0)) + β₁ = $biased_β(ψs[3:6], scheme, Val(1)) + β₂ = $biased_β(ψs[2:5], scheme, Val(2)) + β₃ = $biased_β(ψs[1:4], scheme, Val(3)) - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) + ψs = $(ψ_reconstruction_stencil(4, side, dir, true)) - # Stencil S₁ - ϕs = $new_stencil(i, j, k, scheme, Val(2), ϕs, VI.func, grid, args...) - ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₁ = $biased_β(ϕs, scheme, Val(1)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) - - # Stencil S₂ - ϕs = $new_stencil(i, j, k, scheme, Val(3), ϕs, VI.func, grid, args...) - ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₂ = $biased_β(ϕs, scheme, Val(2)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) - - # Stencil S₃ - ϕs = $new_stencil(i, j, k, scheme, Val(4), ϕs, VI.func, grid, args...) - ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₃ = $biased_β(ϕs, scheme, Val(3)) - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs[4:7], $CT, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs[3:6], $CT, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs[2:5], $CT, Val($val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs[1:4], $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(4), (β₀, β₁, β₂, β₃)) @@ -142,55 +118,23 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z scheme::WENO{5, FT, XT, YT, ZT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - # Stencil S₀ - ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ϕs, scheme, Val(0)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) - - # Stencil S₁ - ϕs = $new_stencil(i, j, k, scheme, Val(2), ϕs, VI.func, grid, args...) - ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₁ = $biased_β(ϕs, scheme, Val(1)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) - - # Stencil S₂ - ϕs = $new_stencil(i, j, k, scheme, Val(3), ϕs, VI.func, grid, args...) - ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₂ = $biased_β(ϕs, scheme, Val(2)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) - - # Stencil S₃ - ϕs = $new_stencil(i, j, k, scheme, Val(4), ϕs, VI.func, grid, args...) - ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, args...) + ψs = $(ϕ_reconstruction_stencil(5, side, dir)) # Calculate x-velocity smoothness at stencil `s` - β₃ = $biased_β(ϕs, scheme, Val(3)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) + β₀ = $biased_β(ψs[5:9], scheme, Val(0)) + β₁ = $biased_β(ψs[4:8], scheme, Val(1)) + β₂ = $biased_β(ψs[3:7], scheme, Val(2)) + β₃ = $biased_β(ψs[2:6], scheme, Val(3)) + β₄ = $biased_β(ψs[1:5], scheme, Val(4)) - # Stencil S₄ - ϕs = $new_stencil(i, j, k, scheme, Val(5), ϕs, VI.func, grid, args...) - ψs = $new_stencil(i, j, k, scheme, Val(5), ψs, ψ, grid, args...) + ψs = $(ψ_reconstruction_stencil(5, side, dir, true)) - # Calculate x-velocity smoothness at stencil `s` - β₄ = $biased_β(ϕs, scheme, Val(4)) - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₄ = $biased_p(scheme, Val(4), ψs, $CT, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs[5:9], $CT, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs[4:8], $CT, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs[3:7], $CT, Val($val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs[2:6], $CT, Val($val), idx, loc) + ψ₄ = $biased_p(scheme, Val(4), ψs[1:5], $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(5), (β₀, β₁, β₂, β₃, β₄)) @@ -207,65 +151,25 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z scheme::WENO{6, FT, XT, YT, ZT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - # Stencil S₀ - ϕs = $stencil(i, j, k, scheme, Val(1), VI.func, grid, args...) - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ϕs, scheme, Val(0)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) - - # Stencil S₁ - ϕs = $new_stencil(i, j, k, scheme, Val(2), ϕs, VI.func, grid, args...) - ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₁ = $biased_β(ϕs, scheme, Val(1)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) - - # Stencil S₂ - ϕs = $new_stencil(i, j, k, scheme, Val(3), ϕs, VI.func, grid, args...) - ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₂ = $biased_β(ϕs, scheme, Val(2)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) - - # Stencil S₃ - ϕs = $new_stencil(i, j, k, scheme, Val(4), ϕs, VI.func, grid, args...) - ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - β₃ = $biased_β(ϕs, scheme, Val(3)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) - - # Stencil S₄ - ϕs = $new_stencil(i, j, k, scheme, Val(5), ϕs, VI.func, grid, args...) - ψs = $new_stencil(i, j, k, scheme, Val(5), ψs, ψ, grid, args...) + ψs = $(ϕ_reconstruction_stencil(6, side, dir)) # Calculate x-velocity smoothness at stencil `s` - β₄ = $biased_β(ϕs, scheme, Val(4)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₄ = $biased_p(scheme, Val(4), ψs, $CT, Val($val), idx, loc) + β₀ = $biased_β(ψs[6:11], scheme, Val(0)) + β₁ = $biased_β(ψs[5:10], scheme, Val(1)) + β₂ = $biased_β(ψs[4:9], scheme, Val(2)) + β₃ = $biased_β(ψs[3:8], scheme, Val(3)) + β₄ = $biased_β(ψs[2:7], scheme, Val(4)) + β₅ = $biased_β(ψs[1:6], scheme, Val(4)) - # Stencil S₄ - ϕs = $new_stencil(i, j, k, scheme, Val(6), ϕs, VI.func, grid, args...) - ψs = $new_stencil(i, j, k, scheme, Val(6), ψs, ψ, grid, args...) + ψs = $(ψ_reconstruction_stencil(6, side, dir, true)) - # Calculate x-velocity smoothness at stencil `s` - β₅ = $biased_β(ϕs, scheme, Val(5)) - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₅ = $biased_p(scheme, Val(5), ψs, $CT, Val($val), idx, loc) + ψ₀ = $biased_p(scheme, Val(0), ψs[6:11], $CT, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs[5:10], $CT, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs[4:9], $CT, Val($val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs[3:8], $CT, Val($val), idx, loc) + ψ₄ = $biased_p(scheme, Val(4), ψs[2:7], $CT, Val($val), idx, loc) + ψ₅ = $biased_p(scheme, Val(5), ψs[1:6], $CT, Val($val), idx, loc) τ = global_smoothness_indicator(Val(6), (β₀, β₁, β₂, β₃, β₄, β₅)) @@ -274,7 +178,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) α₄ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) - α₅ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) + α₅ = FT($coeff(scheme, Val(5))) * (1 + τ / (β₅ + FT(ε))^2) return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄ + ψ₅ * α₅) / (α₀ + α₁ + α₂ + α₃ + α₄ + α₅) end diff --git a/src/Advection/weno_vi.jl b/src/Advection/weno_vi.jl index c33c0c3658..62eeecb61f 100644 --- a/src/Advection/weno_vi.jl +++ b/src/Advection/weno_vi.jl @@ -1,3 +1,72 @@ +@inline function u_reconstruction_stencil(buffer, shift, dir) + N = buffer * 2 + order = shift == :symmetric ? N : N - 1 + if shift != :symmetric + N = N .- 1 + end + rng = 1:N + if shift == :right + rng = rng .+ 1 + end + stencil_full = Vector(undef, N) + coeff = Symbol(:coeff, order, :_, shift) + for (idx, n) in enumerate(rng) + c = n - buffer - 1 + stencil_full[idx] = dir == :x ? + :(ℑyᵃᶠᵃ(i + $c, j, k, grid, u)) : + dir == :y ? + :(ℑyᵃᶠᵃ(i, j + $c, k, grid, u)) : + :(ℑyᵃᶠᵃ(i, j, k + $c, grid, u)) + end + return :($(stencil_full...),) +end + +@inline function v_reconstruction_stencil(buffer, shift, dir) + N = buffer * 2 + order = shift == :symmetric ? N : N - 1 + if shift != :symmetric + N = N .- 1 + end + rng = 1:N + if shift == :right + rng = rng .+ 1 + end + stencil_full = Vector(undef, N) + coeff = Symbol(:coeff, order, :_, shift) + for (idx, n) in enumerate(rng) + c = n - buffer - 1 + stencil_full[idx] = dir == :x ? + :(ℑxᶠᵃᵃ(i + $c, j, k, grid, v)) : + dir == :y ? + :(ℑxᶠᵃᵃ(i, j + $c, k, grid, v)) : + :(ℑxᶠᵃᵃ(i, j, k + $c, grid, v)) + end + return :($(stencil_full...),) +end + +@inline function ζ_reconstruction_stencil(buffer, shift, dir) + N = buffer * 2 + order = shift == :symmetric ? N : N - 1 + if shift != :symmetric + N = N .- 1 + end + rng = 1:N + if shift == :right + rng = rng .+ 1 + end + stencil_full = Vector(undef, N) + coeff = Symbol(:coeff, order, :_, shift) + for (idx, n) in enumerate(rng) + c = n - buffer - 1 + stencil_full[idx] = dir == :x ? + :(ψ(i + $c, j, k, grid, u, v)) : + dir == :y ? + :(ψ(i, j + $c, k, grid, u, v)) : + :(ψ(i, j, k + $c, grid, u, v)) +end + return :($(stencil_full...),) +end + for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) biased_β = Symbol(side, :_biased_β) @@ -13,36 +82,21 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z scheme::WENO{2, FT, XT, YT, ZT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} - # Stencil S₀ - us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(0)) - βv = $biased_β(vs, scheme, Val(0)) - - # total smoothness - β₀ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) + ψs = $(u_reconstruction_stencil(2, side, dir)) + βu₀ = $biased_β(ψs[2:3], scheme, Val(0)) + βu₁ = $biased_β(ψs[1:2], scheme, Val(1)) - # Stencil S₁ - us = $new_stencil(i, j, k, scheme, Val(2), us, ℑyᵃᶠᵃ, grid, u) - vs = $new_stencil(i, j, k, scheme, Val(2), vs, ℑxᶠᵃᵃ, grid, v) - ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(1)) - βv = $biased_β(vs, scheme, Val(1)) + ψs = $(v_reconstruction_stencil(2, side, dir)) + βv₀ = $biased_β(ψs[2:3], scheme, Val(0)) + βv₁ = $biased_β(ψs[1:2], scheme, Val(1)) - # total smoothness - β₁ = (βu + βv) / 2 + ψs = $(ζ_reconstruction_stencil(2, side, dir)) + ψ₀ = $biased_p(scheme, Val(0), ψs[2:3], $CT, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs[1:2], $CT, Val($val), idx, loc) + + β₀ = (βu₀ + βv₀) / 2 + β₁ = (βu₁ + βv₁) / 2 - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) - τ = global_smoothness_indicator(Val(2), (β₀, β₁)) α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) @@ -54,51 +108,25 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{3, FT, XT, YT, ZT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} - - # Stencil S₀ - us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(0)) - βv = $biased_β(vs, scheme, Val(0)) - - # total smoothness - β₀ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) - # Stencil S₁ - us = $new_stencil(i, j, k, scheme, Val(2), us, ℑyᵃᶠᵃ, grid, u) - vs = $new_stencil(i, j, k, scheme, Val(2), vs, ℑxᶠᵃᵃ, grid, v) - ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(1)) - βv = $biased_β(vs, scheme, Val(1)) - - # total smoothness - β₁ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) - - # Stencil S₂ - us = $new_stencil(i, j, k, scheme, Val(3), us, ℑyᵃᶠᵃ, grid, u) - vs = $new_stencil(i, j, k, scheme, Val(3), vs, ℑxᶠᵃᵃ, grid, v) - ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, u, v, args...) + ψs = $(u_reconstruction_stencil(3, side, dir)) + βu₀ = $biased_β(ψs[3:5], scheme, Val(0)) + βu₁ = $biased_β(ψs[2:4], scheme, Val(1)) + βu₂ = $biased_β(ψs[1:3], scheme, Val(2)) + + ψs = $(v_reconstruction_stencil(3, side, dir)) + βv₀ = $biased_β(ψs[3:5], scheme, Val(0)) + βv₁ = $biased_β(ψs[2:4], scheme, Val(1)) + βv₂ = $biased_β(ψs[1:3], scheme, Val(2)) - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(2)) - βv = $biased_β(vs, scheme, Val(2)) + ψs = $(ζ_reconstruction_stencil(3, side, dir)) + ψ₀ = $biased_p(scheme, Val(0), ψs[3:5], $CT, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs[2:4], $CT, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs[1:3], $CT, Val($val), idx, loc) - # total smoothness - β₂ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) + β₀ = (βu₀ + βv₀) / 2 + β₁ = (βu₁ + βv₁) / 2 + β₂ = (βu₂ + βv₂) / 2 τ = global_smoothness_indicator(Val(3), (β₀, β₁, β₂)) @@ -113,65 +141,28 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z scheme::WENO{4, FT, XT, YT, ZT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} - # Stencil S₀ - us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(0)) - βv = $biased_β(vs, scheme, Val(0)) - - # total smoothness - β₀ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) + ψs = $(u_reconstruction_stencil(4, side, dir)) + βu₀ = $biased_β(ψs[4:7], scheme, Val(0)) + βu₁ = $biased_β(ψs[3:6], scheme, Val(1)) + βu₂ = $biased_β(ψs[2:5], scheme, Val(2)) + βu₃ = $biased_β(ψs[1:4], scheme, Val(3)) - # Stencil S₁ - us = $new_stencil(i, j, k, scheme, Val(2), us, ℑyᵃᶠᵃ, grid, u) - vs = $new_stencil(i, j, k, scheme, Val(2), vs, ℑxᶠᵃᵃ, grid, v) - ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(1)) - βv = $biased_β(vs, scheme, Val(1)) - - # total smoothness - β₁ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) - - # Stencil S₂ - us = $new_stencil(i, j, k, scheme, Val(3), us, ℑyᵃᶠᵃ, grid, u) - vs = $new_stencil(i, j, k, scheme, Val(3), vs, ℑxᶠᵃᵃ, grid, v) - ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(2)) - βv = $biased_β(vs, scheme, Val(2)) - - # total smoothness - β₂ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) - - # Stencil S₃ - us = $new_stencil(i, j, k, scheme, Val(4), us, ℑyᵃᶠᵃ, grid, u) - vs = $new_stencil(i, j, k, scheme, Val(4), vs, ℑxᶠᵃᵃ, grid, v) - ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(3)) - βv = $biased_β(vs, scheme, Val(3)) - - # total smoothness - β₃ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) + ψs = $(v_reconstruction_stencil(4, side, dir)) + βv₀ = $biased_β(ψs[4:7], scheme, Val(0)) + βv₁ = $biased_β(ψs[3:6], scheme, Val(1)) + βv₂ = $biased_β(ψs[2:5], scheme, Val(2)) + βv₃ = $biased_β(ψs[1:4], scheme, Val(3)) + + ψs = $(ζ_reconstruction_stencil(4, side, dir)) + ψ₀ = $biased_p(scheme, Val(0), ψs[4:7], $CT, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs[3:6], $CT, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs[2:5], $CT, Val($val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs[1:4], $CT, Val($val), idx, loc) + + β₀ = (βu₀ + βv₀) / 2 + β₁ = (βu₁ + βv₁) / 2 + β₂ = (βu₂ + βv₂) / 2 + β₃ = (βu₃ + βv₃) / 2 τ = global_smoothness_indicator(Val(4), (β₀, β₁, β₂, β₃)) @@ -187,81 +178,33 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z scheme::WENO{5, FT, XT, YT, ZT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} - # Stencil S₀ - us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(0)) - βv = $biased_β(vs, scheme, Val(0)) - - # total smoothness - β₀ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) + ψs = $(u_reconstruction_stencil(5, side, dir)) + βu₀ = $biased_β(ψs[5:9], scheme, Val(0)) + βu₁ = $biased_β(ψs[4:8], scheme, Val(1)) + βu₂ = $biased_β(ψs[3:7], scheme, Val(2)) + βu₃ = $biased_β(ψs[2:6], scheme, Val(3)) + βu₄ = $biased_β(ψs[1:5], scheme, Val(4)) - # Stencil S₁ - us = $new_stencil(i, j, k, scheme, Val(2), us, ℑyᵃᶠᵃ, grid, u) - vs = $new_stencil(i, j, k, scheme, Val(2), vs, ℑxᶠᵃᵃ, grid, v) - ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(1)) - βv = $biased_β(vs, scheme, Val(1)) - - # total smoothness - β₁ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) - - # Stencil S₂ - us = $new_stencil(i, j, k, scheme, Val(3), us, ℑyᵃᶠᵃ, grid, u) - vs = $new_stencil(i, j, k, scheme, Val(3), vs, ℑxᶠᵃᵃ, grid, v) - ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(2)) - βv = $biased_β(vs, scheme, Val(2)) - - # total smoothness - β₂ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) - - # Stencil S₃ - us = $new_stencil(i, j, k, scheme, Val(4), us, ℑyᵃᶠᵃ, grid, u) - vs = $new_stencil(i, j, k, scheme, Val(4), vs, ℑxᶠᵃᵃ, grid, v) - ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(3)) - βv = $biased_β(vs, scheme, Val(3)) - - # total smoothness - β₃ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) - - # Stencil S₄ - us = $new_stencil(i, j, k, scheme, Val(5), us, ℑyᵃᶠᵃ, grid, u) - vs = $new_stencil(i, j, k, scheme, Val(5), vs, ℑxᶠᵃᵃ, grid, v) - ψs = $new_stencil(i, j, k, scheme, Val(5), ψs, ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(4)) - βv = $biased_β(vs, scheme, Val(4)) - - # total smoothness - β₄ = (βu + βv) / 2 + ψs = $(v_reconstruction_stencil(5, side, dir)) + βv₀ = $biased_β(ψs[5:9], scheme, Val(0)) + βv₁ = $biased_β(ψs[4:8], scheme, Val(1)) + βv₂ = $biased_β(ψs[3:7], scheme, Val(2)) + βv₃ = $biased_β(ψs[2:6], scheme, Val(3)) + βv₄ = $biased_β(ψs[1:5], scheme, Val(4)) + + ψs = $(ζ_reconstruction_stencil(5, side, dir)) + ψ₀ = $biased_p(scheme, Val(0), ψs[5:9], $CT, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs[4:8], $CT, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs[3:7], $CT, Val($val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs[2:6], $CT, Val($val), idx, loc) + ψ₄ = $biased_p(scheme, Val(4), ψs[1:5], $CT, Val($val), idx, loc) + + β₀ = (βu₀ + βv₀) / 2 + β₁ = (βu₁ + βv₁) / 2 + β₂ = (βu₂ + βv₂) / 2 + β₃ = (βu₃ + βv₃) / 2 + β₄ = (βu₄ + βv₄) / 2 - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₄ = $biased_p(scheme, Val(4), ψs, $CT, Val($val), idx, loc) - τ = global_smoothness_indicator(Val(5), (β₀, β₁, β₂, β₃, β₄)) α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) @@ -277,95 +220,36 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z scheme::WENO{6, FT, XT, YT, ZT}, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} - # Stencil S₀ - us = $stencil_u(i, j, k, scheme, Val(1), Val($val), grid, u) - vs = $stencil_v(i, j, k, scheme, Val(1), Val($val), grid, v) - ψs = $stencil(i, j, k, scheme, Val(1), ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(0)) - βv = $biased_β(vs, scheme, Val(0)) - - # total smoothness - β₀ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs, $CT, Val($val), idx, loc) - - # Stencil S₁ - us = $new_stencil(i, j, k, scheme, Val(2), us, ℑyᵃᶠᵃ, grid, u) - vs = $new_stencil(i, j, k, scheme, Val(2), vs, ℑxᶠᵃᵃ, grid, v) - ψs = $new_stencil(i, j, k, scheme, Val(2), ψs, ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(1)) - βv = $biased_β(vs, scheme, Val(1)) - - # total smoothness - β₁ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₁ = $biased_p(scheme, Val(1), ψs, $CT, Val($val), idx, loc) - - # Stencil S₂ - us = $new_stencil(i, j, k, scheme, Val(3), us, ℑyᵃᶠᵃ, grid, u) - vs = $new_stencil(i, j, k, scheme, Val(3), vs, ℑxᶠᵃᵃ, grid, v) - ψs = $new_stencil(i, j, k, scheme, Val(3), ψs, ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(2)) - βv = $biased_β(vs, scheme, Val(2)) - - # total smoothness - β₂ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₂ = $biased_p(scheme, Val(2), ψs, $CT, Val($val), idx, loc) - - # Stencil S₃ - us = $new_stencil(i, j, k, scheme, Val(4), us, ℑyᵃᶠᵃ, grid, u) - vs = $new_stencil(i, j, k, scheme, Val(4), vs, ℑxᶠᵃᵃ, grid, v) - ψs = $new_stencil(i, j, k, scheme, Val(4), ψs, ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(3)) - βv = $biased_β(vs, scheme, Val(3)) - - # total smoothness - β₃ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₃ = $biased_p(scheme, Val(3), ψs, $CT, Val($val), idx, loc) - - # Stencil S₄ - us = $new_stencil(i, j, k, scheme, Val(5), us, ℑyᵃᶠᵃ, grid, u) - vs = $new_stencil(i, j, k, scheme, Val(5), vs, ℑxᶠᵃᵃ, grid, v) - ψs = $new_stencil(i, j, k, scheme, Val(5), ψs, ψ, grid, u, v, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(4)) - βv = $biased_β(vs, scheme, Val(4)) - - # total smoothness - β₄ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₄ = $biased_p(scheme, Val(4), ψs, $CT, Val($val), idx, loc) - - # Stencil S₅ - us = $new_stencil(i, j, k, scheme, Val(6), us, ℑyᵃᶠᵃ, grid, u) - vs = $new_stencil(i, j, k, scheme, Val(6), vs, ℑxᶠᵃᵃ, grid, v) - ψs = $new_stencil(i, j, k, scheme, Val(6), ψs, ψ, grid, args...) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(us, scheme, Val(5)) - βv = $biased_β(vs, scheme, Val(5)) - - # total smoothness - β₅ = (βu + βv) / 2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₅ = $biased_p(scheme, Val(5), ψs, $CT, Val($val), idx, loc) + ψs = $(u_reconstruction_stencil(6, side, dir)) + βu₀ = $biased_β(ψs[6:11], scheme, Val(0)) + βu₁ = $biased_β(ψs[5:10], scheme, Val(1)) + βu₂ = $biased_β(ψs[4:9], scheme, Val(2)) + βu₃ = $biased_β(ψs[3:8], scheme, Val(3)) + βu₄ = $biased_β(ψs[2:7], scheme, Val(4)) + βu₅ = $biased_β(ψs[1:6], scheme, Val(5)) + + ψs = $(v_reconstruction_stencil(6, side, dir)) + βv₀ = $biased_β(ψs[6:11], scheme, Val(0)) + βv₁ = $biased_β(ψs[5:10], scheme, Val(1)) + βv₂ = $biased_β(ψs[4:9], scheme, Val(2)) + βv₃ = $biased_β(ψs[3:8], scheme, Val(3)) + βv₄ = $biased_β(ψs[2:7], scheme, Val(4)) + βv₅ = $biased_β(ψs[1:6], scheme, Val(5)) + + ψs = $(ζ_reconstruction_stencil(6, side, dir)) + ψ₀ = $biased_p(scheme, Val(0), ψs[6:11], $CT, Val($val), idx, loc) + ψ₁ = $biased_p(scheme, Val(1), ψs[5:10], $CT, Val($val), idx, loc) + ψ₂ = $biased_p(scheme, Val(2), ψs[4:9], $CT, Val($val), idx, loc) + ψ₃ = $biased_p(scheme, Val(3), ψs[3:8], $CT, Val($val), idx, loc) + ψ₄ = $biased_p(scheme, Val(4), ψs[2:7], $CT, Val($val), idx, loc) + ψ₅ = $biased_p(scheme, Val(5), ψs[1:6], $CT, Val($val), idx, loc) + + β₀ = (βu₀ + βv₀) / 2 + β₁ = (βu₁ + βv₁) / 2 + β₂ = (βu₂ + βv₂) / 2 + β₃ = (βu₃ + βv₃) / 2 + β₄ = (βu₄ + βv₄) / 2 + β₅ = (βu₅ + βv₅) / 2 τ = global_smoothness_indicator(Val(6), (β₀, β₁, β₂, β₃, β₄, β₅)) @@ -374,7 +258,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) α₄ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) - α₅ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) + α₅ = FT($coeff(scheme, Val(5))) * (1 + τ / (β₅ + FT(ε))^2) return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄ + ψ₅ * α₅) / (α₀ + α₁ + α₂ + α₃ + α₄ + α₅) end From 1d0fde2d6fc7d591beeaea3e87dd3c919989554a Mon Sep 17 00:00:00 2001 From: simone-silvestri Date: Sat, 16 Mar 2024 18:35:17 -0400 Subject: [PATCH 111/152] let's try it now --- src/Advection/Advection.jl | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Advection/Advection.jl b/src/Advection/Advection.jl index 5c37288732..99f33a1c23 100644 --- a/src/Advection/Advection.jl +++ b/src/Advection/Advection.jl @@ -67,14 +67,14 @@ include("centered_reconstruction.jl") include("upwind_biased_reconstruction.jl") include("weno_reconstruction.jl") include("weno_interpolants.jl") -include("weno_2.jl") -include("weno_3.jl") -include("weno_4.jl") -include("weno_5.jl") -include("weno_6.jl") -# include("weno_default.jl") -# include("weno_vi.jl") -# include("weno_phi.jl") +# include("weno_2.jl") +# include("weno_3.jl") +# include("weno_4.jl") +# include("weno_5.jl") +# include("weno_6.jl") +include("weno_default.jl") +include("weno_vi.jl") +include("weno_phi.jl") include("stretched_weno_smoothness.jl") include("multi_dimensional_reconstruction.jl") include("vector_invariant_upwinding.jl") From 88b67ad56e357f39f6e444b97c820feff615f829 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Sun, 17 Mar 2024 12:35:00 -0400 Subject: [PATCH 112/152] give it a small try --- src/Advection/Advection.jl | 14 +- src/Advection/weno_default.jl | 264 ++++++++++++++++++----------- src/Advection/weno_interpolants.jl | 58 +++++++ 3 files changed, 233 insertions(+), 103 deletions(-) diff --git a/src/Advection/Advection.jl b/src/Advection/Advection.jl index 99f33a1c23..d3e3887d75 100644 --- a/src/Advection/Advection.jl +++ b/src/Advection/Advection.jl @@ -67,14 +67,14 @@ include("centered_reconstruction.jl") include("upwind_biased_reconstruction.jl") include("weno_reconstruction.jl") include("weno_interpolants.jl") -# include("weno_2.jl") -# include("weno_3.jl") -# include("weno_4.jl") -# include("weno_5.jl") -# include("weno_6.jl") +include("weno_2.jl") +include("weno_3.jl") +include("weno_4.jl") +include("weno_5.jl") +include("weno_6.jl") include("weno_default.jl") -include("weno_vi.jl") -include("weno_phi.jl") +# include("weno_vi.jl") +# include("weno_phi.jl") include("stretched_weno_smoothness.jl") include("multi_dimensional_reconstruction.jl") include("vector_invariant_upwinding.jl") diff --git a/src/Advection/weno_default.jl b/src/Advection/weno_default.jl index 3d73d47a64..a4de0dcc7d 100644 --- a/src/Advection/weno_default.jl +++ b/src/Advection/weno_default.jl @@ -38,6 +38,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z stencil_u = Symbol(:tangential_, side, :_stencil_u) stencil_v = Symbol(:tangential_, side, :_stencil_v) new_stencil = Symbol(:new_stencil_, side, :_, dir) + weno_interpolant = Symbol(side, :_weno_interpolant_, dir) @eval begin @@ -60,20 +61,24 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # All stencils ψs = $(ψ_reconstruction_stencil(2, side, dir)) - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ψs[2:3], scheme, Val(0)) - β₁ = $biased_β(ψs[1:2], scheme, Val(1)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs[2:3], $CT, Val($val), idx, loc) - ψ₁ = $biased_p(scheme, Val(1), ψs[1:2], $CT, Val($val), idx, loc) - - τ = global_smoothness_indicator(Val(2), (β₀, β₁)) - - α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) - α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) - - return (ψ₀ * α₀ + ψ₁ * α₁) / (α₀ + α₁) + β, ψ̅, C, α = $weno_interpolant(ψs[2:3], 1, grid, scheme, $val, ψ, idx, loc, args...) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[1:2], 2, grid, scheme, $val, ψ, idx, loc, args...) + τ += add_global_smoothness(β, Val(2), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = abs(τ) + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -82,23 +87,32 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z ψs = $(ψ_reconstruction_stencil(3, side, dir)) - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ψs[3:5], scheme, Val(0)) - β₁ = $biased_β(ψs[2:4], scheme, Val(1)) - β₂ = $biased_β(ψs[1:3], scheme, Val(2)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs[3:5], $CT, Val($val), idx, loc) - ψ₁ = $biased_p(scheme, Val(1), ψs[2:4], $CT, Val($val), idx, loc) - ψ₂ = $biased_p(scheme, Val(2), ψs[1:3], $CT, Val($val), idx, loc) - - τ = global_smoothness_indicator(Val(3), (β₀, β₁, β₂)) + β, ψ̅, C, α = $weno_interpolant(ψs[3:5], 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[2:4], 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α - α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) - α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) - α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[1:3], 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α - return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂) / (α₀ + α₁ + α₂) + τ = abs(τ) + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -107,26 +121,41 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z ψs = $(ψ_reconstruction_stencil(4, side, dir)) - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ψs[4:7], scheme, Val(0)) - β₁ = $biased_β(ψs[3:6], scheme, Val(1)) - β₂ = $biased_β(ψs[2:5], scheme, Val(2)) - β₃ = $biased_β(ψs[1:4], scheme, Val(3)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs[4:7], $CT, Val($val), idx, loc) - ψ₁ = $biased_p(scheme, Val(1), ψs[3:6], $CT, Val($val), idx, loc) - ψ₂ = $biased_p(scheme, Val(2), ψs[2:5], $CT, Val($val), idx, loc) - ψ₃ = $biased_p(scheme, Val(3), ψs[1:4], $CT, Val($val), idx, loc) + β, ψ̅, C, α = $weno_interpolant(ψs[4:7], 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[3:6], 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[2:5], 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α - τ = global_smoothness_indicator(Val(4), (β₀, β₁, β₂, β₃)) - α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) - α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) - α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) - α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[1:4], 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α - return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃) / (α₀ + α₁ + α₂ + α₃) + τ = abs(τ) + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -134,30 +163,49 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z ψ, idx, loc, args...) where {FT, XT, YT, ZT} ψs = $(ψ_reconstruction_stencil(5, side, dir)) - - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ψs[5:9], scheme, Val(0)) - β₁ = $biased_β(ψs[4:8], scheme, Val(1)) - β₂ = $biased_β(ψs[3:7], scheme, Val(2)) - β₃ = $biased_β(ψs[2:6], scheme, Val(3)) - β₄ = $biased_β(ψs[1:5], scheme, Val(4)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs[5:9], $CT, Val($val), idx, loc) - ψ₁ = $biased_p(scheme, Val(1), ψs[4:8], $CT, Val($val), idx, loc) - ψ₂ = $biased_p(scheme, Val(2), ψs[3:7], $CT, Val($val), idx, loc) - ψ₃ = $biased_p(scheme, Val(3), ψs[2:6], $CT, Val($val), idx, loc) - ψ₄ = $biased_p(scheme, Val(4), ψs[1:5], $CT, Val($val), idx, loc) - - τ = global_smoothness_indicator(Val(5), (β₀, β₁, β₂, β₃, β₄)) - - α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) - α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) - α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) - α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) - α₄ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) - - return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄) / (α₀ + α₁ + α₂ + α₃ + α₄) + + β, ψ̅, C, α = $weno_interpolant(ψs[5:9], 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[4:8], 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[3:7], 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[2:6], 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[1:5], 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = abs(τ) + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -166,32 +214,56 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z ψs = $(ψ_reconstruction_stencil(6, side, dir)) - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ψs[6:11], scheme, Val(0)) - β₁ = $biased_β(ψs[5:10], scheme, Val(1)) - β₂ = $biased_β(ψs[4:9], scheme, Val(2)) - β₃ = $biased_β(ψs[3:8], scheme, Val(3)) - β₄ = $biased_β(ψs[2:7], scheme, Val(4)) - β₅ = $biased_β(ψs[1:6], scheme, Val(5)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs[6:11], $CT, Val($val), idx, loc) - ψ₁ = $biased_p(scheme, Val(1), ψs[5:10], $CT, Val($val), idx, loc) - ψ₂ = $biased_p(scheme, Val(2), ψs[4:9], $CT, Val($val), idx, loc) - ψ₃ = $biased_p(scheme, Val(3), ψs[3:8], $CT, Val($val), idx, loc) - ψ₄ = $biased_p(scheme, Val(4), ψs[2:7], $CT, Val($val), idx, loc) - ψ₅ = $biased_p(scheme, Val(5), ψs[1:6], $CT, Val($val), idx, loc) - - τ = global_smoothness_indicator(Val(6), (β₀, β₁, β₂, β₃, β₄, β₅)) - - α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) - α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) - α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) - α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) - α₄ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) - α₅ = FT($coeff(scheme, Val(5))) * (1 + τ / (β₅ + FT(ε))^2) - - return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄ + ψ₅ * α₅) / (α₀ + α₁ + α₂ + α₃ + α₄ + α₅) + β, ψ̅, C, α = $weno_interpolant(ψs[6:11], 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[5:10], 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[4:9], 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[3:8], 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[2:7], 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[1:6], 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(5)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = abs(τ) + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end end end \ No newline at end of file diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index f32fee3221..a9677bdbb6 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -465,5 +465,63 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z return βᵠ, ψ̅, C, α end + + ##### + ##### Picking up the stencil prior + ##### + + # Standard weno reconstruction at `i, j, k` for stencil `s` where `1 ≤ s ≤ N` + @inline function $weno_interpolant(ψs::Tuple, s, scheme::WENO{N, FT, XT, YT, ZT}, val, idx, loc) where {N, FT, XT, YT, ZT} + + # Calculate smoothness of stencil `s` + β = $biased_β(ψs, scheme, Val(s-1)) + + # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation + C = FT($coeff(scheme, Val(s-1))) + α = C / (β + FT(ε))^2 + + # Reconstruction of `ψ` from stencil `s` + ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) + + return β, ψ̅, C, α + end + + # Using velocity interpolated at `(Face, Face, Center)` to assess smoothness. + # Can be used only for `(Face, Face, Center)` variables like vorticity + @inline function $weno_interpolant(ψs::Tuple, us::Tuple, vs::Tuple, s, scheme::WENO{N, FT, XT, YT, ZT}, val, idx, loc) where {N, FT, XT, YT, ZT} + + # Calculate x-velocity smoothness at stencil `s` + βu = $biased_β(us, scheme, Val(s-1)) + # Calculate y-velocity smoothness at stencil `s` + βv = $biased_β(vs, scheme, Val(s-1)) + + # total smoothness + βᵁ = (βu + βv) / 2 + + # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation + C = FT($coeff(scheme, Val(s-1))) + α = C / (βᵁ + FT(ε))^2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) + + return βᵁ, ψ̅, C, α + end + + # The smoothness is assessed using the stencil calculated from the function `VI.func(i, j, k, grid, args...)` + @inline function $weno_interpolant(ψs::Tuple, ϕs::Tuple, s, scheme::WENO{N, FT, XT, YT, ZT}, val, idx, loc) where {N, FT, XT, YT, ZT} + + # Calculate `ϕ` smoothness at `s` + βᵠ = $biased_β(ϕs, scheme, Val(s-1)) + + # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation + C = FT($coeff(scheme, Val(s-1))) + α = C / (βᵠ + FT(ε))^2 + + # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` + ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) + + return βᵠ, ψ̅, C, α + end end end From 25d3e21387023d692c8bdd9511448348298483fc Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Sun, 17 Mar 2024 12:58:16 -0400 Subject: [PATCH 113/152] try again --- src/Advection/Advection.jl | 14 +++++++------- src/Advection/weno_default.jl | 7 +++---- src/Advection/weno_interpolants.jl | 10 +++++----- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/Advection/Advection.jl b/src/Advection/Advection.jl index d3e3887d75..99f33a1c23 100644 --- a/src/Advection/Advection.jl +++ b/src/Advection/Advection.jl @@ -67,14 +67,14 @@ include("centered_reconstruction.jl") include("upwind_biased_reconstruction.jl") include("weno_reconstruction.jl") include("weno_interpolants.jl") -include("weno_2.jl") -include("weno_3.jl") -include("weno_4.jl") -include("weno_5.jl") -include("weno_6.jl") +# include("weno_2.jl") +# include("weno_3.jl") +# include("weno_4.jl") +# include("weno_5.jl") +# include("weno_6.jl") include("weno_default.jl") -# include("weno_vi.jl") -# include("weno_phi.jl") +include("weno_vi.jl") +include("weno_phi.jl") include("stretched_weno_smoothness.jl") include("multi_dimensional_reconstruction.jl") include("vector_invariant_upwinding.jl") diff --git a/src/Advection/weno_default.jl b/src/Advection/weno_default.jl index a4de0dcc7d..8c8da73b64 100644 --- a/src/Advection/weno_default.jl +++ b/src/Advection/weno_default.jl @@ -144,7 +144,6 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z ψ̂₂ += ψ̅ * α w₂ += α - # Stencil S₁ β, ψ̅, C, α = $weno_interpolant(ψs[1:4], 4, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(4), Val(3)) @@ -196,7 +195,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z w₂ += α # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:5], 4, scheme, $val, idx, loc) + β, ψ̅, C, α = $weno_interpolant(ψs[1:5], 5, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(5), Val(4)) ψ̂₁ += ψ̅ * C w₁ += C @@ -246,7 +245,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z w₂ += α # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[2:7], 4, scheme, $val, idx, loc) + β, ψ̅, C, α = $weno_interpolant(ψs[2:7], 5, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(6), Val(4)) ψ̂₁ += ψ̅ * C w₁ += C @@ -254,7 +253,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z w₂ += α # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:6], 4, scheme, $val, idx, loc) + β, ψ̅, C, α = $weno_interpolant(ψs[1:6], 6, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(6), Val(5)) ψ̂₁ += ψ̅ * C w₁ += C diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index a9677bdbb6..96d39788ba 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -155,7 +155,7 @@ end # Smoothness indicators for stencil `stencil` for left and right biased reconstruction for buffer in [2, 3, 4, 5, 6] @eval begin - @inline smoothness_sum(scheme::WENO{$buffer}, ψ, C) = @inbounds $(metaprogrammed_smoothness_sum(buffer)) + @inline smoothness_sum(scheme::WENO{$buffer}, ψ, C) = @inbounds @fastmath $(metaprogrammed_smoothness_sum(buffer)) end for stencil in [0, 1, 2, 3, 4, 5] @@ -379,7 +379,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z @eval begin # Standard weno reconstruction at `i, j, k` for stencil `s` where `1 ≤ s ≤ N` - @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, args...) where {N, FT, XT, YT, ZT} + @inline function $weno_interpolant(i::Int, j::Int, k::Int, s::Int, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, args...) where {N, FT, XT, YT, ZT} # Retrieve stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -398,7 +398,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z end # If the smoothness stencil is not used (aka it's a `DefaultStencil`) use the same formulation as above - @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {N, FT, XT, YT, ZT} + @inline function $weno_interpolant(i::Int, j::Int, k::Int, s::Int, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {N, FT, XT, YT, ZT} # Retrieve stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -418,7 +418,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Using velocity interpolated at `(Face, Face, Center)` to assess smoothness. # Can be used only for `(Face, Face, Center)` variables like vorticity - @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {N, FT, XT, YT, ZT} + @inline function $weno_interpolant(i::Int, j::Int, k::Int, s::Int, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {N, FT, XT, YT, ZT} # Retrieve x-velocity stencil `s` ψs = $stencil_u(i, j, k, scheme, Val(s), Val(val), grid, u) @@ -447,7 +447,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z end # The smoothness is assessed using the stencil calculated from the function `VI.func(i, j, k, grid, args...)` - @inline function $weno_interpolant(i, j, k, s, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT, XT, YT, ZT} + @inline function $weno_interpolant(i::Int, j::Int, k::Int, s::Int, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT, XT, YT, ZT} # Retrieve smoothness stencil ϕ at `s` ψs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) From 34e4b29ffed4019d5751e124852eb284b69543e3 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Sun, 17 Mar 2024 13:06:23 -0400 Subject: [PATCH 114/152] some bugfix --- src/Advection/weno_default.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Advection/weno_default.jl b/src/Advection/weno_default.jl index 8c8da73b64..365b06bf04 100644 --- a/src/Advection/weno_default.jl +++ b/src/Advection/weno_default.jl @@ -61,7 +61,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # All stencils ψs = $(ψ_reconstruction_stencil(2, side, dir)) - β, ψ̅, C, α = $weno_interpolant(ψs[2:3], 1, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(ψs[2:3], 1, scheme, $val, ψ, idx, loc, args...) τ = β ψ̂₁ = ψ̅ * C w₁ = C @@ -69,7 +69,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z w₂ = α # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:2], 2, grid, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(ψs[1:2], 2, scheme, $val, ψ, idx, loc, args...) τ += add_global_smoothness(β, Val(2), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C From 870c23e4f237871acf365679b3ff868dce7c2764 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Sun, 17 Mar 2024 13:14:49 -0400 Subject: [PATCH 115/152] bugfix --- src/Advection/weno_default.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Advection/weno_default.jl b/src/Advection/weno_default.jl index 365b06bf04..67561c88f6 100644 --- a/src/Advection/weno_default.jl +++ b/src/Advection/weno_default.jl @@ -61,7 +61,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # All stencils ψs = $(ψ_reconstruction_stencil(2, side, dir)) - β, ψ̅, C, α = $weno_interpolant(ψs[2:3], 1, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(ψs[2:3], 1, scheme, $val, idx, loc, args...) τ = β ψ̂₁ = ψ̅ * C w₁ = C @@ -69,7 +69,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z w₂ = α # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:2], 2, scheme, $val, ψ, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(ψs[1:2], 2, scheme, $val, idx, loc, args...) τ += add_global_smoothness(β, Val(2), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C From c76816900be6e296d30f02191d69b3dba0178cb4 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Sun, 17 Mar 2024 13:48:12 -0400 Subject: [PATCH 116/152] try again --- src/Advection/weno_phi.jl | 289 +++++++++++++++++++------------- src/Advection/weno_vi.jl | 338 +++++++++++++++++++++----------------- 2 files changed, 368 insertions(+), 259 deletions(-) diff --git a/src/Advection/weno_phi.jl b/src/Advection/weno_phi.jl index 546cdd5700..6c8487db0a 100644 --- a/src/Advection/weno_phi.jl +++ b/src/Advection/weno_phi.jl @@ -37,150 +37,219 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψs = $(ϕ_reconstruction_stencil(2, side, dir)) - - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ψs[2:3], scheme, Val(0)) - β₁ = $biased_β(ψs[1:2], scheme, Val(1)) - + ϕs = $(ϕ_reconstruction_stencil(2, side, dir)) ψs = $(ψ_reconstruction_stencil(2, side, dir, true)) - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs[2:3], $CT, Val($val), idx, loc) - ψ₁ = $biased_p(scheme, Val(1), ψs[1:2], $CT, Val($val), idx, loc) - - τ = global_smoothness_indicator(Val(2), (β₀, β₁)) - - α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) - α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) - - return (ψ₀ * α₀ + ψ₁ * α₁) / (α₀ + α₁) + β, ψ̅, C, α = $weno_interpolant(ψs[2:3], ϕs[2:3], 1, scheme, $val, idx, loc, args...) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[1:2], ϕs[1:2], 2, scheme, $val, idx, loc, args...) + τ += add_global_smoothness(β, Val(2), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = abs(τ) + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{3, FT, XT, YT, ZT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - ψs = $(ϕ_reconstruction_stencil(3, side, dir)) - - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ψs[3:5], scheme, Val(0)) - β₁ = $biased_β(ψs[2:4], scheme, Val(1)) - β₂ = $biased_β(ψs[1:3], scheme, Val(2)) - + # All stencils + ϕs = $(ϕ_reconstruction_stencil(3, side, dir)) ψs = $(ψ_reconstruction_stencil(3, side, dir, true)) - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs[3:5], $CT, Val($val), idx, loc) - ψ₁ = $biased_p(scheme, Val(1), ψs[2:4], $CT, Val($val), idx, loc) - ψ₂ = $biased_p(scheme, Val(2), ψs[1:3], $CT, Val($val), idx, loc) - - τ = global_smoothness_indicator(Val(3), (β₀, β₁, β₂)) - - α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) - α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) - α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) - - return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂) / (α₀ + α₁ + α₂) + β, ψ̅, C, α = $weno_interpolant(ψs[3:5], ϕs[3:5], 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[2:4], ϕs[2:4], 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[1:3], ϕs[1:3], 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = abs(τ) + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{4, FT, XT, YT, ZT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - ψs = $(ϕ_reconstruction_stencil(4, side, dir)) - - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ψs[4:7], scheme, Val(0)) - β₁ = $biased_β(ψs[3:6], scheme, Val(1)) - β₂ = $biased_β(ψs[2:5], scheme, Val(2)) - β₃ = $biased_β(ψs[1:4], scheme, Val(3)) - + # All stencils + ϕs = $(ϕ_reconstruction_stencil(4, side, dir)) ψs = $(ψ_reconstruction_stencil(4, side, dir, true)) - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs[4:7], $CT, Val($val), idx, loc) - ψ₁ = $biased_p(scheme, Val(1), ψs[3:6], $CT, Val($val), idx, loc) - ψ₂ = $biased_p(scheme, Val(2), ψs[2:5], $CT, Val($val), idx, loc) - ψ₃ = $biased_p(scheme, Val(3), ψs[1:4], $CT, Val($val), idx, loc) - τ = global_smoothness_indicator(Val(4), (β₀, β₁, β₂, β₃)) - - α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) - α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) - α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) - α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) - - return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃) / (α₀ + α₁ + α₂ + α₃) + β, ψ̅, C, α = $weno_interpolant(ψs[4:7], ϕs[4:7], 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[3:6], ϕs[3:6], 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[2:5], ϕs[2:5], 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[1:4], ϕs[1:4], 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = abs(τ) + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{5, FT, XT, YT, ZT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - ψs = $(ϕ_reconstruction_stencil(5, side, dir)) - - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ψs[5:9], scheme, Val(0)) - β₁ = $biased_β(ψs[4:8], scheme, Val(1)) - β₂ = $biased_β(ψs[3:7], scheme, Val(2)) - β₃ = $biased_β(ψs[2:6], scheme, Val(3)) - β₄ = $biased_β(ψs[1:5], scheme, Val(4)) - + # All stencils + ϕs = $(ϕ_reconstruction_stencil(5, side, dir)) ψs = $(ψ_reconstruction_stencil(5, side, dir, true)) - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs[5:9], $CT, Val($val), idx, loc) - ψ₁ = $biased_p(scheme, Val(1), ψs[4:8], $CT, Val($val), idx, loc) - ψ₂ = $biased_p(scheme, Val(2), ψs[3:7], $CT, Val($val), idx, loc) - ψ₃ = $biased_p(scheme, Val(3), ψs[2:6], $CT, Val($val), idx, loc) - ψ₄ = $biased_p(scheme, Val(4), ψs[1:5], $CT, Val($val), idx, loc) - - τ = global_smoothness_indicator(Val(5), (β₀, β₁, β₂, β₃, β₄)) - - α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) - α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) - α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) - α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) - α₄ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) - - return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄) / (α₀ + α₁ + α₂ + α₃ + α₄) + β, ψ̅, C, α = $weno_interpolant(ψs[5:9], ϕs[5:9], 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[4:8], ϕs[4:8], 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[3:7], ϕs[3:7], 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[2:6], ϕs[2:6], 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[1:5], ϕs[1:5], 5, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = abs(τ) + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{6, FT, XT, YT, ZT}, ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - ψs = $(ϕ_reconstruction_stencil(6, side, dir)) - - # Calculate x-velocity smoothness at stencil `s` - β₀ = $biased_β(ψs[6:11], scheme, Val(0)) - β₁ = $biased_β(ψs[5:10], scheme, Val(1)) - β₂ = $biased_β(ψs[4:9], scheme, Val(2)) - β₃ = $biased_β(ψs[3:8], scheme, Val(3)) - β₄ = $biased_β(ψs[2:7], scheme, Val(4)) - β₅ = $biased_β(ψs[1:6], scheme, Val(4)) - + # All stencils + ϕs = $(ϕ_reconstruction_stencil(6, side, dir)) ψs = $(ψ_reconstruction_stencil(6, side, dir, true)) - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψ₀ = $biased_p(scheme, Val(0), ψs[6:11], $CT, Val($val), idx, loc) - ψ₁ = $biased_p(scheme, Val(1), ψs[5:10], $CT, Val($val), idx, loc) - ψ₂ = $biased_p(scheme, Val(2), ψs[4:9], $CT, Val($val), idx, loc) - ψ₃ = $biased_p(scheme, Val(3), ψs[3:8], $CT, Val($val), idx, loc) - ψ₄ = $biased_p(scheme, Val(4), ψs[2:7], $CT, Val($val), idx, loc) - ψ₅ = $biased_p(scheme, Val(5), ψs[1:6], $CT, Val($val), idx, loc) - - τ = global_smoothness_indicator(Val(6), (β₀, β₁, β₂, β₃, β₄, β₅)) - - α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) - α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) - α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) - α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) - α₄ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) - α₅ = FT($coeff(scheme, Val(5))) * (1 + τ / (β₅ + FT(ε))^2) - - return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄ + ψ₅ * α₅) / (α₀ + α₁ + α₂ + α₃ + α₄ + α₅) + β, ψ̅, C, α = $weno_interpolant(ψs[6:11], ϕs[6:11], 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[5:10], ϕs[5:10], 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[4:9], ϕs[4:9], 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[3:8], ϕs[3:8], 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[2:7], ϕs[2:7], 5, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[1:6], ϕs[1:6], 6, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(5)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = abs(τ) + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end end end \ No newline at end of file diff --git a/src/Advection/weno_vi.jl b/src/Advection/weno_vi.jl index 62eeecb61f..a886b8642a 100644 --- a/src/Advection/weno_vi.jl +++ b/src/Advection/weno_vi.jl @@ -80,187 +80,227 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z @eval begin @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{2, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} - - ψs = $(u_reconstruction_stencil(2, side, dir)) - βu₀ = $biased_β(ψs[2:3], scheme, Val(0)) - βu₁ = $biased_β(ψs[1:2], scheme, Val(1)) - - ψs = $(v_reconstruction_stencil(2, side, dir)) - βv₀ = $biased_β(ψs[2:3], scheme, Val(0)) - βv₁ = $biased_β(ψs[1:2], scheme, Val(1)) + ψ, idx, loc, ::VelocityStencil, args...) where {FT, XT, YT, ZT} + # All stencils + us = $(u_reconstruction_stencil(2, side, dir)) + vs = $(v_reconstruction_stencil(2, side, dir)) ψs = $(ζ_reconstruction_stencil(2, side, dir)) - ψ₀ = $biased_p(scheme, Val(0), ψs[2:3], $CT, Val($val), idx, loc) - ψ₁ = $biased_p(scheme, Val(1), ψs[1:2], $CT, Val($val), idx, loc) - - β₀ = (βu₀ + βv₀) / 2 - β₁ = (βu₁ + βv₁) / 2 - - τ = global_smoothness_indicator(Val(2), (β₀, β₁)) + + β, ψ̅, C, α = $weno_interpolant(ψs[2:3], us[2:3], vs[2:3], 1, scheme, $val, idx, loc, args...) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α - α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) - α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[1:2], us[1:2], vs[1:2], 2, scheme, $val, idx, loc, args...) + τ += add_global_smoothness(β, Val(2), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α - return (ψ₀ * α₀ + ψ₁ * α₁) / (α₀ + α₁) + τ = abs(τ) + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{3, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} - - ψs = $(u_reconstruction_stencil(3, side, dir)) - βu₀ = $biased_β(ψs[3:5], scheme, Val(0)) - βu₁ = $biased_β(ψs[2:4], scheme, Val(1)) - βu₂ = $biased_β(ψs[1:3], scheme, Val(2)) - - ψs = $(v_reconstruction_stencil(3, side, dir)) - βv₀ = $biased_β(ψs[3:5], scheme, Val(0)) - βv₁ = $biased_β(ψs[2:4], scheme, Val(1)) - βv₂ = $biased_β(ψs[1:3], scheme, Val(2)) - + ψ, idx, loc, ::VelocityStencil, args...) where {FT, XT, YT, ZT} + + # All stencils + us = $(u_reconstruction_stencil(3, side, dir)) + vs = $(v_reconstruction_stencil(3, side, dir)) ψs = $(ζ_reconstruction_stencil(3, side, dir)) - ψ₀ = $biased_p(scheme, Val(0), ψs[3:5], $CT, Val($val), idx, loc) - ψ₁ = $biased_p(scheme, Val(1), ψs[2:4], $CT, Val($val), idx, loc) - ψ₂ = $biased_p(scheme, Val(2), ψs[1:3], $CT, Val($val), idx, loc) - β₀ = (βu₀ + βv₀) / 2 - β₁ = (βu₁ + βv₁) / 2 - β₂ = (βu₂ + βv₂) / 2 + β, ψ̅, C, α = $weno_interpolant(ψs[3:5], us[3:5], vs[3:5], 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[2:4], us[2:4], vs[2:4], 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α - τ = global_smoothness_indicator(Val(3), (β₀, β₁, β₂)) + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[1:3], us[1:3], vs[1:3], 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α - α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) - α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) - α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) + τ = abs(τ) - return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂) / (α₀ + α₁ + α₂) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} + scheme::WENO{4, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, args...) where {FT, XT, YT, ZT} - ψs = $(u_reconstruction_stencil(4, side, dir)) - βu₀ = $biased_β(ψs[4:7], scheme, Val(0)) - βu₁ = $biased_β(ψs[3:6], scheme, Val(1)) - βu₂ = $biased_β(ψs[2:5], scheme, Val(2)) - βu₃ = $biased_β(ψs[1:4], scheme, Val(3)) - - ψs = $(v_reconstruction_stencil(4, side, dir)) - βv₀ = $biased_β(ψs[4:7], scheme, Val(0)) - βv₁ = $biased_β(ψs[3:6], scheme, Val(1)) - βv₂ = $biased_β(ψs[2:5], scheme, Val(2)) - βv₃ = $biased_β(ψs[1:4], scheme, Val(3)) - + # All stencils + us = $(u_reconstruction_stencil(4, side, dir)) + vs = $(v_reconstruction_stencil(4, side, dir)) ψs = $(ζ_reconstruction_stencil(4, side, dir)) - ψ₀ = $biased_p(scheme, Val(0), ψs[4:7], $CT, Val($val), idx, loc) - ψ₁ = $biased_p(scheme, Val(1), ψs[3:6], $CT, Val($val), idx, loc) - ψ₂ = $biased_p(scheme, Val(2), ψs[2:5], $CT, Val($val), idx, loc) - ψ₃ = $biased_p(scheme, Val(3), ψs[1:4], $CT, Val($val), idx, loc) - β₀ = (βu₀ + βv₀) / 2 - β₁ = (βu₁ + βv₁) / 2 - β₂ = (βu₂ + βv₂) / 2 - β₃ = (βu₃ + βv₃) / 2 + β, ψ̅, C, α = $weno_interpolant(ψs[4:7], us[4:7], vs[4:7], 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α - τ = global_smoothness_indicator(Val(4), (β₀, β₁, β₂, β₃)) + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[3:6], us[3:6], vs[3:6], 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α - α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) - α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) - α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) - α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[2:5], us[2:5], vs[2:5], 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α - return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃) / (α₀ + α₁ + α₂ + α₃) + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[1:4], us[1:4], vs[1:4], 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = abs(τ) + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} + scheme::WENO{5, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, args...) where {FT, XT, YT, ZT} - ψs = $(u_reconstruction_stencil(5, side, dir)) - βu₀ = $biased_β(ψs[5:9], scheme, Val(0)) - βu₁ = $biased_β(ψs[4:8], scheme, Val(1)) - βu₂ = $biased_β(ψs[3:7], scheme, Val(2)) - βu₃ = $biased_β(ψs[2:6], scheme, Val(3)) - βu₄ = $biased_β(ψs[1:5], scheme, Val(4)) - - ψs = $(v_reconstruction_stencil(5, side, dir)) - βv₀ = $biased_β(ψs[5:9], scheme, Val(0)) - βv₁ = $biased_β(ψs[4:8], scheme, Val(1)) - βv₂ = $biased_β(ψs[3:7], scheme, Val(2)) - βv₃ = $biased_β(ψs[2:6], scheme, Val(3)) - βv₄ = $biased_β(ψs[1:5], scheme, Val(4)) - + # All stencils + us = $(u_reconstruction_stencil(5, side, dir)) + vs = $(v_reconstruction_stencil(5, side, dir)) ψs = $(ζ_reconstruction_stencil(5, side, dir)) - ψ₀ = $biased_p(scheme, Val(0), ψs[5:9], $CT, Val($val), idx, loc) - ψ₁ = $biased_p(scheme, Val(1), ψs[4:8], $CT, Val($val), idx, loc) - ψ₂ = $biased_p(scheme, Val(2), ψs[3:7], $CT, Val($val), idx, loc) - ψ₃ = $biased_p(scheme, Val(3), ψs[2:6], $CT, Val($val), idx, loc) - ψ₄ = $biased_p(scheme, Val(4), ψs[1:5], $CT, Val($val), idx, loc) - - β₀ = (βu₀ + βv₀) / 2 - β₁ = (βu₁ + βv₁) / 2 - β₂ = (βu₂ + βv₂) / 2 - β₃ = (βu₃ + βv₃) / 2 - β₄ = (βu₄ + βv₄) / 2 - - τ = global_smoothness_indicator(Val(5), (β₀, β₁, β₂, β₃, β₄)) - - α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) - α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) - α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) - α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) - α₄ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) - - return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄) / (α₀ + α₁ + α₂ + α₃ + α₄) + + β, ψ̅, C, α = $weno_interpolant(ψs[5:9], us[5:9], vs[5:9], 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[4:8], us[4:8], vs[4:8], 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[3:7], us[3:7], vs[3:7], 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[2:6], us[2:6], vs[2:6], 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[1:5], us[1:5], vs[1:5], 5, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = abs(τ) + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{6, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} + scheme::WENO{6, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, args...) where {FT, XT, YT, ZT} - ψs = $(u_reconstruction_stencil(6, side, dir)) - βu₀ = $biased_β(ψs[6:11], scheme, Val(0)) - βu₁ = $biased_β(ψs[5:10], scheme, Val(1)) - βu₂ = $biased_β(ψs[4:9], scheme, Val(2)) - βu₃ = $biased_β(ψs[3:8], scheme, Val(3)) - βu₄ = $biased_β(ψs[2:7], scheme, Val(4)) - βu₅ = $biased_β(ψs[1:6], scheme, Val(5)) - - ψs = $(v_reconstruction_stencil(6, side, dir)) - βv₀ = $biased_β(ψs[6:11], scheme, Val(0)) - βv₁ = $biased_β(ψs[5:10], scheme, Val(1)) - βv₂ = $biased_β(ψs[4:9], scheme, Val(2)) - βv₃ = $biased_β(ψs[3:8], scheme, Val(3)) - βv₄ = $biased_β(ψs[2:7], scheme, Val(4)) - βv₅ = $biased_β(ψs[1:6], scheme, Val(5)) - + # All stencils + us = $(u_reconstruction_stencil(6, side, dir)) + vs = $(v_reconstruction_stencil(6, side, dir)) ψs = $(ζ_reconstruction_stencil(6, side, dir)) - ψ₀ = $biased_p(scheme, Val(0), ψs[6:11], $CT, Val($val), idx, loc) - ψ₁ = $biased_p(scheme, Val(1), ψs[5:10], $CT, Val($val), idx, loc) - ψ₂ = $biased_p(scheme, Val(2), ψs[4:9], $CT, Val($val), idx, loc) - ψ₃ = $biased_p(scheme, Val(3), ψs[3:8], $CT, Val($val), idx, loc) - ψ₄ = $biased_p(scheme, Val(4), ψs[2:7], $CT, Val($val), idx, loc) - ψ₅ = $biased_p(scheme, Val(5), ψs[1:6], $CT, Val($val), idx, loc) - - β₀ = (βu₀ + βv₀) / 2 - β₁ = (βu₁ + βv₁) / 2 - β₂ = (βu₂ + βv₂) / 2 - β₃ = (βu₃ + βv₃) / 2 - β₄ = (βu₄ + βv₄) / 2 - β₅ = (βu₅ + βv₅) / 2 - - τ = global_smoothness_indicator(Val(6), (β₀, β₁, β₂, β₃, β₄, β₅)) - - α₀ = FT($coeff(scheme, Val(0))) * (1 + τ / (β₀ + FT(ε))^2) - α₁ = FT($coeff(scheme, Val(1))) * (1 + τ / (β₁ + FT(ε))^2) - α₂ = FT($coeff(scheme, Val(2))) * (1 + τ / (β₂ + FT(ε))^2) - α₃ = FT($coeff(scheme, Val(3))) * (1 + τ / (β₃ + FT(ε))^2) - α₄ = FT($coeff(scheme, Val(4))) * (1 + τ / (β₄ + FT(ε))^2) - α₅ = FT($coeff(scheme, Val(5))) * (1 + τ / (β₅ + FT(ε))^2) - - return (ψ₀ * α₀ + ψ₁ * α₁ + ψ₂ * α₂ + ψ₃ * α₃ + ψ₄ * α₄ + ψ₅ * α₅) / (α₀ + α₁ + α₂ + α₃ + α₄ + α₅) + + β, ψ̅, C, α = $weno_interpolant(ψs[6:11], us[6:11], vs[6:11], 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[5:10], us[5:10], vs[5:10], 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[4:9], us[4:9], vs[4:9], 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[3:8], us[3:8], vs[3:8], 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[2:7], us[2:7], vs[2:7], 5, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant(ψs[1:6], us[1:6], vs[1:6], 6, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(5)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = abs(τ) + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end end end \ No newline at end of file From 96eaaeca7ea70ab2c59c05518e4f31b332d37bf4 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Sun, 17 Mar 2024 13:50:00 -0400 Subject: [PATCH 117/152] bugfix --- src/Advection/weno_phi.jl | 1 + src/Advection/weno_vi.jl | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Advection/weno_phi.jl b/src/Advection/weno_phi.jl index 6c8487db0a..2d4e7e69cf 100644 --- a/src/Advection/weno_phi.jl +++ b/src/Advection/weno_phi.jl @@ -30,6 +30,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z stencil_u = Symbol(:tangential_, side, :_stencil_u) stencil_v = Symbol(:tangential_, side, :_stencil_v) new_stencil = Symbol(:new_stencil_, side, :_, dir) + weno_interpolant = Symbol(side, :_weno_interpolant_, dir) @eval begin @inline function $biased_interpolate(i, j, k, grid, diff --git a/src/Advection/weno_vi.jl b/src/Advection/weno_vi.jl index a886b8642a..9524017ac2 100644 --- a/src/Advection/weno_vi.jl +++ b/src/Advection/weno_vi.jl @@ -76,6 +76,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z stencil_u = Symbol(:tangential_, side, :_stencil_u) stencil_v = Symbol(:tangential_, side, :_stencil_v) new_stencil = Symbol(:new_stencil_, side, :_, dir) + weno_interpolant = Symbol(side, :_weno_interpolant_, dir) @eval begin @inline function $biased_interpolate(i, j, k, grid, From 9746f5f6a748a831c312635959072dd98225f878 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Sun, 17 Mar 2024 14:30:47 -0400 Subject: [PATCH 118/152] try it now --- src/Advection/weno_vi.jl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Advection/weno_vi.jl b/src/Advection/weno_vi.jl index 9524017ac2..6b01707b0d 100644 --- a/src/Advection/weno_vi.jl +++ b/src/Advection/weno_vi.jl @@ -81,7 +81,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z @eval begin @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{2, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, args...) where {FT, XT, YT, ZT} + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} # All stencils us = $(u_reconstruction_stencil(2, side, dir)) @@ -110,7 +110,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{3, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, args...) where {FT, XT, YT, ZT} + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} # All stencils us = $(u_reconstruction_stencil(3, side, dir)) @@ -147,7 +147,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{4, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, args...) where {FT, XT, YT, ZT} + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} # All stencils us = $(u_reconstruction_stencil(4, side, dir)) @@ -192,7 +192,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{5, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, args...) where {FT, XT, YT, ZT} + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} # All stencils us = $(u_reconstruction_stencil(5, side, dir)) @@ -245,7 +245,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{6, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, args...) where {FT, XT, YT, ZT} + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} # All stencils us = $(u_reconstruction_stencil(6, side, dir)) From 49a60de435aa90dba5c34795740293118ae03833 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Sun, 17 Mar 2024 14:38:34 -0400 Subject: [PATCH 119/152] bugfix --- src/Advection/weno_phi.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Advection/weno_phi.jl b/src/Advection/weno_phi.jl index 2d4e7e69cf..d8562b1897 100644 --- a/src/Advection/weno_phi.jl +++ b/src/Advection/weno_phi.jl @@ -41,7 +41,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z ϕs = $(ϕ_reconstruction_stencil(2, side, dir)) ψs = $(ψ_reconstruction_stencil(2, side, dir, true)) - β, ψ̅, C, α = $weno_interpolant(ψs[2:3], ϕs[2:3], 1, scheme, $val, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(ψs[2:3], ϕs[2:3], 1, scheme, $val, idx, loc) τ = β ψ̂₁ = ψ̅ * C w₁ = C @@ -49,7 +49,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z w₂ = α # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:2], ϕs[1:2], 2, scheme, $val, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(ψs[1:2], ϕs[1:2], 2, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(2), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C From 4be9503598e3c56080f5bb4cef7a1fe47b6e1a80 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Sun, 17 Mar 2024 15:42:18 -0400 Subject: [PATCH 120/152] go with the change --- src/Advection/vector_invariant_advection.jl | 2 +- src/Advection/weno_default.jl | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/Advection/vector_invariant_advection.jl b/src/Advection/vector_invariant_advection.jl index 6e1a237ab4..27403d1324 100644 --- a/src/Advection/vector_invariant_advection.jl +++ b/src/Advection/vector_invariant_advection.jl @@ -177,7 +177,7 @@ function Base.show(io::IO, a::VectorInvariant{N, FT}) where {N, FT} msg11 = !(kscheme isa WENO) ? "" : "└── smoothness δx_u² : $(a.upwinding.δu²_stencil)\n" msg12 = !(kscheme isa WENO) ? "" : "└── smoothness δy_v² : $(a.upwinding.δv²_stencil)\n" - return print(io, summary(a), msg1, msg2, msg3, msg4, msg5, msg6, msg7, msg8, msg9, msg10, msg11, msg12) + return print(io, summary(a), "\n", msg1, msg2, msg3, msg4, msg5, msg6, msg7, msg8, msg9, msg10, msg11, msg12) end ##### diff --git a/src/Advection/weno_default.jl b/src/Advection/weno_default.jl index 67561c88f6..f11931d396 100644 --- a/src/Advection/weno_default.jl +++ b/src/Advection/weno_default.jl @@ -39,8 +39,13 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z stencil_v = Symbol(:tangential_, side, :_stencil_v) new_stencil = Symbol(:new_stencil_, side, :_, dir) weno_interpolant = Symbol(side, :_weno_interpolant_, dir) + ψ_reconstruction = Symbol(:ψ_reconstruction_, side, :_, dir) @eval begin + for N in [2, 3, 4, 5, 6] + @inline $ψ_reconstruction(i, j, k, grid, ::WENO{$N}, ψ, args...) = @inbounds $(ψ_reconstruction_stencil(buffer, side, dir)) + @inline $ψ_reconstruction(i, j, k, grid, ::WENO{$N}, ψ::Function, args...) = @inbounds $(ψ_reconstruction_stencil(buffer, side, dir, true)) + end # Fallback for DefaultStencil formulations and disambiguation @inline $biased_interpolate(i, j, k, grid, scheme::WENO{2}, ψ, idx, loc, ::DefaultStencil, args...) = @@ -59,7 +64,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψs = $(ψ_reconstruction_stencil(2, side, dir)) + ψs = $ψ_reconstruction(i, j, k, grid, scheme, ψ, args...) β, ψ̅, C, α = $weno_interpolant(ψs[2:3], 1, scheme, $val, idx, loc, args...) τ = β @@ -85,7 +90,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z scheme::WENO{3, FT, XT, YT, ZT}, ψ, idx, loc, args...) where {FT, XT, YT, ZT} - ψs = $(ψ_reconstruction_stencil(3, side, dir)) + ψs = $ψ_reconstruction(i, j, k, grid, scheme, ψ, args...) β, ψ̅, C, α = $weno_interpolant(ψs[3:5], 1, scheme, $val, idx, loc) τ = β @@ -161,7 +166,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z scheme::WENO{5, FT, XT, YT, ZT}, ψ, idx, loc, args...) where {FT, XT, YT, ZT} - ψs = $(ψ_reconstruction_stencil(5, side, dir)) + ψs = $ψ_reconstruction(i, j, k, grid, scheme, ψ, args...) β, ψ̅, C, α = $weno_interpolant(ψs[5:9], 1, scheme, $val, idx, loc) τ = β @@ -211,7 +216,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z scheme::WENO{6, FT, XT, YT, ZT}, ψ, idx, loc, args...) where {FT, XT, YT, ZT} - ψs = $(ψ_reconstruction_stencil(6, side, dir)) + ψs = $ψ_reconstruction(i, j, k, grid, scheme, ψ, args...) β, ψ̅, C, α = $weno_interpolant(ψs[6:11], 1, scheme, $val, idx, loc) τ = β From 0f29b688d4b1a03fcc16112f8edd818b1f177bec Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Sun, 17 Mar 2024 15:45:27 -0400 Subject: [PATCH 121/152] tests --- src/Advection/weno_default.jl | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Advection/weno_default.jl b/src/Advection/weno_default.jl index f11931d396..4c8b6abd25 100644 --- a/src/Advection/weno_default.jl +++ b/src/Advection/weno_default.jl @@ -41,11 +41,12 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z weno_interpolant = Symbol(side, :_weno_interpolant_, dir) ψ_reconstruction = Symbol(:ψ_reconstruction_, side, :_, dir) + for N in [2, 3, 4, 5, 6] + @eval @inline $ψ_reconstruction(i, j, k, grid, ::WENO{$N}, ψ, args...) = @inbounds $(ψ_reconstruction_stencil(buffer, side, dir)) + @eval @inline $ψ_reconstruction(i, j, k, grid, ::WENO{$N}, ψ::Function, args...) = @inbounds $(ψ_reconstruction_stencil(buffer, side, dir, true)) + end + @eval begin - for N in [2, 3, 4, 5, 6] - @inline $ψ_reconstruction(i, j, k, grid, ::WENO{$N}, ψ, args...) = @inbounds $(ψ_reconstruction_stencil(buffer, side, dir)) - @inline $ψ_reconstruction(i, j, k, grid, ::WENO{$N}, ψ::Function, args...) = @inbounds $(ψ_reconstruction_stencil(buffer, side, dir, true)) - end # Fallback for DefaultStencil formulations and disambiguation @inline $biased_interpolate(i, j, k, grid, scheme::WENO{2}, ψ, idx, loc, ::DefaultStencil, args...) = From eae56650d7f3f2efc1bf89fb88b5c38860f999d4 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Sun, 17 Mar 2024 15:46:13 -0400 Subject: [PATCH 122/152] bugfix --- src/Advection/weno_default.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Advection/weno_default.jl b/src/Advection/weno_default.jl index 4c8b6abd25..fcb3b82ca9 100644 --- a/src/Advection/weno_default.jl +++ b/src/Advection/weno_default.jl @@ -42,8 +42,8 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z ψ_reconstruction = Symbol(:ψ_reconstruction_, side, :_, dir) for N in [2, 3, 4, 5, 6] - @eval @inline $ψ_reconstruction(i, j, k, grid, ::WENO{$N}, ψ, args...) = @inbounds $(ψ_reconstruction_stencil(buffer, side, dir)) - @eval @inline $ψ_reconstruction(i, j, k, grid, ::WENO{$N}, ψ::Function, args...) = @inbounds $(ψ_reconstruction_stencil(buffer, side, dir, true)) + @eval @inline $ψ_reconstruction(i, j, k, grid, ::WENO{$N}, ψ, args...) = @inbounds $(ψ_reconstruction_stencil(N, side, dir)) + @eval @inline $ψ_reconstruction(i, j, k, grid, ::WENO{$N}, ψ::Function, args...) = @inbounds $(ψ_reconstruction_stencil(N, side, dir, true)) end @eval begin From 4ba20ee321eb4ffbb3b88f5d76c56dd9dd128faa Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Sun, 17 Mar 2024 15:55:31 -0400 Subject: [PATCH 123/152] final optimization --- src/Advection/weno_default.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Advection/weno_default.jl b/src/Advection/weno_default.jl index fcb3b82ca9..62b7ead496 100644 --- a/src/Advection/weno_default.jl +++ b/src/Advection/weno_default.jl @@ -67,7 +67,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # All stencils ψs = $ψ_reconstruction(i, j, k, grid, scheme, ψ, args...) - β, ψ̅, C, α = $weno_interpolant(ψs[2:3], 1, scheme, $val, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(ψs[2:3], 1, scheme, $val, idx, loc) τ = β ψ̂₁ = ψ̅ * C w₁ = C @@ -75,7 +75,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z w₂ = α # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:2], 2, scheme, $val, idx, loc, args...) + β, ψ̅, C, α = $weno_interpolant(ψs[1:2], 2, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(2), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C From 0acf1e0021bf91463bbf147a6f2a7179c0a1dc2e Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Sun, 17 Mar 2024 16:05:38 -0400 Subject: [PATCH 124/152] test it out --- src/Advection/weno_default.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Advection/weno_default.jl b/src/Advection/weno_default.jl index 62b7ead496..b5d20558a7 100644 --- a/src/Advection/weno_default.jl +++ b/src/Advection/weno_default.jl @@ -125,7 +125,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z scheme::WENO{4, FT, XT, YT, ZT}, ψ, idx, loc, args...) where {FT, XT, YT, ZT} - ψs = $(ψ_reconstruction_stencil(4, side, dir)) + ψs = $ψ_reconstruction(i, j, k, grid, scheme, ψ, args...) β, ψ̅, C, α = $weno_interpolant(ψs[4:7], 1, scheme, $val, idx, loc) τ = β From 5d843c08875c2b94700530d98659580a65162a4f Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Sun, 17 Mar 2024 17:08:12 -0400 Subject: [PATCH 125/152] this is probably the best? --- src/Advection/Advection.jl | 16 ++++++++-------- src/Advection/weno_interpolants.jl | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Advection/Advection.jl b/src/Advection/Advection.jl index 99f33a1c23..5c37288732 100644 --- a/src/Advection/Advection.jl +++ b/src/Advection/Advection.jl @@ -67,14 +67,14 @@ include("centered_reconstruction.jl") include("upwind_biased_reconstruction.jl") include("weno_reconstruction.jl") include("weno_interpolants.jl") -# include("weno_2.jl") -# include("weno_3.jl") -# include("weno_4.jl") -# include("weno_5.jl") -# include("weno_6.jl") -include("weno_default.jl") -include("weno_vi.jl") -include("weno_phi.jl") +include("weno_2.jl") +include("weno_3.jl") +include("weno_4.jl") +include("weno_5.jl") +include("weno_6.jl") +# include("weno_default.jl") +# include("weno_vi.jl") +# include("weno_phi.jl") include("stretched_weno_smoothness.jl") include("multi_dimensional_reconstruction.jl") include("vector_invariant_upwinding.jl") diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 96d39788ba..378a856a6b 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -478,7 +478,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = C / (β + FT(ε))^2 + α = @fastmath C / (β + FT(ε))^2 # Reconstruction of `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) @@ -500,7 +500,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = C / (βᵁ + FT(ε))^2 + α = @fastmath C / (βᵁ + FT(ε))^2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) @@ -516,7 +516,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = C / (βᵠ + FT(ε))^2 + α = @fastmath C / (βᵠ + FT(ε))^2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) From 1a2d5ba8798a22cd3c5f84fec3b815da9f2cdfa8 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 19 Mar 2024 00:02:47 -0400 Subject: [PATCH 126/152] boh --- src/Advection/Advection.jl | 16 +- src/Advection/weno_default.jl | 80 ++++ src/Advection/weno_default_new.jl | 723 ++++++++++++++++++++++++++++ src/Advection/weno_interpolants.jl | 106 ++--- src/Advection/weno_phi_new.jl | 596 +++++++++++++++++++++++ src/Advection/weno_vi.jl | 276 ++++++++++- src/Advection/weno_vi_new.jl | 731 +++++++++++++++++++++++++++++ 7 files changed, 2434 insertions(+), 94 deletions(-) create mode 100644 src/Advection/weno_default_new.jl create mode 100644 src/Advection/weno_phi_new.jl create mode 100644 src/Advection/weno_vi_new.jl diff --git a/src/Advection/Advection.jl b/src/Advection/Advection.jl index 5c37288732..ab0618e890 100644 --- a/src/Advection/Advection.jl +++ b/src/Advection/Advection.jl @@ -67,14 +67,14 @@ include("centered_reconstruction.jl") include("upwind_biased_reconstruction.jl") include("weno_reconstruction.jl") include("weno_interpolants.jl") -include("weno_2.jl") -include("weno_3.jl") -include("weno_4.jl") -include("weno_5.jl") -include("weno_6.jl") -# include("weno_default.jl") -# include("weno_vi.jl") -# include("weno_phi.jl") +# include("weno_2.jl") +# include("weno_3.jl") +# include("weno_4.jl") +# include("weno_5.jl") +# include("weno_6.jl") +include("weno_default_new.jl") +include("weno_vi_new.jl") +include("weno_phi_new.jl") include("stretched_weno_smoothness.jl") include("multi_dimensional_reconstruction.jl") include("vector_invariant_upwinding.jl") diff --git a/src/Advection/weno_default.jl b/src/Advection/weno_default.jl index b5d20558a7..50753e732b 100644 --- a/src/Advection/weno_default.jl +++ b/src/Advection/weno_default.jl @@ -30,6 +30,7 @@ end for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) + biased_interpolate_new = Symbol(:new_inner_, side, :_biased_interpolate_, dir) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) biased_β = Symbol(side, :_biased_β) biased_p = Symbol(side, :_biased_p) @@ -163,6 +164,85 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end + @inline function $biased_interpolate_new(i, j, k, grid, + scheme::WENO{5, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = @inbounds ψ[i - 1, j, k] + ψ₁ = @inbounds ψ[i, j, k] + ψ₂ = @inbounds ψ[i + 1, j, k] + ψ₃ = @inbounds ψ[i + 2, j, k] + ψ₄ = @inbounds ψ[i + 3, j, k] + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = @inbounds ψ[i - 2, j, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i - 3, j, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i - 4, j, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i - 5, j, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ * τ + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + end + @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{5, FT, XT, YT, ZT}, ψ, idx, loc, args...) where {FT, XT, YT, ZT} diff --git a/src/Advection/weno_default_new.jl b/src/Advection/weno_default_new.jl new file mode 100644 index 0000000000..3da2cbd342 --- /dev/null +++ b/src/Advection/weno_default_new.jl @@ -0,0 +1,723 @@ + +## STENCILS IN X + +for (side, add) in zip([:left, :right], (-1, 0)) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_xᶠᵃᵃ) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + weno_interpolant = Symbol(side, :_weno_interpolant_xᶠᵃᵃ) + val = 1 + + @eval begin + # Fallback for DefaultStencil formulations and disambiguation + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{2}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{3}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{4}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{5}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{6}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{2, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = @inbounds ψ[i - $add, j, k] + ψ₁ = @inbounds ψ[i + 1 - $add, j, k] + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = @inbounds ψ[i - 1 - $add, j, k] + ψ₁ = ψ₀ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(2), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ * τ + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{3, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = @inbounds ψ[i - $add, j, k] + ψ₁ = @inbounds ψ[i + 1 - $add, j, k] + ψ₂ = @inbounds ψ[i + 2 - $add, j, k] + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = @inbounds ψ[i - 1 - $add, j, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i - 2 - $add, j, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ * τ + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = @inbounds ψ[i - $add, j, k] + ψ₁ = @inbounds ψ[i + 1 - $add, j, k] + ψ₂ = @inbounds ψ[i + 2 - $add, j, k] + ψ₃ = @inbounds ψ[i + 3 - $add, j, k] + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = @inbounds ψ[i - 1 - $add, j, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i - 2 - $add, j, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i - 3 - $add, j, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ * τ + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{5, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = @inbounds ψ[i - $add, j, k] + ψ₁ = @inbounds ψ[i + 1 - $add, j, k] + ψ₂ = @inbounds ψ[i + 2 - $add, j, k] + ψ₃ = @inbounds ψ[i + 3 - $add, j, k] + ψ₄ = @inbounds ψ[i + 4 - $add, j, k] + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = @inbounds ψ[i - 1 - $add, j, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i - 2 - $add, j, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i - 3 - $add, j, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i - 4 - $add, j, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ * τ + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + end + end +end + +## STENCILS IN Y + +for (side, add) in zip([:left, :right], (-1, 0)) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_yᵃᶠᵃ) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + weno_interpolant = Symbol(side, :_weno_interpolant_yᵃᶠᵃ) + val = 2 + + @eval begin + # Fallback for DefaultStencil formulations and disambiguation + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{2}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{3}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{4}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{5}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{6}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{2, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = @inbounds ψ[i, j - $add, k] + ψ₁ = @inbounds ψ[i, j + 1 - $add, k] + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = @inbounds ψ[i, j - 1 - $add, k] + ψ₁ = ψ₀ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(2), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ * τ + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{3, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = @inbounds ψ[i, j - $add, k] + ψ₁ = @inbounds ψ[i, j + 1 - $add, k] + ψ₂ = @inbounds ψ[i, j + 2 - $add, k] + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = @inbounds ψ[i, j - 1 - $add, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i, j - 2 - $add, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ * τ + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = @inbounds ψ[i, j - $add, k] + ψ₁ = @inbounds ψ[i, j + 1 - $add, k] + ψ₂ = @inbounds ψ[i, j + 2 - $add, k] + ψ₃ = @inbounds ψ[i, j + 3 - $add, k] + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = @inbounds ψ[i, j - 1 - $add, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i, j - 2 - $add, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i, j - 3 - $add, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ * τ + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{5, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = @inbounds ψ[i, j - $add, k] + ψ₁ = @inbounds ψ[i, j + 1 - $add, k] + ψ₂ = @inbounds ψ[i, j + 2 - $add, k] + ψ₃ = @inbounds ψ[i, j + 3 - $add, k] + ψ₄ = @inbounds ψ[i, j + 4 - $add, k] + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = @inbounds ψ[i, j - 1 - $add, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i, j - 2 - $add, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i, j - 3 - $add, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i, j - 4 - $add, k] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ * τ + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + end + end +end + +## STENCILS IN Z + +for (side, add) in zip([:left, :right], (-1, 0)) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_zᵃᵃᶠ) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + weno_interpolant = Symbol(side, :_weno_interpolant_zᵃᵃᶠ) + val = 3 + + @eval begin + # Fallback for DefaultStencil formulations and disambiguation + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{2}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{3}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{4}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{5}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{6}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{2, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = @inbounds ψ[i, j, k - $add] + ψ₁ = @inbounds ψ[i, j, k + 1 - $add] + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = @inbounds ψ[i, j, k - 1 - $add] + ψ₁ = ψ₀ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(2), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ * τ + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{3, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = @inbounds ψ[i, j, k - $add] + ψ₁ = @inbounds ψ[i, j, k + 1 - $add] + ψ₂ = @inbounds ψ[i, j, k + 2 - $add] + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = @inbounds ψ[i, j, k - 1 - $add] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i, j, k - 2 - $add] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ * τ + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = @inbounds ψ[i, j, k - $add] + ψ₁ = @inbounds ψ[i, j, k + 1 - $add] + ψ₂ = @inbounds ψ[i, j, k + 2 - $add] + ψ₃ = @inbounds ψ[i, j, k + 3 - $add] + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = @inbounds ψ[i, j, k - 1 - $add] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i, j, k - 2 - $add] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i, j, k - 3 - $add] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ * τ + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{5, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = @inbounds ψ[i, j, k - $add] + ψ₁ = @inbounds ψ[i, j, k + 1 - $add] + ψ₂ = @inbounds ψ[i, j, k + 2 - $add] + ψ₃ = @inbounds ψ[i, j, k + 3 - $add] + ψ₄ = @inbounds ψ[i, j, k + 4 - $add] + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = @inbounds ψ[i, j, k - 1 - $add] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i, j, k - 2 - $add] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i, j, k - 3 - $add] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = @inbounds ψ[i, j, k - 4 - $add] + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ * τ + + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + end + end +end diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 378a856a6b..27c2f28c5a 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -296,77 +296,25 @@ end @inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, grid, v) = @inbounds right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) @inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, grid, v) = @inbounds right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-2, j, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-3, j, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-4, j, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-5, j, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-6, j, k, grid, args...), ψs[1:N-1]...) - -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-2, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-3, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-4, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-5, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-6, k, grid, args...), ψs[1:N-1]...) - -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-2, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-3, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-4, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-5, grid, args...), ψs[1:N-1]...) -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-6, grid, args...), ψs[1:N-1]...) - -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ, args...) where N = @inbounds (ψ[i-2, j, k], ψs[1:N-1]...) -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ, args...) where N = @inbounds (ψ[i-3, j, k], ψs[1:N-1]...) -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ, args...) where N = @inbounds (ψ[i-4, j, k], ψs[1:N-1]...) -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ, args...) where N = @inbounds (ψ[i-5, j, k], ψs[1:N-1]...) -@inline new_stencil_left_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ, args...) where N = @inbounds (ψ[i-6, j, k], ψs[1:N-1]...) - -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-2, k], ψs[1:N-1]...) -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-3, k], ψs[1:N-1]...) -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-4, k], ψs[1:N-1]...) -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-5, k], ψs[1:N-1]...) -@inline new_stencil_left_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-6, k], ψs[1:N-1]...) - -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-2], ψs[1:N-1]...) -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-3], ψs[1:N-1]...) -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-4], ψs[1:N-1]...) -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-5], ψs[1:N-1]...) -@inline new_stencil_left_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-6], ψs[1:N-1]...) - -@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-1, j, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-2, j, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-3, j, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-4, j, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i-5, j, k, grid, args...), ψs[1:N-1]...) - -@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-1, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-2, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-3, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-4, k, grid, args...), ψs[1:N-1]...) -@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j-5, k, grid, args...), ψs[1:N-1]...) - -@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-1, grid, args...), ψs[1:N-1]...) -@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-2, grid, args...), ψs[1:N-1]...) -@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-3, grid, args...), ψs[1:N-1]...) -@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-4, grid, args...), ψs[1:N-1]...) -@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ::Function, grid, args...) where N = @inbounds (ψ(i, j, k-5, grid, args...), ψs[1:N-1]...) - -@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ, args...) where N = @inbounds (ψ[i-1, j, k], ψs[1:N-1]...) -@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ, args...) where N = @inbounds (ψ[i-2, j, k], ψs[1:N-1]...) -@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ, args...) where N = @inbounds (ψ[i-3, j, k], ψs[1:N-1]...) -@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ, args...) where N = @inbounds (ψ[i-4, j, k], ψs[1:N-1]...) -@inline new_stencil_right_xᶠᵃᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ, args...) where N = @inbounds (ψ[i-5, j, k], ψs[1:N-1]...) - -@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-1, k], ψs[1:N-1]...) -@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-2, k], ψs[1:N-1]...) -@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-3, k], ψs[1:N-1]...) -@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-4, k], ψs[1:N-1]...) -@inline new_stencil_right_yᵃᶠᵃ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ, args...) where N = @inbounds (ψ[i, j-5, k], ψs[1:N-1]...) - -@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{2}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-1], ψs[1:N-1]...) -@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{3}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-2], ψs[1:N-1]...) -@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{4}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-3], ψs[1:N-1]...) -@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{5}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-4], ψs[1:N-1]...) -@inline new_stencil_right_zᵃᵃᶠ(i, j, k, ::WENO{N}, ::Val{6}, ψs, ψ, args...) where N = @inbounds (ψ[i, j, k-5], ψs[1:N-1]...) +# Reciprocal! +let (jlf, f) = (:div_arcp, :div) + for (T, llvmT) in ((:Float32, "float"), (:Float64, "double")) + ir = """ + %x = f$f fast $llvmT %0, %1 + ret $llvmT %x + """ + @eval begin + # the @pure is necessary so that we can constant propagate. + @inline Base.@pure function $jlf(a::$T, b::$T) + Base.llvmcall($ir, $T, Tuple{$T, $T}, a, b) + end + end + end + @eval function $jlf(args...) + Base.$jlf(args...) + end +end +rcp(x) = div_arcp(one(x), x) # still leads to rcp.rn which is also a function call for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) weno_interpolant = Symbol(side, :_weno_interpolant_, dir) @@ -389,7 +337,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = C / (β + FT(ε))^2 + α = @fastmath C * rcp(β + FT(ε))^2 # Reconstruction of `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) @@ -408,7 +356,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = C / (β + FT(ε))^2 + α = @fastmath C * rcp(β + FT(ε))^2 # Reconstruction of `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) @@ -433,11 +381,11 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z βv = $biased_β(ψs, scheme, Val(s-1)) # total smoothness - βᵁ = (βu + βv) / 2 + βᵁ = @fastmath (βu + βv) / 2 # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = C / (βᵁ + FT(ε))^2 + α = @fastmath C * rcp(βᵁ + FT(ε))^2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) @@ -457,7 +405,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = C / (βᵠ + FT(ε))^2 + α = @fastmath C * rcp(βᵠ + FT(ε))^2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) @@ -478,7 +426,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (β + FT(ε))^2 + α = @fastmath C * rcp(β + FT(ε))^2 # Reconstruction of `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) @@ -500,7 +448,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (βᵁ + FT(ε))^2 + α = @fastmath C * rcp(βᵁ + FT(ε))^2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) @@ -516,7 +464,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C / (βᵠ + FT(ε))^2 + α = @fastmath C * rcp(βᵠ + FT(ε))^2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) diff --git a/src/Advection/weno_phi_new.jl b/src/Advection/weno_phi_new.jl new file mode 100644 index 0000000000..d1eeb59761 --- /dev/null +++ b/src/Advection/weno_phi_new.jl @@ -0,0 +1,596 @@ + +## STENCILS IN X + +for (side, add) in zip([:left, :right], (-1, 0)) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_xᶠᵃᵃ) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + weno_interpolant = Symbol(side, :_weno_interpolant_xᶠᵃᵃ) + val = 1 + + @eval begin + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{2, FT, XT, YT, ZT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i - $add, j, k, grid, args...) + ψ₁ = ψ(i + 1 - $add, j, k, grid, args...) + + ϕ₀ = VI.func(i - $add, j, k, grid, args...) + ϕ₁ = VI.func(i + 1 - $add, j, k, grid, args...) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i - 1 - $add, j, k, grid, args...) + ψ₁ = ψ₀ + + ϕ₀ = VI.func(i - 1 - $add, j, k, grid, args...) + ϕ₁ = ϕ₀ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{3, FT, XT, YT, ZT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i - $add, j, k, grid, args...) + ψ₁ = ψ(i + 1 - $add, j, k, grid, args...) + ψ₂ = ψ(i + 2 - $add, j, k, grid, args...) + + ϕ₀ = VI.func(i - $add, j, k, grid, args...) + ϕ₁ = VI.func(i + 1 - $add, j, k, grid, args...) + ϕ₂ = VI.func(i + 2 - $add, j, k, grid, args...) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i - 1 - $add, j, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + + ϕ₀ = VI.func(i - 1 - $add, j, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i - 2 - $add, j, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + + ϕ₀ = VI.func(i - 2 - $add, j, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4, FT, XT, YT, ZT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i - $add, j, k, grid, args...) + ψ₁ = ψ(i + 1 - $add, j, k, grid, args...) + ψ₂ = ψ(i + 2 - $add, j, k, grid, args...) + ψ₃ = ψ(i + 3 - $add, j, k, grid, args...) + + ϕ₀ = VI.func(i - $add, j, k, grid, args...) + ϕ₁ = VI.func(i + 1 - $add, j, k, grid, args...) + ϕ₂ = VI.func(i + 2 - $add, j, k, grid, args...) + ϕ₃ = VI.func(i + 3 - $add, j, k, grid, args...) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i - 1 - $add, j, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + ϕ₀ = VI.func(i - 1 - $add, j, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + ϕ₃ = ϕ₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i - 2 - $add, j, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + ϕ₀ = VI.func(i - 2 - $add, j, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + ϕ₃ = ϕ₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i - 3 - $add, j, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + ϕ₀ = VI.func(i - 3 - $add, j, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + ϕ₃ = ϕ₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{5, FT, XT, YT, ZT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i - $add, j, k, grid, args...) + ψ₁ = ψ(i + 1 - $add, j, k, grid, args...) + ψ₂ = ψ(i + 2 - $add, j, k, grid, args...) + ψ₃ = ψ(i + 3 - $add, j, k, grid, args...) + ψ₄ = ψ(i + 4 - $add, j, k, grid, args...) + + ϕ₀ = VI.func(i - $add, j, k, grid, args...) + ϕ₁ = VI.func(i + 1 - $add, j, k, grid, args...) + ϕ₂ = VI.func(i + 2 - $add, j, k, grid, args...) + ϕ₃ = VI.func(i + 3 - $add, j, k, grid, args...) + ϕ₄ = VI.func(i + 4 - $add, j, k, grid, args...) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i - 1 - $add, j, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + ϕ₀ = VI.func(i - 1 - $add, j, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + ϕ₃ = ϕ₂ + ϕ₄ = ϕ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i - 2 - $add, j, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + ϕ₀ = VI.func(i - 2 - $add, j, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + ϕ₃ = ϕ₂ + ϕ₄ = ϕ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i - 3 - $add, j, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + ϕ₀ = VI.func(i - 3 - $add, j, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + ϕ₃ = ϕ₂ + ϕ₄ = ϕ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i - 4 - $add, j, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + ϕ₀ = VI.func(i - 4 - $add, j, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + ϕ₃ = ϕ₂ + ϕ₄ = ϕ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 5, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + end +end + +## STENCILS IN Y + +for (side, add) in zip([:left, :right], (-1, 0)) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_yᵃᶠᵃ) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + weno_interpolant = Symbol(side, :_weno_interpolant_yᵃᶠᵃ) + val = 2 + + @eval begin + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{2, FT, XT, YT, ZT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i, j - $add, k, grid, args...) + ψ₁ = ψ(i, j + 1 - $add, k, grid, args...) + + ϕ₀ = VI.func(i, j - $add, k, grid, args...) + ϕ₁ = VI.func(i, j + 1 - $add, k, grid, args...) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i, j - 1 - $add, k, grid, args...) + ψ₁ = ψ₀ + + ϕ₀ = VI.func(i, j - 1 - $add, k, grid, args...) + ϕ₁ = ϕ₀ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{3, FT, XT, YT, ZT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i, j - $add, k, grid, args...) + ψ₁ = ψ(i, j + 1 - $add, k, grid, args...) + ψ₂ = ψ(i, j + 2 - $add, k, grid, args...) + + ϕ₀ = VI.func(i, j - $add, k, grid, args...) + ϕ₁ = VI.func(i, j + 1 - $add, k, grid, args...) + ϕ₂ = VI.func(i, j + 2 - $add, k, grid, args...) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i, j - 1 - $add, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + + ϕ₀ = VI.func(i, j - 1 - $add, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i, j - 2 - $add, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + + ϕ₀ = VI.func(i, j - 2 - $add, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4, FT, XT, YT, ZT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i, j - $add, k, grid, args...) + ψ₁ = ψ(i, j + 1 - $add, k, grid, args...) + ψ₂ = ψ(i, j + 2 - $add, k, grid, args...) + ψ₃ = ψ(i, j + 3 - $add, k, grid, args...) + + ϕ₀ = VI.func(i, j - $add, k, grid, args...) + ϕ₁ = VI.func(i, j + 1 - $add, k, grid, args...) + ϕ₂ = VI.func(i, j + 2 - $add, k, grid, args...) + ϕ₃ = VI.func(i, j + 3 - $add, k, grid, args...) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i, j - 1 - $add, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + ϕ₀ = VI.func(i, j - 1 - $add, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + ϕ₃ = ϕ₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i, j - 2 - $add, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + ϕ₀ = VI.func(i, j - 2 - $add, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + ϕ₃ = ϕ₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i, j - 3 - $add, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + ϕ₀ = VI.func(i, j - 3 - $add, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + ϕ₃ = ϕ₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{5, FT, XT, YT, ZT}, + ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i, j - $add, k, grid, args...) + ψ₁ = ψ(i, j + 1 - $add, k, grid, args...) + ψ₂ = ψ(i, j + 2 - $add, k, grid, args...) + ψ₃ = ψ(i, j + 3 - $add, k, grid, args...) + ψ₄ = ψ(i, j + 4 - $add, k, grid, args...) + + ϕ₀ = VI.func(i, j - $add, k, grid, args...) + ϕ₁ = VI.func(i, j + 1 - $add, k, grid, args...) + ϕ₂ = VI.func(i, j + 2 - $add, k, grid, args...) + ϕ₃ = VI.func(i, j + 3 - $add, k, grid, args...) + ϕ₄ = VI.func(i, j + 4 - $add, k, grid, args...) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i, j - 1 - $add, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + ϕ₀ = VI.func(i, j - 1 - $add, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + ϕ₃ = ϕ₂ + ϕ₄ = ϕ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i, j - 2 - $add, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + ϕ₀ = VI.func(i, j - 2 - $add, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + ϕ₃ = ϕ₂ + ϕ₄ = ϕ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i, j - 3 - $add, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + ϕ₀ = VI.func(i, j - 3 - $add, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + ϕ₃ = ϕ₂ + ϕ₄ = ϕ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i, j - 4 - $add, k, grid, args...) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + ϕ₀ = VI.func(i, j - 4 - $add, k, grid, args...) + ϕ₁ = ϕ₀ + ϕ₂ = ϕ₁ + ϕ₃ = ϕ₂ + ϕ₄ = ϕ₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 5, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + end +end \ No newline at end of file diff --git a/src/Advection/weno_vi.jl b/src/Advection/weno_vi.jl index 6b01707b0d..6d7a21315d 100644 --- a/src/Advection/weno_vi.jl +++ b/src/Advection/weno_vi.jl @@ -67,8 +67,28 @@ end return :($(stencil_full...),) end +let (jlf, f) = (:div_arcp, :div) + for (T, llvmT) in ((:Float32, "float"), (:Float64, "double")) + ir = """ + %x = f$f fast $llvmT %0, %1 + ret $llvmT %x + """ + @eval begin + # the @pure is necessary so that we can constant propagate. + @inline Base.@pure function $jlf(a::$T, b::$T) + Base.llvmcall($ir, $T, Tuple{$T, $T}, a, b) + end + end + end + @eval function $jlf(args...) + Base.$jlf(args...) + end +end +rcp(x) = div_arcp(one(x), x) # still leads to rcp.rn which is also a function call + for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) + biased_interpolate_new = Symbol(:new_inner_, side, :_biased_interpolate_, dir) biased_β = Symbol(side, :_biased_β) biased_p = Symbol(side, :_biased_p) coeff = Symbol(:coeff_, side) @@ -142,7 +162,109 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z τ = abs(τ) - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + + @inline function $biased_interpolate_new(i, j, k, grid, + scheme::WENO{4, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i - 1, j, k, grid, u, v) + ψ₁ = ψ(i, j, k, grid, u, v) + ψ₂ = ψ(i + 1, j, k, grid, u, v) + ψ₃ = ψ(i + 2, j, k, grid, u, v) + + u₀ = ℑyᵃᶠᵃ(i - 1, j, k, grid, u) + u₁ = ℑyᵃᶠᵃ(i, j, k, grid, u) + u₂ = ℑyᵃᶠᵃ(i + 1, j, k, grid, u) + u₃ = ℑyᵃᶠᵃ(i + 2, j, k, grid, u) + + v₀ = ℑxᶠᵃᵃ(i - 1, j, k, grid, v) + v₁ = ℑxᶠᵃᵃ(i, j, k, grid, v) + v₂ = ℑxᶠᵃᵃ(i + 1, j, k, grid, v) + v₃ = ℑxᶠᵃᵃ(i + 2, j, k, grid, v) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i - 2, j, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + u₀ = ℑyᵃᶠᵃ(i - 2, j, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + + v₀ = ℑxᶠᵃᵃ(i - 2, j, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i - 3, j, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + u₀ = ℑyᵃᶠᵃ(i - 3, j, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + + v₀ = ℑxᶠᵃᵃ(i - 3, j, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + + ψ₀ = ψ(i - 4, j, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + u₀ = ℑyᵃᶠᵃ(i - 4, j, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + + v₀ = ℑxᶠᵃᵃ(i - 4, j, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -187,12 +309,152 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z τ = abs(τ) - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + + @inline function $biased_interpolate_new(i, j, k, grid, + scheme::WENO{5, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i - 1, j, k, grid, u, v) + ψ₁ = ψ(i, j, k, grid, u, v) + ψ₂ = ψ(i + 1, j, k, grid, u, v) + ψ₃ = ψ(i + 2, j, k, grid, u, v) + ψ₄ = ψ(i + 3, j, k, grid, u, v) + + u₀ = ℑyᵃᶠᵃ(i - 1, j, k, grid, u) + u₁ = ℑyᵃᶠᵃ(i, j, k, grid, u) + u₂ = ℑyᵃᶠᵃ(i + 1, j, k, grid, u) + u₃ = ℑyᵃᶠᵃ(i + 2, j, k, grid, u) + u₄ = ℑyᵃᶠᵃ(i + 3, j, k, grid, u) + + v₀ = ℑxᶠᵃᵃ(i - 1, j, k, grid, v) + v₁ = ℑxᶠᵃᵃ(i, j, k, grid, v) + v₂ = ℑxᶠᵃᵃ(i + 1, j, k, grid, v) + v₃ = ℑxᶠᵃᵃ(i + 2, j, k, grid, v) + v₄ = ℑxᶠᵃᵃ(i + 3, j, k, grid, v) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i - 2, j, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + u₀ = ℑyᵃᶠᵃ(i - 2, j, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + u₄ = u₄ + + v₀ = ℑxᶠᵃᵃ(i - 2, j, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + v₄ = v₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i - 3, j, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + u₀ = ℑyᵃᶠᵃ(i - 3, j, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + u₄ = u₄ + + v₀ = ℑxᶠᵃᵃ(i - 3, j, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + v₄ = v₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + + ψ₀ = ψ(i - 4, j, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + u₀ = ℑyᵃᶠᵃ(i - 4, j, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + u₄ = u₄ + + v₀ = ℑxᶠᵃᵃ(i - 4, j, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + v₄ = v₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i - 5, j, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + u₀ = ℑyᵃᶠᵃ(i - 5, j, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + u₄ = u₄ + + v₀ = ℑxᶠᵃᵃ(i - 5, j, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + v₄ = v₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 5, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ * τ + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} + scheme::WENO{5, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} # All stencils us = $(u_reconstruction_stencil(5, side, dir)) @@ -240,7 +502,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z τ = abs(τ) - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -301,7 +563,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z τ = abs(τ) - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) end end end \ No newline at end of file diff --git a/src/Advection/weno_vi_new.jl b/src/Advection/weno_vi_new.jl new file mode 100644 index 0000000000..b469e790eb --- /dev/null +++ b/src/Advection/weno_vi_new.jl @@ -0,0 +1,731 @@ + +## STENCILS IN X + +for (side, add) in zip([:left, :right], (-1, 0)) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_xᶠᵃᵃ) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + weno_interpolant = Symbol(side, :_weno_interpolant_xᶠᵃᵃ) + val = 1 + + @eval begin + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{2, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i - $add, j, k, grid, u, v) + ψ₁ = ψ(i + 1 - $add, j, k, grid, u, v) + + u₀ = ℑyᵃᶠᵃ(i - $add, j, k, grid, u) + u₁ = ℑyᵃᶠᵃ(i + 1 - $add, j, k, grid, u) + + v₀ = ℑxᶠᵃᵃ(i - $add, j, k, grid, v) + v₁ = ℑxᶠᵃᵃ(i + 1 - $add, j, k, grid, v) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (u₀, u₁), (v₀, v₁), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i - 1 - $add, j, k, grid, u, v) + ψ₁ = ψ₀ + + u₀ = ℑyᵃᶠᵃ(i - 1 - $add, j, k, grid, u) + u₁ = u₀ + + v₀ = ℑxᶠᵃᵃ(i - 1 - $add, j, k, grid, v) + v₁ = v₀ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁), (v₀, v₁), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{3, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i - $add, j, k, grid, u, v) + ψ₁ = ψ(i + 1 - $add, j, k, grid, u, v) + ψ₂ = ψ(i + 2 - $add, j, k, grid, u, v) + + u₀ = ℑyᵃᶠᵃ(i - $add, j, k, grid, u) + u₁ = ℑyᵃᶠᵃ(i + 1 - $add, j, k, grid, u) + u₂ = ℑyᵃᶠᵃ(i + 2 - $add, j, k, grid, u) + + v₀ = ℑxᶠᵃᵃ(i - $add, j, k, grid, v) + v₁ = ℑxᶠᵃᵃ(i + 1 - $add, j, k, grid, v) + v₂ = ℑxᶠᵃᵃ(i + 2 - $add, j, k, grid, v) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i - 1 - $add, j, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + + u₀ = ℑyᵃᶠᵃ(i - 1 - $add, j, k, grid, u) + u₁ = u₀ + u₂ = u₁ + + v₀ = ℑxᶠᵃᵃ(i - 1 - $add, j, k, grid, v) + v₁ = v₀ + v₂ = v₁ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i - 2 - $add, j, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + + u₀ = ℑyᵃᶠᵃ(i - 2 - $add, j, k, grid, u) + u₁ = u₀ + u₂ = u₁ + + v₀ = ℑxᶠᵃᵃ(i - 2 - $add, j, k, grid, v) + v₁ = v₀ + v₂ = v₁ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i - $add, j, k, grid, u, v) + ψ₁ = ψ(i + 1 - $add, j, k, grid, u, v) + ψ₂ = ψ(i + 2 - $add, j, k, grid, u, v) + ψ₃ = ψ(i + 3 - $add, j, k, grid, u, v) + + u₀ = ℑyᵃᶠᵃ(i - $add, j, k, grid, u) + u₁ = ℑyᵃᶠᵃ(i + 1 - $add, j, k, grid, u) + u₂ = ℑyᵃᶠᵃ(i + 2 - $add, j, k, grid, u) + u₃ = ℑyᵃᶠᵃ(i + 3 - $add, j, k, grid, u) + + v₀ = ℑxᶠᵃᵃ(i - $add, j, k, grid, v) + v₁ = ℑxᶠᵃᵃ(i + 1 - $add, j, k, grid, v) + v₂ = ℑxᶠᵃᵃ(i + 2 - $add, j, k, grid, v) + v₃ = ℑxᶠᵃᵃ(i + 3 - $add, j, k, grid, v) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i - 1 - $add, j, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + u₀ = ℑyᵃᶠᵃ(i - 1 - $add, j, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + + v₀ = ℑxᶠᵃᵃ(i - 1 - $add, j, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i - 2 - $add, j, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + u₀ = ℑyᵃᶠᵃ(i - 2 - $add, j, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + + v₀ = ℑxᶠᵃᵃ(i - 2 - $add, j, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i - 3 - $add, j, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + u₀ = ℑyᵃᶠᵃ(i - 3 - $add, j, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + + v₀ = ℑxᶠᵃᵃ(i - 3 - $add, j, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{5, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i - $add, j, k, grid, u, v) + ψ₁ = ψ(i + 1 - $add, j, k, grid, u, v) + ψ₂ = ψ(i + 2 - $add, j, k, grid, u, v) + ψ₃ = ψ(i + 3 - $add, j, k, grid, u, v) + ψ₄ = ψ(i + 4 - $add, j, k, grid, u, v) + + u₀ = ℑyᵃᶠᵃ(i - $add, j, k, grid, u) + u₁ = ℑyᵃᶠᵃ(i + 1 - $add, j, k, grid, u) + u₂ = ℑyᵃᶠᵃ(i + 2 - $add, j, k, grid, u) + u₃ = ℑyᵃᶠᵃ(i + 3 - $add, j, k, grid, u) + u₄ = ℑyᵃᶠᵃ(i + 4 - $add, j, k, grid, u) + + v₀ = ℑxᶠᵃᵃ(i - $add, j, k, grid, v) + v₁ = ℑxᶠᵃᵃ(i + 1 - $add, j, k, grid, v) + v₂ = ℑxᶠᵃᵃ(i + 2 - $add, j, k, grid, v) + v₃ = ℑxᶠᵃᵃ(i + 3 - $add, j, k, grid, v) + v₄ = ℑxᶠᵃᵃ(i + 4 - $add, j, k, grid, v) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i - 1 - $add, j, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + u₀ = ℑyᵃᶠᵃ(i - 1 - $add, j, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + u₄ = u₃ + + v₀ = ℑxᶠᵃᵃ(i - 1 - $add, j, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + v₄ = v₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i - 2 - $add, j, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + u₀ = ℑyᵃᶠᵃ(i - 2 - $add, j, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + u₄ = u₃ + + v₀ = ℑxᶠᵃᵃ(i - 2 - $add, j, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + v₄ = v₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i - 3 - $add, j, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + u₀ = ℑyᵃᶠᵃ(i - 3 - $add, j, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + u₄ = u₃ + + v₀ = ℑxᶠᵃᵃ(i - 3 - $add, j, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + v₄ = v₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i - 4 - $add, j, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + u₀ = ℑyᵃᶠᵃ(i - 4 - $add, j, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + u₄ = u₃ + + v₀ = ℑxᶠᵃᵃ(i - 4 - $add, j, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + v₄ = v₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 5, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + end +end + +## STENCILS IN Y + +for (side, add) in zip([:left, :right], (-1, 0)) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_yᵃᶠᵃ) + biased_β = Symbol(side, :_biased_β) + biased_p = Symbol(side, :_biased_p) + coeff = Symbol(:coeff_, side) + weno_interpolant = Symbol(side, :_weno_interpolant_yᵃᶠᵃ) + val = 2 + + @eval begin + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{2, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i, j - $add, k, grid, u, v) + ψ₁ = ψ(i, j + 1 - $add, k, grid, u, v) + + u₀ = ℑyᵃᶠᵃ(i, j - $add, k, grid, u) + u₁ = ℑyᵃᶠᵃ(i, j + 1 - $add, k, grid, u) + + v₀ = ℑxᶠᵃᵃ(i, j - $add, k, grid, v) + v₁ = ℑxᶠᵃᵃ(i, j + 1 - $add, k, grid, v) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (u₀, u₁), (v₀, v₁), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) + ψ₁ = ψ₀ + + u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) + u₁ = u₀ + + v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) + v₁ = v₀ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁), (v₀, v₁), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{3, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i, j - $add, k, grid, u, v) + ψ₁ = ψ(i, j + 1 - $add, k, grid, u, v) + ψ₂ = ψ(i, j + 2 - $add, k, grid, u, v) + + u₀ = ℑyᵃᶠᵃ(i, j - $add, k, grid, u) + u₁ = ℑyᵃᶠᵃ(i, j + 1 - $add, k, grid, u) + u₂ = ℑyᵃᶠᵃ(i, j + 2 - $add, k, grid, u) + + v₀ = ℑxᶠᵃᵃ(i, j - $add, k, grid, v) + v₁ = ℑxᶠᵃᵃ(i, j + 1 - $add, k, grid, v) + v₂ = ℑxᶠᵃᵃ(i, j + 2 - $add, k, grid, v) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + + u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) + u₁ = u₀ + u₂ = u₁ + + v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) + v₁ = v₀ + v₂ = v₁ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i, j - 2 - $add, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + + u₀ = ℑyᵃᶠᵃ(i, j - 2 - $add, k, grid, u) + u₁ = u₀ + u₂ = u₁ + + v₀ = ℑxᶠᵃᵃ(i, j - 2 - $add, k, grid, v) + v₁ = v₀ + v₂ = v₁ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i, j - $add, k, grid, u, v) + ψ₁ = ψ(i, j + 1 - $add, k, grid, u, v) + ψ₂ = ψ(i, j + 2 - $add, k, grid, u, v) + ψ₃ = ψ(i, j + 3 - $add, k, grid, u, v) + + u₀ = ℑyᵃᶠᵃ(i, j - $add, k, grid, u) + u₁ = ℑyᵃᶠᵃ(i, j + 1 - $add, k, grid, u) + u₂ = ℑyᵃᶠᵃ(i, j + 2 - $add, k, grid, u) + u₃ = ℑyᵃᶠᵃ(i, j + 3 - $add, k, grid, u) + + v₀ = ℑxᶠᵃᵃ(i, j - $add, k, grid, v) + v₁ = ℑxᶠᵃᵃ(i, j + 1 - $add, k, grid, v) + v₂ = ℑxᶠᵃᵃ(i, j + 2 - $add, k, grid, v) + v₃ = ℑxᶠᵃᵃ(i, j + 3 - $add, k, grid, v) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + + v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(4), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i, j - 2 - $add, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + u₀ = ℑyᵃᶠᵃ(i, j - 2 - $add, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + + v₀ = ℑxᶠᵃᵃ(i, j - 2 - $add, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i, j - 3 - $add, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + + u₀ = ℑyᵃᶠᵃ(i, j - 3 - $add, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + + v₀ = ℑxᶠᵃᵃ(i, j - 3 - $add, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{5, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i, j - $add, k, grid, u, v) + ψ₁ = ψ(i, j + 1 - $add, k, grid, u, v) + ψ₂ = ψ(i, j + 2 - $add, k, grid, u, v) + ψ₃ = ψ(i, j + 3 - $add, k, grid, u, v) + ψ₄ = ψ(i, j + 4 - $add, k, grid, u, v) + + u₀ = ℑyᵃᶠᵃ(i, j - $add, k, grid, u) + u₁ = ℑyᵃᶠᵃ(i, j + 1 - $add, k, grid, u) + u₂ = ℑyᵃᶠᵃ(i, j + 2 - $add, k, grid, u) + u₃ = ℑyᵃᶠᵃ(i, j + 3 - $add, k, grid, u) + u₄ = ℑyᵃᶠᵃ(i, j + 4 - $add, k, grid, u) + + v₀ = ℑxᶠᵃᵃ(i, j - $add, k, grid, v) + v₁ = ℑxᶠᵃᵃ(i, j + 1 - $add, k, grid, v) + v₂ = ℑxᶠᵃᵃ(i, j + 2 - $add, k, grid, v) + v₃ = ℑxᶠᵃᵃ(i, j + 3 - $add, k, grid, v) + v₄ = ℑxᶠᵃᵃ(i, j + 4 - $add, k, grid, v) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + u₄ = u₃ + + v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + v₄ = v₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i, j - 2 - $add, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + u₀ = ℑyᵃᶠᵃ(i, j - 2 - $add, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + u₄ = u₃ + + v₀ = ℑxᶠᵃᵃ(i, j - 2 - $add, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + v₄ = v₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i, j - 3 - $add, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + u₀ = ℑyᵃᶠᵃ(i, j - 3 - $add, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + u₄ = u₃ + + v₀ = ℑxᶠᵃᵃ(i, j - 3 - $add, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + v₄ = v₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i, j - 4 - $add, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + + u₀ = ℑyᵃᶠᵃ(i, j - 4 - $add, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + u₄ = u₃ + + v₀ = ℑxᶠᵃᵃ(i, j - 4 - $add, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + v₄ = v₃ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 5, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end + end +end \ No newline at end of file From cb84026bc501d769a31c4507cf644bc5701bb0cc Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 19 Mar 2024 00:25:34 -0400 Subject: [PATCH 127/152] bugfix --- src/Advection/weno_vi_new.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Advection/weno_vi_new.jl b/src/Advection/weno_vi_new.jl index b469e790eb..197dc1214d 100644 --- a/src/Advection/weno_vi_new.jl +++ b/src/Advection/weno_vi_new.jl @@ -41,7 +41,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) v₁ = v₀ # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁), (v₀, v₁), 2, scheme, $val, idx, loc) + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (u₀, u₁), (v₀, v₁), 2, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(3), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C @@ -406,7 +406,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) v₁ = v₀ # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁), (v₀, v₁), 2, scheme, $val, idx, loc) + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (u₀, u₁), (v₀, v₁), 2, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(3), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C From 39bbdd524eba0faf893033bc7428d1dac1d3a9cd Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 19 Mar 2024 00:27:23 -0400 Subject: [PATCH 128/152] bugfix --- src/Advection/weno_phi_new.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Advection/weno_phi_new.jl b/src/Advection/weno_phi_new.jl index d1eeb59761..6fd87fece2 100644 --- a/src/Advection/weno_phi_new.jl +++ b/src/Advection/weno_phi_new.jl @@ -35,7 +35,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ϕ₁ = ϕ₀ # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁), 2, scheme, $val, idx, loc) + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 2, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(3), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C @@ -333,7 +333,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ϕ₁ = ϕ₀ # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁), 2, scheme, $val, idx, loc) + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 2, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(3), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C From 22dac23c50ab3c177b70a6acfd107df3da945d14 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 19 Mar 2024 00:37:04 -0400 Subject: [PATCH 129/152] using the reciprocal --- src/Advection/weno_default_new.jl | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Advection/weno_default_new.jl b/src/Advection/weno_default_new.jl index 3da2cbd342..8d6fa407c6 100644 --- a/src/Advection/weno_default_new.jl +++ b/src/Advection/weno_default_new.jl @@ -50,7 +50,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -95,7 +95,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -156,7 +156,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -235,7 +235,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) end end end @@ -291,7 +291,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -336,7 +336,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -397,7 +397,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -476,7 +476,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) end end end @@ -532,7 +532,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -577,7 +577,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -638,7 +638,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -717,7 +717,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) end end end From 27d87751988b428a42154d64310e7f6d67437265 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 19 Mar 2024 01:03:52 -0400 Subject: [PATCH 130/152] let's goooo! --- src/Advection/weno_default_new.jl | 19 +++++++++---------- src/Advection/weno_phi_new.jl | 14 ++++++-------- src/Advection/weno_vi_new.jl | 13 ++++++------- 3 files changed, 21 insertions(+), 25 deletions(-) diff --git a/src/Advection/weno_default_new.jl b/src/Advection/weno_default_new.jl index 8d6fa407c6..724b81d9ec 100644 --- a/src/Advection/weno_default_new.jl +++ b/src/Advection/weno_default_new.jl @@ -1,10 +1,9 @@ - -## STENCILS IN X +##### +##### STENCILS IN X +##### for (side, add) in zip([:left, :right], (-1, 0)) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_xᶠᵃᵃ) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) coeff = Symbol(:coeff_, side) weno_interpolant = Symbol(side, :_weno_interpolant_xᶠᵃᵃ) val = 1 @@ -240,12 +239,12 @@ for (side, add) in zip([:left, :right], (-1, 0)) end end -## STENCILS IN Y +##### +##### STENCILS IN Y +##### for (side, add) in zip([:left, :right], (-1, 0)) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_yᵃᶠᵃ) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) coeff = Symbol(:coeff_, side) weno_interpolant = Symbol(side, :_weno_interpolant_yᵃᶠᵃ) val = 2 @@ -481,12 +480,12 @@ for (side, add) in zip([:left, :right], (-1, 0)) end end -## STENCILS IN Z +##### +##### STENCILS IN Z +##### for (side, add) in zip([:left, :right], (-1, 0)) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_zᵃᵃᶠ) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) coeff = Symbol(:coeff_, side) weno_interpolant = Symbol(side, :_weno_interpolant_zᵃᵃᶠ) val = 3 diff --git a/src/Advection/weno_phi_new.jl b/src/Advection/weno_phi_new.jl index 6fd87fece2..5fb3390107 100644 --- a/src/Advection/weno_phi_new.jl +++ b/src/Advection/weno_phi_new.jl @@ -1,10 +1,9 @@ - -## STENCILS IN X +##### +##### STENCILS IN X +##### for (side, add) in zip([:left, :right], (-1, 0)) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_xᶠᵃᵃ) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) coeff = Symbol(:coeff_, side) weno_interpolant = Symbol(side, :_weno_interpolant_xᶠᵃᵃ) val = 1 @@ -297,13 +296,12 @@ for (side, add) in zip([:left, :right], (-1, 0)) end end -## STENCILS IN Y +##### +##### STENCILS IN Y +##### for (side, add) in zip([:left, :right], (-1, 0)) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_yᵃᶠᵃ) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) weno_interpolant = Symbol(side, :_weno_interpolant_yᵃᶠᵃ) val = 2 diff --git a/src/Advection/weno_vi_new.jl b/src/Advection/weno_vi_new.jl index 197dc1214d..f09cb99d2b 100644 --- a/src/Advection/weno_vi_new.jl +++ b/src/Advection/weno_vi_new.jl @@ -1,10 +1,9 @@ - -## STENCILS IN X +##### +##### STENCILS IN X +##### for (side, add) in zip([:left, :right], (-1, 0)) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_xᶠᵃᵃ) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) coeff = Symbol(:coeff_, side) weno_interpolant = Symbol(side, :_weno_interpolant_xᶠᵃᵃ) val = 1 @@ -364,12 +363,12 @@ for (side, add) in zip([:left, :right], (-1, 0)) end end -## STENCILS IN Y +##### +##### STENCILS IN Y +##### for (side, add) in zip([:left, :right], (-1, 0)) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_yᵃᶠᵃ) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) coeff = Symbol(:coeff_, side) weno_interpolant = Symbol(side, :_weno_interpolant_yᵃᶠᵃ) val = 2 From d50b4573e002d30df6ac9678c4099582c37d0b57 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 19 Mar 2024 09:44:23 -0400 Subject: [PATCH 131/152] final versions? --- src/Advection/weno_default_new.jl | 147 ++++++++++----------- src/Advection/weno_interpolants.jl | 179 +------------------------ src/Advection/weno_phi_new.jl | 201 ++++++++++++++--------------- 3 files changed, 176 insertions(+), 351 deletions(-) diff --git a/src/Advection/weno_default_new.jl b/src/Advection/weno_default_new.jl index 724b81d9ec..6399179a65 100644 --- a/src/Advection/weno_default_new.jl +++ b/src/Advection/weno_default_new.jl @@ -1,3 +1,6 @@ +@inline getvalue(ψ, i, j, k, args...) = @inbounds ψ[i, j, k] +@inline getvalue(ψ::Function, i, j, k, args...) = ψ(i, j, k, args...) + ##### ##### STENCILS IN X ##### @@ -26,8 +29,8 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = @inbounds ψ[i - $add, j, k] - ψ₁ = @inbounds ψ[i + 1 - $add, j, k] + ψ₀ = getvalue(ψ, i - $add, j, k, grid, args...) + ψ₁ = getvalue(ψ, i + 1 - $add, j, k, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) τ = β @@ -36,7 +39,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = @inbounds ψ[i - 1 - $add, j, k] + ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) ψ₁ = ψ₀ # Stencil S₁ @@ -57,9 +60,9 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = @inbounds ψ[i - $add, j, k] - ψ₁ = @inbounds ψ[i + 1 - $add, j, k] - ψ₂ = @inbounds ψ[i + 2 - $add, j, k] + ψ₀ = getvalue(ψ, i - $add, j, k, grid, args...) + ψ₁ = getvalue(ψ, i + 1 - $add, j, k, grid, args...) + ψ₂ = getvalue(ψ, i + 2 - $add, j, k, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) τ = β @@ -68,7 +71,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = @inbounds ψ[i - 1 - $add, j, k] + ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ @@ -80,7 +83,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i - 2 - $add, j, k] + ψ₀ = getvalue(ψ, i - 2 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ @@ -102,10 +105,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = @inbounds ψ[i - $add, j, k] - ψ₁ = @inbounds ψ[i + 1 - $add, j, k] - ψ₂ = @inbounds ψ[i + 2 - $add, j, k] - ψ₃ = @inbounds ψ[i + 3 - $add, j, k] + ψ₀ = getvalue(ψ, i - $add, j, k, grid, args...) + ψ₁ = getvalue(ψ, i + 1 - $add, j, k, grid, args...) + ψ₂ = getvalue(ψ, i + 2 - $add, j, k, grid, args...) + ψ₃ = getvalue(ψ, i + 3 - $add, j, k, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) τ = β @@ -114,7 +117,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = @inbounds ψ[i - 1 - $add, j, k] + ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -127,7 +130,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i - 2 - $add, j, k] + ψ₀ = getvalue(ψ, i - 2 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -140,7 +143,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i - 3 - $add, j, k] + ψ₀ = getvalue(ψ, i - 3 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -163,11 +166,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = @inbounds ψ[i - $add, j, k] - ψ₁ = @inbounds ψ[i + 1 - $add, j, k] - ψ₂ = @inbounds ψ[i + 2 - $add, j, k] - ψ₃ = @inbounds ψ[i + 3 - $add, j, k] - ψ₄ = @inbounds ψ[i + 4 - $add, j, k] + ψ₀ = getvalue(ψ, i - $add, j, k, grid, args...) + ψ₁ = getvalue(ψ, i + 1 - $add, j, k, grid, args...) + ψ₂ = getvalue(ψ, i + 2 - $add, j, k, grid, args...) + ψ₃ = getvalue(ψ, i + 3 - $add, j, k, grid, args...) + ψ₄ = getvalue(ψ, i + 4 - $add, j, k, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) τ = β @@ -176,7 +179,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = @inbounds ψ[i - 1 - $add, j, k] + ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -190,7 +193,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i - 2 - $add, j, k] + ψ₀ = getvalue(ψ, i - 2 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -204,7 +207,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i - 3 - $add, j, k] + ψ₀ = getvalue(ψ, i - 3 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -218,7 +221,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i - 4 - $add, j, k] + ψ₀ = getvalue(ψ, i - 4 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -267,8 +270,8 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = @inbounds ψ[i, j - $add, k] - ψ₁ = @inbounds ψ[i, j + 1 - $add, k] + ψ₀ = getvalue(ψ, i, j - $add, k, grid, args...) + ψ₁ = getvalue(ψ, i, j + 1 - $add, k, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) τ = β @@ -277,7 +280,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = @inbounds ψ[i, j - 1 - $add, k] + ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) ψ₁ = ψ₀ # Stencil S₁ @@ -298,9 +301,9 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = @inbounds ψ[i, j - $add, k] - ψ₁ = @inbounds ψ[i, j + 1 - $add, k] - ψ₂ = @inbounds ψ[i, j + 2 - $add, k] + ψ₀ = getvalue(ψ, i, j - $add, k, grid, args...) + ψ₁ = getvalue(ψ, i, j + 1 - $add, k, grid, args...) + ψ₂ = getvalue(ψ, i, j + 2 - $add, k, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) τ = β @@ -309,7 +312,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = @inbounds ψ[i, j - 1 - $add, k] + ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ @@ -321,7 +324,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i, j - 2 - $add, k] + ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ @@ -343,10 +346,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = @inbounds ψ[i, j - $add, k] - ψ₁ = @inbounds ψ[i, j + 1 - $add, k] - ψ₂ = @inbounds ψ[i, j + 2 - $add, k] - ψ₃ = @inbounds ψ[i, j + 3 - $add, k] + ψ₀ = getvalue(ψ, i, j - $add, k, grid, args...) + ψ₁ = getvalue(ψ, i, j + 1 - $add, k, grid, args...) + ψ₂ = getvalue(ψ, i, j + 2 - $add, k, grid, args...) + ψ₃ = getvalue(ψ, i, j + 3 - $add, k, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) τ = β @@ -355,7 +358,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = @inbounds ψ[i, j - 1 - $add, k] + ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -368,7 +371,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i, j - 2 - $add, k] + ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -381,7 +384,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i, j - 3 - $add, k] + ψ₀ = getvalue(ψ, i, j - 3 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -404,11 +407,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = @inbounds ψ[i, j - $add, k] - ψ₁ = @inbounds ψ[i, j + 1 - $add, k] - ψ₂ = @inbounds ψ[i, j + 2 - $add, k] - ψ₃ = @inbounds ψ[i, j + 3 - $add, k] - ψ₄ = @inbounds ψ[i, j + 4 - $add, k] + ψ₀ = getvalue(ψ, i, j - $add, k, grid, args...) + ψ₁ = getvalue(ψ, i, j + 1 - $add, k, grid, args...) + ψ₂ = getvalue(ψ, i, j + 2 - $add, k, grid, args...) + ψ₃ = getvalue(ψ, i, j + 3 - $add, k, grid, args...) + ψ₄ = getvalue(ψ, i, j + 4 - $add, k, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) τ = β @@ -417,7 +420,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = @inbounds ψ[i, j - 1 - $add, k] + ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -431,7 +434,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i, j - 2 - $add, k] + ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -445,7 +448,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i, j - 3 - $add, k] + ψ₀ = getvalue(ψ, i, j - 3 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -459,7 +462,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i, j - 4 - $add, k] + ψ₀ = getvalue(ψ, i, j - 4 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -508,8 +511,8 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = @inbounds ψ[i, j, k - $add] - ψ₁ = @inbounds ψ[i, j, k + 1 - $add] + ψ₀ = getvalue(ψ, i, j, k - $add, grid, args...) + ψ₁ = getvalue(ψ, i, j, k + 1 - $add, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) τ = β @@ -518,7 +521,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = @inbounds ψ[i, j, k - 1 - $add] + ψ₀ = getvalue(ψ, i, j, k - 1 - $add, grid, args...) ψ₁ = ψ₀ # Stencil S₁ @@ -539,9 +542,9 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = @inbounds ψ[i, j, k - $add] - ψ₁ = @inbounds ψ[i, j, k + 1 - $add] - ψ₂ = @inbounds ψ[i, j, k + 2 - $add] + ψ₀ = getvalue(ψ, i, j, k - $add, grid, args...) + ψ₁ = getvalue(ψ, i, j, k + 1 - $add, grid, args...) + ψ₂ = getvalue(ψ, i, j, k + 2 - $add, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) τ = β @@ -550,7 +553,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = @inbounds ψ[i, j, k - 1 - $add] + ψ₀ = getvalue(ψ, i, j, k - 1 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ @@ -562,7 +565,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i, j, k - 2 - $add] + ψ₀ = getvalue(ψ, i, j, k - 2 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ @@ -584,10 +587,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = @inbounds ψ[i, j, k - $add] - ψ₁ = @inbounds ψ[i, j, k + 1 - $add] - ψ₂ = @inbounds ψ[i, j, k + 2 - $add] - ψ₃ = @inbounds ψ[i, j, k + 3 - $add] + ψ₀ = getvalue(ψ, i, j, k - $add, grid, args...) + ψ₁ = getvalue(ψ, i, j, k + 1 - $add, grid, args...) + ψ₂ = getvalue(ψ, i, j, k + 2 - $add, grid, args...) + ψ₃ = getvalue(ψ, i, j, k + 3 - $add, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) τ = β @@ -596,7 +599,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = @inbounds ψ[i, j, k - 1 - $add] + ψ₀ = getvalue(ψ, i, j, k - 1 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -609,7 +612,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i, j, k - 2 - $add] + ψ₀ = getvalue(ψ, i, j, k - 2 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -622,7 +625,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i, j, k - 3 - $add] + ψ₀ = getvalue(ψ, i, j, k - 3 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -645,11 +648,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = @inbounds ψ[i, j, k - $add] - ψ₁ = @inbounds ψ[i, j, k + 1 - $add] - ψ₂ = @inbounds ψ[i, j, k + 2 - $add] - ψ₃ = @inbounds ψ[i, j, k + 3 - $add] - ψ₄ = @inbounds ψ[i, j, k + 4 - $add] + ψ₀ = getvalue(ψ, i, j, k - $add, grid, args...) + ψ₁ = getvalue(ψ, i, j, k + 1 - $add, grid, args...) + ψ₂ = getvalue(ψ, i, j, k + 2 - $add, grid, args...) + ψ₃ = getvalue(ψ, i, j, k + 3 - $add, grid, args...) + ψ₄ = getvalue(ψ, i, j, k + 4 - $add, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) τ = β @@ -658,7 +661,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = @inbounds ψ[i, j, k - 1 - $add] + ψ₀ = getvalue(ψ, i, j, k - 1 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -672,7 +675,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i, j, k - 2 - $add] + ψ₀ = getvalue(ψ, i, j, k - 2 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -686,7 +689,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i, j, k - 3 - $add] + ψ₀ = getvalue(ψ, i, j, k - 3 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -700,7 +703,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = @inbounds ψ[i, j, k - 4 - $add] + ψ₀ = getvalue(ψ, i, j, k - 4 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 27c2f28c5a..8d25c68124 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -184,12 +184,6 @@ for buffer in [2, 3, 4, 5, 6] end # Global smoothness indicator τ₂ᵣ₋₁ taken from "Accuracy of the weighted essentially non-oscillatory conservative finite difference schemes", Don & Borges, 2013 -@inline global_smoothness_indicator(::Val{2}, β) = @inbounds abs(β[1] - β[2]) -@inline global_smoothness_indicator(::Val{3}, β) = @inbounds abs(β[1] - β[3]) -@inline global_smoothness_indicator(::Val{4}, β) = @inbounds abs(β[1] + 3β[2] - 3β[3] - β[4]) -@inline global_smoothness_indicator(::Val{5}, β) = @inbounds abs(β[1] + 2β[2] - 6β[3] + 2β[4] + β[5]) -@inline global_smoothness_indicator(::Val{6}, β) = @inbounds abs(β[1] + β[2] - 8β[3] + 8β[4] - β[5] - β[6]) - @inline add_global_smoothness(β, ::Val{2}, ::Val{1}) = + β @inline add_global_smoothness(β, ::Val{2}, ::Val{2}) = - β @@ -215,87 +209,6 @@ end @inline add_global_smoothness(β, ::Val{6}, ::Val{5}) = - β @inline add_global_smoothness(β, ::Val{6}, ::Val{6}) = - β -""" - calc_weno_stencil(buffer, shift, dir, func::Bool = false) - -Stencils for WENO reconstruction calculations - -The first argument is the `buffer`, not the `order`! -- `order = 2 * buffer - 1` for WENO reconstruction - -Examples -======== - -```jldoctest -julia> using Oceananigans.Advection: calc_weno_stencil - -julia> calc_weno_stencil(3, :left, :x) -:(((ψ[i + -1, j, k], ψ[i + 0, j, k], ψ[i + 1, j, k]), (ψ[i + -2, j, k], ψ[i + -1, j, k], ψ[i + 0, j, k]), (ψ[i + -3, j, k], ψ[i + -2, j, k], ψ[i + -1, j, k]))) - -julia> calc_weno_stencil(2, :right, :x) -:(((ψ[i + 0, j, k], ψ[i + 1, j, k]), (ψ[i + -1, j, k], ψ[i + 0, j, k]))) - -""" -@inline function calc_weno_stencil(buffer, shift, dir, func::Bool = false) - N = buffer * 2 - if shift != :none - N -=1 - end - stencil_full = Vector(undef, buffer) - rng = 1:N - if shift == :right - rng = rng .+ 1 - end - for stencil in 1:buffer - stencil_point = Vector(undef, buffer) - rngstencil = rng[stencil:stencil+buffer-1] - for (idx, n) in enumerate(rngstencil) - c = n - buffer - 1 - if func - stencil_point[idx] = dir == :x ? - :(ψ(i + $c, j, k, args...)) : - dir == :y ? - :(ψ(i, j + $c, k, args...)) : - :(ψ(i, j, k + $c, args...)) - else - stencil_point[idx] = dir == :x ? - :(ψ[i + $c, j, k]) : - dir == :y ? - :(ψ[i, j + $c, k]) : - :(ψ[i, j, k + $c]) - end - end - stencil_full[buffer - stencil + 1] = :($(stencil_point...), ) - end - return stencil_full -end - -# Stencils for left and right biased reconstruction ((ψ̅ᵢ₋ᵣ₊ⱼ for j in 0:k) for r in 0:k) to calculate v̂ᵣ = ∑ⱼ(cᵣⱼψ̅ᵢ₋ᵣ₊ⱼ) -# where `k = N - 1`. Coefficients (cᵣⱼ for j in 0:N) for stencil r are given by `coeff_side_p(scheme, Val(r), ...)` -for side in (:left, :right), dir in (:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ) - retrieve_stencil = Symbol(side, :_stencil_, dir) - for buffer in [2, 3, 4, 5, 6] - for stencil in 1:buffer - @eval begin - @inline $retrieve_stencil(i, j, k, ::WENO{$buffer}, ::Val{$stencil}, ψ, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, false)[stencil]) - @inline $retrieve_stencil(i, j, k, ::WENO{$buffer}, ::Val{$stencil}, ψ::Function, args...) = @inbounds $(calc_weno_stencil(buffer, side, dir, true)[stencil]) - end - end - end -end - -# Stencil for vector invariant calculation of smoothness indicators in the horizontal direction -# Parallel to the interpolation direction! (same as left/right stencil) -@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{1}, grid, u) = @inbounds left_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) -@inline tangential_left_stencil_u(i, j, k, scheme, stencil, ::Val{2}, grid, u) = @inbounds left_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) -@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{1}, grid, v) = @inbounds left_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) -@inline tangential_left_stencil_v(i, j, k, scheme, stencil, ::Val{2}, grid, v) = @inbounds left_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) - -@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{1}, grid, u) = @inbounds right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) -@inline tangential_right_stencil_u(i, j, k, scheme, stencil, ::Val{2}, grid, u) = @inbounds right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑyᵃᶠᵃ, grid, u) -@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{1}, grid, v) = @inbounds right_stencil_xᶠᵃᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) -@inline tangential_right_stencil_v(i, j, k, scheme, stencil, ::Val{2}, grid, v) = @inbounds right_stencil_yᵃᶠᵃ(i, j, k, scheme, stencil, ℑxᶠᵃᵃ, grid, v) - # Reciprocal! let (jlf, f) = (:div_arcp, :div) for (T, llvmT) in ((:Float32, "float"), (:Float64, "double")) @@ -314,6 +227,7 @@ let (jlf, f) = (:div_arcp, :div) Base.$jlf(args...) end end + rcp(x) = div_arcp(one(x), x) # still leads to rcp.rn which is also a function call for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) @@ -321,99 +235,8 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z biased_β = Symbol(side, :_biased_β) biased_p = Symbol(side, :_biased_p) coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) @eval begin - # Standard weno reconstruction at `i, j, k` for stencil `s` where `1 ≤ s ≤ N` - @inline function $weno_interpolant(i::Int, j::Int, k::Int, s::Int, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, args...) where {N, FT, XT, YT, ZT} - - # Retrieve stencil `s` - ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) - - # Calculate smoothness of stencil `s` - β = $biased_β(ψs, scheme, Val(s-1)) - - # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C * rcp(β + FT(ε))^2 - - # Reconstruction of `ψ` from stencil `s` - ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) - - return β, ψ̅, C, α - end - - # If the smoothness stencil is not used (aka it's a `DefaultStencil`) use the same formulation as above - @inline function $weno_interpolant(i::Int, j::Int, k::Int, s::Int, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::AbstractSmoothnessStencil, args...) where {N, FT, XT, YT, ZT} - - # Retrieve stencil `s` - ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) - - # Calculate smoothness of stencil `s` - β = $biased_β(ψs, scheme, Val(s-1)) - - # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C * rcp(β + FT(ε))^2 - - # Reconstruction of `ψ` from stencil `s` - ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) - - return β, ψ̅, C, α - end - - # Using velocity interpolated at `(Face, Face, Center)` to assess smoothness. - # Can be used only for `(Face, Face, Center)` variables like vorticity - @inline function $weno_interpolant(i::Int, j::Int, k::Int, s::Int, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, ::VelocityStencil, u, v, args...) where {N, FT, XT, YT, ZT} - - # Retrieve x-velocity stencil `s` - ψs = $stencil_u(i, j, k, scheme, Val(s), Val(val), grid, u) - - # Calculate x-velocity smoothness at stencil `s` - βu = $biased_β(ψs, scheme, Val(s-1)) - - # Retrieve y-velocity stencil `s` - ψs = $stencil_v(i, j, k, scheme, Val(s), Val(val), grid, v) - - # Calculate y-velocity smoothness at stencil `s` - βv = $biased_β(ψs, scheme, Val(s-1)) - - # total smoothness - βᵁ = @fastmath (βu + βv) / 2 - - # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C * rcp(βᵁ + FT(ε))^2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, u, v, args...) - ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) - - return βᵁ, ψ̅, C, α - end - - # The smoothness is assessed using the stencil calculated from the function `VI.func(i, j, k, grid, args...)` - @inline function $weno_interpolant(i::Int, j::Int, k::Int, s::Int, grid, scheme::WENO{N, FT, XT, YT, ZT}, val, ψ, idx, loc, VI::FunctionStencil, args...) where {N, FT, XT, YT, ZT} - - # Retrieve smoothness stencil ϕ at `s` - ψs = $stencil(i, j, k, scheme, Val(s), VI.func, grid, args...) - - # Calculate `ϕ` smoothness at `s` - βᵠ = $biased_β(ψs, scheme, Val(s-1)) - - # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation - C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C * rcp(βᵠ + FT(ε))^2 - - # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` - ψs = $stencil(i, j, k, scheme, Val(s), ψ, grid, args...) - ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) - - return βᵠ, ψ̅, C, α - end - ##### ##### Picking up the stencil prior ##### diff --git a/src/Advection/weno_phi_new.jl b/src/Advection/weno_phi_new.jl index 5fb3390107..63cc8d7ecc 100644 --- a/src/Advection/weno_phi_new.jl +++ b/src/Advection/weno_phi_new.jl @@ -14,11 +14,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = ψ(i - $add, j, k, grid, args...) - ψ₁ = ψ(i + 1 - $add, j, k, grid, args...) + ψ₀ = getvalue(ψ, i - $add, j, k, grid, args...) + ψ₁ = getvalue(ψ, i + 1 - $add, j, k, grid, args...) - ϕ₀ = VI.func(i - $add, j, k, grid, args...) - ϕ₁ = VI.func(i + 1 - $add, j, k, grid, args...) + ϕ₀ = getvalue(VI.func, i - $add, j, k, grid, args...) + ϕ₁ = getvalue(VI.func, i + 1 - $add, j, k, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 1, scheme, $val, idx, loc) τ = β @@ -27,10 +27,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = ψ(i - 1 - $add, j, k, grid, args...) + ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) ψ₁ = ψ₀ - ϕ₀ = VI.func(i - 1 - $add, j, k, grid, args...) + ϕ₀ = getvalue(VI.func, i - 1 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ # Stencil S₁ @@ -51,13 +51,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = ψ(i - $add, j, k, grid, args...) - ψ₁ = ψ(i + 1 - $add, j, k, grid, args...) - ψ₂ = ψ(i + 2 - $add, j, k, grid, args...) + ψ₀ = getvalue(ψ, i - $add, j, k, grid, args...) + ψ₁ = getvalue(ψ, i + 1 - $add, j, k, grid, args...) + ψ₂ = getvalue(ψ, i + 2 - $add, j, k, grid, args...) - ϕ₀ = VI.func(i - $add, j, k, grid, args...) - ϕ₁ = VI.func(i + 1 - $add, j, k, grid, args...) - ϕ₂ = VI.func(i + 2 - $add, j, k, grid, args...) + ϕ₀ = getvalue(VI.func, i - $add, j, k, grid, args...) + ϕ₁ = getvalue(VI.func, i + 1 - $add, j, k, grid, args...) + ϕ₂ = getvalue(VI.func, i + 2 - $add, j, k, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 1, scheme, $val, idx, loc) τ = β @@ -66,11 +66,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = ψ(i - 1 - $add, j, k, grid, args...) + ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ - ϕ₀ = VI.func(i - 1 - $add, j, k, grid, args...) + ϕ₀ = getvalue(VI.func, i - 1 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ @@ -82,11 +82,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i - 2 - $add, j, k, grid, args...) + ψ₀ = getvalue(ψ, i - 2 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ - ϕ₀ = VI.func(i - 2 - $add, j, k, grid, args...) + ϕ₀ = getvalue(VI.func, i - 2 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ @@ -108,15 +108,15 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = ψ(i - $add, j, k, grid, args...) - ψ₁ = ψ(i + 1 - $add, j, k, grid, args...) - ψ₂ = ψ(i + 2 - $add, j, k, grid, args...) - ψ₃ = ψ(i + 3 - $add, j, k, grid, args...) - - ϕ₀ = VI.func(i - $add, j, k, grid, args...) - ϕ₁ = VI.func(i + 1 - $add, j, k, grid, args...) - ϕ₂ = VI.func(i + 2 - $add, j, k, grid, args...) - ϕ₃ = VI.func(i + 3 - $add, j, k, grid, args...) + ψ₀ = getvalue(ψ, i - $add, j, k, grid, args...) + ψ₁ = getvalue(ψ, i + 1 - $add, j, k, grid, args...) + ψ₂ = getvalue(ψ, i + 2 - $add, j, k, grid, args...) + ψ₃ = getvalue(ψ, i + 3 - $add, j, k, grid, args...) + + ϕ₀ = getvalue(VI.func, i - $add, j, k, grid, args...) + ϕ₁ = getvalue(VI.func, i + 1 - $add, j, k, grid, args...) + ϕ₂ = getvalue(VI.func, i + 2 - $add, j, k, grid, args...) + ϕ₃ = getvalue(VI.func, i + 3 - $add, j, k, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 1, scheme, $val, idx, loc) τ = β @@ -125,12 +125,12 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = ψ(i - 1 - $add, j, k, grid, args...) + ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - ϕ₀ = VI.func(i - 1 - $add, j, k, grid, args...) + ϕ₀ = getvalue(VI.func, i - 1 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ @@ -143,12 +143,12 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i - 2 - $add, j, k, grid, args...) + ψ₀ = getvalue(ψ, i - 2 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - ϕ₀ = VI.func(i - 2 - $add, j, k, grid, args...) + ϕ₀ = getvalue(VI.func, i - 2 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ @@ -161,12 +161,12 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i - 3 - $add, j, k, grid, args...) + ψ₀ = getvalue(ψ, i - 3 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - ϕ₀ = VI.func(i - 3 - $add, j, k, grid, args...) + ϕ₀ = getvalue(VI.func, i - 3 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ @@ -190,17 +190,17 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = ψ(i - $add, j, k, grid, args...) - ψ₁ = ψ(i + 1 - $add, j, k, grid, args...) - ψ₂ = ψ(i + 2 - $add, j, k, grid, args...) - ψ₃ = ψ(i + 3 - $add, j, k, grid, args...) - ψ₄ = ψ(i + 4 - $add, j, k, grid, args...) - - ϕ₀ = VI.func(i - $add, j, k, grid, args...) - ϕ₁ = VI.func(i + 1 - $add, j, k, grid, args...) - ϕ₂ = VI.func(i + 2 - $add, j, k, grid, args...) - ϕ₃ = VI.func(i + 3 - $add, j, k, grid, args...) - ϕ₄ = VI.func(i + 4 - $add, j, k, grid, args...) + ψ₀ = getvalue(ψ, i - $add, j, k, grid, args...) + ψ₁ = getvalue(ψ, i + 1 - $add, j, k, grid, args...) + ψ₂ = getvalue(ψ, i + 2 - $add, j, k, grid, args...) + ψ₃ = getvalue(ψ, i + 3 - $add, j, k, grid, args...) + ψ₄ = getvalue(ψ, i + 4 - $add, j, k, grid, args...) + + ϕ₀ = getvalue(VI.func, i - $add, j, k, grid, args...) + ϕ₁ = getvalue(VI.func, i + 1 - $add, j, k, grid, args...) + ϕ₂ = getvalue(VI.func, i + 2 - $add, j, k, grid, args...) + ϕ₃ = getvalue(VI.func, i + 3 - $add, j, k, grid, args...) + ϕ₄ = getvalue(VI.func, i + 4 - $add, j, k, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 1, scheme, $val, idx, loc) τ = β @@ -209,13 +209,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = ψ(i - 1 - $add, j, k, grid, args...) + ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ϕ₀ = VI.func(i - 1 - $add, j, k, grid, args...) + ϕ₀ = getvalue(VI.func, i - 1 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ @@ -229,13 +229,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i - 2 - $add, j, k, grid, args...) + ψ₀ = getvalue(ψ, i - 2 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ϕ₀ = VI.func(i - 2 - $add, j, k, grid, args...) + ϕ₀ = getvalue(VI.func, i - 2 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ @@ -249,13 +249,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i - 3 - $add, j, k, grid, args...) + ψ₀ = getvalue(ψ, i - 3 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ϕ₀ = VI.func(i - 3 - $add, j, k, grid, args...) + ϕ₀ = getvalue(VI.func, i - 3 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ @@ -269,13 +269,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i - 4 - $add, j, k, grid, args...) + ψ₀ = getvalue(ψ, i - 4 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ϕ₀ = VI.func(i - 4 - $add, j, k, grid, args...) + ϕ₀ = getvalue(VI.func, i - 4 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ @@ -311,11 +311,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = ψ(i, j - $add, k, grid, args...) - ψ₁ = ψ(i, j + 1 - $add, k, grid, args...) + ψ₀ = getvalue(ψ, i, j - $add, k, grid, args...) + ψ₁ = getvalue(ψ, i, j + 1 - $add, k, grid, args...) - ϕ₀ = VI.func(i, j - $add, k, grid, args...) - ϕ₁ = VI.func(i, j + 1 - $add, k, grid, args...) + ϕ₀ = getvalue(VI.func, i, j - $add, k, grid, args...) + ϕ₁ = getvalue(VI.func, i, j + 1 - $add, k, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 1, scheme, $val, idx, loc) τ = β @@ -324,10 +324,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = ψ(i, j - 1 - $add, k, grid, args...) + ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) ψ₁ = ψ₀ - ϕ₀ = VI.func(i, j - 1 - $add, k, grid, args...) + ϕ₀ = getvalue(VI.func, i, j - 1 - $add, k, grid, args...) ϕ₁ = ϕ₀ # Stencil S₁ @@ -348,13 +348,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = ψ(i, j - $add, k, grid, args...) - ψ₁ = ψ(i, j + 1 - $add, k, grid, args...) - ψ₂ = ψ(i, j + 2 - $add, k, grid, args...) + ψ₀ = getvalue(ψ, i, j - $add, k, grid, args...) + ψ₁ = getvalue(ψ, i, j + 1 - $add, k, grid, args...) + ψ₂ = getvalue(ψ, i, j + 2 - $add, k, grid, args...) - ϕ₀ = VI.func(i, j - $add, k, grid, args...) - ϕ₁ = VI.func(i, j + 1 - $add, k, grid, args...) - ϕ₂ = VI.func(i, j + 2 - $add, k, grid, args...) + ϕ₀ = getvalue(VI.func, i, j - $add, k, grid, args...) + ϕ₁ = getvalue(VI.func, i, j + 1 - $add, k, grid, args...) + ϕ₂ = getvalue(VI.func, i, j + 2 - $add, k, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 1, scheme, $val, idx, loc) τ = β @@ -363,11 +363,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = ψ(i, j - 1 - $add, k, grid, args...) + ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ - ϕ₀ = VI.func(i, j - 1 - $add, k, grid, args...) + ϕ₀ = getvalue(VI.func, i, j - 1 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ @@ -379,11 +379,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i, j - 2 - $add, k, grid, args...) + ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ - ϕ₀ = VI.func(i, j - 2 - $add, k, grid, args...) + ϕ₀ = getvalue(VI.func, i, j - 2 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ @@ -405,15 +405,15 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = ψ(i, j - $add, k, grid, args...) - ψ₁ = ψ(i, j + 1 - $add, k, grid, args...) - ψ₂ = ψ(i, j + 2 - $add, k, grid, args...) - ψ₃ = ψ(i, j + 3 - $add, k, grid, args...) - - ϕ₀ = VI.func(i, j - $add, k, grid, args...) - ϕ₁ = VI.func(i, j + 1 - $add, k, grid, args...) - ϕ₂ = VI.func(i, j + 2 - $add, k, grid, args...) - ϕ₃ = VI.func(i, j + 3 - $add, k, grid, args...) + ψ₀ = getvalue(ψ, i, j - $add, k, grid, args...) + ψ₁ = getvalue(ψ, i, j + 1 - $add, k, grid, args...) + ψ₂ = getvalue(ψ, i, j + 2 - $add, k, grid, args...) + ψ₃ = getvalue(ψ, i, j + 3 - $add, k, grid, args...) + + ϕ₀ = getvalue(VI.func, i, j - $add, k, grid, args...) + ϕ₁ = getvalue(VI.func, i, j + 1 - $add, k, grid, args...) + ϕ₂ = getvalue(VI.func, i, j + 2 - $add, k, grid, args...) + ϕ₃ = getvalue(VI.func, i, j + 3 - $add, k, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 1, scheme, $val, idx, loc) τ = β @@ -422,12 +422,12 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = ψ(i, j - 1 - $add, k, grid, args...) + ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - ϕ₀ = VI.func(i, j - 1 - $add, k, grid, args...) + ϕ₀ = getvalue(VI.func, i, j - 1 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ @@ -440,12 +440,12 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i, j - 2 - $add, k, grid, args...) + ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - ϕ₀ = VI.func(i, j - 2 - $add, k, grid, args...) + ϕ₀ = getvalue(VI.func, i, j - 2 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ @@ -458,12 +458,12 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i, j - 3 - $add, k, grid, args...) + ψ₀ = getvalue(ψ, i, j - 3 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - ϕ₀ = VI.func(i, j - 3 - $add, k, grid, args...) + ϕ₀ = getvalue(VI.func, i, j - 3 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ @@ -476,7 +476,6 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - τ = τ^2 return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) @@ -487,17 +486,17 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = ψ(i, j - $add, k, grid, args...) - ψ₁ = ψ(i, j + 1 - $add, k, grid, args...) - ψ₂ = ψ(i, j + 2 - $add, k, grid, args...) - ψ₃ = ψ(i, j + 3 - $add, k, grid, args...) - ψ₄ = ψ(i, j + 4 - $add, k, grid, args...) - - ϕ₀ = VI.func(i, j - $add, k, grid, args...) - ϕ₁ = VI.func(i, j + 1 - $add, k, grid, args...) - ϕ₂ = VI.func(i, j + 2 - $add, k, grid, args...) - ϕ₃ = VI.func(i, j + 3 - $add, k, grid, args...) - ϕ₄ = VI.func(i, j + 4 - $add, k, grid, args...) + ψ₀ = getvalue(ψ, i, j - $add, k, grid, args...) + ψ₁ = getvalue(ψ, i, j + 1 - $add, k, grid, args...) + ψ₂ = getvalue(ψ, i, j + 2 - $add, k, grid, args...) + ψ₃ = getvalue(ψ, i, j + 3 - $add, k, grid, args...) + ψ₄ = getvalue(ψ, i, j + 4 - $add, k, grid, args...) + + ϕ₀ = getvalue(VI.func, i, j - $add, k, grid, args...) + ϕ₁ = getvalue(VI.func, i, j + 1 - $add, k, grid, args...) + ϕ₂ = getvalue(VI.func, i, j + 2 - $add, k, grid, args...) + ϕ₃ = getvalue(VI.func, i, j + 3 - $add, k, grid, args...) + ϕ₄ = getvalue(VI.func, i, j + 4 - $add, k, grid, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 1, scheme, $val, idx, loc) τ = β @@ -506,13 +505,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = ψ(i, j - 1 - $add, k, grid, args...) + ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ϕ₀ = VI.func(i, j - 1 - $add, k, grid, args...) + ϕ₀ = getvalue(VI.func, i, j - 1 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ @@ -526,13 +525,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i, j - 2 - $add, k, grid, args...) + ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ϕ₀ = VI.func(i, j - 2 - $add, k, grid, args...) + ϕ₀ = getvalue(VI.func, i, j - 2 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ @@ -546,13 +545,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i, j - 3 - $add, k, grid, args...) + ψ₀ = getvalue(ψ, i, j - 3 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ϕ₀ = VI.func(i, j - 3 - $add, k, grid, args...) + ϕ₀ = getvalue(VI.func, i, j - 3 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ @@ -566,13 +565,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i, j - 4 - $add, k, grid, args...) + ψ₀ = getvalue(ψ, i, j - 4 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ϕ₀ = VI.func(i, j - 4 - $add, k, grid, args...) + ϕ₀ = getvalue(VI.func, i, j - 4 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ From c7f9dd95e9cc05d06bba6083f84789145973b937 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 19 Mar 2024 09:46:38 -0400 Subject: [PATCH 132/152] optimize --- src/Advection/Advection.jl | 11 ++----- src/Advection/weno_default.jl | 30 ------------------- ...efault_new.jl => weno_default_stencils.jl} | 0 ...o_phi_new.jl => weno_function_stencils.jl} | 0 ...no_vi_new.jl => weno_velocity_stencils.jl} | 0 5 files changed, 3 insertions(+), 38 deletions(-) rename src/Advection/{weno_default_new.jl => weno_default_stencils.jl} (100%) rename src/Advection/{weno_phi_new.jl => weno_function_stencils.jl} (100%) rename src/Advection/{weno_vi_new.jl => weno_velocity_stencils.jl} (100%) diff --git a/src/Advection/Advection.jl b/src/Advection/Advection.jl index ab0618e890..e85f51009c 100644 --- a/src/Advection/Advection.jl +++ b/src/Advection/Advection.jl @@ -67,14 +67,9 @@ include("centered_reconstruction.jl") include("upwind_biased_reconstruction.jl") include("weno_reconstruction.jl") include("weno_interpolants.jl") -# include("weno_2.jl") -# include("weno_3.jl") -# include("weno_4.jl") -# include("weno_5.jl") -# include("weno_6.jl") -include("weno_default_new.jl") -include("weno_vi_new.jl") -include("weno_phi_new.jl") +include("weno_default_stencils.jl") +include("weno_function_stencils.jl") +include("weno_velocity_stencils.jl") include("stretched_weno_smoothness.jl") include("multi_dimensional_reconstruction.jl") include("vector_invariant_upwinding.jl") diff --git a/src/Advection/weno_default.jl b/src/Advection/weno_default.jl index 50753e732b..cb4f96d0dc 100644 --- a/src/Advection/weno_default.jl +++ b/src/Advection/weno_default.jl @@ -1,33 +1,3 @@ -@inline function ψ_reconstruction_stencil(buffer, shift, dir, func::Bool = false) - N = buffer * 2 - order = shift == :symmetric ? N : N - 1 - if shift != :symmetric - N = N .- 1 - end - rng = 1:N - if shift == :right - rng = rng .+ 1 - end - stencil_full = Vector(undef, N) - coeff = Symbol(:coeff, order, :_, shift) - for (idx, n) in enumerate(rng) - c = n - buffer - 1 - if func - stencil_full[idx] = dir == :x ? - :(ψ(i + $c, j, k, grid, args...)) : - dir == :y ? - :(ψ(i, j + $c, k, grid, args...)) : - :(ψ(i, j, k + $c, grid, args...)) - else - stencil_full[idx] = dir == :x ? - :(ψ[i + $c, j, k]) : - dir == :y ? - :(ψ[i, j + $c, k]) : - :(ψ[i, j, k + $c]) - end - end - return :($(stencil_full...),) -end for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) biased_interpolate_new = Symbol(:new_inner_, side, :_biased_interpolate_, dir) diff --git a/src/Advection/weno_default_new.jl b/src/Advection/weno_default_stencils.jl similarity index 100% rename from src/Advection/weno_default_new.jl rename to src/Advection/weno_default_stencils.jl diff --git a/src/Advection/weno_phi_new.jl b/src/Advection/weno_function_stencils.jl similarity index 100% rename from src/Advection/weno_phi_new.jl rename to src/Advection/weno_function_stencils.jl diff --git a/src/Advection/weno_vi_new.jl b/src/Advection/weno_velocity_stencils.jl similarity index 100% rename from src/Advection/weno_vi_new.jl rename to src/Advection/weno_velocity_stencils.jl From b3da0144db0fe95d659dbee34449864efdf05d67 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 19 Mar 2024 09:50:18 -0400 Subject: [PATCH 133/152] adding weno 6? --- src/Advection/weno_velocity_stencils.jl | 183 ++++++++++++++++++++++++ 1 file changed, 183 insertions(+) diff --git a/src/Advection/weno_velocity_stencils.jl b/src/Advection/weno_velocity_stencils.jl index f09cb99d2b..945dd65aa9 100644 --- a/src/Advection/weno_velocity_stencils.jl +++ b/src/Advection/weno_velocity_stencils.jl @@ -726,5 +726,188 @@ for (side, add) in zip([:left, :right], (-1, 0)) return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{6, FT, XT, YT, ZT}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} + + # All stencils + ψ₀ = ψ(i, j - $add, k, grid, u, v) + ψ₁ = ψ(i, j + 1 - $add, k, grid, u, v) + ψ₂ = ψ(i, j + 2 - $add, k, grid, u, v) + ψ₃ = ψ(i, j + 3 - $add, k, grid, u, v) + ψ₄ = ψ(i, j + 4 - $add, k, grid, u, v) + ψ₅ = ψ(i, j + 5 - $add, k, grid, u, v) + + u₀ = ℑyᵃᶠᵃ(i, j - $add, k, grid, u) + u₁ = ℑyᵃᶠᵃ(i, j + 1 - $add, k, grid, u) + u₂ = ℑyᵃᶠᵃ(i, j + 2 - $add, k, grid, u) + u₃ = ℑyᵃᶠᵃ(i, j + 3 - $add, k, grid, u) + u₄ = ℑyᵃᶠᵃ(i, j + 4 - $add, k, grid, u) + u₅ = ℑyᵃᶠᵃ(i, j + 5 - $add, k, grid, u) + + v₀ = ℑxᶠᵃᵃ(i, j - $add, k, grid, v) + v₁ = ℑxᶠᵃᵃ(i, j + 1 - $add, k, grid, v) + v₂ = ℑxᶠᵃᵃ(i, j + 2 - $add, k, grid, v) + v₃ = ℑxᶠᵃᵃ(i, j + 3 - $add, k, grid, v) + v₄ = ℑxᶠᵃᵃ(i, j + 4 - $add, k, grid, v) + v₅ = ℑxᶠᵃᵃ(i, j + 5 - $add, k, grid, v) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * C + w₁ = C + ψ̂₂ = ψ̅ * α + w₂ = α + + ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + ψ₅ = ψ₄ + + u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + u₄ = u₃ + u₅ = u₄ + + v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + v₄ = v₃ + v₅ = v₄ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 2, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(1)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i, j - 2 - $add, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + ψ₅ = ψ₄ + + u₀ = ℑyᵃᶠᵃ(i, j - 2 - $add, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + u₄ = u₃ + u₅ = u₄ + + v₀ = ℑxᶠᵃᵃ(i, j - 2 - $add, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + v₄ = v₃ + v₅ = v₄ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 3, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(2)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i, j - 3 - $add, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + ψ₅ = ψ₄ + + u₀ = ℑyᵃᶠᵃ(i, j - 3 - $add, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + u₄ = u₃ + u₅ = u₄ + + v₀ = ℑxᶠᵃᵃ(i, j - 3 - $add, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + v₄ = v₃ + v₅ = v₄ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 4, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(3)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i, j - 4 - $add, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + ψ₅ = ψ₄ + + u₀ = ℑyᵃᶠᵃ(i, j - 4 - $add, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + u₄ = u₃ + u₅ = u₄ + + v₀ = ℑxᶠᵃᵃ(i, j - 4 - $add, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + v₄ = v₃ + v₅ = v₄ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 5, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(4)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + ψ₀ = ψ(i, j - 5 - $add, k, grid, u, v) + ψ₁ = ψ₀ + ψ₂ = ψ₁ + ψ₃ = ψ₂ + ψ₄ = ψ₃ + ψ₅ = ψ₄ + + u₀ = ℑyᵃᶠᵃ(i, j - 5 - $add, k, grid, u) + u₁ = u₀ + u₂ = u₁ + u₃ = u₂ + u₄ = u₃ + u₅ = u₄ + + v₀ = ℑxᶠᵃᵃ(i, j - 5 - $add, k, grid, v) + v₁ = v₀ + v₂ = v₁ + v₃ = v₂ + v₄ = v₃ + v₅ = v₄ + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 6, scheme, $val, idx, loc) + τ += add_global_smoothness(β, Val(6), Val(5)) + ψ̂₁ += ψ̅ * C + w₁ += C + ψ̂₂ += ψ̅ * α + w₂ += α + + τ = τ^2 + + return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + end end end \ No newline at end of file From f555571cf40b6ef08719263b67c3350231190ffe Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 19 Mar 2024 11:41:00 -0400 Subject: [PATCH 134/152] bugfix --- src/Advection/weno_default_stencils.jl | 52 ++--- src/Advection/weno_function_stencils.jl | 40 ++-- src/Advection/weno_velocity_stencils.jl | 275 ++++++++++++------------ 3 files changed, 183 insertions(+), 184 deletions(-) diff --git a/src/Advection/weno_default_stencils.jl b/src/Advection/weno_default_stencils.jl index 6399179a65..09da84aee3 100644 --- a/src/Advection/weno_default_stencils.jl +++ b/src/Advection/weno_default_stencils.jl @@ -1,5 +1,5 @@ -@inline getvalue(ψ, i, j, k, args...) = @inbounds ψ[i, j, k] -@inline getvalue(ψ::Function, i, j, k, args...) = ψ(i, j, k, args...) +@inline getvalue(ψ, i, j, k, grid, args...) = @inbounds ψ[i, j, k] +@inline getvalue(ψ::Function, i, j, k, grid, args...) = ψ(i, j, k, grid, args...) ##### ##### STENCILS IN X @@ -179,11 +179,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) @@ -193,11 +193,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i - 2 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(ψ, i - 2 - $add, j, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) @@ -207,11 +207,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i - 3 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(ψ, i - 3 - $add, j, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) @@ -221,11 +221,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i - 4 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(ψ, i - 4 - $add, j, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) @@ -280,8 +280,8 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) ψ₁ = ψ₀ + ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) @@ -312,9 +312,9 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) @@ -324,9 +324,9 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) @@ -358,10 +358,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) @@ -371,10 +371,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) @@ -384,10 +384,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j - 3 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₀ = getvalue(ψ, i, j - 3 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) @@ -420,11 +420,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) @@ -434,11 +434,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) @@ -448,11 +448,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j - 3 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(ψ, i, j - 3 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) @@ -462,11 +462,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j - 4 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(ψ, i, j - 4 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) @@ -521,8 +521,8 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i, j, k - 1 - $add, grid, args...) ψ₁ = ψ₀ + ψ₀ = getvalue(ψ, i, j, k - 1 - $add, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) @@ -553,9 +553,9 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i, j, k - 1 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₀ = getvalue(ψ, i, j, k - 1 - $add, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) @@ -565,9 +565,9 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j, k - 2 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₀ = getvalue(ψ, i, j, k - 2 - $add, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) @@ -599,10 +599,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i, j, k - 1 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₀ = getvalue(ψ, i, j, k - 1 - $add, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) @@ -612,10 +612,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j, k - 2 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₀ = getvalue(ψ, i, j, k - 2 - $add, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) @@ -625,10 +625,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j, k - 3 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₀ = getvalue(ψ, i, j, k - 3 - $add, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) @@ -661,11 +661,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i, j, k - 1 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(ψ, i, j, k - 1 - $add, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) @@ -675,11 +675,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j, k - 2 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(ψ, i, j, k - 2 - $add, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) @@ -689,11 +689,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j, k - 3 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(ψ, i, j, k - 3 - $add, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) @@ -703,11 +703,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j, k - 4 - $add, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(ψ, i, j, k - 4 - $add, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) diff --git a/src/Advection/weno_function_stencils.jl b/src/Advection/weno_function_stencils.jl index 63cc8d7ecc..b8f36a9b9c 100644 --- a/src/Advection/weno_function_stencils.jl +++ b/src/Advection/weno_function_stencils.jl @@ -324,11 +324,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) ψ₁ = ψ₀ + ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) - ϕ₀ = getvalue(VI.func, i, j - 1 - $add, k, grid, args...) ϕ₁ = ϕ₀ + ϕ₀ = getvalue(VI.func, i, j - 1 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 2, scheme, $val, idx, loc) @@ -363,13 +363,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) - ϕ₀ = getvalue(VI.func, i, j - 1 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ + ϕ₀ = getvalue(VI.func, i, j - 1 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 2, scheme, $val, idx, loc) @@ -379,13 +379,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) - ϕ₀ = getvalue(VI.func, i, j - 2 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ + ϕ₀ = getvalue(VI.func, i, j - 2 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 3, scheme, $val, idx, loc) @@ -422,15 +422,15 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) - ϕ₀ = getvalue(VI.func, i, j - 1 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ + ϕ₀ = getvalue(VI.func, i, j - 1 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 2, scheme, $val, idx, loc) @@ -440,15 +440,15 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) - ϕ₀ = getvalue(VI.func, i, j - 2 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ + ϕ₀ = getvalue(VI.func, i, j - 2 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 3, scheme, $val, idx, loc) @@ -458,15 +458,15 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j - 3 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₀ = getvalue(ψ, i, j - 3 - $add, k, grid, args...) - ϕ₀ = getvalue(VI.func, i, j - 3 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ + ϕ₀ = getvalue(VI.func, i, j - 3 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 4, scheme, $val, idx, loc) @@ -505,17 +505,17 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) - ϕ₀ = getvalue(VI.func, i, j - 1 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ + ϕ₀ = getvalue(VI.func, i, j - 1 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 2, scheme, $val, idx, loc) @@ -525,17 +525,17 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) - ϕ₀ = getvalue(VI.func, i, j - 2 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ + ϕ₀ = getvalue(VI.func, i, j - 2 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 3, scheme, $val, idx, loc) @@ -545,17 +545,17 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j - 3 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(ψ, i, j - 3 - $add, k, grid, args...) - ϕ₀ = getvalue(VI.func, i, j - 3 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ + ϕ₀ = getvalue(VI.func, i, j - 3 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 4, scheme, $val, idx, loc) @@ -565,17 +565,17 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i, j - 4 - $add, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(ψ, i, j - 4 - $add, k, grid, args...) - ϕ₀ = getvalue(VI.func, i, j - 4 - $add, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ + ϕ₀ = getvalue(VI.func, i, j - 4 - $add, k, grid, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 5, scheme, $val, idx, loc) diff --git a/src/Advection/weno_velocity_stencils.jl b/src/Advection/weno_velocity_stencils.jl index 945dd65aa9..3a24dbd1b5 100644 --- a/src/Advection/weno_velocity_stencils.jl +++ b/src/Advection/weno_velocity_stencils.jl @@ -30,15 +30,15 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = ψ(i - 1 - $add, j, k, grid, u, v) ψ₁ = ψ₀ + ψ₀ = ψ(i - 1 - $add, j, k, grid, u, v) - u₀ = ℑyᵃᶠᵃ(i - 1 - $add, j, k, grid, u) u₁ = u₀ + u₀ = ℑyᵃᶠᵃ(i - 1 - $add, j, k, grid, u) - v₀ = ℑxᶠᵃᵃ(i - 1 - $add, j, k, grid, v) v₁ = v₀ - + v₀ = ℑxᶠᵃᵃ(i - 1 - $add, j, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (u₀, u₁), (v₀, v₁), 2, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(3), Val(1)) @@ -76,18 +76,18 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = ψ(i - 1 - $add, j, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ - - u₀ = ℑyᵃᶠᵃ(i - 1 - $add, j, k, grid, u) + ψ₀ = ψ(i - 1 - $add, j, k, grid, u, v) + u₁ = u₀ u₂ = u₁ - - v₀ = ℑxᶠᵃᵃ(i - 1 - $add, j, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i - 1 - $add, j, k, grid, u) + v₁ = v₀ v₂ = v₁ - + v₀ = ℑxᶠᵃᵃ(i - 1 - $add, j, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 2, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(3), Val(1)) @@ -96,18 +96,18 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i - 2 - $add, j, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ - - u₀ = ℑyᵃᶠᵃ(i - 2 - $add, j, k, grid, u) + ψ₀ = ψ(i - 2 - $add, j, k, grid, u, v) + u₁ = u₀ u₂ = u₁ - - v₀ = ℑxᶠᵃᵃ(i - 2 - $add, j, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i - 2 - $add, j, k, grid, u) + v₁ = v₀ v₂ = v₁ - + v₀ = ℑxᶠᵃᵃ(i - 2 - $add, j, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 3, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(3), Val(2)) @@ -148,21 +148,21 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = ψ(i - 1 - $add, j, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - - u₀ = ℑyᵃᶠᵃ(i - 1 - $add, j, k, grid, u) + ψ₀ = ψ(i - 1 - $add, j, k, grid, u, v) + u₁ = u₀ u₂ = u₁ u₃ = u₂ - - v₀ = ℑxᶠᵃᵃ(i - 1 - $add, j, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i - 1 - $add, j, k, grid, u) + v₁ = v₀ v₂ = v₁ v₃ = v₂ - + v₀ = ℑxᶠᵃᵃ(i - 1 - $add, j, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 2, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(4), Val(1)) @@ -171,21 +171,21 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i - 2 - $add, j, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - - u₀ = ℑyᵃᶠᵃ(i - 2 - $add, j, k, grid, u) + ψ₀ = ψ(i - 2 - $add, j, k, grid, u, v) + u₁ = u₀ u₂ = u₁ u₃ = u₂ - - v₀ = ℑxᶠᵃᵃ(i - 2 - $add, j, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i - 2 - $add, j, k, grid, u) + v₁ = v₀ v₂ = v₁ v₃ = v₂ - + v₀ = ℑxᶠᵃᵃ(i - 2 - $add, j, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 3, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(4), Val(2)) @@ -194,21 +194,21 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i - 3 - $add, j, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - - u₀ = ℑyᵃᶠᵃ(i - 3 - $add, j, k, grid, u) + ψ₀ = ψ(i - 3 - $add, j, k, grid, u, v) + u₁ = u₀ u₂ = u₁ u₃ = u₂ - - v₀ = ℑxᶠᵃᵃ(i - 3 - $add, j, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i - 3 - $add, j, k, grid, u) + v₁ = v₀ v₂ = v₁ v₃ = v₂ - + v₀ = ℑxᶠᵃᵃ(i - 3 - $add, j, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 4, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(4), Val(3)) @@ -252,24 +252,24 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = ψ(i - 1 - $add, j, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - - u₀ = ℑyᵃᶠᵃ(i - 1 - $add, j, k, grid, u) + ψ₀ = ψ(i - 1 - $add, j, k, grid, u, v) + u₁ = u₀ u₂ = u₁ u₃ = u₂ u₄ = u₃ - - v₀ = ℑxᶠᵃᵃ(i - 1 - $add, j, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i - 1 - $add, j, k, grid, u) + v₁ = v₀ v₂ = v₁ v₃ = v₂ v₄ = v₃ - + v₀ = ℑxᶠᵃᵃ(i - 1 - $add, j, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 2, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(5), Val(1)) @@ -278,24 +278,24 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i - 2 - $add, j, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - - u₀ = ℑyᵃᶠᵃ(i - 2 - $add, j, k, grid, u) + ψ₀ = ψ(i - 2 - $add, j, k, grid, u, v) + u₁ = u₀ u₂ = u₁ u₃ = u₂ u₄ = u₃ - - v₀ = ℑxᶠᵃᵃ(i - 2 - $add, j, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i - 2 - $add, j, k, grid, u) + v₁ = v₀ v₂ = v₁ v₃ = v₂ v₄ = v₃ - + v₀ = ℑxᶠᵃᵃ(i - 2 - $add, j, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 3, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(5), Val(2)) @@ -304,24 +304,24 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i - 3 - $add, j, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - - u₀ = ℑyᵃᶠᵃ(i - 3 - $add, j, k, grid, u) + ψ₀ = ψ(i - 3 - $add, j, k, grid, u, v) + u₁ = u₀ u₂ = u₁ u₃ = u₂ u₄ = u₃ - - v₀ = ℑxᶠᵃᵃ(i - 3 - $add, j, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i - 3 - $add, j, k, grid, u) + v₁ = v₀ v₂ = v₁ v₃ = v₂ v₄ = v₃ - + v₀ = ℑxᶠᵃᵃ(i - 3 - $add, j, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 4, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(5), Val(3)) @@ -330,24 +330,24 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i - 4 - $add, j, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - - u₀ = ℑyᵃᶠᵃ(i - 4 - $add, j, k, grid, u) + ψ₀ = ψ(i - 4 - $add, j, k, grid, u, v) + u₁ = u₀ u₂ = u₁ u₃ = u₂ u₄ = u₃ - - v₀ = ℑxᶠᵃᵃ(i - 4 - $add, j, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i - 4 - $add, j, k, grid, u) + v₁ = v₀ v₂ = v₁ v₃ = v₂ v₄ = v₃ - + v₀ = ℑxᶠᵃᵃ(i - 4 - $add, j, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 5, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(5), Val(4)) @@ -395,15 +395,15 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) ψ₁ = ψ₀ + ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) - u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) u₁ = u₀ + u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) - v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) v₁ = v₀ - + v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (u₀, u₁), (v₀, v₁), 2, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(3), Val(1)) @@ -441,18 +441,18 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ - - u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) + ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) + u₁ = u₀ u₂ = u₁ - - v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) + v₁ = v₀ v₂ = v₁ - + v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 2, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(3), Val(1)) @@ -461,18 +461,18 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i, j - 2 - $add, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ - - u₀ = ℑyᵃᶠᵃ(i, j - 2 - $add, k, grid, u) + ψ₀ = ψ(i, j - 2 - $add, k, grid, u, v) + u₁ = u₀ u₂ = u₁ - - v₀ = ℑxᶠᵃᵃ(i, j - 2 - $add, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i, j - 2 - $add, k, grid, u) + v₁ = v₀ v₂ = v₁ - + v₀ = ℑxᶠᵃᵃ(i, j - 2 - $add, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 3, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(3), Val(2)) @@ -513,21 +513,21 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - - u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) + ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) + u₁ = u₀ u₂ = u₁ u₃ = u₂ - - v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) + v₁ = v₀ v₂ = v₁ v₃ = v₂ - + v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 2, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(4), Val(1)) @@ -536,21 +536,21 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i, j - 2 - $add, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - - u₀ = ℑyᵃᶠᵃ(i, j - 2 - $add, k, grid, u) + ψ₀ = ψ(i, j - 2 - $add, k, grid, u, v) + u₁ = u₀ u₂ = u₁ u₃ = u₂ - - v₀ = ℑxᶠᵃᵃ(i, j - 2 - $add, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i, j - 2 - $add, k, grid, u) + v₁ = v₀ v₂ = v₁ v₃ = v₂ - + v₀ = ℑxᶠᵃᵃ(i, j - 2 - $add, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 3, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(3), Val(2)) @@ -559,21 +559,21 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i, j - 3 - $add, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - - u₀ = ℑyᵃᶠᵃ(i, j - 3 - $add, k, grid, u) + ψ₀ = ψ(i, j - 3 - $add, k, grid, u, v) + u₁ = u₀ u₂ = u₁ u₃ = u₂ - - v₀ = ℑxᶠᵃᵃ(i, j - 3 - $add, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i, j - 3 - $add, k, grid, u) + v₁ = v₀ v₂ = v₁ v₃ = v₂ - + v₀ = ℑxᶠᵃᵃ(i, j - 3 - $add, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 4, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(3), Val(2)) @@ -582,7 +582,6 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - τ = τ^2 return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) @@ -618,24 +617,24 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - - u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) + ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) + u₁ = u₀ u₂ = u₁ u₃ = u₂ u₄ = u₃ - - v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) + v₁ = v₀ v₂ = v₁ v₃ = v₂ v₄ = v₃ - + v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 2, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(5), Val(1)) @@ -644,24 +643,24 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i, j - 2 - $add, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - - u₀ = ℑyᵃᶠᵃ(i, j - 2 - $add, k, grid, u) + ψ₀ = ψ(i, j - 2 - $add, k, grid, u, v) + u₁ = u₀ u₂ = u₁ u₃ = u₂ u₄ = u₃ - - v₀ = ℑxᶠᵃᵃ(i, j - 2 - $add, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i, j - 2 - $add, k, grid, u) + v₁ = v₀ v₂ = v₁ v₃ = v₂ v₄ = v₃ - + v₀ = ℑxᶠᵃᵃ(i, j - 2 - $add, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 3, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(5), Val(2)) @@ -670,24 +669,24 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i, j - 3 - $add, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - - u₀ = ℑyᵃᶠᵃ(i, j - 3 - $add, k, grid, u) + ψ₀ = ψ(i, j - 3 - $add, k, grid, u, v) + u₁ = u₀ u₂ = u₁ u₃ = u₂ u₄ = u₃ - - v₀ = ℑxᶠᵃᵃ(i, j - 3 - $add, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i, j - 3 - $add, k, grid, u) + v₁ = v₀ v₂ = v₁ v₃ = v₂ v₄ = v₃ - + v₀ = ℑxᶠᵃᵃ(i, j - 3 - $add, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 4, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(5), Val(3)) @@ -696,24 +695,24 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i, j - 4 - $add, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - - u₀ = ℑyᵃᶠᵃ(i, j - 4 - $add, k, grid, u) + ψ₀ = ψ(i, j - 4 - $add, k, grid, u, v) + u₁ = u₀ u₂ = u₁ u₃ = u₂ u₄ = u₃ - - v₀ = ℑxᶠᵃᵃ(i, j - 4 - $add, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i, j - 4 - $add, k, grid, u) + v₁ = v₀ v₂ = v₁ v₃ = v₂ v₄ = v₃ - + v₀ = ℑxᶠᵃᵃ(i, j - 4 - $add, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 5, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(5), Val(4)) @@ -760,26 +759,26 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ ψ₅ = ψ₄ + ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) - u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) u₁ = u₀ u₂ = u₁ u₃ = u₂ u₄ = u₃ u₅ = u₄ + u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) - v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) v₁ = v₀ v₂ = v₁ v₃ = v₂ v₄ = v₃ v₅ = v₄ + v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 2, scheme, $val, idx, loc) @@ -789,26 +788,26 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i, j - 2 - $add, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ ψ₅ = ψ₄ + ψ₀ = ψ(i, j - 2 - $add, k, grid, u, v) - u₀ = ℑyᵃᶠᵃ(i, j - 2 - $add, k, grid, u) u₁ = u₀ u₂ = u₁ u₃ = u₂ u₄ = u₃ u₅ = u₄ + u₀ = ℑyᵃᶠᵃ(i, j - 2 - $add, k, grid, u) - v₀ = ℑxᶠᵃᵃ(i, j - 2 - $add, k, grid, v) v₁ = v₀ v₂ = v₁ v₃ = v₂ v₄ = v₃ v₅ = v₄ + v₀ = ℑxᶠᵃᵃ(i, j - 2 - $add, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 3, scheme, $val, idx, loc) @@ -818,26 +817,26 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i, j - 3 - $add, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ ψ₅ = ψ₄ + ψ₀ = ψ(i, j - 3 - $add, k, grid, u, v) - u₀ = ℑyᵃᶠᵃ(i, j - 3 - $add, k, grid, u) u₁ = u₀ u₂ = u₁ u₃ = u₂ u₄ = u₃ u₅ = u₄ + u₀ = ℑyᵃᶠᵃ(i, j - 3 - $add, k, grid, u) - v₀ = ℑxᶠᵃᵃ(i, j - 3 - $add, k, grid, v) v₁ = v₀ v₂ = v₁ v₃ = v₂ v₄ = v₃ v₅ = v₄ + v₀ = ℑxᶠᵃᵃ(i, j - 3 - $add, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 4, scheme, $val, idx, loc) @@ -847,27 +846,27 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i, j - 4 - $add, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ ψ₅ = ψ₄ - - u₀ = ℑyᵃᶠᵃ(i, j - 4 - $add, k, grid, u) + ψ₀ = ψ(i, j - 4 - $add, k, grid, u, v) + u₁ = u₀ u₂ = u₁ u₃ = u₂ u₄ = u₃ u₅ = u₄ - - v₀ = ℑxᶠᵃᵃ(i, j - 4 - $add, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i, j - 4 - $add, k, grid, u) + v₁ = v₀ v₂ = v₁ v₃ = v₂ v₄ = v₃ v₅ = v₄ - + v₀ = ℑxᶠᵃᵃ(i, j - 4 - $add, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 5, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(6), Val(4)) @@ -876,27 +875,27 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = ψ(i, j - 5 - $add, k, grid, u, v) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ ψ₅ = ψ₄ - - u₀ = ℑyᵃᶠᵃ(i, j - 5 - $add, k, grid, u) + ψ₀ = ψ(i, j - 5 - $add, k, grid, u, v) + u₁ = u₀ u₂ = u₁ u₃ = u₂ u₄ = u₃ u₅ = u₄ - - v₀ = ℑxᶠᵃᵃ(i, j - 5 - $add, k, grid, v) + u₀ = ℑyᵃᶠᵃ(i, j - 5 - $add, k, grid, u) + v₁ = v₀ v₂ = v₁ v₃ = v₂ v₄ = v₃ v₅ = v₄ - + v₀ = ℑxᶠᵃᵃ(i, j - 5 - $add, k, grid, v) + # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 6, scheme, $val, idx, loc) τ += add_global_smoothness(β, Val(6), Val(5)) From 46d306b38ad283758bfecb14015425b4c645360e Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 19 Mar 2024 13:35:25 -0400 Subject: [PATCH 135/152] fix getvalue --- src/Advection/weno_default_stencils.jl | 148 ++++++++--------- src/Advection/weno_function_stencils.jl | 202 ++++++++++++------------ 2 files changed, 175 insertions(+), 175 deletions(-) diff --git a/src/Advection/weno_default_stencils.jl b/src/Advection/weno_default_stencils.jl index 09da84aee3..afaa17ff15 100644 --- a/src/Advection/weno_default_stencils.jl +++ b/src/Advection/weno_default_stencils.jl @@ -1,5 +1,5 @@ -@inline getvalue(ψ, i, j, k, grid, args...) = @inbounds ψ[i, j, k] -@inline getvalue(ψ::Function, i, j, k, grid, args...) = ψ(i, j, k, grid, args...) +@inline getvalue(i, j, k, grid, ψ, args...) = @inbounds ψ[i, j, k] +@inline getvalue(i, j, k, grid, ψ::Function, args...) = ψ(i, j, k, grid, args...) ##### ##### STENCILS IN X @@ -29,8 +29,8 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i - $add, j, k, grid, args...) - ψ₁ = getvalue(ψ, i + 1 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - $add, j, k, grid, ψ, args...) + ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) τ = β @@ -39,7 +39,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) ψ₁ = ψ₀ # Stencil S₁ @@ -60,9 +60,9 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i - $add, j, k, grid, args...) - ψ₁ = getvalue(ψ, i + 1 - $add, j, k, grid, args...) - ψ₂ = getvalue(ψ, i + 2 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - $add, j, k, grid, ψ, args...) + ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) + ψ₂ = getvalue(i + 2 - $add, j, k, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) τ = β @@ -71,7 +71,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ @@ -83,7 +83,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i - 2 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ @@ -105,10 +105,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i - $add, j, k, grid, args...) - ψ₁ = getvalue(ψ, i + 1 - $add, j, k, grid, args...) - ψ₂ = getvalue(ψ, i + 2 - $add, j, k, grid, args...) - ψ₃ = getvalue(ψ, i + 3 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - $add, j, k, grid, ψ, args...) + ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) + ψ₂ = getvalue(i + 2 - $add, j, k, grid, ψ, args...) + ψ₃ = getvalue(i + 3 - $add, j, k, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) τ = β @@ -117,7 +117,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -130,7 +130,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i - 2 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -143,7 +143,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i - 3 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - 3 - $add, j, k, grid, ψ, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ @@ -166,11 +166,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i - $add, j, k, grid, args...) - ψ₁ = getvalue(ψ, i + 1 - $add, j, k, grid, args...) - ψ₂ = getvalue(ψ, i + 2 - $add, j, k, grid, args...) - ψ₃ = getvalue(ψ, i + 3 - $add, j, k, grid, args...) - ψ₄ = getvalue(ψ, i + 4 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - $add, j, k, grid, ψ, args...) + ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) + ψ₂ = getvalue(i + 2 - $add, j, k, grid, ψ, args...) + ψ₃ = getvalue(i + 3 - $add, j, k, grid, ψ, args...) + ψ₄ = getvalue(i + 4 - $add, j, k, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) τ = β @@ -183,7 +183,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) @@ -197,7 +197,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ψ₀ = getvalue(ψ, i - 2 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) @@ -211,7 +211,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ψ₀ = getvalue(ψ, i - 3 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - 3 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) @@ -225,7 +225,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ψ₀ = getvalue(ψ, i - 4 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - 4 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) @@ -270,8 +270,8 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i, j - $add, k, grid, args...) - ψ₁ = getvalue(ψ, i, j + 1 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - $add, k, grid, ψ, args...) + ψ₁ = getvalue(i, j + 1 - $add, k, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) τ = β @@ -281,7 +281,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) w₂ = α ψ₁ = ψ₀ - ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) @@ -301,9 +301,9 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i, j - $add, k, grid, args...) - ψ₁ = getvalue(ψ, i, j + 1 - $add, k, grid, args...) - ψ₂ = getvalue(ψ, i, j + 2 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - $add, k, grid, ψ, args...) + ψ₁ = getvalue(i, j + 1 - $add, k, grid, ψ, args...) + ψ₂ = getvalue(i, j + 2 - $add, k, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) τ = β @@ -314,7 +314,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₁ = ψ₀ ψ₂ = ψ₁ - ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) @@ -326,7 +326,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₁ = ψ₀ ψ₂ = ψ₁ - ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) @@ -346,10 +346,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i, j - $add, k, grid, args...) - ψ₁ = getvalue(ψ, i, j + 1 - $add, k, grid, args...) - ψ₂ = getvalue(ψ, i, j + 2 - $add, k, grid, args...) - ψ₃ = getvalue(ψ, i, j + 3 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - $add, k, grid, ψ, args...) + ψ₁ = getvalue(i, j + 1 - $add, k, grid, ψ, args...) + ψ₂ = getvalue(i, j + 2 - $add, k, grid, ψ, args...) + ψ₃ = getvalue(i, j + 3 - $add, k, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) τ = β @@ -361,7 +361,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) @@ -374,7 +374,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) @@ -387,7 +387,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - ψ₀ = getvalue(ψ, i, j - 3 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 3 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) @@ -407,11 +407,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i, j - $add, k, grid, args...) - ψ₁ = getvalue(ψ, i, j + 1 - $add, k, grid, args...) - ψ₂ = getvalue(ψ, i, j + 2 - $add, k, grid, args...) - ψ₃ = getvalue(ψ, i, j + 3 - $add, k, grid, args...) - ψ₄ = getvalue(ψ, i, j + 4 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - $add, k, grid, ψ, args...) + ψ₁ = getvalue(i, j + 1 - $add, k, grid, ψ, args...) + ψ₂ = getvalue(i, j + 2 - $add, k, grid, ψ, args...) + ψ₃ = getvalue(i, j + 3 - $add, k, grid, ψ, args...) + ψ₄ = getvalue(i, j + 4 - $add, k, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) τ = β @@ -424,7 +424,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) @@ -438,7 +438,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) @@ -452,7 +452,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ψ₀ = getvalue(ψ, i, j - 3 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 3 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) @@ -466,7 +466,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ψ₀ = getvalue(ψ, i, j - 4 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 4 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) @@ -511,8 +511,8 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i, j, k - $add, grid, args...) - ψ₁ = getvalue(ψ, i, j, k + 1 - $add, grid, args...) + ψ₀ = getvalue(i, j, k - $add, grid, ψ, args...) + ψ₁ = getvalue(i, j, k + 1 - $add, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) τ = β @@ -522,7 +522,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) w₂ = α ψ₁ = ψ₀ - ψ₀ = getvalue(ψ, i, j, k - 1 - $add, grid, args...) + ψ₀ = getvalue(i, j, k - 1 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) @@ -542,9 +542,9 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i, j, k - $add, grid, args...) - ψ₁ = getvalue(ψ, i, j, k + 1 - $add, grid, args...) - ψ₂ = getvalue(ψ, i, j, k + 2 - $add, grid, args...) + ψ₀ = getvalue(i, j, k - $add, grid, ψ, args...) + ψ₁ = getvalue(i, j, k + 1 - $add, grid, ψ, args...) + ψ₂ = getvalue(i, j, k + 2 - $add, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) τ = β @@ -555,7 +555,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₁ = ψ₀ ψ₂ = ψ₁ - ψ₀ = getvalue(ψ, i, j, k - 1 - $add, grid, args...) + ψ₀ = getvalue(i, j, k - 1 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) @@ -567,7 +567,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₁ = ψ₀ ψ₂ = ψ₁ - ψ₀ = getvalue(ψ, i, j, k - 2 - $add, grid, args...) + ψ₀ = getvalue(i, j, k - 2 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) @@ -587,10 +587,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i, j, k - $add, grid, args...) - ψ₁ = getvalue(ψ, i, j, k + 1 - $add, grid, args...) - ψ₂ = getvalue(ψ, i, j, k + 2 - $add, grid, args...) - ψ₃ = getvalue(ψ, i, j, k + 3 - $add, grid, args...) + ψ₀ = getvalue(i, j, k - $add, grid, ψ, args...) + ψ₁ = getvalue(i, j, k + 1 - $add, grid, ψ, args...) + ψ₂ = getvalue(i, j, k + 2 - $add, grid, ψ, args...) + ψ₃ = getvalue(i, j, k + 3 - $add, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) τ = β @@ -602,7 +602,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - ψ₀ = getvalue(ψ, i, j, k - 1 - $add, grid, args...) + ψ₀ = getvalue(i, j, k - 1 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) @@ -615,7 +615,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - ψ₀ = getvalue(ψ, i, j, k - 2 - $add, grid, args...) + ψ₀ = getvalue(i, j, k - 2 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) @@ -628,7 +628,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - ψ₀ = getvalue(ψ, i, j, k - 3 - $add, grid, args...) + ψ₀ = getvalue(i, j, k - 3 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) @@ -648,11 +648,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i, j, k - $add, grid, args...) - ψ₁ = getvalue(ψ, i, j, k + 1 - $add, grid, args...) - ψ₂ = getvalue(ψ, i, j, k + 2 - $add, grid, args...) - ψ₃ = getvalue(ψ, i, j, k + 3 - $add, grid, args...) - ψ₄ = getvalue(ψ, i, j, k + 4 - $add, grid, args...) + ψ₀ = getvalue(i, j, k - $add, grid, ψ, args...) + ψ₁ = getvalue(i, j, k + 1 - $add, grid, ψ, args...) + ψ₂ = getvalue(i, j, k + 2 - $add, grid, ψ, args...) + ψ₃ = getvalue(i, j, k + 3 - $add, grid, ψ, args...) + ψ₄ = getvalue(i, j, k + 4 - $add, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) τ = β @@ -665,7 +665,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ψ₀ = getvalue(ψ, i, j, k - 1 - $add, grid, args...) + ψ₀ = getvalue(i, j, k - 1 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) @@ -679,7 +679,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ψ₀ = getvalue(ψ, i, j, k - 2 - $add, grid, args...) + ψ₀ = getvalue(i, j, k - 2 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) @@ -693,7 +693,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ψ₀ = getvalue(ψ, i, j, k - 3 - $add, grid, args...) + ψ₀ = getvalue(i, j, k - 3 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) @@ -707,7 +707,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ψ₀ = getvalue(ψ, i, j, k - 4 - $add, grid, args...) + ψ₀ = getvalue(i, j, k - 4 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) diff --git a/src/Advection/weno_function_stencils.jl b/src/Advection/weno_function_stencils.jl index b8f36a9b9c..f1ca6eabc7 100644 --- a/src/Advection/weno_function_stencils.jl +++ b/src/Advection/weno_function_stencils.jl @@ -14,11 +14,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i - $add, j, k, grid, args...) - ψ₁ = getvalue(ψ, i + 1 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - $add, j, k, grid, ψ, args...) + ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) - ϕ₀ = getvalue(VI.func, i - $add, j, k, grid, args...) - ϕ₁ = getvalue(VI.func, i + 1 - $add, j, k, grid, args...) + ϕ₀ = getvalue(i - $add, j, k, grid, VI.func, args...) + ϕ₁ = getvalue(i + 1 - $add, j, k, grid, VI.func, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 1, scheme, $val, idx, loc) τ = β @@ -27,11 +27,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) ψ₁ = ψ₀ + ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) - ϕ₀ = getvalue(VI.func, i - 1 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ + ϕ₀ = getvalue(i - 1 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 2, scheme, $val, idx, loc) @@ -51,13 +51,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i - $add, j, k, grid, args...) - ψ₁ = getvalue(ψ, i + 1 - $add, j, k, grid, args...) - ψ₂ = getvalue(ψ, i + 2 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - $add, j, k, grid, ψ, args...) + ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) + ψ₂ = getvalue(i + 2 - $add, j, k, grid, ψ, args...) - ϕ₀ = getvalue(VI.func, i - $add, j, k, grid, args...) - ϕ₁ = getvalue(VI.func, i + 1 - $add, j, k, grid, args...) - ϕ₂ = getvalue(VI.func, i + 2 - $add, j, k, grid, args...) + ϕ₀ = getvalue(i - $add, j, k, grid, VI.func, args...) + ϕ₁ = getvalue(i + 1 - $add, j, k, grid, VI.func, args...) + ϕ₂ = getvalue(i + 2 - $add, j, k, grid, VI.func, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 1, scheme, $val, idx, loc) τ = β @@ -66,13 +66,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) - ϕ₀ = getvalue(VI.func, i - 1 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ + ϕ₀ = getvalue(i - 1 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 2, scheme, $val, idx, loc) @@ -82,13 +82,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i - 2 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) - ϕ₀ = getvalue(VI.func, i - 2 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ + ϕ₀ = getvalue(i - 2 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 3, scheme, $val, idx, loc) @@ -108,15 +108,15 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i - $add, j, k, grid, args...) - ψ₁ = getvalue(ψ, i + 1 - $add, j, k, grid, args...) - ψ₂ = getvalue(ψ, i + 2 - $add, j, k, grid, args...) - ψ₃ = getvalue(ψ, i + 3 - $add, j, k, grid, args...) - - ϕ₀ = getvalue(VI.func, i - $add, j, k, grid, args...) - ϕ₁ = getvalue(VI.func, i + 1 - $add, j, k, grid, args...) - ϕ₂ = getvalue(VI.func, i + 2 - $add, j, k, grid, args...) - ϕ₃ = getvalue(VI.func, i + 3 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - $add, j, k, grid, ψ, args...) + ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) + ψ₂ = getvalue(i + 2 - $add, j, k, grid, ψ, args...) + ψ₃ = getvalue(i + 3 - $add, j, k, grid, ψ, args...) + + ϕ₀ = getvalue(i - $add, j, k, grid, VI.func, args...) + ϕ₁ = getvalue(i + 1 - $add, j, k, grid, VI.func, args...) + ϕ₂ = getvalue(i + 2 - $add, j, k, grid, VI.func, args...) + ϕ₃ = getvalue(i + 3 - $add, j, k, grid, VI.func, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 1, scheme, $val, idx, loc) τ = β @@ -125,15 +125,15 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) - ϕ₀ = getvalue(VI.func, i - 1 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ + ϕ₀ = getvalue(i - 1 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 2, scheme, $val, idx, loc) @@ -143,15 +143,15 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i - 2 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) - ϕ₀ = getvalue(VI.func, i - 2 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ + ϕ₀ = getvalue(i - 2 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 3, scheme, $val, idx, loc) @@ -161,15 +161,15 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i - 3 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₀ = getvalue(i - 3 - $add, j, k, grid, ψ, args...) - ϕ₀ = getvalue(VI.func, i - 3 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ + ϕ₀ = getvalue(i - 3 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 4, scheme, $val, idx, loc) @@ -190,17 +190,17 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i - $add, j, k, grid, args...) - ψ₁ = getvalue(ψ, i + 1 - $add, j, k, grid, args...) - ψ₂ = getvalue(ψ, i + 2 - $add, j, k, grid, args...) - ψ₃ = getvalue(ψ, i + 3 - $add, j, k, grid, args...) - ψ₄ = getvalue(ψ, i + 4 - $add, j, k, grid, args...) - - ϕ₀ = getvalue(VI.func, i - $add, j, k, grid, args...) - ϕ₁ = getvalue(VI.func, i + 1 - $add, j, k, grid, args...) - ϕ₂ = getvalue(VI.func, i + 2 - $add, j, k, grid, args...) - ϕ₃ = getvalue(VI.func, i + 3 - $add, j, k, grid, args...) - ϕ₄ = getvalue(VI.func, i + 4 - $add, j, k, grid, args...) + ψ₀ = getvalue(i - $add, j, k, grid, ψ, args...) + ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) + ψ₂ = getvalue(i + 2 - $add, j, k, grid, ψ, args...) + ψ₃ = getvalue(i + 3 - $add, j, k, grid, ψ, args...) + ψ₄ = getvalue(i + 4 - $add, j, k, grid, ψ, args...) + + ϕ₀ = getvalue(i - $add, j, k, grid, VI.func, args...) + ϕ₁ = getvalue(i + 1 - $add, j, k, grid, VI.func, args...) + ϕ₂ = getvalue(i + 2 - $add, j, k, grid, VI.func, args...) + ϕ₃ = getvalue(i + 3 - $add, j, k, grid, VI.func, args...) + ϕ₄ = getvalue(i + 4 - $add, j, k, grid, VI.func, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 1, scheme, $val, idx, loc) τ = β @@ -209,17 +209,17 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(ψ, i - 1 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) - ϕ₀ = getvalue(VI.func, i - 1 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ + ϕ₀ = getvalue(i - 1 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 2, scheme, $val, idx, loc) @@ -229,17 +229,17 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i - 2 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) - ϕ₀ = getvalue(VI.func, i - 2 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ - ϕ₄ = ϕ₃ + ϕ₄ = ϕ₃ + ϕ₀ = getvalue(i - 2 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 3, scheme, $val, idx, loc) @@ -249,17 +249,17 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i - 3 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(i - 3 - $add, j, k, grid, ψ, args...) - ϕ₀ = getvalue(VI.func, i - 3 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ + ϕ₀ = getvalue(i - 3 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 4, scheme, $val, idx, loc) @@ -269,17 +269,17 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(ψ, i - 4 - $add, j, k, grid, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₀ = getvalue(i - 4 - $add, j, k, grid, ψ, args...) - ϕ₀ = getvalue(VI.func, i - 4 - $add, j, k, grid, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ + ϕ₀ = getvalue(i - 4 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 5, scheme, $val, idx, loc) @@ -311,11 +311,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i, j - $add, k, grid, args...) - ψ₁ = getvalue(ψ, i, j + 1 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - $add, k, grid, ψ, args...) + ψ₁ = getvalue(i, j + 1 - $add, k, grid, ψ, args...) - ϕ₀ = getvalue(VI.func, i, j - $add, k, grid, args...) - ϕ₁ = getvalue(VI.func, i, j + 1 - $add, k, grid, args...) + ϕ₀ = getvalue(i, j - $add, k, grid, VI.func, args...) + ϕ₁ = getvalue(i, j + 1 - $add, k, grid, VI.func, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 1, scheme, $val, idx, loc) τ = β @@ -325,10 +325,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) w₂ = α ψ₁ = ψ₀ - ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) ϕ₁ = ϕ₀ - ϕ₀ = getvalue(VI.func, i, j - 1 - $add, k, grid, args...) + ϕ₀ = getvalue(i, j - 1 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 2, scheme, $val, idx, loc) @@ -348,13 +348,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i, j - $add, k, grid, args...) - ψ₁ = getvalue(ψ, i, j + 1 - $add, k, grid, args...) - ψ₂ = getvalue(ψ, i, j + 2 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - $add, k, grid, ψ, args...) + ψ₁ = getvalue(i, j + 1 - $add, k, grid, ψ, args...) + ψ₂ = getvalue(i, j + 2 - $add, k, grid, ψ, args...) - ϕ₀ = getvalue(VI.func, i, j - $add, k, grid, args...) - ϕ₁ = getvalue(VI.func, i, j + 1 - $add, k, grid, args...) - ϕ₂ = getvalue(VI.func, i, j + 2 - $add, k, grid, args...) + ϕ₀ = getvalue(i, j - $add, k, grid, VI.func, args...) + ϕ₁ = getvalue(i, j + 1 - $add, k, grid, VI.func, args...) + ϕ₂ = getvalue(i, j + 2 - $add, k, grid, VI.func, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 1, scheme, $val, idx, loc) τ = β @@ -365,11 +365,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₁ = ψ₀ ψ₂ = ψ₁ - ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ - ϕ₀ = getvalue(VI.func, i, j - 1 - $add, k, grid, args...) + ϕ₀ = getvalue(i, j - 1 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 2, scheme, $val, idx, loc) @@ -381,11 +381,11 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₁ = ψ₀ ψ₂ = ψ₁ - ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ - ϕ₀ = getvalue(VI.func, i, j - 2 - $add, k, grid, args...) + ϕ₀ = getvalue(i, j - 2 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 3, scheme, $val, idx, loc) @@ -405,15 +405,15 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i, j - $add, k, grid, args...) - ψ₁ = getvalue(ψ, i, j + 1 - $add, k, grid, args...) - ψ₂ = getvalue(ψ, i, j + 2 - $add, k, grid, args...) - ψ₃ = getvalue(ψ, i, j + 3 - $add, k, grid, args...) - - ϕ₀ = getvalue(VI.func, i, j - $add, k, grid, args...) - ϕ₁ = getvalue(VI.func, i, j + 1 - $add, k, grid, args...) - ϕ₂ = getvalue(VI.func, i, j + 2 - $add, k, grid, args...) - ϕ₃ = getvalue(VI.func, i, j + 3 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - $add, k, grid, ψ, args...) + ψ₁ = getvalue(i, j + 1 - $add, k, grid, ψ, args...) + ψ₂ = getvalue(i, j + 2 - $add, k, grid, ψ, args...) + ψ₃ = getvalue(i, j + 3 - $add, k, grid, ψ, args...) + + ϕ₀ = getvalue(i, j - $add, k, grid, VI.func, args...) + ϕ₁ = getvalue(i, j + 1 - $add, k, grid, VI.func, args...) + ϕ₂ = getvalue(i, j + 2 - $add, k, grid, VI.func, args...) + ϕ₃ = getvalue(i, j + 3 - $add, k, grid, VI.func, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 1, scheme, $val, idx, loc) τ = β @@ -425,12 +425,12 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ - ϕ₀ = getvalue(VI.func, i, j - 1 - $add, k, grid, args...) + ϕ₀ = getvalue(i, j - 1 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 2, scheme, $val, idx, loc) @@ -443,12 +443,12 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ - ϕ₀ = getvalue(VI.func, i, j - 2 - $add, k, grid, args...) + ϕ₀ = getvalue(i, j - 2 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 3, scheme, $val, idx, loc) @@ -461,12 +461,12 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ - ψ₀ = getvalue(ψ, i, j - 3 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 3 - $add, k, grid, ψ, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ - ϕ₀ = getvalue(VI.func, i, j - 3 - $add, k, grid, args...) + ϕ₀ = getvalue(i, j - 3 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 4, scheme, $val, idx, loc) @@ -486,17 +486,17 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(ψ, i, j - $add, k, grid, args...) - ψ₁ = getvalue(ψ, i, j + 1 - $add, k, grid, args...) - ψ₂ = getvalue(ψ, i, j + 2 - $add, k, grid, args...) - ψ₃ = getvalue(ψ, i, j + 3 - $add, k, grid, args...) - ψ₄ = getvalue(ψ, i, j + 4 - $add, k, grid, args...) - - ϕ₀ = getvalue(VI.func, i, j - $add, k, grid, args...) - ϕ₁ = getvalue(VI.func, i, j + 1 - $add, k, grid, args...) - ϕ₂ = getvalue(VI.func, i, j + 2 - $add, k, grid, args...) - ϕ₃ = getvalue(VI.func, i, j + 3 - $add, k, grid, args...) - ϕ₄ = getvalue(VI.func, i, j + 4 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - $add, k, grid, ψ, args...) + ψ₁ = getvalue(i, j + 1 - $add, k, grid, ψ, args...) + ψ₂ = getvalue(i, j + 2 - $add, k, grid, ψ, args...) + ψ₃ = getvalue(i, j + 3 - $add, k, grid, ψ, args...) + ψ₄ = getvalue(i, j + 4 - $add, k, grid, ψ, args...) + + ϕ₀ = getvalue(i, j - $add, k, grid, VI.func, args...) + ϕ₁ = getvalue(i, j + 1 - $add, k, grid, VI.func, args...) + ϕ₂ = getvalue(i, j + 2 - $add, k, grid, VI.func, args...) + ϕ₃ = getvalue(i, j + 3 - $add, k, grid, VI.func, args...) + ϕ₄ = getvalue(i, j + 4 - $add, k, grid, VI.func, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 1, scheme, $val, idx, loc) τ = β @@ -509,13 +509,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ψ₀ = getvalue(ψ, i, j - 1 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ - ϕ₀ = getvalue(VI.func, i, j - 1 - $add, k, grid, args...) + ϕ₀ = getvalue(i, j - 1 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 2, scheme, $val, idx, loc) @@ -529,13 +529,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ψ₀ = getvalue(ψ, i, j - 2 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ - ϕ₀ = getvalue(VI.func, i, j - 2 - $add, k, grid, args...) + ϕ₀ = getvalue(i, j - 2 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 3, scheme, $val, idx, loc) @@ -549,13 +549,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ψ₀ = getvalue(ψ, i, j - 3 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 3 - $add, k, grid, ψ, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ - ϕ₀ = getvalue(VI.func, i, j - 3 - $add, k, grid, args...) + ϕ₀ = getvalue(i, j - 3 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 4, scheme, $val, idx, loc) @@ -569,13 +569,13 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₂ = ψ₁ ψ₃ = ψ₂ ψ₄ = ψ₃ - ψ₀ = getvalue(ψ, i, j - 4 - $add, k, grid, args...) + ψ₀ = getvalue(i, j - 4 - $add, k, grid, ψ, args...) ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ - ϕ₀ = getvalue(VI.func, i, j - 4 - $add, k, grid, args...) + ϕ₀ = getvalue(i, j - 4 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 5, scheme, $val, idx, loc) From cae5f0230bc6ee8f2826966756f7f056814eb720 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 19 Mar 2024 14:41:32 -0400 Subject: [PATCH 136/152] improve scheme --- src/Advection/weno_default_stencils.jl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Advection/weno_default_stencils.jl b/src/Advection/weno_default_stencils.jl index afaa17ff15..bdfb4250ec 100644 --- a/src/Advection/weno_default_stencils.jl +++ b/src/Advection/weno_default_stencils.jl @@ -39,8 +39,8 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) ψ₁ = ψ₀ + ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) @@ -71,9 +71,9 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) @@ -83,9 +83,9 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) @@ -117,10 +117,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) @@ -130,10 +130,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) @@ -143,10 +143,10 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ̂₂ += ψ̅ * α w₂ += α - ψ₀ = getvalue(i - 3 - $add, j, k, grid, ψ, args...) ψ₁ = ψ₀ ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₀ = getvalue(i - 3 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) From 8ed24802a2d2c240f0417b1a9a8e404c7c099b8a Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 19 Mar 2024 17:41:11 -0400 Subject: [PATCH 137/152] remove useless file --- src/Advection/weno_2.jl | 38 --- src/Advection/weno_3.jl | 45 --- src/Advection/weno_4.jl | 53 ---- src/Advection/weno_5.jl | 61 ---- src/Advection/weno_6.jl | 69 ----- src/Advection/weno_default.jl | 324 ------------------- src/Advection/weno_phi.jl | 256 --------------- src/Advection/weno_vi.jl | 569 ---------------------------------- 8 files changed, 1415 deletions(-) delete mode 100644 src/Advection/weno_2.jl delete mode 100644 src/Advection/weno_3.jl delete mode 100644 src/Advection/weno_4.jl delete mode 100644 src/Advection/weno_5.jl delete mode 100644 src/Advection/weno_6.jl delete mode 100644 src/Advection/weno_default.jl delete mode 100644 src/Advection/weno_phi.jl delete mode 100644 src/Advection/weno_vi.jl diff --git a/src/Advection/weno_2.jl b/src/Advection/weno_2.jl deleted file mode 100644 index 6449b4de71..0000000000 --- a/src/Advection/weno_2.jl +++ /dev/null @@ -1,38 +0,0 @@ - -for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) - weno_interpolant = Symbol(side, :_weno_interpolant_, dir) - - @eval begin - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2}, - ψ, idx, loc, args...) - - # Stencil S₀ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) - τ += add_global_smoothness(β, Val(2), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) - end - end -end \ No newline at end of file diff --git a/src/Advection/weno_3.jl b/src/Advection/weno_3.jl deleted file mode 100644 index a4a8e21186..0000000000 --- a/src/Advection/weno_3.jl +++ /dev/null @@ -1,45 +0,0 @@ -for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) - weno_interpolant = Symbol(side, :_weno_interpolant_, dir) - - @eval begin - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3}, - ψ, idx, loc, args...) - - # Stencil S₀ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) - τ += add_global_smoothness(β, Val(3), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₂ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) - τ += add_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) - end - end -end \ No newline at end of file diff --git a/src/Advection/weno_4.jl b/src/Advection/weno_4.jl deleted file mode 100644 index a97fe40a84..0000000000 --- a/src/Advection/weno_4.jl +++ /dev/null @@ -1,53 +0,0 @@ -for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) - weno_interpolant = Symbol(side, :_weno_interpolant_, dir) - - @eval begin - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4}, - ψ, idx, loc, args...) - - # Stencil S₀ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) - τ += add_global_smoothness(β, Val(4), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₂ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) - τ += add_global_smoothness(β, Val(4), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₃ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 4, grid, scheme, $val, ψ, idx, loc, args...) - τ += add_global_smoothness(β, Val(4), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) - end - end -end \ No newline at end of file diff --git a/src/Advection/weno_5.jl b/src/Advection/weno_5.jl deleted file mode 100644 index f77508d207..0000000000 --- a/src/Advection/weno_5.jl +++ /dev/null @@ -1,61 +0,0 @@ -for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) - weno_interpolant = Symbol(side, :_weno_interpolant_, dir) - - @eval begin - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5}, - ψ, idx, loc, args...) - - # Stencil S₀ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) - τ += add_global_smoothness(β, Val(5), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₂ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) - τ += add_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₃ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 4, grid, scheme, $val, ψ, idx, loc, args...) - τ += add_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₄ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 5, grid, scheme, $val, ψ, idx, loc, args...) - τ += add_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) - end - end -end \ No newline at end of file diff --git a/src/Advection/weno_6.jl b/src/Advection/weno_6.jl deleted file mode 100644 index 874d9a9580..0000000000 --- a/src/Advection/weno_6.jl +++ /dev/null @@ -1,69 +0,0 @@ -for side in [:left, :right], (dir, val) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3]) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) - weno_interpolant = Symbol(side, :_weno_interpolant_, dir) - - @eval begin - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{6}, - ψ, idx, loc, args...) - - # Stencil S₀ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 1, grid, scheme, $val, ψ, idx, loc, args...) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 2, grid, scheme, $val, ψ, idx, loc, args...) - τ += add_global_smoothness(β, Val(5), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₂ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 3, grid, scheme, $val, ψ, idx, loc, args...) - τ += add_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₃ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 4, grid, scheme, $val, ψ, idx, loc, args...) - τ += add_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₄ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 5, grid, scheme, $val, ψ, idx, loc, args...) - τ += add_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₅ - β, ψ̅, C, α = $weno_interpolant(i, j, k, 6, grid, scheme, $val, ψ, idx, loc, args...) - τ += add_global_smoothness(β, Val(6), Val(5)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) - end - end -end \ No newline at end of file diff --git a/src/Advection/weno_default.jl b/src/Advection/weno_default.jl deleted file mode 100644 index cb4f96d0dc..0000000000 --- a/src/Advection/weno_default.jl +++ /dev/null @@ -1,324 +0,0 @@ - -for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) - biased_interpolate_new = Symbol(:new_inner_, side, :_biased_interpolate_, dir) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) - new_stencil = Symbol(:new_stencil_, side, :_, dir) - weno_interpolant = Symbol(side, :_weno_interpolant_, dir) - ψ_reconstruction = Symbol(:ψ_reconstruction_, side, :_, dir) - - for N in [2, 3, 4, 5, 6] - @eval @inline $ψ_reconstruction(i, j, k, grid, ::WENO{$N}, ψ, args...) = @inbounds $(ψ_reconstruction_stencil(N, side, dir)) - @eval @inline $ψ_reconstruction(i, j, k, grid, ::WENO{$N}, ψ::Function, args...) = @inbounds $(ψ_reconstruction_stencil(N, side, dir, true)) - end - - @eval begin - - # Fallback for DefaultStencil formulations and disambiguation - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{2}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{3}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{4}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{5}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{6}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} - - # All stencils - ψs = $ψ_reconstruction(i, j, k, grid, scheme, ψ, args...) - - β, ψ̅, C, α = $weno_interpolant(ψs[2:3], 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:2], 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(2), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} - - ψs = $ψ_reconstruction(i, j, k, grid, scheme, ψ, args...) - - β, ψ̅, C, α = $weno_interpolant(ψs[3:5], 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[2:4], 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:3], 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} - - ψs = $ψ_reconstruction(i, j, k, grid, scheme, ψ, args...) - - β, ψ̅, C, α = $weno_interpolant(ψs[4:7], 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[3:6], 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[2:5], 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:4], 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) - end - - @inline function $biased_interpolate_new(i, j, k, grid, - scheme::WENO{5, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} - - # All stencils - ψ₀ = @inbounds ψ[i - 1, j, k] - ψ₁ = @inbounds ψ[i, j, k] - ψ₂ = @inbounds ψ[i + 1, j, k] - ψ₃ = @inbounds ψ[i + 2, j, k] - ψ₄ = @inbounds ψ[i + 3, j, k] - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - ψ₀ = @inbounds ψ[i - 2, j, k] - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ - ψ₄ = ψ₃ - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - ψ₀ = @inbounds ψ[i - 3, j, k] - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ - ψ₄ = ψ₃ - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - ψ₀ = @inbounds ψ[i - 4, j, k] - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ - ψ₄ = ψ₃ - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - ψ₀ = @inbounds ψ[i - 5, j, k] - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ - ψ₄ = ψ₃ - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = τ * τ - - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} - - ψs = $ψ_reconstruction(i, j, k, grid, scheme, ψ, args...) - - β, ψ̅, C, α = $weno_interpolant(ψs[5:9], 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[4:8], 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[3:7], 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[2:6], 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:5], 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{6, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} - - ψs = $ψ_reconstruction(i, j, k, grid, scheme, ψ, args...) - - β, ψ̅, C, α = $weno_interpolant(ψs[6:11], 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[5:10], 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[4:9], 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[3:8], 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[2:7], 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:6], 6, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(5)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) - end - end -end \ No newline at end of file diff --git a/src/Advection/weno_phi.jl b/src/Advection/weno_phi.jl deleted file mode 100644 index d8562b1897..0000000000 --- a/src/Advection/weno_phi.jl +++ /dev/null @@ -1,256 +0,0 @@ -@inline function ϕ_reconstruction_stencil(buffer, shift, dir) - N = buffer * 2 - order = shift == :symmetric ? N : N - 1 - if shift != :symmetric - N = N .- 1 - end - rng = 1:N - if shift == :right - rng = rng .+ 1 - end - stencil_full = Vector(undef, N) - coeff = Symbol(:coeff, order, :_, shift) - for (idx, n) in enumerate(rng) - c = n - buffer - 1 - stencil_full[idx] = dir == :x ? - :(VI.func(i + $c, j, k, grid, args...)) : - dir == :y ? - :(VI.func(i, j + $c, k, grid, args...)) : - :(VI.func(i, j, k + $c, grid, args...)) - end - return :($(stencil_full...),) -end - -for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) - new_stencil = Symbol(:new_stencil_, side, :_, dir) - weno_interpolant = Symbol(side, :_weno_interpolant_, dir) - - @eval begin - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT, XT, YT, ZT}, - ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - - # All stencils - ϕs = $(ϕ_reconstruction_stencil(2, side, dir)) - ψs = $(ψ_reconstruction_stencil(2, side, dir, true)) - - β, ψ̅, C, α = $weno_interpolant(ψs[2:3], ϕs[2:3], 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:2], ϕs[1:2], 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(2), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT, XT, YT, ZT}, - ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - - # All stencils - ϕs = $(ϕ_reconstruction_stencil(3, side, dir)) - ψs = $(ψ_reconstruction_stencil(3, side, dir, true)) - - β, ψ̅, C, α = $weno_interpolant(ψs[3:5], ϕs[3:5], 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[2:4], ϕs[2:4], 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:3], ϕs[1:3], 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT, XT, YT, ZT}, - ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - - # All stencils - ϕs = $(ϕ_reconstruction_stencil(4, side, dir)) - ψs = $(ψ_reconstruction_stencil(4, side, dir, true)) - - β, ψ̅, C, α = $weno_interpolant(ψs[4:7], ϕs[4:7], 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[3:6], ϕs[3:6], 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[2:5], ϕs[2:5], 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:4], ϕs[1:4], 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT, XT, YT, ZT}, - ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - - # All stencils - ϕs = $(ϕ_reconstruction_stencil(5, side, dir)) - ψs = $(ψ_reconstruction_stencil(5, side, dir, true)) - - β, ψ̅, C, α = $weno_interpolant(ψs[5:9], ϕs[5:9], 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[4:8], ϕs[4:8], 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[3:7], ϕs[3:7], 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[2:6], ϕs[2:6], 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:5], ϕs[1:5], 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{6, FT, XT, YT, ZT}, - ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - - # All stencils - ϕs = $(ϕ_reconstruction_stencil(6, side, dir)) - ψs = $(ψ_reconstruction_stencil(6, side, dir, true)) - - β, ψ̅, C, α = $weno_interpolant(ψs[6:11], ϕs[6:11], 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[5:10], ϕs[5:10], 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[4:9], ϕs[4:9], 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[3:8], ϕs[3:8], 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[2:7], ϕs[2:7], 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:6], ϕs[1:6], 6, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(5)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) - end - end -end \ No newline at end of file diff --git a/src/Advection/weno_vi.jl b/src/Advection/weno_vi.jl deleted file mode 100644 index 6d7a21315d..0000000000 --- a/src/Advection/weno_vi.jl +++ /dev/null @@ -1,569 +0,0 @@ -@inline function u_reconstruction_stencil(buffer, shift, dir) - N = buffer * 2 - order = shift == :symmetric ? N : N - 1 - if shift != :symmetric - N = N .- 1 - end - rng = 1:N - if shift == :right - rng = rng .+ 1 - end - stencil_full = Vector(undef, N) - coeff = Symbol(:coeff, order, :_, shift) - for (idx, n) in enumerate(rng) - c = n - buffer - 1 - stencil_full[idx] = dir == :x ? - :(ℑyᵃᶠᵃ(i + $c, j, k, grid, u)) : - dir == :y ? - :(ℑyᵃᶠᵃ(i, j + $c, k, grid, u)) : - :(ℑyᵃᶠᵃ(i, j, k + $c, grid, u)) - end - return :($(stencil_full...),) -end - -@inline function v_reconstruction_stencil(buffer, shift, dir) - N = buffer * 2 - order = shift == :symmetric ? N : N - 1 - if shift != :symmetric - N = N .- 1 - end - rng = 1:N - if shift == :right - rng = rng .+ 1 - end - stencil_full = Vector(undef, N) - coeff = Symbol(:coeff, order, :_, shift) - for (idx, n) in enumerate(rng) - c = n - buffer - 1 - stencil_full[idx] = dir == :x ? - :(ℑxᶠᵃᵃ(i + $c, j, k, grid, v)) : - dir == :y ? - :(ℑxᶠᵃᵃ(i, j + $c, k, grid, v)) : - :(ℑxᶠᵃᵃ(i, j, k + $c, grid, v)) - end - return :($(stencil_full...),) -end - -@inline function ζ_reconstruction_stencil(buffer, shift, dir) - N = buffer * 2 - order = shift == :symmetric ? N : N - 1 - if shift != :symmetric - N = N .- 1 - end - rng = 1:N - if shift == :right - rng = rng .+ 1 - end - stencil_full = Vector(undef, N) - coeff = Symbol(:coeff, order, :_, shift) - for (idx, n) in enumerate(rng) - c = n - buffer - 1 - stencil_full[idx] = dir == :x ? - :(ψ(i + $c, j, k, grid, u, v)) : - dir == :y ? - :(ψ(i, j + $c, k, grid, u, v)) : - :(ψ(i, j, k + $c, grid, u, v)) -end - return :($(stencil_full...),) -end - -let (jlf, f) = (:div_arcp, :div) - for (T, llvmT) in ((:Float32, "float"), (:Float64, "double")) - ir = """ - %x = f$f fast $llvmT %0, %1 - ret $llvmT %x - """ - @eval begin - # the @pure is necessary so that we can constant propagate. - @inline Base.@pure function $jlf(a::$T, b::$T) - Base.llvmcall($ir, $T, Tuple{$T, $T}, a, b) - end - end - end - @eval function $jlf(args...) - Base.$jlf(args...) - end -end -rcp(x) = div_arcp(one(x), x) # still leads to rcp.rn which is also a function call - -for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :zᵃᵃᶠ], [1, 2, 3], [:XT, :YT, :ZT]) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir) - biased_interpolate_new = Symbol(:new_inner_, side, :_biased_interpolate_, dir) - biased_β = Symbol(side, :_biased_β) - biased_p = Symbol(side, :_biased_p) - coeff = Symbol(:coeff_, side) - stencil = Symbol(side, :_stencil_, dir) - stencil_u = Symbol(:tangential_, side, :_stencil_u) - stencil_v = Symbol(:tangential_, side, :_stencil_v) - new_stencil = Symbol(:new_stencil_, side, :_, dir) - weno_interpolant = Symbol(side, :_weno_interpolant_, dir) - - @eval begin - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} - - # All stencils - us = $(u_reconstruction_stencil(2, side, dir)) - vs = $(v_reconstruction_stencil(2, side, dir)) - ψs = $(ζ_reconstruction_stencil(2, side, dir)) - - β, ψ̅, C, α = $weno_interpolant(ψs[2:3], us[2:3], vs[2:3], 1, scheme, $val, idx, loc, args...) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:2], us[1:2], vs[1:2], 2, scheme, $val, idx, loc, args...) - τ += add_global_smoothness(β, Val(2), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} - - # All stencils - us = $(u_reconstruction_stencil(3, side, dir)) - vs = $(v_reconstruction_stencil(3, side, dir)) - ψs = $(ζ_reconstruction_stencil(3, side, dir)) - - β, ψ̅, C, α = $weno_interpolant(ψs[3:5], us[3:5], vs[3:5], 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[2:4], us[2:4], vs[2:4], 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:3], us[1:3], vs[1:3], 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) - end - - @inline function $biased_interpolate_new(i, j, k, grid, - scheme::WENO{4, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} - - # All stencils - ψ₀ = ψ(i - 1, j, k, grid, u, v) - ψ₁ = ψ(i, j, k, grid, u, v) - ψ₂ = ψ(i + 1, j, k, grid, u, v) - ψ₃ = ψ(i + 2, j, k, grid, u, v) - - u₀ = ℑyᵃᶠᵃ(i - 1, j, k, grid, u) - u₁ = ℑyᵃᶠᵃ(i, j, k, grid, u) - u₂ = ℑyᵃᶠᵃ(i + 1, j, k, grid, u) - u₃ = ℑyᵃᶠᵃ(i + 2, j, k, grid, u) - - v₀ = ℑxᶠᵃᵃ(i - 1, j, k, grid, v) - v₁ = ℑxᶠᵃᵃ(i, j, k, grid, v) - v₂ = ℑxᶠᵃᵃ(i + 1, j, k, grid, v) - v₃ = ℑxᶠᵃᵃ(i + 2, j, k, grid, v) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - ψ₀ = ψ(i - 2, j, k, grid, u, v) - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ - - u₀ = ℑyᵃᶠᵃ(i - 2, j, k, grid, u) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ - - v₀ = ℑxᶠᵃᵃ(i - 2, j, k, grid, v) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - ψ₀ = ψ(i - 3, j, k, grid, u, v) - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ - - u₀ = ℑyᵃᶠᵃ(i - 3, j, k, grid, u) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ - - v₀ = ℑxᶠᵃᵃ(i - 3, j, k, grid, v) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - - ψ₀ = ψ(i - 4, j, k, grid, u, v) - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ - - u₀ = ℑyᵃᶠᵃ(i - 4, j, k, grid, u) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ - - v₀ = ℑxᶠᵃᵃ(i - 4, j, k, grid, v) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = τ^2 - - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} - - # All stencils - us = $(u_reconstruction_stencil(4, side, dir)) - vs = $(v_reconstruction_stencil(4, side, dir)) - ψs = $(ζ_reconstruction_stencil(4, side, dir)) - - β, ψ̅, C, α = $weno_interpolant(ψs[4:7], us[4:7], vs[4:7], 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[3:6], us[3:6], vs[3:6], 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[2:5], us[2:5], vs[2:5], 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:4], us[1:4], vs[1:4], 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) - end - - @inline function $biased_interpolate_new(i, j, k, grid, - scheme::WENO{5, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} - - # All stencils - ψ₀ = ψ(i - 1, j, k, grid, u, v) - ψ₁ = ψ(i, j, k, grid, u, v) - ψ₂ = ψ(i + 1, j, k, grid, u, v) - ψ₃ = ψ(i + 2, j, k, grid, u, v) - ψ₄ = ψ(i + 3, j, k, grid, u, v) - - u₀ = ℑyᵃᶠᵃ(i - 1, j, k, grid, u) - u₁ = ℑyᵃᶠᵃ(i, j, k, grid, u) - u₂ = ℑyᵃᶠᵃ(i + 1, j, k, grid, u) - u₃ = ℑyᵃᶠᵃ(i + 2, j, k, grid, u) - u₄ = ℑyᵃᶠᵃ(i + 3, j, k, grid, u) - - v₀ = ℑxᶠᵃᵃ(i - 1, j, k, grid, v) - v₁ = ℑxᶠᵃᵃ(i, j, k, grid, v) - v₂ = ℑxᶠᵃᵃ(i + 1, j, k, grid, v) - v₃ = ℑxᶠᵃᵃ(i + 2, j, k, grid, v) - v₄ = ℑxᶠᵃᵃ(i + 3, j, k, grid, v) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - ψ₀ = ψ(i - 2, j, k, grid, u, v) - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ - ψ₄ = ψ₃ - - u₀ = ℑyᵃᶠᵃ(i - 2, j, k, grid, u) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ - u₄ = u₄ - - v₀ = ℑxᶠᵃᵃ(i - 2, j, k, grid, v) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ - v₄ = v₃ - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - ψ₀ = ψ(i - 3, j, k, grid, u, v) - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ - ψ₄ = ψ₃ - - u₀ = ℑyᵃᶠᵃ(i - 3, j, k, grid, u) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ - u₄ = u₄ - - v₀ = ℑxᶠᵃᵃ(i - 3, j, k, grid, v) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ - v₄ = v₃ - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - - ψ₀ = ψ(i - 4, j, k, grid, u, v) - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ - ψ₄ = ψ₃ - - u₀ = ℑyᵃᶠᵃ(i - 4, j, k, grid, u) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ - u₄ = u₄ - - v₀ = ℑxᶠᵃᵃ(i - 4, j, k, grid, v) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ - v₄ = v₃ - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - ψ₀ = ψ(i - 5, j, k, grid, u, v) - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ - ψ₄ = ψ₃ - - u₀ = ℑyᵃᶠᵃ(i - 5, j, k, grid, u) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ - u₄ = u₄ - - v₀ = ℑxᶠᵃᵃ(i - 5, j, k, grid, v) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ - v₄ = v₃ - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = τ * τ - - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} - - # All stencils - us = $(u_reconstruction_stencil(5, side, dir)) - vs = $(v_reconstruction_stencil(5, side, dir)) - ψs = $(ζ_reconstruction_stencil(5, side, dir)) - - β, ψ̅, C, α = $weno_interpolant(ψs[5:9], us[5:9], vs[5:9], 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[4:8], us[4:8], vs[4:8], 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[3:7], us[3:7], vs[3:7], 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[2:6], us[2:6], vs[2:6], 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:5], us[1:5], vs[1:5], 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{6, FT, XT, YT, ZT}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) where {FT, XT, YT, ZT} - - # All stencils - us = $(u_reconstruction_stencil(6, side, dir)) - vs = $(v_reconstruction_stencil(6, side, dir)) - ψs = $(ζ_reconstruction_stencil(6, side, dir)) - - β, ψ̅, C, α = $weno_interpolant(ψs[6:11], us[6:11], vs[6:11], 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[5:10], us[5:10], vs[5:10], 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[4:9], us[4:9], vs[4:9], 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[3:8], us[3:8], vs[3:8], 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[2:7], us[2:7], vs[2:7], 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant(ψs[1:6], us[1:6], vs[1:6], 6, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(5)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - - τ = abs(τ) - - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) - end - end -end \ No newline at end of file From 83447bce5313ba022bf345812adb9726b0813589 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 19 Mar 2024 18:20:48 -0400 Subject: [PATCH 138/152] bugfix --- src/Advection/weno_default_stencils.jl | 91 +++++++++++++------------ src/Advection/weno_function_stencils.jl | 4 +- src/Advection/weno_interpolants.jl | 10 +-- src/Advection/weno_velocity_stencils.jl | 4 +- 4 files changed, 57 insertions(+), 52 deletions(-) diff --git a/src/Advection/weno_default_stencils.jl b/src/Advection/weno_default_stencils.jl index bdfb4250ec..7c300f35f5 100644 --- a/src/Advection/weno_default_stencils.jl +++ b/src/Advection/weno_default_stencils.jl @@ -5,7 +5,7 @@ ##### STENCILS IN X ##### -for (side, add) in zip([:left, :right], (-1, 0)) +for (side, add) in zip([:left, :right], (1, 0)) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_xᶠᵃᵃ) coeff = Symbol(:coeff_, side) weno_interpolant = Symbol(side, :_weno_interpolant_xᶠᵃᵃ) @@ -33,26 +33,31 @@ for (side, add) in zip([:left, :right], (-1, 0)) ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + τ = add_global_smoothness(β, Val(2), Val(1)) + α₀ = α + ψ̅₀ = ψ̅ + C₀ = C ψ₁ = ψ₀ ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(2), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_global_smoothness(β, Val(2), Val(2)) + α₁ = α + ψ̅₁ = ψ̅ + C₁ = C τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + α₀ = C₀ + α₀ * τ + α₁ = C₁ + α₁ * τ + + αₛ = (α₀ + α₁) + α₀ = α₀ / αₛ + α₁ = α₁ / αₛ + + return ψ̅₀ * α₀ + ψ̅₁ * α₁ end @inline function $biased_interpolate(i, j, k, grid, @@ -77,7 +82,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(1)) + τ += add_global_smoothness(β, Val(3), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -89,7 +94,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) + τ += add_global_smoothness(β, Val(3), Val(3)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -124,7 +129,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(1)) + τ += add_global_smoothness(β, Val(4), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -137,7 +142,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(2)) + τ += add_global_smoothness(β, Val(4), Val(3)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -150,7 +155,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(3)) + τ += add_global_smoothness(β, Val(4), Val(4)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -187,7 +192,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(1)) + τ += add_global_smoothness(β, Val(5), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -201,7 +206,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(2)) + τ += add_global_smoothness(β, Val(5), Val(3)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -215,7 +220,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(3)) + τ += add_global_smoothness(β, Val(5), Val(4)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -229,7 +234,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(4)) + τ += add_global_smoothness(β, Val(5), Val(5)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -246,7 +251,7 @@ end ##### STENCILS IN Y ##### -for (side, add) in zip([:left, :right], (-1, 0)) +for (side, add) in zip([:left, :right], (1, 0)) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_yᵃᶠᵃ) coeff = Symbol(:coeff_, side) weno_interpolant = Symbol(side, :_weno_interpolant_yᵃᶠᵃ) @@ -285,7 +290,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(2), Val(1)) + τ += add_global_smoothness(β, Val(2), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -318,7 +323,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(1)) + τ += add_global_smoothness(β, Val(3), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -330,7 +335,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) + τ += add_global_smoothness(β, Val(3), Val(3)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -365,7 +370,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(1)) + τ += add_global_smoothness(β, Val(4), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -378,7 +383,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(2)) + τ += add_global_smoothness(β, Val(4), Val(3)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -391,7 +396,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(3)) + τ += add_global_smoothness(β, Val(4), Val(4)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -428,7 +433,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(1)) + τ += add_global_smoothness(β, Val(5), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -442,7 +447,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(2)) + τ += add_global_smoothness(β, Val(5), Val(3)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -456,7 +461,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(3)) + τ += add_global_smoothness(β, Val(5), Val(4)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -470,7 +475,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(4)) + τ += add_global_smoothness(β, Val(5), Val(5)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -487,7 +492,7 @@ end ##### STENCILS IN Z ##### -for (side, add) in zip([:left, :right], (-1, 0)) +for (side, add) in zip([:left, :right], (1, 0)) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_zᵃᵃᶠ) coeff = Symbol(:coeff_, side) weno_interpolant = Symbol(side, :_weno_interpolant_zᵃᵃᶠ) @@ -526,7 +531,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(2), Val(1)) + τ += add_global_smoothness(β, Val(2), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -559,7 +564,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(1)) + τ += add_global_smoothness(β, Val(3), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -571,7 +576,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) + τ += add_global_smoothness(β, Val(3), Val(3)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -606,7 +611,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(1)) + τ += add_global_smoothness(β, Val(4), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -619,7 +624,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(2)) + τ += add_global_smoothness(β, Val(4), Val(4)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -632,7 +637,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(3)) + τ += add_global_smoothness(β, Val(4), Val(5)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -669,7 +674,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(1)) + τ += add_global_smoothness(β, Val(5), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -683,7 +688,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(2)) + τ += add_global_smoothness(β, Val(5), Val(3)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -697,7 +702,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(3)) + τ += add_global_smoothness(β, Val(5), Val(4)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -711,7 +716,7 @@ for (side, add) in zip([:left, :right], (-1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(4)) + τ += add_global_smoothness(β, Val(5), Val(5)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α diff --git a/src/Advection/weno_function_stencils.jl b/src/Advection/weno_function_stencils.jl index f1ca6eabc7..6a1a03901e 100644 --- a/src/Advection/weno_function_stencils.jl +++ b/src/Advection/weno_function_stencils.jl @@ -2,7 +2,7 @@ ##### STENCILS IN X ##### -for (side, add) in zip([:left, :right], (-1, 0)) +for (side, add) in zip([:left, :right], (1, 0)) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_xᶠᵃᵃ) coeff = Symbol(:coeff_, side) weno_interpolant = Symbol(side, :_weno_interpolant_xᶠᵃᵃ) @@ -300,7 +300,7 @@ end ##### STENCILS IN Y ##### -for (side, add) in zip([:left, :right], (-1, 0)) +for (side, add) in zip([:left, :right], (1, 0)) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_yᵃᶠᵃ) weno_interpolant = Symbol(side, :_weno_interpolant_yᵃᶠᵃ) val = 2 diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 8d25c68124..142f9cd4f3 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -69,7 +69,7 @@ end Base.show(io::IO, a::FunctionStencil) = print(io, "FunctionStencil f = $(a.func)") -const ε = 1e-8 +const ε = 1e-6 # Optimal values taken from # Balsara & Shu, "Monotonicity Preserving Weighted Essentially Non-oscillatory Schemes with Inceasingly High Order of Accuracy" @@ -249,11 +249,11 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C * rcp(β + FT(ε))^2 + α = C * rcp(β + FT(ε))^2 # Reconstruction of `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) - + return β, ψ̅, C, α end @@ -271,7 +271,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C * rcp(βᵁ + FT(ε))^2 + α = C / (βᵁ + FT(ε))^2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) @@ -287,7 +287,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = @fastmath C * rcp(βᵠ + FT(ε))^2 + α = C / (βᵠ + FT(ε))^2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) diff --git a/src/Advection/weno_velocity_stencils.jl b/src/Advection/weno_velocity_stencils.jl index 3a24dbd1b5..efff347922 100644 --- a/src/Advection/weno_velocity_stencils.jl +++ b/src/Advection/weno_velocity_stencils.jl @@ -2,7 +2,7 @@ ##### STENCILS IN X ##### -for (side, add) in zip([:left, :right], (-1, 0)) +for (side, add) in zip([:left, :right], (1, 0)) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_xᶠᵃᵃ) coeff = Symbol(:coeff_, side) weno_interpolant = Symbol(side, :_weno_interpolant_xᶠᵃᵃ) @@ -367,7 +367,7 @@ end ##### STENCILS IN Y ##### -for (side, add) in zip([:left, :right], (-1, 0)) +for (side, add) in zip([:left, :right], (1, 0)) biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_yᵃᶠᵃ) coeff = Symbol(:coeff_, side) weno_interpolant = Symbol(side, :_weno_interpolant_yᵃᶠᵃ) From 58aad89101e32fadb625cb8f04d9e1594f17e2fe Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 19 Mar 2024 22:01:18 -0400 Subject: [PATCH 139/152] bugfixes --- src/Advection/weno_default_stencils.jl | 516 +++++++++++------------- src/Advection/weno_function_stencils.jl | 416 +++++++++---------- src/Advection/weno_interpolants.jl | 56 +-- src/Advection/weno_velocity_stencils.jl | 68 ++-- 4 files changed, 491 insertions(+), 565 deletions(-) diff --git a/src/Advection/weno_default_stencils.jl b/src/Advection/weno_default_stencils.jl index 7c300f35f5..644b34456a 100644 --- a/src/Advection/weno_default_stencils.jl +++ b/src/Advection/weno_default_stencils.jl @@ -1,3 +1,5 @@ +using Printf + @inline getvalue(i, j, k, grid, ψ, args...) = @inbounds ψ[i, j, k] @inline getvalue(i, j, k, grid, ψ::Function, args...) = ψ(i, j, k, grid, args...) @@ -33,31 +35,24 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) - τ = add_global_smoothness(β, Val(2), Val(1)) - α₀ = α - ψ̅₀ = ψ̅ - C₀ = C + τ = add_to_global_smoothness(β, Val(2), Val(1)) + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α ψ₁ = ψ₀ ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(2), Val(2)) - α₁ = α - ψ̅₁ = ψ̅ - C₁ = C + τ += add_to_global_smoothness(β, Val(2), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ * τ - α₀ = C₀ + α₀ * τ - α₁ = C₁ + α₁ * τ - - αₛ = (α₀ + α₁) - α₀ = α₀ / αₛ - α₁ = α₁ / αₛ - - return ψ̅₀ * α₀ + ψ̅₁ * α₁ + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -70,41 +65,39 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₂ = getvalue(i + 2 - $add, j, k, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + τ = add_to_global_smoothness(β, Val(3), Val(1)) + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α - ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(3), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) # end + @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{4, FT, XT, YT, ZT}, ψ, idx, loc, args...) where {FT, XT, YT, ZT} @@ -116,54 +109,50 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₃ = getvalue(i + 3 - $add, j, k, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + τ = add_to_global_smoothness(β, Val(4), Val(1)) + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 3 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(4)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -179,70 +168,65 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 3 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 4 - $add, j, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(5)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(5)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end end end @@ -279,26 +263,24 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₁ = getvalue(i, j + 1 - $add, k, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + τ = add_to_global_smoothness(β, Val(2), Val(1)) + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(2), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(2), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -312,38 +294,35 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α - ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(3), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -357,54 +336,49 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₃ = getvalue(i, j + 3 - $add, k, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ = add_to_global_smoothness(β, Val(4), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 3 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(4)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -420,70 +394,65 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 3 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 4 - $add, k, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(5)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(5)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end end end @@ -520,26 +489,23 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₁ = getvalue(i, j, k + 1 - $add, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α ψ₁ = ψ₀ ψ₀ = getvalue(i, j, k - 1 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(2), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(2), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -553,38 +519,35 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α - ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j, k - 1 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j, k - 2 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(3), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -599,53 +562,49 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j, k - 1 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j, k - 2 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j, k - 3 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(5)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(4)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -661,70 +620,65 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j, k - 1 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j, k - 2 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j, k - 3 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j, k - 4 - $add, grid, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(5)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(5)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ * τ - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end end end diff --git a/src/Advection/weno_function_stencils.jl b/src/Advection/weno_function_stencils.jl index 6a1a03901e..11918f813b 100644 --- a/src/Advection/weno_function_stencils.jl +++ b/src/Advection/weno_function_stencils.jl @@ -22,10 +22,9 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α ψ₁ = ψ₀ ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) @@ -35,15 +34,14 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(2), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -61,46 +59,43 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) - ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i - 1 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) - ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i - 2 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(3), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -120,69 +115,64 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) - ϕ₁ = ϕ₀ - ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ + ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i - 1 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(1)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) - ϕ₁ = ϕ₀ - ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ + ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i - 2 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 3 - $add, j, k, grid, ψ, args...) - - ϕ₁ = ϕ₀ - ϕ₂ = ϕ₁ + ϕ₃ = ϕ₂ + ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i - 3 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α - + τ += add_to_global_smoothness(β, Val(4), Val(4)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -204,94 +194,89 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) - ϕ₁ = ϕ₀ - ϕ₂ = ϕ₁ - ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ + ϕ₃ = ϕ₂ + ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i - 1 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) - ϕ₁ = ϕ₀ - ϕ₂ = ϕ₁ + ϕ₄ = ϕ₃ ϕ₃ = ϕ₂ - ϕ₄ = ϕ₃ + ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i - 2 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 3 - $add, j, k, grid, ψ, args...) - ϕ₁ = ϕ₀ - ϕ₂ = ϕ₁ - ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ + ϕ₃ = ϕ₂ + ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i - 3 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i - 4 - $add, j, k, grid, ψ, args...) - ϕ₁ = ϕ₀ - ϕ₂ = ϕ₁ - ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ + ϕ₃ = ϕ₂ + ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i - 4 - $add, j, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(5)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end end end @@ -319,10 +304,9 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) @@ -332,15 +316,14 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(2), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -358,46 +341,43 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α - ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) - ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i, j - 1 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) - ϕ₁ = ϕ₀ ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i, j - 2 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(3), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -417,68 +397,65 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α + - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) - ϕ₁ = ϕ₀ - ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ + ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i, j - 1 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) - ϕ₁ = ϕ₀ - ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ + ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i, j - 2 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 3 - $add, k, grid, ψ, args...) - ϕ₁ = ϕ₀ - ϕ₂ = ϕ₁ ϕ₃ = ϕ₂ + ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i, j - 3 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(4)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -500,94 +477,89 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) - ϕ₁ = ϕ₀ - ϕ₂ = ϕ₁ - ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ + ϕ₃ = ϕ₂ + ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i, j - 1 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) - ϕ₁ = ϕ₀ - ϕ₂ = ϕ₁ - ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ + ϕ₃ = ϕ₂ + ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i, j - 2 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 3 - $add, k, grid, ψ, args...) - ϕ₁ = ϕ₀ - ϕ₂ = ϕ₁ - ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ + ϕ₃ = ϕ₂ + ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i, j - 3 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = getvalue(i, j - 4 - $add, k, grid, ψ, args...) - ϕ₁ = ϕ₀ - ϕ₂ = ϕ₁ - ϕ₃ = ϕ₂ ϕ₄ = ϕ₃ + ϕ₃ = ϕ₂ + ϕ₂ = ϕ₁ + ϕ₁ = ϕ₀ ϕ₀ = getvalue(i, j - 4 - $add, k, grid, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(5)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end end end \ No newline at end of file diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 142f9cd4f3..4c824f2769 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -69,7 +69,7 @@ end Base.show(io::IO, a::FunctionStencil) = print(io, "FunctionStencil f = $(a.func)") -const ε = 1e-6 +const ε = 1e-8 # Optimal values taken from # Balsara & Shu, "Monotonicity Preserving Weighted Essentially Non-oscillatory Schemes with Inceasingly High Order of Accuracy" @@ -184,30 +184,30 @@ for buffer in [2, 3, 4, 5, 6] end # Global smoothness indicator τ₂ᵣ₋₁ taken from "Accuracy of the weighted essentially non-oscillatory conservative finite difference schemes", Don & Borges, 2013 -@inline add_global_smoothness(β, ::Val{2}, ::Val{1}) = + β -@inline add_global_smoothness(β, ::Val{2}, ::Val{2}) = - β - -@inline add_global_smoothness(β, ::Val{3}, ::Val{1}) = + β -@inline add_global_smoothness(β, ::Val{3}, ::Val{2}) = 0 -@inline add_global_smoothness(β, ::Val{3}, ::Val{3}) = - β - -@inline add_global_smoothness(β, ::Val{4}, ::Val{1}) = + β -@inline add_global_smoothness(β, ::Val{4}, ::Val{2}) = + 3β -@inline add_global_smoothness(β, ::Val{4}, ::Val{3}) = - 3β -@inline add_global_smoothness(β, ::Val{4}, ::Val{4}) = - β - -@inline add_global_smoothness(β, ::Val{5}, ::Val{1}) = + β -@inline add_global_smoothness(β, ::Val{5}, ::Val{2}) = + 2β -@inline add_global_smoothness(β, ::Val{5}, ::Val{3}) = - 6β -@inline add_global_smoothness(β, ::Val{5}, ::Val{4}) = + 2β -@inline add_global_smoothness(β, ::Val{5}, ::Val{5}) = + β - -@inline add_global_smoothness(β, ::Val{6}, ::Val{1}) = + β -@inline add_global_smoothness(β, ::Val{6}, ::Val{2}) = + β -@inline add_global_smoothness(β, ::Val{6}, ::Val{3}) = - 8β -@inline add_global_smoothness(β, ::Val{6}, ::Val{4}) = + 8β -@inline add_global_smoothness(β, ::Val{6}, ::Val{5}) = - β -@inline add_global_smoothness(β, ::Val{6}, ::Val{6}) = - β +@inline add_to_global_smoothness(β, ::Val{2}, ::Val{1}) = + β +@inline add_to_global_smoothness(β, ::Val{2}, ::Val{2}) = - β + +@inline add_to_global_smoothness(β, ::Val{3}, ::Val{1}) = + β +@inline add_to_global_smoothness(β, ::Val{3}, ::Val{2}) = 0 +@inline add_to_global_smoothness(β, ::Val{3}, ::Val{3}) = - β + +@inline add_to_global_smoothness(β, ::Val{4}, ::Val{1}) = + β +@inline add_to_global_smoothness(β, ::Val{4}, ::Val{2}) = + 3β +@inline add_to_global_smoothness(β, ::Val{4}, ::Val{3}) = - 3β +@inline add_to_global_smoothness(β, ::Val{4}, ::Val{4}) = - β + +@inline add_to_global_smoothness(β, ::Val{5}, ::Val{1}) = + β +@inline add_to_global_smoothness(β, ::Val{5}, ::Val{2}) = + 2β +@inline add_to_global_smoothness(β, ::Val{5}, ::Val{3}) = - 6β +@inline add_to_global_smoothness(β, ::Val{5}, ::Val{4}) = + 2β +@inline add_to_global_smoothness(β, ::Val{5}, ::Val{5}) = + β + +@inline add_to_global_smoothness(β, ::Val{6}, ::Val{1}) = + β +@inline add_to_global_smoothness(β, ::Val{6}, ::Val{2}) = + β +@inline add_to_global_smoothness(β, ::Val{6}, ::Val{3}) = - 8β +@inline add_to_global_smoothness(β, ::Val{6}, ::Val{4}) = + 8β +@inline add_to_global_smoothness(β, ::Val{6}, ::Val{5}) = - β +@inline add_to_global_smoothness(β, ::Val{6}, ::Val{6}) = - β # Reciprocal! let (jlf, f) = (:div_arcp, :div) @@ -249,7 +249,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = C * rcp(β + FT(ε))^2 + α = C * rcp(β + FT(ε))^2 # Reconstruction of `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) @@ -271,7 +271,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = C / (βᵁ + FT(ε))^2 + α = C * rcp(β + FT(ε))^2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) @@ -287,7 +287,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = C / (βᵠ + FT(ε))^2 + α = C * rcp(β + FT(ε))^2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) diff --git a/src/Advection/weno_velocity_stencils.jl b/src/Advection/weno_velocity_stencils.jl index efff347922..4a68bd8b08 100644 --- a/src/Advection/weno_velocity_stencils.jl +++ b/src/Advection/weno_velocity_stencils.jl @@ -41,7 +41,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (u₀, u₁), (v₀, v₁), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(1)) + τ += add_to_global_smoothness(β, Val(3), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -49,7 +49,7 @@ for (side, add) in zip([:left, :right], (1, 0)) τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -90,7 +90,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(1)) + τ += add_to_global_smoothness(β, Val(3), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -110,7 +110,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) + τ += add_to_global_smoothness(β, Val(3), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -118,7 +118,7 @@ for (side, add) in zip([:left, :right], (1, 0)) τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -165,7 +165,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(1)) + τ += add_to_global_smoothness(β, Val(4), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -188,7 +188,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(2)) + τ += add_to_global_smoothness(β, Val(4), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -211,7 +211,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(3)) + τ += add_to_global_smoothness(β, Val(4), Val(3)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -219,7 +219,7 @@ for (side, add) in zip([:left, :right], (1, 0)) τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -272,7 +272,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(1)) + τ += add_to_global_smoothness(β, Val(5), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -298,7 +298,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(2)) + τ += add_to_global_smoothness(β, Val(5), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -324,7 +324,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(3)) + τ += add_to_global_smoothness(β, Val(5), Val(3)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -350,7 +350,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(4)) + τ += add_to_global_smoothness(β, Val(5), Val(4)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -358,7 +358,7 @@ for (side, add) in zip([:left, :right], (1, 0)) τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end end end @@ -406,7 +406,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (u₀, u₁), (v₀, v₁), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(1)) + τ += add_to_global_smoothness(β, Val(3), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -414,7 +414,7 @@ for (side, add) in zip([:left, :right], (1, 0)) τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -455,7 +455,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(1)) + τ += add_to_global_smoothness(β, Val(3), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -475,7 +475,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) + τ += add_to_global_smoothness(β, Val(3), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -483,7 +483,7 @@ for (side, add) in zip([:left, :right], (1, 0)) τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -530,7 +530,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(4), Val(1)) + τ += add_to_global_smoothness(β, Val(4), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -553,7 +553,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) + τ += add_to_global_smoothness(β, Val(3), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -576,7 +576,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(3), Val(2)) + τ += add_to_global_smoothness(β, Val(3), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -584,7 +584,7 @@ for (side, add) in zip([:left, :right], (1, 0)) τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -637,7 +637,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(1)) + τ += add_to_global_smoothness(β, Val(5), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -663,7 +663,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(2)) + τ += add_to_global_smoothness(β, Val(5), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -689,7 +689,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(3)) + τ += add_to_global_smoothness(β, Val(5), Val(3)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -715,7 +715,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(5), Val(4)) + τ += add_to_global_smoothness(β, Val(5), Val(4)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -723,7 +723,7 @@ for (side, add) in zip([:left, :right], (1, 0)) τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end @inline function $biased_interpolate(i, j, k, grid, @@ -782,7 +782,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 2, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(1)) + τ += add_to_global_smoothness(β, Val(6), Val(1)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -811,7 +811,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 3, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(2)) + τ += add_to_global_smoothness(β, Val(6), Val(2)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -840,7 +840,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 4, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(3)) + τ += add_to_global_smoothness(β, Val(6), Val(3)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -869,7 +869,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 5, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(4)) + τ += add_to_global_smoothness(β, Val(6), Val(4)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -898,7 +898,7 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 6, scheme, $val, idx, loc) - τ += add_global_smoothness(β, Val(6), Val(5)) + τ += add_to_global_smoothness(β, Val(6), Val(5)) ψ̂₁ += ψ̅ * C w₁ += C ψ̂₂ += ψ̅ * α @@ -906,7 +906,7 @@ for (side, add) in zip([:left, :right], (1, 0)) τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) * rcp(w₁ + w₂ * τ) + return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) end end end \ No newline at end of file From 5d7d243736e5aecb37b717003c7a461dd9c5362b Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 19 Mar 2024 22:11:32 -0400 Subject: [PATCH 140/152] all done --- src/Advection/weno_velocity_stencils.jl | 603 ++++++++++++------------ 1 file changed, 289 insertions(+), 314 deletions(-) diff --git a/src/Advection/weno_velocity_stencils.jl b/src/Advection/weno_velocity_stencils.jl index 4a68bd8b08..0626ed4bf0 100644 --- a/src/Advection/weno_velocity_stencils.jl +++ b/src/Advection/weno_velocity_stencils.jl @@ -41,15 +41,14 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (u₀, u₁), (v₀, v₁), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(3), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(2), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -76,49 +75,47 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i - 1 - $add, j, k, grid, u, v) - u₁ = u₀ u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i - 1 - $add, j, k, grid, u) - v₁ = v₀ v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i - 1 - $add, j, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(3), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i - 2 - $add, j, k, grid, u, v) - u₁ = u₀ u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i - 2 - $add, j, k, grid, u) - v₁ = v₀ v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i - 2 - $add, j, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(3), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -148,78 +145,75 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i - 1 - $add, j, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i - 1 - $add, j, k, grid, u) - v₁ = v₀ - v₂ = v₁ v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i - 1 - $add, j, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(4), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i - 2 - $add, j, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i - 2 - $add, j, k, grid, u) - v₁ = v₀ - v₂ = v₁ v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i - 2 - $add, j, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(4), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i - 3 - $add, j, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i - 3 - $add, j, k, grid, u) - v₁ = v₀ - v₂ = v₁ v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i - 3 - $add, j, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 4, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(4), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(4)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -252,113 +246,109 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i - 1 - $add, j, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ u₄ = u₃ + u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i - 1 - $add, j, k, grid, u) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ v₄ = v₃ + v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i - 1 - $add, j, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i - 2 - $add, j, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ u₄ = u₃ + u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i - 2 - $add, j, k, grid, u) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ v₄ = v₃ + v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i - 2 - $add, j, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i - 3 - $add, j, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ u₄ = u₃ + u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i - 3 - $add, j, k, grid, u) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ v₄ = v₃ + v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i - 3 - $add, j, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 4, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i - 4 - $add, j, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ u₄ = u₃ + u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i - 4 - $add, j, k, grid, u) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ v₄ = v₃ + v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i - 4 - $add, j, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 5, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(5)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end end end @@ -406,15 +396,14 @@ for (side, add) in zip([:left, :right], (1, 0)) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (u₀, u₁), (v₀, v₁), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(3), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(2), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -441,49 +430,47 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) - u₁ = u₀ u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) - v₁ = v₀ v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(3), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i, j - 2 - $add, k, grid, u, v) - u₁ = u₀ u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i, j - 2 - $add, k, grid, u) - v₁ = v₀ v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i, j - 2 - $add, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(3), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -513,78 +500,75 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) - v₁ = v₀ - v₂ = v₁ v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(4), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i, j - 2 - $add, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i, j - 2 - $add, k, grid, u) - v₁ = v₀ - v₂ = v₁ v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i, j - 2 - $add, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i, j - 3 - $add, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i, j - 3 - $add, k, grid, u) - v₁ = v₀ - v₂ = v₁ v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i, j - 3 - $add, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 4, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(4), Val(4)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -617,113 +601,109 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ u₄ = u₃ + u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ v₄ = v₃ + v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i, j - 2 - $add, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ u₄ = u₃ + u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i, j - 2 - $add, k, grid, u) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ v₄ = v₃ + v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i, j - 2 - $add, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i, j - 3 - $add, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ u₄ = u₃ + u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i, j - 3 - $add, k, grid, u) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ v₄ = v₃ + v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i, j - 3 - $add, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 4, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i, j - 4 - $add, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ u₄ = u₃ + u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i, j - 4 - $add, k, grid, u) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ v₄ = v₃ + v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i, j - 4 - $add, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 5, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(5), Val(5)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end @inline function $biased_interpolate(i, j, k, grid, @@ -759,154 +739,149 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ̂₂ = ψ̅ * α w₂ = α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ - ψ₄ = ψ₃ ψ₅ = ψ₄ + ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ - u₄ = u₃ u₅ = u₄ + u₄ = u₃ + u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i, j - 1 - $add, k, grid, u) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ - v₄ = v₃ v₅ = v₄ + v₄ = v₃ + v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i, j - 1 - $add, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(6), Val(1)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(6), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ - ψ₄ = ψ₃ ψ₅ = ψ₄ + ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i, j - 2 - $add, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ - u₄ = u₃ u₅ = u₄ + u₄ = u₃ + u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i, j - 2 - $add, k, grid, u) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ - v₄ = v₃ v₅ = v₄ + v₄ = v₃ + v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i, j - 2 - $add, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(6), Val(2)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(6), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ - ψ₄ = ψ₃ ψ₅ = ψ₄ + ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i, j - 3 - $add, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ - u₄ = u₃ u₅ = u₄ + u₄ = u₃ + u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i, j - 3 - $add, k, grid, u) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ - v₄ = v₃ v₅ = v₄ + v₄ = v₃ + v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i, j - 3 - $add, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 4, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(6), Val(3)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(6), Val(4)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ - ψ₄ = ψ₃ ψ₅ = ψ₄ + ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i, j - 4 - $add, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ - u₄ = u₃ u₅ = u₄ + u₄ = u₃ + u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i, j - 4 - $add, k, grid, u) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ - v₄ = v₃ v₅ = v₄ + v₄ = v₃ + v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i, j - 4 - $add, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 5, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(6), Val(4)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(6), Val(5)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α - ψ₁ = ψ₀ - ψ₂ = ψ₁ - ψ₃ = ψ₂ - ψ₄ = ψ₃ ψ₅ = ψ₄ + ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ ψ₀ = ψ(i, j - 5 - $add, k, grid, u, v) - u₁ = u₀ - u₂ = u₁ - u₃ = u₂ - u₄ = u₃ u₅ = u₄ + u₄ = u₃ + u₃ = u₂ + u₂ = u₁ + u₁ = u₀ u₀ = ℑyᵃᶠᵃ(i, j - 5 - $add, k, grid, u) - v₁ = v₀ - v₂ = v₁ - v₃ = v₂ - v₄ = v₃ v₅ = v₄ + v₄ = v₃ + v₃ = v₂ + v₂ = v₁ + v₁ = v₀ v₀ = ℑxᶠᵃᵃ(i, j - 5 - $add, k, grid, v) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 6, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(6), Val(5)) - ψ̂₁ += ψ̅ * C - w₁ += C - ψ̂₂ += ψ̅ * α - w₂ += α + τ += add_to_global_smoothness(β, Val(6), Val(6)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α τ = τ^2 - return (ψ̂₁ + ψ̂₂ * τ) / (w₁ + w₂ * τ) + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end end end \ No newline at end of file From 43f852d5a956de54edcce60beeb2aaf24d813b0c Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 19 Mar 2024 22:30:32 -0400 Subject: [PATCH 141/152] bugfix --- src/Advection/weno_default_stencils.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Advection/weno_default_stencils.jl b/src/Advection/weno_default_stencils.jl index 644b34456a..87657c2364 100644 --- a/src/Advection/weno_default_stencils.jl +++ b/src/Advection/weno_default_stencils.jl @@ -489,6 +489,7 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₁ = getvalue(i, j, k + 1 - $add, grid, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) + τ = β ψ̂₁ = ψ̅ * α ψ̂₂ = ψ̅ * C w₁ = α From 93a09d4f34d2a6c6342a05c01adc3db60b58f493 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 19 Mar 2024 23:25:55 -0400 Subject: [PATCH 142/152] bugfix --- src/Advection/weno_interpolants.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 4c824f2769..7ec5fd567f 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -271,7 +271,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = C * rcp(β + FT(ε))^2 + α = C * rcp(βᵁ + FT(ε))^2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) @@ -287,7 +287,7 @@ for side in [:left, :right], (dir, val, CT) in zip([:xᶠᵃᵃ, :yᵃᶠᵃ, :z # Calculate the `α` coefficient of stencil `s` following a WENO-JS formulation C = FT($coeff(scheme, Val(s-1))) - α = C * rcp(β + FT(ε))^2 + α = C * rcp(βᵠ + FT(ε))^2 # Retrieve stencil `s` and reconstruct `ψ` from stencil `s` ψ̅ = $biased_p(scheme, Val(s-1), ψs, $CT, Val(val), idx, loc) From 39fdad437b46aea5c0f854726d2b539e0da49b26 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 20 Mar 2024 11:42:26 -0400 Subject: [PATCH 143/152] bugfix --- src/Advection/weno_function_stencils.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Advection/weno_function_stencils.jl b/src/Advection/weno_function_stencils.jl index 11918f813b..573f6b18a1 100644 --- a/src/Advection/weno_function_stencils.jl +++ b/src/Advection/weno_function_stencils.jl @@ -59,9 +59,9 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α ψ₂ = ψ₁ ψ₁ = ψ₀ From a7deaa05bc2996492a2013916be21f9c91983fb3 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Wed, 20 Mar 2024 11:46:58 -0400 Subject: [PATCH 144/152] more bugfixes --- src/Advection/weno_velocity_stencils.jl | 63 +++++++++++-------------- 1 file changed, 27 insertions(+), 36 deletions(-) diff --git a/src/Advection/weno_velocity_stencils.jl b/src/Advection/weno_velocity_stencils.jl index 0626ed4bf0..971f943732 100644 --- a/src/Advection/weno_velocity_stencils.jl +++ b/src/Advection/weno_velocity_stencils.jl @@ -25,10 +25,9 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (u₀, u₁), (v₀, v₁), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α ψ₁ = ψ₀ ψ₀ = ψ(i - 1 - $add, j, k, grid, u, v) @@ -70,10 +69,9 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α ψ₂ = ψ₁ ψ₁ = ψ₀ @@ -140,10 +138,9 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α ψ₃ = ψ₂ ψ₂ = ψ₁ @@ -241,10 +238,9 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α ψ₄ = ψ₃ ψ₃ = ψ₂ @@ -380,10 +376,9 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (u₀, u₁), (v₀, v₁), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α ψ₁ = ψ₀ ψ₀ = ψ(i, j - 1 - $add, k, grid, u, v) @@ -425,10 +420,9 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (u₀, u₁, u₂), (v₀, v₁, v₂), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α ψ₂ = ψ₁ ψ₁ = ψ₀ @@ -495,10 +489,9 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (u₀, u₁, u₂, u₃), (v₀, v₁, v₂, v₃), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α ψ₃ = ψ₂ ψ₂ = ψ₁ @@ -596,10 +589,9 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (u₀, u₁, u₂, u₃, u₄), (v₀, v₁, v₂, v₃, v₄), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α ψ₄ = ψ₃ ψ₃ = ψ₂ @@ -734,10 +726,9 @@ for (side, add) in zip([:left, :right], (1, 0)) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄, ψ₅), (u₀, u₁, u₂, u₃, u₄, u₅), (v₀, v₁, v₂, v₃, v₄, v₅), 1, scheme, $val, idx, loc) τ = β - ψ̂₁ = ψ̅ * C - w₁ = C - ψ̂₂ = ψ̅ * α - w₂ = α + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α ψ₅ = ψ₄ ψ₄ = ψ₃ From a93197be399cff6f2e5fb651869858ea6161a6b5 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Thu, 21 Mar 2024 11:58:39 -0400 Subject: [PATCH 145/152] add mention --- src/Advection/weno_interpolants.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Advection/weno_interpolants.jl b/src/Advection/weno_interpolants.jl index 7ec5fd567f..6a9e1c7561 100644 --- a/src/Advection/weno_interpolants.jl +++ b/src/Advection/weno_interpolants.jl @@ -209,7 +209,8 @@ end @inline add_to_global_smoothness(β, ::Val{6}, ::Val{5}) = - β @inline add_to_global_smoothness(β, ::Val{6}, ::Val{6}) = - β -# Reciprocal! +# Reciprocal implementation from Valentin Churavy copied from +# https://github.com/JuliaGPU/CUDA.jl/blob/668b79c6378aa9443faf27d1efa3c117e0701077/perf/volumerhs.jl#L40 let (jlf, f) = (:div_arcp, :div) for (T, llvmT) in ((:Float32, "float"), (:Float64, "double")) ir = """ From a878de262d340944595a581308c88e32f602b777 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Fri, 22 Mar 2024 09:32:31 -0400 Subject: [PATCH 146/152] remove non-necessary directions --- src/Advection/weno_default_stencils.jl | 530 ++---------------------- src/Advection/weno_function_stencils.jl | 392 +++--------------- 2 files changed, 96 insertions(+), 826 deletions(-) diff --git a/src/Advection/weno_default_stencils.jl b/src/Advection/weno_default_stencils.jl index 87657c2364..7aef9dfd55 100644 --- a/src/Advection/weno_default_stencils.jl +++ b/src/Advection/weno_default_stencils.jl @@ -1,18 +1,24 @@ using Printf -@inline getvalue(i, j, k, grid, ψ, args...) = @inbounds ψ[i, j, k] -@inline getvalue(i, j, k, grid, ψ::Function, args...) = ψ(i, j, k, grid, args...) +@inline get_shifted_value_x(i, j, k, grid, shift, ψ, args...) = @inbounds ψ[i + shift, j, k] +@inline get_shifted_value_x(i, j, k, grid, shift, ψ::Function, args...) = ψ(i + shift, j, k, grid, args...) + +@inline get_shifted_value_y(i, j, k, grid, shift, ψ, args...) = @inbounds ψ[i, j + shift, k] +@inline get_shifted_value_y(i, j, k, grid, shift, ψ::Function, args...) = ψ(i, j + shift, k, grid, args...) + +@inline get_shifted_value_z(i, j, k, grid, shift, ψ, args...) = @inbounds ψ[i, j, k + shift] +@inline get_shifted_value_z(i, j, k, grid, shift, ψ::Function, args...) = ψ(i, j, k + shift, grid, args...) ##### ##### STENCILS IN X ##### -for (side, add) in zip([:left, :right], (1, 0)) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_xᶠᵃᵃ) +for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, :z), (:ᶠᵃᵃ, :ᵃᶠᵃ, :ᵃᵃᶠ), (1, 2, 3)) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir, loc) coeff = Symbol(:coeff_, side) - weno_interpolant = Symbol(side, :_weno_interpolant_xᶠᵃᵃ) - val = 1 - + weno_interpolant = Symbol(side, :_weno_interpolant_, dir, loc) + get_shifted_value = Symbol(:get_shifted_value_, dir) + @eval begin # Fallback for DefaultStencil formulations and disambiguation @inline $biased_interpolate(i, j, k, grid, scheme::WENO{2}, ψ, idx, loc, ::DefaultStencil, args...) = @@ -27,12 +33,12 @@ for (side, add) in zip([:left, :right], (1, 0)) $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} + scheme::WENO{2}, + ψ, idx, loc, args...) # All stencils - ψ₀ = getvalue(i - $add, j, k, grid, ψ, args...) - ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) + ψ₁ = $get_shifted_value(i, j, k, grid, 1 - $add, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) τ = add_to_global_smoothness(β, Val(2), Val(1)) @@ -41,7 +47,7 @@ for (side, add) in zip([:left, :right], (1, 0)) w₁ = α ψ₁ = ψ₀ - ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) @@ -60,9 +66,9 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(i - $add, j, k, grid, ψ, args...) - ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) - ψ₂ = getvalue(i + 2 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) + ψ₁ = $get_shifted_value(i, j, k, grid, 1 - $add, ψ, args...) + ψ₂ = $get_shifted_value(i, j, k, grid, 2 - $add, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) τ = add_to_global_smoothness(β, Val(3), Val(1)) @@ -72,7 +78,7 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) @@ -83,7 +89,7 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) @@ -94,19 +100,18 @@ for (side, add) in zip([:left, :right], (1, 0)) τ = τ * τ - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) # + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end - @inline function $biased_interpolate(i, j, k, grid, scheme::WENO{4, FT, XT, YT, ZT}, ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(i - $add, j, k, grid, ψ, args...) - ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) - ψ₂ = getvalue(i + 2 - $add, j, k, grid, ψ, args...) - ψ₃ = getvalue(i + 3 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) + ψ₁ = $get_shifted_value(i, j, k, grid, 1 - $add, ψ, args...) + ψ₂ = $get_shifted_value(i, j, k, grid, 2 - $add, ψ, args...) + ψ₃ = $get_shifted_value(i, j, k, grid, 3 - $add, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) τ = add_to_global_smoothness(β, Val(4), Val(1)) @@ -117,460 +122,7 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₃ = ψ₂ ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(4), Val(2)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(4), Val(3)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i - 3 - $add, j, k, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(4), Val(4)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - τ = τ * τ - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} - - # All stencils - ψ₀ = getvalue(i - $add, j, k, grid, ψ, args...) - ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) - ψ₂ = getvalue(i + 2 - $add, j, k, grid, ψ, args...) - ψ₃ = getvalue(i + 3 - $add, j, k, grid, ψ, args...) - ψ₄ = getvalue(i + 4 - $add, j, k, grid, ψ, args...) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - ψ₄ = ψ₃ - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₄ = ψ₃ - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₄ = ψ₃ - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i - 3 - $add, j, k, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₄ = ψ₃ - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i - 4 - $add, j, k, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(5)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - τ = τ * τ - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - end -end - -##### -##### STENCILS IN Y -##### - -for (side, add) in zip([:left, :right], (1, 0)) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_yᵃᶠᵃ) - coeff = Symbol(:coeff_, side) - weno_interpolant = Symbol(side, :_weno_interpolant_yᵃᶠᵃ) - val = 2 - - @eval begin - # Fallback for DefaultStencil formulations and disambiguation - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{2}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{3}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{4}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{5}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{6}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} - - # All stencils - ψ₀ = getvalue(i, j - $add, k, grid, ψ, args...) - ψ₁ = getvalue(i, j + 1 - $add, k, grid, ψ, args...) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) - τ = add_to_global_smoothness(β, Val(2), Val(1)) - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(2), Val(2)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - τ = τ * τ - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} - - # All stencils - ψ₀ = getvalue(i, j - $add, k, grid, ψ, args...) - ψ₁ = getvalue(i, j + 1 - $add, k, grid, ψ, args...) - ψ₂ = getvalue(i, j + 2 - $add, k, grid, ψ, args...) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(3), Val(3)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - τ = τ * τ - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} - - # All stencils - ψ₀ = getvalue(i, j - $add, k, grid, ψ, args...) - ψ₁ = getvalue(i, j + 1 - $add, k, grid, ψ, args...) - ψ₂ = getvalue(i, j + 2 - $add, k, grid, ψ, args...) - ψ₃ = getvalue(i, j + 3 - $add, k, grid, ψ, args...) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) - τ = add_to_global_smoothness(β, Val(4), Val(2)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(4), Val(3)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 3 - $add, k, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(4), Val(4)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - τ = τ * τ - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} - - # All stencils - ψ₀ = getvalue(i, j - $add, k, grid, ψ, args...) - ψ₁ = getvalue(i, j + 1 - $add, k, grid, ψ, args...) - ψ₂ = getvalue(i, j + 2 - $add, k, grid, ψ, args...) - ψ₃ = getvalue(i, j + 3 - $add, k, grid, ψ, args...) - ψ₄ = getvalue(i, j + 4 - $add, k, grid, ψ, args...) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - ψ₄ = ψ₃ - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₄ = ψ₃ - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₄ = ψ₃ - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 3 - $add, k, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₄ = ψ₃ - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 4 - $add, k, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(5)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - τ = τ * τ - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - end -end - -##### -##### STENCILS IN Z -##### - -for (side, add) in zip([:left, :right], (1, 0)) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_zᵃᵃᶠ) - coeff = Symbol(:coeff_, side) - weno_interpolant = Symbol(side, :_weno_interpolant_zᵃᵃᶠ) - val = 3 - - @eval begin - # Fallback for DefaultStencil formulations and disambiguation - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{2}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{3}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{4}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{5}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{6}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} - - # All stencils - ψ₀ = getvalue(i, j, k - $add, grid, ψ, args...) - ψ₁ = getvalue(i, j, k + 1 - $add, grid, ψ, args...) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j, k - 1 - $add, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(2), Val(2)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - τ = τ * τ - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} - - # All stencils - ψ₀ = getvalue(i, j, k - $add, grid, ψ, args...) - ψ₁ = getvalue(i, j, k + 1 - $add, grid, ψ, args...) - ψ₂ = getvalue(i, j, k + 2 - $add, grid, ψ, args...) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j, k - 1 - $add, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j, k - 2 - $add, grid, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(3), Val(3)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - τ = τ * τ - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} - - # All stencils - ψ₀ = getvalue(i, j, k - $add, grid, ψ, args...) - ψ₁ = getvalue(i, j, k + 1 - $add, grid, ψ, args...) - ψ₂ = getvalue(i, j, k + 2 - $add, grid, ψ, args...) - ψ₃ = getvalue(i, j, k + 3 - $add, grid, ψ, args...) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j, k - 1 - $add, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) @@ -582,7 +134,7 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₃ = ψ₂ ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i, j, k - 2 - $add, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) @@ -594,7 +146,7 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₃ = ψ₂ ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i, j, k - 3 - $add, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 3 - $add, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) @@ -613,11 +165,11 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ, idx, loc, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(i, j, k - $add, grid, ψ, args...) - ψ₁ = getvalue(i, j, k + 1 - $add, grid, ψ, args...) - ψ₂ = getvalue(i, j, k + 2 - $add, grid, ψ, args...) - ψ₃ = getvalue(i, j, k + 3 - $add, grid, ψ, args...) - ψ₄ = getvalue(i, j, k + 4 - $add, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) + ψ₁ = $get_shifted_value(i, j, k, grid, + 1 - $add, ψ, args...) + ψ₂ = $get_shifted_value(i, j, k, grid, + 2 - $add, ψ, args...) + ψ₃ = $get_shifted_value(i, j, k, grid, + 3 - $add, ψ, args...) + ψ₄ = $get_shifted_value(i, j, k, grid, + 4 - $add, ψ, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) τ = β @@ -629,7 +181,7 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₃ = ψ₂ ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i, j, k - 1 - $add, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) @@ -642,7 +194,7 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₃ = ψ₂ ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i, j, k - 2 - $add, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) @@ -655,7 +207,7 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₃ = ψ₂ ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i, j, k - 3 - $add, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 3 - $add, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) @@ -668,7 +220,7 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₃ = ψ₂ ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i, j, k - 4 - $add, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 4 - $add, ψ, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) @@ -682,4 +234,4 @@ for (side, add) in zip([:left, :right], (1, 0)) return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end end -end +end \ No newline at end of file diff --git a/src/Advection/weno_function_stencils.jl b/src/Advection/weno_function_stencils.jl index 573f6b18a1..eb0981e7ae 100644 --- a/src/Advection/weno_function_stencils.jl +++ b/src/Advection/weno_function_stencils.jl @@ -2,11 +2,12 @@ ##### STENCILS IN X ##### -for (side, add) in zip([:left, :right], (1, 0)) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_xᶠᵃᵃ) + +for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, :z), (:ᶠᵃᵃ, :ᵃᶠᵃ, :ᵃᵃᶠ), (1, 2, 3)) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir, loc) coeff = Symbol(:coeff_, side) - weno_interpolant = Symbol(side, :_weno_interpolant_xᶠᵃᵃ) - val = 1 + weno_interpolant = Symbol(side, :_weno_interpolant_, dir, loc) + get_shifted_value = Symbol(:get_shifted_value_, dir) @eval begin @inline function $biased_interpolate(i, j, k, grid, @@ -14,11 +15,11 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(i - $add, j, k, grid, ψ, args...) - ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) + ψ₁ = $get_shifted_value(i, j, k, grid, + 1 - $add, ψ, args...) - ϕ₀ = getvalue(i - $add, j, k, grid, VI.func, args...) - ϕ₁ = getvalue(i + 1 - $add, j, k, grid, VI.func, args...) + ϕ₀ = $get_shifted_value(i, j, k, grid, - $add, VI.func, args...) + ϕ₁ = $get_shifted_value(i, j, k, grid, + 1 - $add, VI.func, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 1, scheme, $val, idx, loc) τ = β @@ -27,10 +28,10 @@ for (side, add) in zip([:left, :right], (1, 0)) w₁ = α ψ₁ = ψ₀ - ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i - 1 - $add, j, k, grid, VI.func, args...) + ϕ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 2, scheme, $val, idx, loc) @@ -49,13 +50,13 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(i - $add, j, k, grid, ψ, args...) - ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) - ψ₂ = getvalue(i + 2 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) + ψ₁ = $get_shifted_value(i, j, k, grid, + 1 - $add, ψ, args...) + ψ₂ = $get_shifted_value(i, j, k, grid, + 2 - $add, ψ, args...) - ϕ₀ = getvalue(i - $add, j, k, grid, VI.func, args...) - ϕ₁ = getvalue(i + 1 - $add, j, k, grid, VI.func, args...) - ϕ₂ = getvalue(i + 2 - $add, j, k, grid, VI.func, args...) + ϕ₀ = $get_shifted_value(i, j, k, grid, - $add, VI.func, args...) + ϕ₁ = $get_shifted_value(i, j, k, grid, + 1 - $add, VI.func, args...) + ϕ₂ = $get_shifted_value(i, j, k, grid, + 2 - $add, VI.func, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 1, scheme, $val, idx, loc) τ = β @@ -65,11 +66,11 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) ϕ₂ = ϕ₁ ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i - 1 - $add, j, k, grid, VI.func, args...) + ϕ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 2, scheme, $val, idx, loc) @@ -80,11 +81,11 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) ϕ₂ = ϕ₁ ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i - 2 - $add, j, k, grid, VI.func, args...) + ϕ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 3, scheme, $val, idx, loc) @@ -103,15 +104,15 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(i - $add, j, k, grid, ψ, args...) - ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) - ψ₂ = getvalue(i + 2 - $add, j, k, grid, ψ, args...) - ψ₃ = getvalue(i + 3 - $add, j, k, grid, ψ, args...) - - ϕ₀ = getvalue(i - $add, j, k, grid, VI.func, args...) - ϕ₁ = getvalue(i + 1 - $add, j, k, grid, VI.func, args...) - ϕ₂ = getvalue(i + 2 - $add, j, k, grid, VI.func, args...) - ϕ₃ = getvalue(i + 3 - $add, j, k, grid, VI.func, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) + ψ₁ = $get_shifted_value(i, j, k, grid, + 1 - $add, ψ, args...) + ψ₂ = $get_shifted_value(i, j, k, grid, + 2 - $add, ψ, args...) + ψ₃ = $get_shifted_value(i, j, k, grid, + 3 - $add, ψ, args...) + + ϕ₀ = $get_shifted_value(i, j, k, grid, - $add, VI.func, args...) + ϕ₁ = $get_shifted_value(i, j, k, grid, + 1 - $add, VI.func, args...) + ϕ₂ = $get_shifted_value(i, j, k, grid, + 2 - $add, VI.func, args...) + ϕ₃ = $get_shifted_value(i, j, k, grid, + 3 - $add, VI.func, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 1, scheme, $val, idx, loc) τ = β @@ -122,12 +123,12 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₃ = ψ₂ ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) ϕ₃ = ϕ₂ ϕ₂ = ϕ₁ ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i - 1 - $add, j, k, grid, VI.func, args...) + ϕ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 2, scheme, $val, idx, loc) @@ -139,12 +140,12 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₃ = ψ₂ ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) ϕ₃ = ϕ₂ ϕ₂ = ϕ₁ ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i - 2 - $add, j, k, grid, VI.func, args...) + ϕ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 3, scheme, $val, idx, loc) @@ -156,12 +157,12 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₃ = ψ₂ ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i - 3 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 3 - $add, ψ, args...) ϕ₃ = ϕ₂ ϕ₂ = ϕ₁ ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i - 3 - $add, j, k, grid, VI.func, args...) + ϕ₀ = $get_shifted_value(i, j, k, grid, - 3 - $add, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 4, scheme, $val, idx, loc) @@ -180,17 +181,17 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} # All stencils - ψ₀ = getvalue(i - $add, j, k, grid, ψ, args...) - ψ₁ = getvalue(i + 1 - $add, j, k, grid, ψ, args...) - ψ₂ = getvalue(i + 2 - $add, j, k, grid, ψ, args...) - ψ₃ = getvalue(i + 3 - $add, j, k, grid, ψ, args...) - ψ₄ = getvalue(i + 4 - $add, j, k, grid, ψ, args...) - - ϕ₀ = getvalue(i - $add, j, k, grid, VI.func, args...) - ϕ₁ = getvalue(i + 1 - $add, j, k, grid, VI.func, args...) - ϕ₂ = getvalue(i + 2 - $add, j, k, grid, VI.func, args...) - ϕ₃ = getvalue(i + 3 - $add, j, k, grid, VI.func, args...) - ϕ₄ = getvalue(i + 4 - $add, j, k, grid, VI.func, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) + ψ₁ = $get_shifted_value(i, j, k, grid, + 1 - $add, ψ, args...) + ψ₂ = $get_shifted_value(i, j, k, grid, + 2 - $add, ψ, args...) + ψ₃ = $get_shifted_value(i, j, k, grid, + 3 - $add, ψ, args...) + ψ₄ = $get_shifted_value(i, j, k, grid, + 4 - $add, ψ, args...) + + ϕ₀ = $get_shifted_value(i, j, k, grid, - $add, VI.func, args...) + ϕ₁ = $get_shifted_value(i, j, k, grid, + 1 - $add, VI.func, args...) + ϕ₂ = $get_shifted_value(i, j, k, grid, + 2 - $add, VI.func, args...) + ϕ₃ = $get_shifted_value(i, j, k, grid, + 3 - $add, VI.func, args...) + ϕ₄ = $get_shifted_value(i, j, k, grid, + 4 - $add, VI.func, args...) β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 1, scheme, $val, idx, loc) τ = β @@ -202,13 +203,13 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₃ = ψ₂ ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i - 1 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) ϕ₄ = ϕ₃ ϕ₃ = ϕ₂ ϕ₂ = ϕ₁ ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i - 1 - $add, j, k, grid, VI.func, args...) + ϕ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 2, scheme, $val, idx, loc) @@ -221,13 +222,13 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₃ = ψ₂ ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i - 2 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) ϕ₄ = ϕ₃ ϕ₃ = ϕ₂ ϕ₂ = ϕ₁ ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i - 2 - $add, j, k, grid, VI.func, args...) + ϕ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 3, scheme, $val, idx, loc) @@ -240,13 +241,13 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₃ = ψ₂ ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i - 3 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 3 - $add, ψ, args...) ϕ₄ = ϕ₃ ϕ₃ = ϕ₂ ϕ₂ = ϕ₁ ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i - 3 - $add, j, k, grid, VI.func, args...) + ϕ₀ = $get_shifted_value(i, j, k, grid, - 3 - $add, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 4, scheme, $val, idx, loc) @@ -259,13 +260,13 @@ for (side, add) in zip([:left, :right], (1, 0)) ψ₃ = ψ₂ ψ₂ = ψ₁ ψ₁ = ψ₀ - ψ₀ = getvalue(i - 4 - $add, j, k, grid, ψ, args...) + ψ₀ = $get_shifted_value(i, j, k, grid, - 4 - $add, ψ, args...) ϕ₄ = ϕ₃ ϕ₃ = ϕ₂ ϕ₂ = ϕ₁ ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i - 4 - $add, j, k, grid, VI.func, args...) + ϕ₀ = $get_shifted_value(i, j, k, grid, - 4 - $add, VI.func, args...) # Stencil S₁ β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 5, scheme, $val, idx, loc) @@ -280,286 +281,3 @@ for (side, add) in zip([:left, :right], (1, 0)) end end end - -##### -##### STENCILS IN Y -##### - -for (side, add) in zip([:left, :right], (1, 0)) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_yᵃᶠᵃ) - weno_interpolant = Symbol(side, :_weno_interpolant_yᵃᶠᵃ) - val = 2 - - @eval begin - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2, FT, XT, YT, ZT}, - ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - - # All stencils - ψ₀ = getvalue(i, j - $add, k, grid, ψ, args...) - ψ₁ = getvalue(i, j + 1 - $add, k, grid, ψ, args...) - - ϕ₀ = getvalue(i, j - $add, k, grid, VI.func, args...) - ϕ₁ = getvalue(i, j + 1 - $add, k, grid, VI.func, args...) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) - - ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i, j - 1 - $add, k, grid, VI.func, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), (ϕ₀, ϕ₁), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(2), Val(2)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - τ = τ^2 - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT, XT, YT, ZT}, - ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - - # All stencils - ψ₀ = getvalue(i, j - $add, k, grid, ψ, args...) - ψ₁ = getvalue(i, j + 1 - $add, k, grid, ψ, args...) - ψ₂ = getvalue(i, j + 2 - $add, k, grid, ψ, args...) - - ϕ₀ = getvalue(i, j - $add, k, grid, VI.func, args...) - ϕ₁ = getvalue(i, j + 1 - $add, k, grid, VI.func, args...) - ϕ₂ = getvalue(i, j + 2 - $add, k, grid, VI.func, args...) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) - - ϕ₂ = ϕ₁ - ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i, j - 1 - $add, k, grid, VI.func, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) - - ϕ₂ = ϕ₁ - ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i, j - 2 - $add, k, grid, VI.func, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), (ϕ₀, ϕ₁, ϕ₂), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(3), Val(3)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - τ = τ^2 - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT, XT, YT, ZT}, - ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - - # All stencils - ψ₀ = getvalue(i, j - $add, k, grid, ψ, args...) - ψ₁ = getvalue(i, j + 1 - $add, k, grid, ψ, args...) - ψ₂ = getvalue(i, j + 2 - $add, k, grid, ψ, args...) - ψ₃ = getvalue(i, j + 3 - $add, k, grid, ψ, args...) - - ϕ₀ = getvalue(i, j - $add, k, grid, VI.func, args...) - ϕ₁ = getvalue(i, j + 1 - $add, k, grid, VI.func, args...) - ϕ₂ = getvalue(i, j + 2 - $add, k, grid, VI.func, args...) - ϕ₃ = getvalue(i, j + 3 - $add, k, grid, VI.func, args...) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) - - ϕ₃ = ϕ₂ - ϕ₂ = ϕ₁ - ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i, j - 1 - $add, k, grid, VI.func, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(4), Val(2)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) - - ϕ₃ = ϕ₂ - ϕ₂ = ϕ₁ - ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i, j - 2 - $add, k, grid, VI.func, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(4), Val(3)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 3 - $add, k, grid, ψ, args...) - - ϕ₃ = ϕ₂ - ϕ₂ = ϕ₁ - ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i, j - 3 - $add, k, grid, VI.func, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), (ϕ₀, ϕ₁, ϕ₂, ϕ₃), 4, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(4), Val(4)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - τ = τ^2 - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT, XT, YT, ZT}, - ψ, idx, loc, VI::FunctionStencil, args...) where {FT, XT, YT, ZT} - - # All stencils - ψ₀ = getvalue(i, j - $add, k, grid, ψ, args...) - ψ₁ = getvalue(i, j + 1 - $add, k, grid, ψ, args...) - ψ₂ = getvalue(i, j + 2 - $add, k, grid, ψ, args...) - ψ₃ = getvalue(i, j + 3 - $add, k, grid, ψ, args...) - ψ₄ = getvalue(i, j + 4 - $add, k, grid, ψ, args...) - - ϕ₀ = getvalue(i, j - $add, k, grid, VI.func, args...) - ϕ₁ = getvalue(i, j + 1 - $add, k, grid, VI.func, args...) - ϕ₂ = getvalue(i, j + 2 - $add, k, grid, VI.func, args...) - ϕ₃ = getvalue(i, j + 3 - $add, k, grid, VI.func, args...) - ϕ₄ = getvalue(i, j + 4 - $add, k, grid, VI.func, args...) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - ψ₄ = ψ₃ - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 1 - $add, k, grid, ψ, args...) - - ϕ₄ = ϕ₃ - ϕ₃ = ϕ₂ - ϕ₂ = ϕ₁ - ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i, j - 1 - $add, k, grid, VI.func, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₄ = ψ₃ - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 2 - $add, k, grid, ψ, args...) - - ϕ₄ = ϕ₃ - ϕ₃ = ϕ₂ - ϕ₂ = ϕ₁ - ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i, j - 2 - $add, k, grid, VI.func, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₄ = ψ₃ - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 3 - $add, k, grid, ψ, args...) - - ϕ₄ = ϕ₃ - ϕ₃ = ϕ₂ - ϕ₂ = ϕ₁ - ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i, j - 3 - $add, k, grid, VI.func, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 4, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₄ = ψ₃ - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = getvalue(i, j - 4 - $add, k, grid, ψ, args...) - - ϕ₄ = ϕ₃ - ϕ₃ = ϕ₂ - ϕ₂ = ϕ₁ - ϕ₁ = ϕ₀ - ϕ₀ = getvalue(i, j - 4 - $add, k, grid, VI.func, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), (ϕ₀, ϕ₁, ϕ₂, ϕ₃, ϕ₄), 5, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(5)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - τ = τ^2 - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - end -end \ No newline at end of file From b4b79d279133e5117c7a2512093baccd41aa3885 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Fri, 22 Mar 2024 09:49:22 -0400 Subject: [PATCH 147/152] add some metaprogramming --- src/Advection/weno_default_stencils.jl | 64 +++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/src/Advection/weno_default_stencils.jl b/src/Advection/weno_default_stencils.jl index 7aef9dfd55..4d20e596d2 100644 --- a/src/Advection/weno_default_stencils.jl +++ b/src/Advection/weno_default_stencils.jl @@ -234,4 +234,66 @@ for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) end end -end \ No newline at end of file +end + + +#= Metaprogrammed implementation (to finish) + +@inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{$N}, + ψ, idx, loc, args...) + + # All stencils + $(retrieve_initial_stencil(N, dir, add)) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α + + @unroll for s in 2:$N + $(update_stencil(N, dir, - s + 1, add)) + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), s, scheme, $val, idx, loc) + τ += add_to_global_smoothness(β, Val($N), Val(s)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α + end + + τ = τ * τ + + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) +end + +# TO finish +stencil(N) = :($(Symbol(:ψ, i) for i in 1:N)) + +function retrieve_initial_stencil(N, dir, add) + expr = [] + get_shifted_value = Symbol(:get_shifted_value_, dir) + for i in 0:N-1 + ψ = Symbol(:ψ, i) + push!(expr, :($ψ = $get_shifted_value(i, j, k, grid, $i - $add, ψ, args...))) + end + eblk = Expr(:block, expr...) + + return eblk +end + +function update_stencil(N, dir, newval, add) + expr = [] + get_shifted_value = Symbol(:get_shifted_value_, dir) + for i in N-1:-1:1 + ψ = Symbol(:ψ, i) + ψp = Symbol(:ψ, i-1) + push!(expr, :($ψ = $ψp)) + end + ψ = :ψ0 + push!(expr, :($ψ = $get_shifted_value(i, j, k, grid, $newval - $add, ψ, args...))) + eblk = Expr(:block, expr...) + + return eblk +end + +=# \ No newline at end of file From 9e653a04ded40d5f5f0b7e62c339632003b776ee Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Fri, 22 Mar 2024 15:52:30 -0400 Subject: [PATCH 148/152] full metaprogramming --- src/Advection/Advection.jl | 4 +- src/Advection/weno_default_stencils.jl | 651 +++++++++++++++---------- 2 files changed, 401 insertions(+), 254 deletions(-) diff --git a/src/Advection/Advection.jl b/src/Advection/Advection.jl index e85f51009c..a1451d2852 100644 --- a/src/Advection/Advection.jl +++ b/src/Advection/Advection.jl @@ -68,8 +68,8 @@ include("upwind_biased_reconstruction.jl") include("weno_reconstruction.jl") include("weno_interpolants.jl") include("weno_default_stencils.jl") -include("weno_function_stencils.jl") -include("weno_velocity_stencils.jl") +# include("weno_function_stencils.jl") +# include("weno_velocity_stencils.jl") include("stretched_weno_smoothness.jl") include("multi_dimensional_reconstruction.jl") include("vector_invariant_upwinding.jl") diff --git a/src/Advection/weno_default_stencils.jl b/src/Advection/weno_default_stencils.jl index 4d20e596d2..f922706151 100644 --- a/src/Advection/weno_default_stencils.jl +++ b/src/Advection/weno_default_stencils.jl @@ -1,5 +1,3 @@ -using Printf - @inline get_shifted_value_x(i, j, k, grid, shift, ψ, args...) = @inbounds ψ[i + shift, j, k] @inline get_shifted_value_x(i, j, k, grid, shift, ψ::Function, args...) = ψ(i + shift, j, k, grid, args...) @@ -13,287 +11,436 @@ using Printf ##### STENCILS IN X ##### -for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, :z), (:ᶠᵃᵃ, :ᵃᶠᵃ, :ᵃᵃᶠ), (1, 2, 3)) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir, loc) - coeff = Symbol(:coeff_, side) - weno_interpolant = Symbol(side, :_weno_interpolant_, dir, loc) - get_shifted_value = Symbol(:get_shifted_value_, dir) - - @eval begin - # Fallback for DefaultStencil formulations and disambiguation - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{2}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{3}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{4}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{5}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - @inline $biased_interpolate(i, j, k, grid, scheme::WENO{6}, ψ, idx, loc, ::DefaultStencil, args...) = - $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{2}, - ψ, idx, loc, args...) +# for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, :z), (:ᶠᵃᵃ, :ᵃᶠᵃ, :ᵃᵃᶠ), (1, 2, 3)) +# biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir, loc) +# coeff = Symbol(:coeff_, side) +# weno_interpolant = Symbol(side, :_weno_interpolant_, dir, loc) +# get_shifted_value = Symbol(:get_shifted_value_, dir) + +# @eval begin +# # Fallback for DefaultStencil formulations and disambiguation +# @inline $biased_interpolate(i, j, k, grid, scheme::WENO{2}, ψ, idx, loc, ::DefaultStencil, args...) = +# $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) +# @inline $biased_interpolate(i, j, k, grid, scheme::WENO{3}, ψ, idx, loc, ::DefaultStencil, args...) = +# $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) +# @inline $biased_interpolate(i, j, k, grid, scheme::WENO{4}, ψ, idx, loc, ::DefaultStencil, args...) = +# $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) +# @inline $biased_interpolate(i, j, k, grid, scheme::WENO{5}, ψ, idx, loc, ::DefaultStencil, args...) = +# $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) +# @inline $biased_interpolate(i, j, k, grid, scheme::WENO{6}, ψ, idx, loc, ::DefaultStencil, args...) = +# $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + +# @inline function $biased_interpolate(i, j, k, grid, +# scheme::WENO{2}, +# ψ, idx, loc, args...) - # All stencils - ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) - ψ₁ = $get_shifted_value(i, j, k, grid, 1 - $add, ψ, args...) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) - τ = add_to_global_smoothness(β, Val(2), Val(1)) - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - ψ₁ = ψ₀ - ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(2), Val(2)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - τ = τ * τ - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{3, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} +# # All stencils +# ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) +# ψ₁ = $get_shifted_value(i, j, k, grid, 1 - $add, ψ, args...) + +# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) +# τ = add_to_global_smoothness(β, Val(2), Val(1)) +# ψ̂₁ = ψ̅ * α +# ψ̂₂ = ψ̅ * C +# w₁ = α + +# ψ₁ = ψ₀ +# ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) + +# # Stencil S₁ +# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) +# τ += add_to_global_smoothness(β, Val(2), Val(2)) +# ψ̂₁ += ψ̅ * α +# ψ̂₂ += ψ̅ * C +# w₁ += α + +# τ = τ * τ + +# return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) +# end + +# @inline function $biased_interpolate(i, j, k, grid, +# scheme::WENO{3, FT, XT, YT, ZT}, +# ψ, idx, loc, args...) where {FT, XT, YT, ZT} - # All stencils - ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) - ψ₁ = $get_shifted_value(i, j, k, grid, 1 - $add, ψ, args...) - ψ₂ = $get_shifted_value(i, j, k, grid, 2 - $add, ψ, args...) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) - τ = add_to_global_smoothness(β, Val(3), Val(1)) - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(3), Val(2)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(3), Val(3)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - τ = τ * τ - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{4, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} +# # All stencils +# ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) +# ψ₁ = $get_shifted_value(i, j, k, grid, 1 - $add, ψ, args...) +# ψ₂ = $get_shifted_value(i, j, k, grid, 2 - $add, ψ, args...) + +# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) +# τ = add_to_global_smoothness(β, Val(3), Val(1)) +# ψ̂₁ = ψ̅ * α +# ψ̂₂ = ψ̅ * C +# w₁ = α + +# ψ₂ = ψ₁ +# ψ₁ = ψ₀ +# ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) + +# # Stencil S₁ +# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) +# τ += add_to_global_smoothness(β, Val(3), Val(2)) +# ψ̂₁ += ψ̅ * α +# ψ̂₂ += ψ̅ * C +# w₁ += α + +# ψ₂ = ψ₁ +# ψ₁ = ψ₀ +# ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) + +# # Stencil S₁ +# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) +# τ += add_to_global_smoothness(β, Val(3), Val(3)) +# ψ̂₁ += ψ̅ * α +# ψ̂₂ += ψ̅ * C +# w₁ += α + +# τ = τ * τ + +# return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) +# end + +# @inline function $biased_interpolate(i, j, k, grid, +# scheme::WENO{4, FT, XT, YT, ZT}, +# ψ, idx, loc, args...) where {FT, XT, YT, ZT} - # All stencils - ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) - ψ₁ = $get_shifted_value(i, j, k, grid, 1 - $add, ψ, args...) - ψ₂ = $get_shifted_value(i, j, k, grid, 2 - $add, ψ, args...) - ψ₃ = $get_shifted_value(i, j, k, grid, 3 - $add, ψ, args...) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) - τ = add_to_global_smoothness(β, Val(4), Val(1)) - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(4), Val(2)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(4), Val(3)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = $get_shifted_value(i, j, k, grid, - 3 - $add, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(4), Val(4)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - τ = τ * τ - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{5, FT, XT, YT, ZT}, - ψ, idx, loc, args...) where {FT, XT, YT, ZT} +# # All stencils +# ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) +# ψ₁ = $get_shifted_value(i, j, k, grid, 1 - $add, ψ, args...) +# ψ₂ = $get_shifted_value(i, j, k, grid, 2 - $add, ψ, args...) +# ψ₃ = $get_shifted_value(i, j, k, grid, 3 - $add, ψ, args...) + +# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) +# τ = add_to_global_smoothness(β, Val(4), Val(1)) +# ψ̂₁ = ψ̅ * α +# ψ̂₂ = ψ̅ * C +# w₁ = α + +# ψ₃ = ψ₂ +# ψ₂ = ψ₁ +# ψ₁ = ψ₀ +# ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) + +# # Stencil S₁ +# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) +# τ += add_to_global_smoothness(β, Val(4), Val(2)) +# ψ̂₁ += ψ̅ * α +# ψ̂₂ += ψ̅ * C +# w₁ += α + +# ψ₃ = ψ₂ +# ψ₂ = ψ₁ +# ψ₁ = ψ₀ +# ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) + +# # Stencil S₁ +# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) +# τ += add_to_global_smoothness(β, Val(4), Val(3)) +# ψ̂₁ += ψ̅ * α +# ψ̂₂ += ψ̅ * C +# w₁ += α + +# ψ₃ = ψ₂ +# ψ₂ = ψ₁ +# ψ₁ = ψ₀ +# ψ₀ = $get_shifted_value(i, j, k, grid, - 3 - $add, ψ, args...) + +# # Stencil S₁ +# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) +# τ += add_to_global_smoothness(β, Val(4), Val(4)) +# ψ̂₁ += ψ̅ * α +# ψ̂₂ += ψ̅ * C +# w₁ += α + +# τ = τ * τ + +# return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) +# end + +# @inline function $biased_interpolate(i, j, k, grid, +# scheme::WENO{5, FT, XT, YT, ZT}, +# ψ, idx, loc, args...) where {FT, XT, YT, ZT} - # All stencils - ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) - ψ₁ = $get_shifted_value(i, j, k, grid, + 1 - $add, ψ, args...) - ψ₂ = $get_shifted_value(i, j, k, grid, + 2 - $add, ψ, args...) - ψ₃ = $get_shifted_value(i, j, k, grid, + 3 - $add, ψ, args...) - ψ₄ = $get_shifted_value(i, j, k, grid, + 4 - $add, ψ, args...) - - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - ψ₄ = ψ₃ - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(2)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₄ = ψ₃ - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(3)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₄ = ψ₃ - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = $get_shifted_value(i, j, k, grid, - 3 - $add, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(4)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - ψ₄ = ψ₃ - ψ₃ = ψ₂ - ψ₂ = ψ₁ - ψ₁ = ψ₀ - ψ₀ = $get_shifted_value(i, j, k, grid, - 4 - $add, ψ, args...) - - # Stencil S₁ - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val(5), Val(5)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - - τ = τ * τ - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - end +# # All stencils +# ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) +# ψ₁ = $get_shifted_value(i, j, k, grid, + 1 - $add, ψ, args...) +# ψ₂ = $get_shifted_value(i, j, k, grid, + 2 - $add, ψ, args...) +# ψ₃ = $get_shifted_value(i, j, k, grid, + 3 - $add, ψ, args...) +# ψ₄ = $get_shifted_value(i, j, k, grid, + 4 - $add, ψ, args...) + +# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) +# τ = β +# ψ̂₁ = ψ̅ * α +# ψ̂₂ = ψ̅ * C +# w₁ = α + +# ψ₄ = ψ₃ +# ψ₃ = ψ₂ +# ψ₂ = ψ₁ +# ψ₁ = ψ₀ +# ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) + +# # Stencil S₁ +# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) +# τ += add_to_global_smoothness(β, Val(5), Val(2)) +# ψ̂₁ += ψ̅ * α +# ψ̂₂ += ψ̅ * C +# w₁ += α + +# ψ₄ = ψ₃ +# ψ₃ = ψ₂ +# ψ₂ = ψ₁ +# ψ₁ = ψ₀ +# ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) + +# # Stencil S₁ +# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) +# τ += add_to_global_smoothness(β, Val(5), Val(3)) +# ψ̂₁ += ψ̅ * α +# ψ̂₂ += ψ̅ * C +# w₁ += α + +# ψ₄ = ψ₃ +# ψ₃ = ψ₂ +# ψ₂ = ψ₁ +# ψ₁ = ψ₀ +# ψ₀ = $get_shifted_value(i, j, k, grid, - 3 - $add, ψ, args...) + +# # Stencil S₁ +# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) +# τ += add_to_global_smoothness(β, Val(5), Val(4)) +# ψ̂₁ += ψ̅ * α +# ψ̂₂ += ψ̅ * C +# w₁ += α + +# ψ₄ = ψ₃ +# ψ₃ = ψ₂ +# ψ₂ = ψ₁ +# ψ₁ = ψ₀ +# ψ₀ = $get_shifted_value(i, j, k, grid, - 4 - $add, ψ, args...) + +# # Stencil S₁ +# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) +# τ += add_to_global_smoothness(β, Val(5), Val(5)) +# ψ̂₁ += ψ̅ * α +# ψ̂₂ += ψ̅ * C +# w₁ += α + +# τ = τ * τ + +# return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) +# end +# end +# end + +# Metaprogrammed implementation of WENO reconstruction of order N +function stencil(::Val{2}, v) + v0 = Symbol(v, 0) + v1 = Symbol(v, 1) + return :(($v0, $v1)) end +function stencil(::Val{3}, v) + v0 = Symbol(v, 0) + v1 = Symbol(v, 1) + v2 = Symbol(v, 2) + return :(($v0, $v1, $v2)) +end -#= Metaprogrammed implementation (to finish) - -@inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{$N}, - ψ, idx, loc, args...) +function stencil(::Val{4}, v) + v0 = Symbol(v, 0) + v1 = Symbol(v, 1) + v2 = Symbol(v, 2) + v3 = Symbol(v, 3) + return :(($v0, $v1, $v2, $v3)) +end - # All stencils - $(retrieve_initial_stencil(N, dir, add)) +function stencil(::Val{5}, v) + v0 = Symbol(v, 0) + v1 = Symbol(v, 1) + v2 = Symbol(v, 2) + v3 = Symbol(v, 3) + v4 = Symbol(v, 4) + return :(($v0, $v1, $v2, $v3, $v4)) +end - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α +function stencil(::Val{6}, v) + v0 = Symbol(v, 0) + v1 = Symbol(v, 1) + v2 = Symbol(v, 2) + v3 = Symbol(v, 3) + v4 = Symbol(v, 4) + v5 = Symbol(v, 5) + return :(($v0, $v1, $v2, $v3, $v4, $v5)) +end - @unroll for s in 2:$N - $(update_stencil(N, dir, - s + 1, add)) - β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), s, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val($N), Val(s)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α +function retrieve_initial_stencil(N, dir, add, variable) + expr = [] + get_shifted_value = Symbol(:get_shifted_value_, dir) + for i in 0:N-1 + ψ = Symbol(variable, i) + push!(expr, :($ψ = $get_shifted_value(i, j, k, grid, $i - $add, $variable, args...))) end + eblk = Expr(:block, expr...) - τ = τ * τ - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) + return eblk end -# TO finish -stencil(N) = :($(Symbol(:ψ, i) for i in 1:N)) +function update_stencil(N, dir, add, variable) + expr = [] + get_shifted_value = Symbol(:get_shifted_value_, dir) + for i in N-1:-1:1 + ψ = Symbol(variable, i) + ψp = Symbol(variable, i-1) + push!(expr, :($ψ = $ψp)) + end + ψ = Symbol(variable, 0) + push!(expr, :($ψ = $get_shifted_value(i, j, k, grid, - s + 1 - $add, $variable, args...))) + eblk = Expr(:block, expr...) + + return eblk +end -function retrieve_initial_stencil(N, dir, add) +function retrieve_velocity_stencil(N, dir, add, variable) expr = [] get_shifted_value = Symbol(:get_shifted_value_, dir) for i in 0:N-1 - ψ = Symbol(:ψ, i) - push!(expr, :($ψ = $get_shifted_value(i, j, k, grid, $i - $add, ψ, args...))) + ψ = Symbol(variable, i) + push!(expr, :($ψ = $get_shifted_value(i, j, k, grid, $i - $add, $variable, u, v, args...))) end eblk = Expr(:block, expr...) return eblk end -function update_stencil(N, dir, newval, add) +function update_velocity_stencil(N, dir, add, variable) expr = [] get_shifted_value = Symbol(:get_shifted_value_, dir) for i in N-1:-1:1 - ψ = Symbol(:ψ, i) - ψp = Symbol(:ψ, i-1) + ψ = Symbol(variable, i) + ψp = Symbol(variable, i-1) push!(expr, :($ψ = $ψp)) end - ψ = :ψ0 - push!(expr, :($ψ = $get_shifted_value(i, j, k, grid, $newval - $add, ψ, args...))) + ψ = Symbol(variable, 0) + push!(expr, :($ψ = $get_shifted_value(i, j, k, grid, - s + 1 - $add, $variable, u, v, args...))) eblk = Expr(:block, expr...) return eblk end -=# \ No newline at end of file +@inline ℑyᵃᶠᵃ_u(i, j, k, grid, u, v, args...) = ℑyᵃᶠᵃ(i, j, k, grid, u) +@inline ℑxᶠᵃᵃ_v(i, j, k, grid, u, v, args...) = ℑxᶠᵃᵃ(i, j, k, grid, v) + +for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, :z), (:ᶠᵃᵃ, :ᵃᶠᵃ, :ᵃᵃᶠ), (1, 2, 3)) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir, loc) + weno_interpolant = Symbol(side, :_weno_interpolant_, dir, loc) + + for N in [2, 3, 4, 5, 6] + @eval begin + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{$N}, + ψ, idx, loc, args...) + + # All stencils + $(retrieve_initial_stencil(N, dir, add, :ψ)) + + β, ψ̅, C, α = $weno_interpolant($(stencil(Val(N), :ψ)), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α + + @unroll for s in 2:$N + $(update_stencil(N, dir, add, :ψ)) + β, ψ̅, C, α = $weno_interpolant($(stencil(Val(N), :ψ)), s, scheme, $val, idx, loc) + τ += add_to_global_smoothness(β, Val($N), Val(s)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α + end + + τ = τ * τ + + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{$N}, + ψ, idx, loc, VI::FunctionStencil, args...) + + ϕ = VI.func + + # All stencils + $(retrieve_initial_stencil(N, dir, add, :ψ)) + $(retrieve_initial_stencil(N, dir, add, :ϕ)) + + β, ψ̅, C, α = $weno_interpolant($(stencil(Val(N), :ψ)), + $(stencil(Val(N), :ϕ)), + 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α + + @unroll for s in 2:$N + $(update_stencil(N, dir, add, :ψ)) + $(update_stencil(N, dir, add, :ϕ)) + + β, ψ̅, C, α = $weno_interpolant($(stencil(Val(N), :ψ)), + $(stencil(Val(N), :ϕ)), + s, scheme, $val, idx, loc) + + τ += add_to_global_smoothness(β, Val($N), Val(s)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α + end + + τ = τ * τ + + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) + end + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{$N}, + ψ, idx, loc, ::VelocityStencil, u, v, args...) + + 𝓊 = ℑyᵃᶠᵃ_u + 𝓋 = ℑyᵃᶠᵃ_v + + # All stencils + $(retrieve_velocity_stencil(N, dir, add, :ψ)) + $(retrieve_velocity_stencil(N, dir, add, :𝓊)) + $(retrieve_velocity_stencil(N, dir, add, :𝓋)) + + β, ψ̅, C, α = $weno_interpolant($(stencil(Val(N), :ψ)), + $(stencil(Val(N), :𝓊)), + $(stencil(Val(N), :𝓋)), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α + + @unroll for s in 2:$N + $(update_velocity_stencil(N, dir, add, :ψ)) + $(update_velocity_stencil(N, dir, add, :𝓊)) + $(update_velocity_stencil(N, dir, add, :𝓋)) + + β, ψ̅, C, α = $weno_interpolant($(stencil(Val(N), :ψ)), + $(stencil(Val(N), :𝓊)), + $(stencil(Val(N), :𝓋)), s, scheme, $val, idx, loc) + + τ += add_to_global_smoothness(β, Val($N), Val(s)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α + end + + τ = τ^2 + + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) + end + end + end +end \ No newline at end of file From 8e8112e5c16b5c41640da94cbbc5aaeb78f43236 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Sun, 24 Mar 2024 12:27:39 -0400 Subject: [PATCH 149/152] this works --- src/Advection/weno_default_stencils.jl | 2 +- .../advection/validate_one_dimensional_advection.jl | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Advection/weno_default_stencils.jl b/src/Advection/weno_default_stencils.jl index f922706151..b858febd38 100644 --- a/src/Advection/weno_default_stencils.jl +++ b/src/Advection/weno_default_stencils.jl @@ -407,7 +407,7 @@ for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, ψ, idx, loc, ::VelocityStencil, u, v, args...) 𝓊 = ℑyᵃᶠᵃ_u - 𝓋 = ℑyᵃᶠᵃ_v + 𝓋 = ℑxᶠᵃᵃ_v # All stencils $(retrieve_velocity_stencil(N, dir, add, :ψ)) diff --git a/validation/advection/validate_one_dimensional_advection.jl b/validation/advection/validate_one_dimensional_advection.jl index f04c3c3661..6fc48f52d5 100644 --- a/validation/advection/validate_one_dimensional_advection.jl +++ b/validation/advection/validate_one_dimensional_advection.jl @@ -1,5 +1,5 @@ using Oceananigans -using Oceananigans.Advection: AbstractCenteredAdvectionScheme, AbstractUpwindBiasedAdvectionScheme, VelocityStencil, VorticityStencil +using Oceananigans.Advection: AbstractCenteredAdvectionScheme, AbstractUpwindBiasedAdvectionScheme, VelocityStencil using Oceananigans.Models.ShallowWaterModels: VectorInvariantFormulation, ConservativeFormulation using JLD2 using OffsetArrays @@ -58,7 +58,7 @@ Z = -0.7 a = 0.5 α = 10 -@inline function c₀_1D(x, y, z) +@inline function c₀_1D(x, y) if x <= -0.6 && x >= -0.8 return 1/6*(G(x, β, Z-δ) + 4*G(x, β, Z) + G(x, β, Z+δ)) elseif x <= -0.2 && x >= -0.4 @@ -78,8 +78,8 @@ Schemes = [:Centered, :UpwindBiased, :WENO] @inline grid_or_not(::Nothing) = -1 # # Checking the accuracy of different schemes with different settings -buffers = [2, 3] -for (gr, grid) in enumerate([grid_str]) +buffers = [2, 3, 4, 5, 6] +for (gr, grid) in enumerate([grid_reg]) @info "testing grid number $gr" @@ -92,7 +92,7 @@ for (gr, grid) in enumerate([grid_str]) c_real = CenterField(grid) formulation = ConservativeFormulation() - for Scheme in [Schemes[2]] + for Scheme in [Schemes[3]] for buffer in buffers, gr in (nothing, grid) scheme = eval(Scheme)(gr, order = advection_order(buffer, eval(Scheme))) @@ -124,7 +124,7 @@ for (gr, grid) in enumerate([grid_str]) solution[(buffer, Int(i), grid_or_not(gr))] = csim end - c_sol(x, y, z) = @. c₀_1D(x - model.clock.time + 2, y, z) + c_sol(x, y) = @. c₀_1D(x - model.clock.time + 2, y) set!(c_real, c_sol) end From 1d5d66bda0febc8d32681d3179c1691aa71caf8f Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Sun, 24 Mar 2024 14:39:21 -0400 Subject: [PATCH 150/152] some comments --- src/Advection/weno_default_stencils.jl | 117 +++++++++++++------------ 1 file changed, 63 insertions(+), 54 deletions(-) diff --git a/src/Advection/weno_default_stencils.jl b/src/Advection/weno_default_stencils.jl index b858febd38..48515feb5d 100644 --- a/src/Advection/weno_default_stencils.jl +++ b/src/Advection/weno_default_stencils.jl @@ -235,46 +235,28 @@ # end # Metaprogrammed implementation of WENO reconstruction of order N -function stencil(::Val{2}, v) - v0 = Symbol(v, 0) - v1 = Symbol(v, 1) - return :(($v0, $v1)) -end - -function stencil(::Val{3}, v) - v0 = Symbol(v, 0) - v1 = Symbol(v, 1) - v2 = Symbol(v, 2) - return :(($v0, $v1, $v2)) -end - -function stencil(::Val{4}, v) - v0 = Symbol(v, 0) - v1 = Symbol(v, 1) - v2 = Symbol(v, 2) - v3 = Symbol(v, 3) - return :(($v0, $v1, $v2, $v3)) -end - -function stencil(::Val{5}, v) - v0 = Symbol(v, 0) - v1 = Symbol(v, 1) - v2 = Symbol(v, 2) - v3 = Symbol(v, 3) - v4 = Symbol(v, 4) - return :(($v0, $v1, $v2, $v3, $v4)) -end -function stencil(::Val{6}, v) - v0 = Symbol(v, 0) - v1 = Symbol(v, 1) - v2 = Symbol(v, 2) - v3 = Symbol(v, 3) - v4 = Symbol(v, 4) - v5 = Symbol(v, 5) - return :(($v0, $v1, $v2, $v3, $v4, $v5)) +# Example: +# julia> stencil(3, :ψ) +# :((ψ0, ψ1, ψ2, ψ3)) +# +function stencil(N, v) + expr = [] + for i in 0:N + vs = Symbol(v, i) + push!(expr, vs) + end + return Expr(:tuple, expr...) end +# julia> retrieve_initial_stencil(3, :x, 1, :ψ) +# quote +# ψ0 = get_shifted_value_x(i, j, k, grid, 0 - 1, ψ, args...) +# ψ1 = get_shifted_value_x(i, j, k, grid, 1 - 1, ψ, args...) +# ψ2 = get_shifted_value_x(i, j, k, grid, 2 - 1, ψ, args...) +# end +# +# julia> function retrieve_initial_stencil(N, dir, add, variable) expr = [] get_shifted_value = Symbol(:get_shifted_value_, dir) @@ -287,6 +269,16 @@ function retrieve_initial_stencil(N, dir, add, variable) return eblk end +# julia> update_stencil(5, :y, 2, :𝓋) +# quote +# 𝓋4 = 𝓋3 +# 𝓋3 = 𝓋2 +# 𝓋2 = 𝓋1 +# 𝓋1 = 𝓋0 +# 𝓋0 = get_shifted_value_y(i, j, k, grid, (-s + 1) - 2, 𝓋, args...) +# end +# +# julia> function update_stencil(N, dir, add, variable) expr = [] get_shifted_value = Symbol(:get_shifted_value_, dir) @@ -302,6 +294,14 @@ function update_stencil(N, dir, add, variable) return eblk end +# julia> retrieve_velocity_stencil(3, :x, 1, :ψ) +# quote +# ψ0 = get_shifted_value_x(i, j, k, grid, 0 - 1, ψ, u, v, args...) +# ψ1 = get_shifted_value_x(i, j, k, grid, 1 - 1, ψ, u, v, args...) +# ψ2 = get_shifted_value_x(i, j, k, grid, 2 - 1, ψ, u, v, args...) +# end +# +# julia> function retrieve_velocity_stencil(N, dir, add, variable) expr = [] get_shifted_value = Symbol(:get_shifted_value_, dir) @@ -314,6 +314,16 @@ function retrieve_velocity_stencil(N, dir, add, variable) return eblk end +# julia> update_velocity_stencil(5, :y, 2, :𝓋) +# quote +# 𝓋4 = 𝓋3 +# 𝓋3 = 𝓋2 +# 𝓋2 = 𝓋1 +# 𝓋1 = 𝓋0 +# 𝓋0 = get_shifted_value_y(i, j, k, grid, (-s + 1) - 2, 𝓋, u, v, args...) +# end +# +# julia> function update_velocity_stencil(N, dir, add, variable) expr = [] get_shifted_value = Symbol(:get_shifted_value_, dir) @@ -339,13 +349,13 @@ for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, for N in [2, 3, 4, 5, 6] @eval begin @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{$N}, - ψ, idx, loc, args...) + scheme::WENO{$N}, + ψ, idx, loc, args...) # All stencils $(retrieve_initial_stencil(N, dir, add, :ψ)) - β, ψ̅, C, α = $weno_interpolant($(stencil(Val(N), :ψ)), 1, scheme, $val, idx, loc) + β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), 1, scheme, $val, idx, loc) τ = β ψ̂₁ = ψ̅ * α ψ̂₂ = ψ̅ * C @@ -353,7 +363,7 @@ for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, @unroll for s in 2:$N $(update_stencil(N, dir, add, :ψ)) - β, ψ̅, C, α = $weno_interpolant($(stencil(Val(N), :ψ)), s, scheme, $val, idx, loc) + β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), s, scheme, $val, idx, loc) τ += add_to_global_smoothness(β, Val($N), Val(s)) ψ̂₁ += ψ̅ * α ψ̂₂ += ψ̅ * C @@ -366,8 +376,8 @@ for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, end @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{$N}, - ψ, idx, loc, VI::FunctionStencil, args...) + scheme::WENO{$N}, + ψ, idx, loc, VI::FunctionStencil, args...) ϕ = VI.func @@ -375,9 +385,8 @@ for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, $(retrieve_initial_stencil(N, dir, add, :ψ)) $(retrieve_initial_stencil(N, dir, add, :ϕ)) - β, ψ̅, C, α = $weno_interpolant($(stencil(Val(N), :ψ)), - $(stencil(Val(N), :ϕ)), - 1, scheme, $val, idx, loc) + β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), + $(stencil(N, :ϕ)), 1, scheme, $val, idx, loc) τ = β ψ̂₁ = ψ̅ * α ψ̂₂ = ψ̅ * C @@ -387,8 +396,8 @@ for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, $(update_stencil(N, dir, add, :ψ)) $(update_stencil(N, dir, add, :ϕ)) - β, ψ̅, C, α = $weno_interpolant($(stencil(Val(N), :ψ)), - $(stencil(Val(N), :ϕ)), + β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), + $(stencil(N, :ϕ)), s, scheme, $val, idx, loc) τ += add_to_global_smoothness(β, Val($N), Val(s)) @@ -414,9 +423,9 @@ for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, $(retrieve_velocity_stencil(N, dir, add, :𝓊)) $(retrieve_velocity_stencil(N, dir, add, :𝓋)) - β, ψ̅, C, α = $weno_interpolant($(stencil(Val(N), :ψ)), - $(stencil(Val(N), :𝓊)), - $(stencil(Val(N), :𝓋)), 1, scheme, $val, idx, loc) + β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), + $(stencil(N, :𝓊)), + $(stencil(N, :𝓋)), 1, scheme, $val, idx, loc) τ = β ψ̂₁ = ψ̅ * α ψ̂₂ = ψ̅ * C @@ -427,9 +436,9 @@ for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, $(update_velocity_stencil(N, dir, add, :𝓊)) $(update_velocity_stencil(N, dir, add, :𝓋)) - β, ψ̅, C, α = $weno_interpolant($(stencil(Val(N), :ψ)), - $(stencil(Val(N), :𝓊)), - $(stencil(Val(N), :𝓋)), s, scheme, $val, idx, loc) + β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), + $(stencil(N, :𝓊)), + $(stencil(N, :𝓋)), s, scheme, $val, idx, loc) τ += add_to_global_smoothness(β, Val($N), Val(s)) ψ̂₁ += ψ̅ * α From 194b6845f93d8b4b7bab35596fc56cdfcdea1222 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Mon, 25 Mar 2024 22:43:16 -0400 Subject: [PATCH 151/152] bugfix --- src/Advection/weno_default_stencils.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Advection/weno_default_stencils.jl b/src/Advection/weno_default_stencils.jl index 48515feb5d..4f6eca3e97 100644 --- a/src/Advection/weno_default_stencils.jl +++ b/src/Advection/weno_default_stencils.jl @@ -242,7 +242,7 @@ # function stencil(N, v) expr = [] - for i in 0:N + for i in 0:N-1 vs = Symbol(v, i) push!(expr, vs) end From e02a9d02af17d9d126809afa038dcfa257bc0149 Mon Sep 17 00:00:00 2001 From: Simone Silvestri <33547697+simone-silvestri@users.noreply.github.com> Date: Tue, 2 Apr 2024 20:32:11 +0200 Subject: [PATCH 152/152] small try --- src/Advection/Advection.jl | 4 +- src/Advection/weno_default_stencils.jl | 820 ++++++++++++------------- 2 files changed, 412 insertions(+), 412 deletions(-) diff --git a/src/Advection/Advection.jl b/src/Advection/Advection.jl index a1451d2852..e85f51009c 100644 --- a/src/Advection/Advection.jl +++ b/src/Advection/Advection.jl @@ -68,8 +68,8 @@ include("upwind_biased_reconstruction.jl") include("weno_reconstruction.jl") include("weno_interpolants.jl") include("weno_default_stencils.jl") -# include("weno_function_stencils.jl") -# include("weno_velocity_stencils.jl") +include("weno_function_stencils.jl") +include("weno_velocity_stencils.jl") include("stretched_weno_smoothness.jl") include("multi_dimensional_reconstruction.jl") include("vector_invariant_upwinding.jl") diff --git a/src/Advection/weno_default_stencils.jl b/src/Advection/weno_default_stencils.jl index 4f6eca3e97..18d9bbccfa 100644 --- a/src/Advection/weno_default_stencils.jl +++ b/src/Advection/weno_default_stencils.jl @@ -11,445 +11,445 @@ ##### STENCILS IN X ##### -# for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, :z), (:ᶠᵃᵃ, :ᵃᶠᵃ, :ᵃᵃᶠ), (1, 2, 3)) -# biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir, loc) -# coeff = Symbol(:coeff_, side) -# weno_interpolant = Symbol(side, :_weno_interpolant_, dir, loc) -# get_shifted_value = Symbol(:get_shifted_value_, dir) - -# @eval begin -# # Fallback for DefaultStencil formulations and disambiguation -# @inline $biased_interpolate(i, j, k, grid, scheme::WENO{2}, ψ, idx, loc, ::DefaultStencil, args...) = -# $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) -# @inline $biased_interpolate(i, j, k, grid, scheme::WENO{3}, ψ, idx, loc, ::DefaultStencil, args...) = -# $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) -# @inline $biased_interpolate(i, j, k, grid, scheme::WENO{4}, ψ, idx, loc, ::DefaultStencil, args...) = -# $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) -# @inline $biased_interpolate(i, j, k, grid, scheme::WENO{5}, ψ, idx, loc, ::DefaultStencil, args...) = -# $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) -# @inline $biased_interpolate(i, j, k, grid, scheme::WENO{6}, ψ, idx, loc, ::DefaultStencil, args...) = -# $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) - -# @inline function $biased_interpolate(i, j, k, grid, -# scheme::WENO{2}, -# ψ, idx, loc, args...) +for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, :z), (:ᶠᵃᵃ, :ᵃᶠᵃ, :ᵃᵃᶠ), (1, 2, 3)) + biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir, loc) + coeff = Symbol(:coeff_, side) + weno_interpolant = Symbol(side, :_weno_interpolant_, dir, loc) + get_shifted_value = Symbol(:get_shifted_value_, dir) + + @eval begin + # Fallback for DefaultStencil formulations and disambiguation + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{2}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{3}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{4}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{5}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + @inline $biased_interpolate(i, j, k, grid, scheme::WENO{6}, ψ, idx, loc, ::DefaultStencil, args...) = + $biased_interpolate(i, j, k, grid, scheme, ψ, idx, loc, args...) + + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{2}, + ψ, idx, loc, args...) -# # All stencils -# ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) -# ψ₁ = $get_shifted_value(i, j, k, grid, 1 - $add, ψ, args...) + # All stencils + ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) + ψ₁ = $get_shifted_value(i, j, k, grid, 1 - $add, ψ, args...) -# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) -# τ = add_to_global_smoothness(β, Val(2), Val(1)) -# ψ̂₁ = ψ̅ * α -# ψ̂₂ = ψ̅ * C -# w₁ = α + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 1, scheme, $val, idx, loc) + τ = add_to_global_smoothness(β, Val(2), Val(1)) + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α -# ψ₁ = ψ₀ -# ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) + ψ₁ = ψ₀ + ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) -# # Stencil S₁ -# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) -# τ += add_to_global_smoothness(β, Val(2), Val(2)) -# ψ̂₁ += ψ̅ * α -# ψ̂₂ += ψ̅ * C -# w₁ += α + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁), 2, scheme, $val, idx, loc) + τ += add_to_global_smoothness(β, Val(2), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α -# τ = τ * τ + τ = τ * τ -# return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) -# end + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) + end -# @inline function $biased_interpolate(i, j, k, grid, -# scheme::WENO{3, FT, XT, YT, ZT}, -# ψ, idx, loc, args...) where {FT, XT, YT, ZT} + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{3, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} -# # All stencils -# ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) -# ψ₁ = $get_shifted_value(i, j, k, grid, 1 - $add, ψ, args...) -# ψ₂ = $get_shifted_value(i, j, k, grid, 2 - $add, ψ, args...) - -# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) -# τ = add_to_global_smoothness(β, Val(3), Val(1)) -# ψ̂₁ = ψ̅ * α -# ψ̂₂ = ψ̅ * C -# w₁ = α - -# ψ₂ = ψ₁ -# ψ₁ = ψ₀ -# ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) - -# # Stencil S₁ -# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) -# τ += add_to_global_smoothness(β, Val(3), Val(2)) -# ψ̂₁ += ψ̅ * α -# ψ̂₂ += ψ̅ * C -# w₁ += α - -# ψ₂ = ψ₁ -# ψ₁ = ψ₀ -# ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) - -# # Stencil S₁ -# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) -# τ += add_to_global_smoothness(β, Val(3), Val(3)) -# ψ̂₁ += ψ̅ * α -# ψ̂₂ += ψ̅ * C -# w₁ += α - -# τ = τ * τ - -# return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) -# end + # All stencils + ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) + ψ₁ = $get_shifted_value(i, j, k, grid, 1 - $add, ψ, args...) + ψ₂ = $get_shifted_value(i, j, k, grid, 2 - $add, ψ, args...) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 1, scheme, $val, idx, loc) + τ = add_to_global_smoothness(β, Val(3), Val(1)) + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α + + ψ₂ = ψ₁ + ψ₁ = ψ₀ + ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 2, scheme, $val, idx, loc) + τ += add_to_global_smoothness(β, Val(3), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α + + ψ₂ = ψ₁ + ψ₁ = ψ₀ + ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂), 3, scheme, $val, idx, loc) + τ += add_to_global_smoothness(β, Val(3), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α + + τ = τ * τ + + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) + end -# @inline function $biased_interpolate(i, j, k, grid, -# scheme::WENO{4, FT, XT, YT, ZT}, -# ψ, idx, loc, args...) where {FT, XT, YT, ZT} + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{4, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} -# # All stencils -# ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) -# ψ₁ = $get_shifted_value(i, j, k, grid, 1 - $add, ψ, args...) -# ψ₂ = $get_shifted_value(i, j, k, grid, 2 - $add, ψ, args...) -# ψ₃ = $get_shifted_value(i, j, k, grid, 3 - $add, ψ, args...) - -# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) -# τ = add_to_global_smoothness(β, Val(4), Val(1)) -# ψ̂₁ = ψ̅ * α -# ψ̂₂ = ψ̅ * C -# w₁ = α - -# ψ₃ = ψ₂ -# ψ₂ = ψ₁ -# ψ₁ = ψ₀ -# ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) - -# # Stencil S₁ -# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) -# τ += add_to_global_smoothness(β, Val(4), Val(2)) -# ψ̂₁ += ψ̅ * α -# ψ̂₂ += ψ̅ * C -# w₁ += α - -# ψ₃ = ψ₂ -# ψ₂ = ψ₁ -# ψ₁ = ψ₀ -# ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) - -# # Stencil S₁ -# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) -# τ += add_to_global_smoothness(β, Val(4), Val(3)) -# ψ̂₁ += ψ̅ * α -# ψ̂₂ += ψ̅ * C -# w₁ += α - -# ψ₃ = ψ₂ -# ψ₂ = ψ₁ -# ψ₁ = ψ₀ -# ψ₀ = $get_shifted_value(i, j, k, grid, - 3 - $add, ψ, args...) - -# # Stencil S₁ -# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) -# τ += add_to_global_smoothness(β, Val(4), Val(4)) -# ψ̂₁ += ψ̅ * α -# ψ̂₂ += ψ̅ * C -# w₁ += α - -# τ = τ * τ - -# return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) -# end + # All stencils + ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) + ψ₁ = $get_shifted_value(i, j, k, grid, 1 - $add, ψ, args...) + ψ₂ = $get_shifted_value(i, j, k, grid, 2 - $add, ψ, args...) + ψ₃ = $get_shifted_value(i, j, k, grid, 3 - $add, ψ, args...) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 1, scheme, $val, idx, loc) + τ = add_to_global_smoothness(β, Val(4), Val(1)) + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α + + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ + ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 2, scheme, $val, idx, loc) + τ += add_to_global_smoothness(β, Val(4), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α + + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ + ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 3, scheme, $val, idx, loc) + τ += add_to_global_smoothness(β, Val(4), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α + + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ + ψ₀ = $get_shifted_value(i, j, k, grid, - 3 - $add, ψ, args...) + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃), 4, scheme, $val, idx, loc) + τ += add_to_global_smoothness(β, Val(4), Val(4)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α + + τ = τ * τ + + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) + end -# @inline function $biased_interpolate(i, j, k, grid, -# scheme::WENO{5, FT, XT, YT, ZT}, -# ψ, idx, loc, args...) where {FT, XT, YT, ZT} + @inline function $biased_interpolate(i, j, k, grid, + scheme::WENO{5, FT, XT, YT, ZT}, + ψ, idx, loc, args...) where {FT, XT, YT, ZT} -# # All stencils -# ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) -# ψ₁ = $get_shifted_value(i, j, k, grid, + 1 - $add, ψ, args...) -# ψ₂ = $get_shifted_value(i, j, k, grid, + 2 - $add, ψ, args...) -# ψ₃ = $get_shifted_value(i, j, k, grid, + 3 - $add, ψ, args...) -# ψ₄ = $get_shifted_value(i, j, k, grid, + 4 - $add, ψ, args...) - -# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) -# τ = β -# ψ̂₁ = ψ̅ * α -# ψ̂₂ = ψ̅ * C -# w₁ = α - -# ψ₄ = ψ₃ -# ψ₃ = ψ₂ -# ψ₂ = ψ₁ -# ψ₁ = ψ₀ -# ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) - -# # Stencil S₁ -# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) -# τ += add_to_global_smoothness(β, Val(5), Val(2)) -# ψ̂₁ += ψ̅ * α -# ψ̂₂ += ψ̅ * C -# w₁ += α - -# ψ₄ = ψ₃ -# ψ₃ = ψ₂ -# ψ₂ = ψ₁ -# ψ₁ = ψ₀ -# ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) - -# # Stencil S₁ -# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) -# τ += add_to_global_smoothness(β, Val(5), Val(3)) -# ψ̂₁ += ψ̅ * α -# ψ̂₂ += ψ̅ * C -# w₁ += α - -# ψ₄ = ψ₃ -# ψ₃ = ψ₂ -# ψ₂ = ψ₁ -# ψ₁ = ψ₀ -# ψ₀ = $get_shifted_value(i, j, k, grid, - 3 - $add, ψ, args...) - -# # Stencil S₁ -# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) -# τ += add_to_global_smoothness(β, Val(5), Val(4)) -# ψ̂₁ += ψ̅ * α -# ψ̂₂ += ψ̅ * C -# w₁ += α - -# ψ₄ = ψ₃ -# ψ₃ = ψ₂ -# ψ₂ = ψ₁ -# ψ₁ = ψ₀ -# ψ₀ = $get_shifted_value(i, j, k, grid, - 4 - $add, ψ, args...) - -# # Stencil S₁ -# β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) -# τ += add_to_global_smoothness(β, Val(5), Val(5)) -# ψ̂₁ += ψ̅ * α -# ψ̂₂ += ψ̅ * C -# w₁ += α - -# τ = τ * τ - -# return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) -# end -# end -# end - -# Metaprogrammed implementation of WENO reconstruction of order N - -# Example: -# julia> stencil(3, :ψ) -# :((ψ0, ψ1, ψ2, ψ3)) -# -function stencil(N, v) - expr = [] - for i in 0:N-1 - vs = Symbol(v, i) - push!(expr, vs) + # All stencils + ψ₀ = $get_shifted_value(i, j, k, grid, - $add, ψ, args...) + ψ₁ = $get_shifted_value(i, j, k, grid, + 1 - $add, ψ, args...) + ψ₂ = $get_shifted_value(i, j, k, grid, + 2 - $add, ψ, args...) + ψ₃ = $get_shifted_value(i, j, k, grid, + 3 - $add, ψ, args...) + ψ₄ = $get_shifted_value(i, j, k, grid, + 4 - $add, ψ, args...) + + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 1, scheme, $val, idx, loc) + τ = β + ψ̂₁ = ψ̅ * α + ψ̂₂ = ψ̅ * C + w₁ = α + + ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ + ψ₀ = $get_shifted_value(i, j, k, grid, - 1 - $add, ψ, args...) + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 2, scheme, $val, idx, loc) + τ += add_to_global_smoothness(β, Val(5), Val(2)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α + + ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ + ψ₀ = $get_shifted_value(i, j, k, grid, - 2 - $add, ψ, args...) + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 3, scheme, $val, idx, loc) + τ += add_to_global_smoothness(β, Val(5), Val(3)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α + + ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ + ψ₀ = $get_shifted_value(i, j, k, grid, - 3 - $add, ψ, args...) + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 4, scheme, $val, idx, loc) + τ += add_to_global_smoothness(β, Val(5), Val(4)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α + + ψ₄ = ψ₃ + ψ₃ = ψ₂ + ψ₂ = ψ₁ + ψ₁ = ψ₀ + ψ₀ = $get_shifted_value(i, j, k, grid, - 4 - $add, ψ, args...) + + # Stencil S₁ + β, ψ̅, C, α = $weno_interpolant((ψ₀, ψ₁, ψ₂, ψ₃, ψ₄), 5, scheme, $val, idx, loc) + τ += add_to_global_smoothness(β, Val(5), Val(5)) + ψ̂₁ += ψ̅ * α + ψ̂₂ += ψ̅ * C + w₁ += α + + τ = τ * τ + + return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) + end end - return Expr(:tuple, expr...) end -# julia> retrieve_initial_stencil(3, :x, 1, :ψ) -# quote -# ψ0 = get_shifted_value_x(i, j, k, grid, 0 - 1, ψ, args...) -# ψ1 = get_shifted_value_x(i, j, k, grid, 1 - 1, ψ, args...) -# ψ2 = get_shifted_value_x(i, j, k, grid, 2 - 1, ψ, args...) +# # Metaprogrammed implementation of WENO reconstruction of order N + +# # Example: +# # julia> stencil(3, :ψ) +# # :((ψ0, ψ1, ψ2, ψ3)) +# # +# function stencil(N, v) +# expr = [] +# for i in 0:N-1 +# vs = Symbol(v, i) +# push!(expr, vs) +# end +# return Expr(:tuple, expr...) # end -# -# julia> -function retrieve_initial_stencil(N, dir, add, variable) - expr = [] - get_shifted_value = Symbol(:get_shifted_value_, dir) - for i in 0:N-1 - ψ = Symbol(variable, i) - push!(expr, :($ψ = $get_shifted_value(i, j, k, grid, $i - $add, $variable, args...))) - end - eblk = Expr(:block, expr...) - return eblk -end +# # julia> retrieve_initial_stencil(3, :x, 1, :ψ) +# # quote +# # ψ0 = get_shifted_value_x(i, j, k, grid, 0 - 1, ψ, args...) +# # ψ1 = get_shifted_value_x(i, j, k, grid, 1 - 1, ψ, args...) +# # ψ2 = get_shifted_value_x(i, j, k, grid, 2 - 1, ψ, args...) +# # end +# # +# # julia> +# function retrieve_initial_stencil(N, dir, add, variable) +# expr = [] +# get_shifted_value = Symbol(:get_shifted_value_, dir) +# for i in 0:N-1 +# ψ = Symbol(variable, i) +# push!(expr, :($ψ = $get_shifted_value(i, j, k, grid, $i - $add, $variable, args...))) +# end +# eblk = Expr(:block, expr...) -# julia> update_stencil(5, :y, 2, :𝓋) -# quote -# 𝓋4 = 𝓋3 -# 𝓋3 = 𝓋2 -# 𝓋2 = 𝓋1 -# 𝓋1 = 𝓋0 -# 𝓋0 = get_shifted_value_y(i, j, k, grid, (-s + 1) - 2, 𝓋, args...) +# return eblk # end -# -# julia> -function update_stencil(N, dir, add, variable) - expr = [] - get_shifted_value = Symbol(:get_shifted_value_, dir) - for i in N-1:-1:1 - ψ = Symbol(variable, i) - ψp = Symbol(variable, i-1) - push!(expr, :($ψ = $ψp)) - end - ψ = Symbol(variable, 0) - push!(expr, :($ψ = $get_shifted_value(i, j, k, grid, - s + 1 - $add, $variable, args...))) - eblk = Expr(:block, expr...) - return eblk -end +# # julia> update_stencil(5, :y, 2, :𝓋) +# # quote +# # 𝓋4 = 𝓋3 +# # 𝓋3 = 𝓋2 +# # 𝓋2 = 𝓋1 +# # 𝓋1 = 𝓋0 +# # 𝓋0 = get_shifted_value_y(i, j, k, grid, (-s + 1) - 2, 𝓋, args...) +# # end +# # +# # julia> +# function update_stencil(N, dir, add, variable) +# expr = [] +# get_shifted_value = Symbol(:get_shifted_value_, dir) +# for i in N-1:-1:1 +# ψ = Symbol(variable, i) +# ψp = Symbol(variable, i-1) +# push!(expr, :($ψ = $ψp)) +# end +# ψ = Symbol(variable, 0) +# push!(expr, :($ψ = $get_shifted_value(i, j, k, grid, - s + 1 - $add, $variable, args...))) +# eblk = Expr(:block, expr...) -# julia> retrieve_velocity_stencil(3, :x, 1, :ψ) -# quote -# ψ0 = get_shifted_value_x(i, j, k, grid, 0 - 1, ψ, u, v, args...) -# ψ1 = get_shifted_value_x(i, j, k, grid, 1 - 1, ψ, u, v, args...) -# ψ2 = get_shifted_value_x(i, j, k, grid, 2 - 1, ψ, u, v, args...) +# return eblk # end -# -# julia> -function retrieve_velocity_stencil(N, dir, add, variable) - expr = [] - get_shifted_value = Symbol(:get_shifted_value_, dir) - for i in 0:N-1 - ψ = Symbol(variable, i) - push!(expr, :($ψ = $get_shifted_value(i, j, k, grid, $i - $add, $variable, u, v, args...))) - end - eblk = Expr(:block, expr...) - return eblk -end +# # julia> retrieve_velocity_stencil(3, :x, 1, :ψ) +# # quote +# # ψ0 = get_shifted_value_x(i, j, k, grid, 0 - 1, ψ, u, v, args...) +# # ψ1 = get_shifted_value_x(i, j, k, grid, 1 - 1, ψ, u, v, args...) +# # ψ2 = get_shifted_value_x(i, j, k, grid, 2 - 1, ψ, u, v, args...) +# # end +# # +# # julia> +# function retrieve_velocity_stencil(N, dir, add, variable) +# expr = [] +# get_shifted_value = Symbol(:get_shifted_value_, dir) +# for i in 0:N-1 +# ψ = Symbol(variable, i) +# push!(expr, :($ψ = $get_shifted_value(i, j, k, grid, $i - $add, $variable, u, v, args...))) +# end +# eblk = Expr(:block, expr...) -# julia> update_velocity_stencil(5, :y, 2, :𝓋) -# quote -# 𝓋4 = 𝓋3 -# 𝓋3 = 𝓋2 -# 𝓋2 = 𝓋1 -# 𝓋1 = 𝓋0 -# 𝓋0 = get_shifted_value_y(i, j, k, grid, (-s + 1) - 2, 𝓋, u, v, args...) +# return eblk # end -# -# julia> -function update_velocity_stencil(N, dir, add, variable) - expr = [] - get_shifted_value = Symbol(:get_shifted_value_, dir) - for i in N-1:-1:1 - ψ = Symbol(variable, i) - ψp = Symbol(variable, i-1) - push!(expr, :($ψ = $ψp)) - end - ψ = Symbol(variable, 0) - push!(expr, :($ψ = $get_shifted_value(i, j, k, grid, - s + 1 - $add, $variable, u, v, args...))) - eblk = Expr(:block, expr...) - return eblk -end +# # julia> update_velocity_stencil(5, :y, 2, :𝓋) +# # quote +# # 𝓋4 = 𝓋3 +# # 𝓋3 = 𝓋2 +# # 𝓋2 = 𝓋1 +# # 𝓋1 = 𝓋0 +# # 𝓋0 = get_shifted_value_y(i, j, k, grid, (-s + 1) - 2, 𝓋, u, v, args...) +# # end +# # +# # julia> +# function update_velocity_stencil(N, dir, add, variable) +# expr = [] +# get_shifted_value = Symbol(:get_shifted_value_, dir) +# for i in N-1:-1:1 +# ψ = Symbol(variable, i) +# ψp = Symbol(variable, i-1) +# push!(expr, :($ψ = $ψp)) +# end +# ψ = Symbol(variable, 0) +# push!(expr, :($ψ = $get_shifted_value(i, j, k, grid, - s + 1 - $add, $variable, u, v, args...))) +# eblk = Expr(:block, expr...) -@inline ℑyᵃᶠᵃ_u(i, j, k, grid, u, v, args...) = ℑyᵃᶠᵃ(i, j, k, grid, u) -@inline ℑxᶠᵃᵃ_v(i, j, k, grid, u, v, args...) = ℑxᶠᵃᵃ(i, j, k, grid, v) +# return eblk +# end -for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, :z), (:ᶠᵃᵃ, :ᵃᶠᵃ, :ᵃᵃᶠ), (1, 2, 3)) - biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir, loc) - weno_interpolant = Symbol(side, :_weno_interpolant_, dir, loc) +# @inline ℑyᵃᶠᵃ_u(i, j, k, grid, u, v, args...) = ℑyᵃᶠᵃ(i, j, k, grid, u) +# @inline ℑxᶠᵃᵃ_v(i, j, k, grid, u, v, args...) = ℑxᶠᵃᵃ(i, j, k, grid, v) + +# for (side, add) in zip([:left, :right], (1, 0)), (dir, loc, val) in zip((:x, :y, :z), (:ᶠᵃᵃ, :ᵃᶠᵃ, :ᵃᵃᶠ), (1, 2, 3)) +# biased_interpolate = Symbol(:inner_, side, :_biased_interpolate_, dir, loc) +# weno_interpolant = Symbol(side, :_weno_interpolant_, dir, loc) - for N in [2, 3, 4, 5, 6] - @eval begin - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{$N}, - ψ, idx, loc, args...) - - # All stencils - $(retrieve_initial_stencil(N, dir, add, :ψ)) - - β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - @unroll for s in 2:$N - $(update_stencil(N, dir, add, :ψ)) - β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), s, scheme, $val, idx, loc) - τ += add_to_global_smoothness(β, Val($N), Val(s)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - end - - τ = τ * τ - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{$N}, - ψ, idx, loc, VI::FunctionStencil, args...) - - ϕ = VI.func - - # All stencils - $(retrieve_initial_stencil(N, dir, add, :ψ)) - $(retrieve_initial_stencil(N, dir, add, :ϕ)) - - β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), - $(stencil(N, :ϕ)), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - @unroll for s in 2:$N - $(update_stencil(N, dir, add, :ψ)) - $(update_stencil(N, dir, add, :ϕ)) - - β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), - $(stencil(N, :ϕ)), - s, scheme, $val, idx, loc) - - τ += add_to_global_smoothness(β, Val($N), Val(s)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - end - - τ = τ * τ - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - - @inline function $biased_interpolate(i, j, k, grid, - scheme::WENO{$N}, - ψ, idx, loc, ::VelocityStencil, u, v, args...) +# for N in [2, 3, 4, 5, 6] +# @eval begin +# @inline function $biased_interpolate(i, j, k, grid, +# scheme::WENO{$N}, +# ψ, idx, loc, args...) + +# # All stencils +# $(retrieve_initial_stencil(N, dir, add, :ψ)) + +# β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), 1, scheme, $val, idx, loc) +# τ = β +# ψ̂₁ = ψ̅ * α +# ψ̂₂ = ψ̅ * C +# w₁ = α + +# @unroll for s in 2:$N +# $(update_stencil(N, dir, add, :ψ)) +# β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), s, scheme, $val, idx, loc) +# τ += add_to_global_smoothness(β, Val($N), Val(s)) +# ψ̂₁ += ψ̅ * α +# ψ̂₂ += ψ̅ * C +# w₁ += α +# end + +# τ = τ * τ + +# return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) +# end + +# @inline function $biased_interpolate(i, j, k, grid, +# scheme::WENO{$N}, +# ψ, idx, loc, VI::FunctionStencil, args...) + +# ϕ = VI.func + +# # All stencils +# $(retrieve_initial_stencil(N, dir, add, :ψ)) +# $(retrieve_initial_stencil(N, dir, add, :ϕ)) + +# β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), +# $(stencil(N, :ϕ)), 1, scheme, $val, idx, loc) +# τ = β +# ψ̂₁ = ψ̅ * α +# ψ̂₂ = ψ̅ * C +# w₁ = α + +# @unroll for s in 2:$N +# $(update_stencil(N, dir, add, :ψ)) +# $(update_stencil(N, dir, add, :ϕ)) + +# β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), +# $(stencil(N, :ϕ)), +# s, scheme, $val, idx, loc) + +# τ += add_to_global_smoothness(β, Val($N), Val(s)) +# ψ̂₁ += ψ̅ * α +# ψ̂₂ += ψ̅ * C +# w₁ += α +# end + +# τ = τ * τ + +# return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) +# end + +# @inline function $biased_interpolate(i, j, k, grid, +# scheme::WENO{$N}, +# ψ, idx, loc, ::VelocityStencil, u, v, args...) - 𝓊 = ℑyᵃᶠᵃ_u - 𝓋 = ℑxᶠᵃᵃ_v +# 𝓊 = ℑyᵃᶠᵃ_u +# 𝓋 = ℑxᶠᵃᵃ_v - # All stencils - $(retrieve_velocity_stencil(N, dir, add, :ψ)) - $(retrieve_velocity_stencil(N, dir, add, :𝓊)) - $(retrieve_velocity_stencil(N, dir, add, :𝓋)) +# # All stencils +# $(retrieve_velocity_stencil(N, dir, add, :ψ)) +# $(retrieve_velocity_stencil(N, dir, add, :𝓊)) +# $(retrieve_velocity_stencil(N, dir, add, :𝓋)) - β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), - $(stencil(N, :𝓊)), - $(stencil(N, :𝓋)), 1, scheme, $val, idx, loc) - τ = β - ψ̂₁ = ψ̅ * α - ψ̂₂ = ψ̅ * C - w₁ = α - - @unroll for s in 2:$N - $(update_velocity_stencil(N, dir, add, :ψ)) - $(update_velocity_stencil(N, dir, add, :𝓊)) - $(update_velocity_stencil(N, dir, add, :𝓋)) - - β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), - $(stencil(N, :𝓊)), - $(stencil(N, :𝓋)), s, scheme, $val, idx, loc) - - τ += add_to_global_smoothness(β, Val($N), Val(s)) - ψ̂₁ += ψ̅ * α - ψ̂₂ += ψ̅ * C - w₁ += α - end - - τ = τ^2 - - return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) - end - end - end -end \ No newline at end of file +# β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), +# $(stencil(N, :𝓊)), +# $(stencil(N, :𝓋)), 1, scheme, $val, idx, loc) +# τ = β +# ψ̂₁ = ψ̅ * α +# ψ̂₂ = ψ̅ * C +# w₁ = α + +# @unroll for s in 2:$N +# $(update_velocity_stencil(N, dir, add, :ψ)) +# $(update_velocity_stencil(N, dir, add, :𝓊)) +# $(update_velocity_stencil(N, dir, add, :𝓋)) + +# β, ψ̅, C, α = $weno_interpolant($(stencil(N, :ψ)), +# $(stencil(N, :𝓊)), +# $(stencil(N, :𝓋)), s, scheme, $val, idx, loc) + +# τ += add_to_global_smoothness(β, Val($N), Val(s)) +# ψ̂₁ += ψ̅ * α +# ψ̂₂ += ψ̅ * C +# w₁ += α +# end + +# τ = τ^2 + +# return (ψ̂₁ * τ + ψ̂₂) / (w₁ * τ + 1) +# end +# end +# end +# end \ No newline at end of file