From 86b277257e333c005e4c92dc67535a8055fe35c5 Mon Sep 17 00:00:00 2001 From: Gregory Wagner Date: Mon, 27 Oct 2025 22:08:05 -0600 Subject: [PATCH 1/8] Add a test for CATKE with DateTime clock and fix --- src/TimeSteppers/runge_kutta_3.jl | 3 ++- .../catke_vertical_diffusivity.jl | 4 +++- .../tke_dissipation_stability_functions.jl | 2 +- test/test_time_stepping.jl | 24 +++++++++++++------ 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/TimeSteppers/runge_kutta_3.jl b/src/TimeSteppers/runge_kutta_3.jl index 7771b451f5..5d3f78b737 100644 --- a/src/TimeSteppers/runge_kutta_3.jl +++ b/src/TimeSteppers/runge_kutta_3.jl @@ -1,5 +1,6 @@ using Oceananigans.Architectures: architecture using Oceananigans: fields +using Oceananigans.Utils: time_difference_seconds """ RungeKutta3TimeStepper{FT, TG} <: AbstractTimeStepper @@ -153,7 +154,7 @@ function time_step!(model::AbstractModel{<:RungeKutta3TimeStepper}, Δt; callbac # This adjustment of the final time-step reduces the accumulation of # round-off error when Δt is added to model.clock.time. Note that we still use # third_stage_Δt for the substep, pressure correction, and Lagrangian particles step. - corrected_third_stage_Δt = tⁿ⁺¹ - model.clock.time + corrected_third_stage_Δt = time_difference_seconds(tⁿ⁺¹, model.clock.time) tick!(model.clock, third_stage_Δt) # now model.clock.last_Δt = clock.last_stage_Δt = third_stage_Δt # we correct those below diff --git a/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/catke_vertical_diffusivity.jl b/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/catke_vertical_diffusivity.jl index d24cdd6b7c..5c0d09db04 100644 --- a/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/catke_vertical_diffusivity.jl +++ b/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/catke_vertical_diffusivity.jl @@ -1,3 +1,5 @@ +using Oceananigans.Utils: time_difference_seconds + struct CATKEVerticalDiffusivity{TD, CL, FT, DT, TKE} <: AbstractScalarDiffusivity{TD, VerticalFormulation, 2} mixing_length :: CL turbulent_kinetic_energy_equation :: TKE @@ -223,7 +225,7 @@ end @inline diffusivity_location(::FlavorOfCATKE) = (c, c, f) function update_previous_compute_time!(diffusivities, model) - Δt = model.clock.time - diffusivities.previous_compute_time[] + Δt = time_difference_seconds(model.clock.time, diffusivities.previous_compute_time[]) diffusivities.previous_compute_time[] = model.clock.time return Δt end diff --git a/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/tke_dissipation_stability_functions.jl b/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/tke_dissipation_stability_functions.jl index 684bbb87b6..a1e449b5da 100644 --- a/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/tke_dissipation_stability_functions.jl +++ b/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/tke_dissipation_stability_functions.jl @@ -37,7 +37,7 @@ const ConstantStabilityTDVD = TKEDissipationVerticalDiffusivity{<:Any, <:Any, <: @inline momentum_stability_functionᶜᶜᶠ(i, j, k, grid, c::ConstantStabilityTDVD, args...) = c.stability_functions.Cu₀ @inline tracer_stability_functionᶜᶜᶠ(i, j, k, grid, c::ConstantStabilityTDVD, args...) = c.stability_functions.Cc₀ -struct VariableStabilityFunctions{FT} <: AbstractConstantSchmidtStabilityFunctions +@Base.kwdef struct VariableStabilityFunctions{FT} <: AbstractConstantSchmidtStabilityFunctions Cσe :: FT Cσϵ :: FT Cu₀ :: FT diff --git a/test/test_time_stepping.jl b/test/test_time_stepping.jl index e4bdb42e5c..fd0f8447a0 100644 --- a/test/test_time_stepping.jl +++ b/test/test_time_stepping.jl @@ -309,22 +309,32 @@ timesteppers = (:QuasiAdamsBashforth2, :RungeKutta3) @info "Testing time stepping..." for arch in archs, FT in float_types - @testset "Time stepping with DateTimes [$(typeof(arch)), $FT]" begin - @info " Testing time stepping with datetime clocks [$(typeof(arch)), $FT]" + A = typeof(arch) + @testset "Time stepping with DateTimes [$A, $FT]" begin + @info " Testing time stepping with datetime clocks [$A, $FT]" grid = RectilinearGrid(arch, size=(1, 1, 1), extent=(1, 1, 1)) clock = Clock(time=DateTime(2020)) - model = NonhydrostaticModel(; grid, clock, timestepper=:QuasiAdamsBashforth2) + model = NonhydrostaticModel(; grid, clock) time_step!(model, 7.883) @test model.clock.time == DateTime("2020-01-01T00:00:07.883") - model = NonhydrostaticModel(grid = RectilinearGrid(arch, size=(1, 1, 1), extent=(1, 1, 1)), - timestepper = :QuasiAdamsBashforth2, - clock = Clock(time=TimeDate(2020))) - + clock = Clock(time=TimeDate(2020)) + model = NonhydrostaticModel(; grid, clock) time_step!(model, 123e-9) # 123 nanoseconds @test model.clock.time == TimeDate("2020-01-01T00:00:00.000000123") + + # Test HydrostaticFreeSurfaceModel + for closure in (nothing, CATKEVerticalDiffusivity(FT), TKEDissipationVerticalDiffusivity(FT)) + tracers = (:b, :c, :e, :ϵ) + clock = Clock(time=DateTime(2020, 1, 1)) + grid = RectilinearGrid(arch, FT; size=(2, 2, 2), extent=(1, 1, 1)) + model = HydrostaticFreeSurfaceModel(; grid, clock, closure, tracers, + buoyancy = BuoyancyTracer()) + time_step!(model, 1) + @test model.clock.time == DateTime("2020-01-01T00:00:01") + end end end From 7b15a725597da96f2cd53518782cb578e3831635 Mon Sep 17 00:00:00 2001 From: "Navid C. Constantinou" Date: Tue, 28 Oct 2025 18:48:48 +1100 Subject: [PATCH 2/8] bump patch release --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 90404515b1..72386a5104 100755 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "Oceananigans" uuid = "9e8cae18-63c1-5223-a75c-80ca9d6e9a09" authors = ["Climate Modeling Alliance and contributors"] -version = "0.100.7" +version = "0.100.8" [deps] Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" From 36157de30df1f467dc7a69059e5947f26bc8ffb7 Mon Sep 17 00:00:00 2001 From: "Navid C. Constantinou" Date: Tue, 28 Oct 2025 18:59:24 +1100 Subject: [PATCH 3/8] drop @Base.kwdef --- .../tke_dissipation_stability_functions.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/tke_dissipation_stability_functions.jl b/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/tke_dissipation_stability_functions.jl index a1e449b5da..684bbb87b6 100644 --- a/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/tke_dissipation_stability_functions.jl +++ b/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/tke_dissipation_stability_functions.jl @@ -37,7 +37,7 @@ const ConstantStabilityTDVD = TKEDissipationVerticalDiffusivity{<:Any, <:Any, <: @inline momentum_stability_functionᶜᶜᶠ(i, j, k, grid, c::ConstantStabilityTDVD, args...) = c.stability_functions.Cu₀ @inline tracer_stability_functionᶜᶜᶠ(i, j, k, grid, c::ConstantStabilityTDVD, args...) = c.stability_functions.Cc₀ -@Base.kwdef struct VariableStabilityFunctions{FT} <: AbstractConstantSchmidtStabilityFunctions +struct VariableStabilityFunctions{FT} <: AbstractConstantSchmidtStabilityFunctions Cσe :: FT Cσϵ :: FT Cu₀ :: FT From ab0b248e666d242db3ba1ab4db45e66a836455d8 Mon Sep 17 00:00:00 2001 From: "Navid C. Constantinou" Date: Tue, 28 Oct 2025 19:00:35 +1100 Subject: [PATCH 4/8] in-> by --- .../tke_dissipation_stability_functions.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/tke_dissipation_stability_functions.jl b/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/tke_dissipation_stability_functions.jl index 684bbb87b6..7e4150cfca 100644 --- a/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/tke_dissipation_stability_functions.jl +++ b/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/tke_dissipation_stability_functions.jl @@ -75,7 +75,7 @@ function VariableStabilityFunctions(FT=Oceananigans.defaults.FloatType; if isnothing(𝕊u₀) # Compute 𝕊u₀ for the logarithmic boundary layer where production # balances dissipation. For more information see the discussion - # surrounding equation (13) in Umlauf and Burchard (2003). + # surrounding equation (13) by Umlauf and Burchard (2003). a = Cd₅ - Cu₂ b = Cd₂ - Cu₀ c = Cd₀ From c9b3e34406eb9b511868ddd77bd19f917272405a Mon Sep 17 00:00:00 2001 From: Gregory Wagner Date: Tue, 28 Oct 2025 13:19:12 -0600 Subject: [PATCH 5/8] fix k-epsilon for Float32 --- .../tke_dissipation_stability_functions.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/tke_dissipation_stability_functions.jl b/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/tke_dissipation_stability_functions.jl index 7e4150cfca..df281373c3 100644 --- a/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/tke_dissipation_stability_functions.jl +++ b/src/TurbulenceClosures/turbulence_closure_implementations/TKEBasedVerticalDiffusivities/tke_dissipation_stability_functions.jl @@ -55,6 +55,8 @@ struct VariableStabilityFunctions{FT} <: AbstractConstantSchmidtStabilityFunctio 𝕊u₀ :: FT end +VariableStabilityFunctions{FT}(; kw...) where FT = VariableStabilityFunctions(FT; kw...) + function VariableStabilityFunctions(FT=Oceananigans.defaults.FloatType; Cσe = 1.0, Cσϵ = 1.2, From 1c32ca4105185ca01279357109f44b9b86aa1e1f Mon Sep 17 00:00:00 2001 From: "Gregory L. Wagner" Date: Wed, 29 Oct 2025 14:42:10 -0600 Subject: [PATCH 6/8] Update test/test_time_stepping.jl --- test/test_time_stepping.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_time_stepping.jl b/test/test_time_stepping.jl index fd0f8447a0..d2fefb1451 100644 --- a/test/test_time_stepping.jl +++ b/test/test_time_stepping.jl @@ -311,7 +311,7 @@ timesteppers = (:QuasiAdamsBashforth2, :RungeKutta3) for arch in archs, FT in float_types A = typeof(arch) @testset "Time stepping with DateTimes [$A, $FT]" begin - @info " Testing time stepping with datetime clocks [$A, $FT]" + @info " Testing NonhydrostaticModel time stepping with datetime clocks [$A, $FT]" grid = RectilinearGrid(arch, size=(1, 1, 1), extent=(1, 1, 1)) clock = Clock(time=DateTime(2020)) From 3dd87a0f199a65c22d5eab688ad5f6ead1a1d481 Mon Sep 17 00:00:00 2001 From: "Gregory L. Wagner" Date: Wed, 29 Oct 2025 14:42:16 -0600 Subject: [PATCH 7/8] Update test/test_time_stepping.jl --- test/test_time_stepping.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_time_stepping.jl b/test/test_time_stepping.jl index d2fefb1451..e44be9ebc8 100644 --- a/test/test_time_stepping.jl +++ b/test/test_time_stepping.jl @@ -327,6 +327,7 @@ timesteppers = (:QuasiAdamsBashforth2, :RungeKutta3) # Test HydrostaticFreeSurfaceModel for closure in (nothing, CATKEVerticalDiffusivity(FT), TKEDissipationVerticalDiffusivity(FT)) + @info " Testing HydrostaticFreeSurfaceModel time stepping with datetime clocks [$A, $FT, $(typeof(closure))]" tracers = (:b, :c, :e, :ϵ) clock = Clock(time=DateTime(2020, 1, 1)) grid = RectilinearGrid(arch, FT; size=(2, 2, 2), extent=(1, 1, 1)) From e426b5a5e6fad0fcba95664fb68b855be26522cd Mon Sep 17 00:00:00 2001 From: ali-ramadhan Date: Fri, 31 Oct 2025 07:12:53 -0600 Subject: [PATCH 8/8] Empty commit to trigger Buildkite