Skip to content

Commit 9c99de6

Browse files
xkykaisimone-silvestrinavidcy
authored
Fix clock argument in TriadIsopycnalSkewSymmetricDiffusivity's explicit_R₃₃_∂z_c function (#4780)
Co-authored-by: Simone Silvestri <[email protected]> Co-authored-by: Navid C. Constantinou <[email protected]>
1 parent ec5ffd1 commit 9c99de6

File tree

4 files changed

+62
-11
lines changed

4 files changed

+62
-11
lines changed

src/TurbulenceClosures/abstract_scalar_diffusivity_closure.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ end
312312
@inline νᶜᶠᶠ(i, j, k, grid, loc, ν::Number, clk, fields) = ν
313313
@inline νᶠᶠᶜ(i, j, k, grid, loc, ν::Number, clk, fields) = ν
314314

315+
@inline κᶜᶜᶜ(i, j, k, grid, loc, κ::Number, clk, fields) = κ
315316
@inline κᶠᶜᶜ(i, j, k, grid, loc, κ::Number, clk, fields) = κ
316317
@inline κᶜᶠᶜ(i, j, k, grid, loc, κ::Number, clk, fields) = κ
317318
@inline κᶜᶜᶠ(i, j, k, grid, loc, κ::Number, clk, fields) = κ

src/TurbulenceClosures/turbulence_closure_implementations/isopycnal_skew_symmetric_diffusivity_with_triads.jl

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ function DiffusivityFields(grid, tracer_names, bcs, ::FlavorOfTISSD{TD}) where T
8888
return K
8989
end
9090

91+
# Build closure fields for model initialization
92+
build_closure_fields(grid, clock, tracer_names, bcs, closure::FlavorOfTISSD) =
93+
DiffusivityFields(grid, tracer_names, bcs, closure)
94+
9195
function compute_diffusivities!(diffusivities, closure::FlavorOfTISSD{TD}, model; parameters = :xyz) where TD
9296

9397
arch = model.architecture
@@ -164,15 +168,15 @@ end
164168
@inline triad_mask_y(i, jy, jz, ky, kz, grid) =
165169
!peripheral_node(i, jy, ky, grid, Center(), Face(), Center()) & !peripheral_node(i, jz, kz, grid, Center(), Center(), Face())
166170

167-
@inline ϵκx⁺⁺(i, j, k, grid, loc, κ, clock, sl, b, C) = triad_mask_x(i+1, i, j, k, k+1, grid) * κᶜᶜᶜ(i, j, k, grid, loc, κ, clock) * tapering_factorᶜᶜᶜ(i, j, k, grid, sl, b, C)
168-
@inline ϵκx⁺⁻(i, j, k, grid, loc, κ, clock, sl, b, C) = triad_mask_x(i+1, i, j, k, k, grid) * κᶜᶜᶜ(i, j, k, grid, loc, κ, clock) * tapering_factorᶜᶜᶜ(i, j, k, grid, sl, b, C)
169-
@inline ϵκx⁻⁺(i, j, k, grid, loc, κ, clock, sl, b, C) = triad_mask_x(i, i, j, k, k+1, grid) * κᶜᶜᶜ(i, j, k, grid, loc, κ, clock) * tapering_factorᶜᶜᶜ(i, j, k, grid, sl, b, C)
170-
@inline ϵκx⁻⁻(i, j, k, grid, loc, κ, clock, sl, b, C) = triad_mask_x(i, i, j, k, k, grid) * κᶜᶜᶜ(i, j, k, grid, loc, κ, clock) * tapering_factorᶜᶜᶜ(i, j, k, grid, sl, b, C)
171+
@inline ϵκx⁺⁺(i, j, k, grid, loc, κ, clock, sl, b, C) = triad_mask_x(i+1, i, j, k, k+1, grid) * κᶜᶜᶜ(i, j, k, grid, loc, κ, clock, C) * tapering_factorᶜᶜᶜ(i, j, k, grid, sl, b, C)
172+
@inline ϵκx⁺⁻(i, j, k, grid, loc, κ, clock, sl, b, C) = triad_mask_x(i+1, i, j, k, k, grid) * κᶜᶜᶜ(i, j, k, grid, loc, κ, clock, C) * tapering_factorᶜᶜᶜ(i, j, k, grid, sl, b, C)
173+
@inline ϵκx⁻⁺(i, j, k, grid, loc, κ, clock, sl, b, C) = triad_mask_x(i, i, j, k, k+1, grid) * κᶜᶜᶜ(i, j, k, grid, loc, κ, clock, C) * tapering_factorᶜᶜᶜ(i, j, k, grid, sl, b, C)
174+
@inline ϵκx⁻⁻(i, j, k, grid, loc, κ, clock, sl, b, C) = triad_mask_x(i, i, j, k, k, grid) * κᶜᶜᶜ(i, j, k, grid, loc, κ, clock, C) * tapering_factorᶜᶜᶜ(i, j, k, grid, sl, b, C)
171175

172-
@inline ϵκy⁺⁺(i, j, k, grid, loc, κ, clock, sl, b, C) = triad_mask_y(i, j+1, j, k, k+1, grid) * κᶜᶜᶜ(i, j, k, grid, loc, κ, clock) * tapering_factorᶜᶜᶜ(i, j, k, grid, sl, b, C)
173-
@inline ϵκy⁺⁻(i, j, k, grid, loc, κ, clock, sl, b, C) = triad_mask_y(i, j+1, j, k, k, grid) * κᶜᶜᶜ(i, j, k, grid, loc, κ, clock) * tapering_factorᶜᶜᶜ(i, j, k, grid, sl, b, C)
174-
@inline ϵκy⁻⁺(i, j, k, grid, loc, κ, clock, sl, b, C) = triad_mask_y(i, j, j, k, k+1, grid) * κᶜᶜᶜ(i, j, k, grid, loc, κ, clock) * tapering_factorᶜᶜᶜ(i, j, k, grid, sl, b, C)
175-
@inline ϵκy⁻⁻(i, j, k, grid, loc, κ, clock, sl, b, C) = triad_mask_y(i, j, j, k, k, grid) * κᶜᶜᶜ(i, j, k, grid, loc, κ, clock) * tapering_factorᶜᶜᶜ(i, j, k, grid, sl, b, C)
176+
@inline ϵκy⁺⁺(i, j, k, grid, loc, κ, clock, sl, b, C) = triad_mask_y(i, j+1, j, k, k+1, grid) * κᶜᶜᶜ(i, j, k, grid, loc, κ, clock, C) * tapering_factorᶜᶜᶜ(i, j, k, grid, sl, b, C)
177+
@inline ϵκy⁺⁻(i, j, k, grid, loc, κ, clock, sl, b, C) = triad_mask_y(i, j+1, j, k, k, grid) * κᶜᶜᶜ(i, j, k, grid, loc, κ, clock, C) * tapering_factorᶜᶜᶜ(i, j, k, grid, sl, b, C)
178+
@inline ϵκy⁻⁺(i, j, k, grid, loc, κ, clock, sl, b, C) = triad_mask_y(i, j, j, k, k+1, grid) * κᶜᶜᶜ(i, j, k, grid, loc, κ, clock, C) * tapering_factorᶜᶜᶜ(i, j, k, grid, sl, b, C)
179+
@inline ϵκy⁻⁻(i, j, k, grid, loc, κ, clock, sl, b, C) = triad_mask_y(i, j, j, k, k, grid) * κᶜᶜᶜ(i, j, k, grid, loc, κ, clock, C) * tapering_factorᶜᶜᶜ(i, j, k, grid, sl, b, C)
176180

177181
# Triad diagram key
178182
# =================
@@ -282,7 +286,7 @@ end
282286
ϵκʸ⁻⁺ * Sy⁻⁺(i, j, k-1, grid, b, C) * ∂yᶜᶠᶜ(i, j, k-1, grid, c) +
283287
ϵκʸ⁺⁺ * Sy⁺⁺(i, j, k-1, grid, b, C) * ∂yᶜᶠᶜ(i, j+1, k-1, grid, c)) / 4
284288

285-
κϵ_R₃₃_∂z_c = explicit_R₃₃_∂z_c(i, j, k, grid, TD(), c, closure, b, C)
289+
κϵ_R₃₃_∂z_c = explicit_R₃₃_∂z_c(i, j, k, grid, TD(), clock, c, closure, b, C)
286290

287291
return - κR₃₁_∂x_c - κR₃₂_∂y_c - κϵ_R₃₃_∂z_c
288292
end
@@ -308,13 +312,13 @@ end
308312
return ϵκR₃₃
309313
end
310314

311-
@inline function explicit_R₃₃_∂z_c(i, j, k, grid, ::ExplicitTimeDiscretization, c, closure, b, C)
315+
@inline function explicit_R₃₃_∂z_c(i, j, k, grid, ::ExplicitTimeDiscretization, clock, c, closure, b, C)
312316
κ = closure.κ_symmetric
313317
sl = closure.slope_limiter
314318
return ϵκR₃₃(i, j, k, grid, κ, clock, sl, b, C) * ∂zᶜᶜᶠ(i, j, k, grid, c)
315319
end
316320

317-
@inline explicit_R₃₃_∂z_c(i, j, k, grid, ::VerticallyImplicitTimeDiscretization, c, closure, b, C) = zero(grid)
321+
@inline explicit_R₃₃_∂z_c(i, j, k, grid, ::VerticallyImplicitTimeDiscretization, clock, c, closure, b, C) = zero(grid)
318322

319323
@inline κzᶜᶜᶠ(i, j, k, grid, closure::FlavorOfTISSD, K, ::Val{id}, clock) where id = @inbounds K.ϵκR₃₃[i, j, k]
320324

test/runtests.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ CUDA.allowscalar() do
138138
if group == :turbulence_closures || group == :all
139139
@testset "Turbulence closures tests" begin
140140
include("test_turbulence_closures.jl")
141+
include("test_triad_isopycnal_diffusivity.jl")
141142
include("test_gm_infinite_slope.jl")
142143
end
143144
end
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
include("dependencies_for_runtests.jl")
2+
3+
using Oceananigans.TurbulenceClosures: TriadIsopycnalSkewSymmetricDiffusivity
4+
using Oceananigans.TurbulenceClosures: diffusive_flux_x, diffusive_flux_y, diffusive_flux_z,
5+
ExplicitTimeDiscretization, VerticallyImplicitTimeDiscretization,
6+
compute_diffusivities!
7+
8+
"""
9+
Test that TriadIsopycnalSkewSymmetricDiffusivity can be constructed and timestepped
10+
with both any time discretization.
11+
"""
12+
function time_step_with_triad_isopycnal_diffusivity(arch, time_discretization)
13+
grid = RectilinearGrid(arch, size=(4, 4, 8), extent=(100, 100, 100))
14+
15+
closure = TriadIsopycnalSkewSymmetricDiffusivity(time_discretization, Float64,
16+
κ_skew = 100.0,
17+
κ_symmetric = 100.0)
18+
19+
# TriadIsopycnalSkewSymmetricDiffusivity only works with HydrostaticFreeSurfaceModel
20+
model = HydrostaticFreeSurfaceModel(; grid, closure,
21+
buoyancy = BuoyancyTracer(),
22+
tracers = (:b, :c))
23+
24+
# A constant stratification initial condition
25+
set!(model, b=(x, y, z) -> 1e-5 * z)
26+
27+
# Attempt to time-step
28+
time_step!(model, 1)
29+
30+
return true
31+
end
32+
33+
34+
@testset "TriadIsopycnalSkewSymmetricDiffusivity" begin
35+
@info "Testing TriadIsopycnalSkewSymmetricDiffusivity..."
36+
37+
for arch in archs
38+
@testset "Time stepping with TriadIsopycnalSkewSymmetricDiffusivity [$arch]" begin
39+
for time_discretization in [ExplicitTimeDiscretization(), VerticallyImplicitTimeDiscretization()]
40+
@info " Time-stepping TriadIsopycnalSkewSymmetricDiffusivity with $(typeof(time_discretization)) on $arch..."
41+
@test time_step_with_triad_isopycnal_diffusivity(arch, time_discretization)
42+
end
43+
end
44+
end
45+
end

0 commit comments

Comments
 (0)