From 46d22a7c1f13ad2855693819dd16870a7f8805df Mon Sep 17 00:00:00 2001 From: Gregory Wagner Date: Mon, 1 Jul 2024 19:36:33 -0400 Subject: [PATCH 1/8] Use total tracer in diffusive flux calculation --- .../nonhydrostatic_tendency_kernel_functions.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Models/NonhydrostaticModels/nonhydrostatic_tendency_kernel_functions.jl b/src/Models/NonhydrostaticModels/nonhydrostatic_tendency_kernel_functions.jl index cefb5eadc3..a87c792a26 100644 --- a/src/Models/NonhydrostaticModels/nonhydrostatic_tendency_kernel_functions.jl +++ b/src/Models/NonhydrostaticModels/nonhydrostatic_tendency_kernel_functions.jl @@ -261,10 +261,11 @@ velocity components, tracer fields, and precalculated diffusivities where applic w = SumOfArrays{3}(velocities.w, background_fields.velocities.w, biogeochemical_velocities.w)) total_velocities = with_advective_forcing(forcing, total_velocities) + total_c = SumOfArrays{2}(c, background_fields_c) return ( - div_Uc(i, j, k, grid, advection, total_velocities, c) - div_Uc(i, j, k, grid, advection, velocities, background_fields_c) - - ∇_dot_qᶜ(i, j, k, grid, closure, diffusivities, val_tracer_index, c, clock, model_fields, buoyancy) + - ∇_dot_qᶜ(i, j, k, grid, closure, diffusivities, val_tracer_index, total_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) + forcing(i, j, k, grid, clock, model_fields)) From 719e4c299607b6b36bb39a9281761a2eb6841ff0 Mon Sep 17 00:00:00 2001 From: Gregory Wagner Date: Mon, 1 Jul 2024 19:43:36 -0400 Subject: [PATCH 2/8] Also use total_c in the immersed flux divergence --- .../nonhydrostatic_tendency_kernel_functions.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Models/NonhydrostaticModels/nonhydrostatic_tendency_kernel_functions.jl b/src/Models/NonhydrostaticModels/nonhydrostatic_tendency_kernel_functions.jl index a87c792a26..93a5555b4b 100644 --- a/src/Models/NonhydrostaticModels/nonhydrostatic_tendency_kernel_functions.jl +++ b/src/Models/NonhydrostaticModels/nonhydrostatic_tendency_kernel_functions.jl @@ -266,7 +266,7 @@ velocity components, tracer fields, and precalculated diffusivities where applic return ( - div_Uc(i, j, k, grid, advection, total_velocities, c) - div_Uc(i, j, k, grid, advection, velocities, background_fields_c) - ∇_dot_qᶜ(i, j, k, grid, closure, diffusivities, val_tracer_index, total_c, clock, model_fields, buoyancy) - - immersed_∇_dot_qᶜ(i, j, k, grid, c, c_immersed_bc, closure, diffusivities, val_tracer_index, clock, model_fields) + - immersed_∇_dot_qᶜ(i, j, k, grid, total_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) + forcing(i, j, k, grid, clock, model_fields)) end From 794088f2d9a1bd788d7992713050dfb5a20f2f88 Mon Sep 17 00:00:00 2001 From: Gregory Wagner Date: Tue, 2 Jul 2024 10:06:01 -0800 Subject: [PATCH 3/8] Move background fields around --- src/Fields/Fields.jl | 2 - src/Models/Models.jl | 4 +- .../NonhydrostaticModels.jl | 3 +- .../background_fields.jl | 48 +++++++++++++++---- .../nonhydrostatic_model.jl | 5 +- 5 files changed, 47 insertions(+), 15 deletions(-) rename src/{Fields => Models/NonhydrostaticModels}/background_fields.jl (53%) diff --git a/src/Fields/Fields.jl b/src/Fields/Fields.jl index 56b2d11594..9222cc979d 100644 --- a/src/Fields/Fields.jl +++ b/src/Fields/Fields.jl @@ -3,7 +3,6 @@ module Fields export Face, Center export AbstractField, Field, Average, Integral, Reduction, Accumulation, field export CenterField, XFaceField, YFaceField, ZFaceField -export BackgroundField export interior, data, xnode, ynode, znode, location export set!, compute!, @compute, regrid! export VelocityFields, TracerFields, TendencyFields, tracernames @@ -24,7 +23,6 @@ include("field.jl") include("scans.jl") include("regridding_fields.jl") include("field_tuples.jl") -include("background_fields.jl") include("interpolate.jl") include("show_fields.jl") include("broadcasting_abstract_fields.jl") diff --git a/src/Models/Models.jl b/src/Models/Models.jl index fa46608b96..22c2944c37 100644 --- a/src/Models/Models.jl +++ b/src/Models/Models.jl @@ -1,7 +1,7 @@ module Models export - NonhydrostaticModel, + NonhydrostaticModel, BackgroundField, BackgroundFields, ShallowWaterModel, ConservativeFormulation, VectorInvariantFormulation, HydrostaticFreeSurfaceModel, ExplicitFreeSurface, ImplicitFreeSurface, SplitExplicitFreeSurface, @@ -98,7 +98,7 @@ include("HydrostaticFreeSurfaceModels/HydrostaticFreeSurfaceModels.jl") include("ShallowWaterModels/ShallowWaterModels.jl") include("LagrangianParticleTracking/LagrangianParticleTracking.jl") -using .NonhydrostaticModels: NonhydrostaticModel, PressureField +using .NonhydrostaticModels: NonhydrostaticModel, PressureField, BackgroundField, BackgroundFields using .HydrostaticFreeSurfaceModels: HydrostaticFreeSurfaceModel, diff --git a/src/Models/NonhydrostaticModels/NonhydrostaticModels.jl b/src/Models/NonhydrostaticModels/NonhydrostaticModels.jl index 5fccd29f82..9d8aba21d8 100644 --- a/src/Models/NonhydrostaticModels/NonhydrostaticModels.jl +++ b/src/Models/NonhydrostaticModels/NonhydrostaticModels.jl @@ -1,6 +1,6 @@ module NonhydrostaticModels -export NonhydrostaticModel +export NonhydrostaticModel, BackgroundField, BackgroundFields using DocStringExtensions @@ -40,6 +40,7 @@ PressureSolver(arch, grid) = error("None of the implemented pressure solvers for ##### NonhydrostaticModel definition ##### +include("background_fields.jl") include("nonhydrostatic_model.jl") include("pressure_field.jl") include("show_nonhydrostatic_model.jl") diff --git a/src/Fields/background_fields.jl b/src/Models/NonhydrostaticModels/background_fields.jl similarity index 53% rename from src/Fields/background_fields.jl rename to src/Models/NonhydrostaticModels/background_fields.jl index 9ac557cb5d..705f6e6b79 100644 --- a/src/Fields/background_fields.jl +++ b/src/Models/NonhydrostaticModels/background_fields.jl @@ -1,13 +1,18 @@ +using Oceananigans.Fields: ZeroField, AbstractField, FunctionField, location using Oceananigans.Utils: prettysummary # TODO: This code belongs in the Models module -function BackgroundVelocityFields(bg, grid, clock) - u = :u ∈ keys(bg) ? regularize_background_field(Face, Center, Center, bg[:u], grid, clock) : ZeroField() - v = :v ∈ keys(bg) ? regularize_background_field(Center, Face, Center, bg[:v], grid, clock) : ZeroField() - w = :w ∈ keys(bg) ? regularize_background_field(Center, Center, Face, bg[:w], grid, clock) : ZeroField() +function BackgroundVelocityFields(fields, grid, clock) + u = get(fields, :u, ZeroField()) + v = get(fields, :v, ZeroField()) + w = get(fields, :w, ZeroField()) - return (u=u, v=v, w=w) + u = regularize_background_field(Face, Center, Center, u, grid, clock) + v = regularize_background_field(Center, Face, Center, v, grid, clock) + w = regularize_background_field(Center, Center, Face, w, grid, clock) + + return (; u, v, w) end function BackgroundTracerFields(bg, tracer_names, grid, clock) @@ -21,13 +26,38 @@ function BackgroundTracerFields(bg, tracer_names, grid, clock) end ##### -##### Convenience for model constructor +##### BackgroundFields (with option for including background closure fluxes) ##### -function BackgroundFields(background_fields, tracer_names, grid, clock) +struct BackgroundFields{Q, U, C} + velocities :: U + tracers :: C + function BackgroundFields{Q}(velocities::U, tracers::C) where {Q, U, C} + return new{Q, U, C}(velocities, tracers) + end +end + +const BackgroundFieldsWithClosureFluxes = BackgroundFields{true} + +function BackgroundFields(; background_closure_fluxes=false, fields...) + u = get(fields, :u, ZeroField()) + v = get(fields, :v, ZeroField()) + w = get(fields, :w, ZeroField()) + velocities = (; u, v, w) + tracers = NamedTuple(name => fields[name] for name in keys(fields) if !(name ∈ (:u, :v, :w))) + return BackgroundFields{background_closure_fluxes}(velocities, tracers) +end + +function BackgroundFields(background_fields::BackgroundFields{Q}, tracer_names, grid, clock) where Q + velocities = BackgroundVelocityFields(background_fields.velocities, grid, clock) + tracers = BackgroundTracerFields(background_fields.tracers, tracer_names, grid, clock) + return BackgroundFields{Q}(velocities, tracers) +end + +function BackgroundFields(background_fields::NamedTuple, tracer_names, grid, clock) velocities = BackgroundVelocityFields(background_fields, grid, clock) tracers = BackgroundTracerFields(background_fields, tracer_names, grid, clock) - return (velocities=velocities, tracers=tracers) + return BackgroundFields{false}(velocities, tracers) end """ @@ -66,6 +96,8 @@ regularize_background_field(LX, LY, LZ, f::BackgroundField{<:Function}, grid, cl regularize_background_field(LX, LY, LZ, func::Function, grid, clock) = FunctionField{LX, LY, LZ}(func, grid; clock=clock) +regularize_background_field(LX, LY, LZ, ::ZeroField, grid, clock) = ZeroField() + function regularize_background_field(LX, LY, LZ, field::AbstractField, grid, clock) if location(field) != (LX, LY, LZ) throw(ArgumentError("Cannot use field at $(location(field)) as a background field at $((LX, LY, LZ))")) diff --git a/src/Models/NonhydrostaticModels/nonhydrostatic_model.jl b/src/Models/NonhydrostaticModels/nonhydrostatic_model.jl index 44ecdce89b..eb644ca095 100644 --- a/src/Models/NonhydrostaticModels/nonhydrostatic_model.jl +++ b/src/Models/NonhydrostaticModels/nonhydrostatic_model.jl @@ -7,7 +7,7 @@ using Oceananigans.Advection: CenteredSecondOrder using Oceananigans.BuoyancyModels: validate_buoyancy, regularize_buoyancy, SeawaterBuoyancy using Oceananigans.Biogeochemistry: validate_biogeochemistry, AbstractBiogeochemistry, biogeochemical_auxiliary_fields using Oceananigans.BoundaryConditions: regularize_field_boundary_conditions -using Oceananigans.Fields: BackgroundFields, Field, tracernames, VelocityFields, TracerFields, CenterField +using Oceananigans.Fields: Field, tracernames, VelocityFields, TracerFields, CenterField using Oceananigans.Forcings: model_forcing using Oceananigans.Grids: inflate_halo_size, with_halo, architecture using Oceananigans.ImmersedBoundaries: ImmersedBoundaryGrid @@ -24,6 +24,7 @@ import Oceananigans.Models: total_velocities, default_nan_checker, timestepper const ParticlesOrNothing = Union{Nothing, AbstractLagrangianParticles} const AbstractBGCOrNothing = Union{Nothing, AbstractBiogeochemistry} +const BFOrNamedTuple = Union{BackgroundFields, NamedTuple} mutable struct NonhydrostaticModel{TS, E, A<:AbstractArchitecture, G, T, B, R, SD, U, C, Φ, F, V, S, K, BG, P, BGC, I, AF} <: AbstractModel{TS} @@ -121,7 +122,7 @@ function NonhydrostaticModel(; grid, boundary_conditions::NamedTuple = NamedTuple(), tracers = (), timestepper = :QuasiAdamsBashforth2, - background_fields::NamedTuple = NamedTuple(), + background_fields::BFOrNamedTuple = NamedTuple(), particles::ParticlesOrNothing = nothing, biogeochemistry::AbstractBGCOrNothing = nothing, velocities = nothing, From 433e250553cf0b9888b46888374a2bba829b7bef Mon Sep 17 00:00:00 2001 From: Gregory Wagner Date: Tue, 2 Jul 2024 11:05:22 -0800 Subject: [PATCH 4/8] Adapt backgroundFields and add option to include or not in closure fluxes --- .../NonhydrostaticModels/background_fields.jl | 17 +++++++++++------ .../nonhydrostatic_tendency_kernel_functions.jl | 11 ++++++++--- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/Models/NonhydrostaticModels/background_fields.jl b/src/Models/NonhydrostaticModels/background_fields.jl index 705f6e6b79..8322c0c2a8 100644 --- a/src/Models/NonhydrostaticModels/background_fields.jl +++ b/src/Models/NonhydrostaticModels/background_fields.jl @@ -1,9 +1,11 @@ using Oceananigans.Fields: ZeroField, AbstractField, FunctionField, location using Oceananigans.Utils: prettysummary +using Adapt + # TODO: This code belongs in the Models module -function BackgroundVelocityFields(fields, grid, clock) +function background_velocity_fields(fields, grid, clock) u = get(fields, :u, ZeroField()) v = get(fields, :v, ZeroField()) w = get(fields, :w, ZeroField()) @@ -15,7 +17,7 @@ function BackgroundVelocityFields(fields, grid, clock) return (; u, v, w) end -function BackgroundTracerFields(bg, tracer_names, grid, clock) +function background_tracer_fields(bg, tracer_names, grid, clock) tracer_fields = Tuple(c ∈ keys(bg) ? regularize_background_field(Center, Center, Center, getindex(bg, c), grid, clock) : @@ -37,6 +39,9 @@ struct BackgroundFields{Q, U, C} end end +Adapt.adapt_structure(to, bf::BackgroundFields{Q}) where Q = + BackgroundFields{Q}(adapt(to, bf.velocities), adapt(to, bf.tracers)) + const BackgroundFieldsWithClosureFluxes = BackgroundFields{true} function BackgroundFields(; background_closure_fluxes=false, fields...) @@ -49,14 +54,14 @@ function BackgroundFields(; background_closure_fluxes=false, fields...) end function BackgroundFields(background_fields::BackgroundFields{Q}, tracer_names, grid, clock) where Q - velocities = BackgroundVelocityFields(background_fields.velocities, grid, clock) - tracers = BackgroundTracerFields(background_fields.tracers, tracer_names, grid, clock) + velocities = background_velocity_fields(background_fields.velocities, grid, clock) + tracers = background_tracer_fields(background_fields.tracers, tracer_names, grid, clock) return BackgroundFields{Q}(velocities, tracers) end function BackgroundFields(background_fields::NamedTuple, tracer_names, grid, clock) - velocities = BackgroundVelocityFields(background_fields, grid, clock) - tracers = BackgroundTracerFields(background_fields, tracer_names, grid, clock) + velocities = background_velocity_fields(background_fields, grid, clock) + tracers = background_tracer_fields(background_fields, tracer_names, grid, clock) return BackgroundFields{false}(velocities, tracers) end diff --git a/src/Models/NonhydrostaticModels/nonhydrostatic_tendency_kernel_functions.jl b/src/Models/NonhydrostaticModels/nonhydrostatic_tendency_kernel_functions.jl index 93a5555b4b..9e735d9c1c 100644 --- a/src/Models/NonhydrostaticModels/nonhydrostatic_tendency_kernel_functions.jl +++ b/src/Models/NonhydrostaticModels/nonhydrostatic_tendency_kernel_functions.jl @@ -261,12 +261,17 @@ velocity components, tracer fields, and precalculated diffusivities where applic w = SumOfArrays{3}(velocities.w, background_fields.velocities.w, biogeochemical_velocities.w)) total_velocities = with_advective_forcing(forcing, total_velocities) - total_c = SumOfArrays{2}(c, background_fields_c) + + closure_c = if background_fields isa BackgroundFieldsWithClosureFluxes + SumOfArrays{2}(c, background_fields_c) + else + c + end return ( - div_Uc(i, j, k, grid, advection, total_velocities, c) - div_Uc(i, j, k, grid, advection, velocities, background_fields_c) - - ∇_dot_qᶜ(i, j, k, grid, closure, diffusivities, val_tracer_index, total_c, clock, model_fields, buoyancy) - - immersed_∇_dot_qᶜ(i, j, k, grid, total_c, c_immersed_bc, closure, diffusivities, val_tracer_index, clock, model_fields) + - ∇_dot_qᶜ(i, j, k, grid, closure, diffusivities, val_tracer_index, closure_c, clock, model_fields, buoyancy) + - immersed_∇_dot_qᶜ(i, j, k, grid, closure_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) + forcing(i, j, k, grid, clock, model_fields)) end From 3f0f0cdc3ca70693a90b9f9d85e5c56850996789 Mon Sep 17 00:00:00 2001 From: "Gregory L. Wagner" Date: Thu, 8 Aug 2024 09:07:25 -0600 Subject: [PATCH 5/8] Update src/Models/NonhydrostaticModels/background_fields.jl --- src/Models/NonhydrostaticModels/background_fields.jl | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Models/NonhydrostaticModels/background_fields.jl b/src/Models/NonhydrostaticModels/background_fields.jl index 8322c0c2a8..5a9a29a1e7 100644 --- a/src/Models/NonhydrostaticModels/background_fields.jl +++ b/src/Models/NonhydrostaticModels/background_fields.jl @@ -3,8 +3,6 @@ using Oceananigans.Utils: prettysummary using Adapt -# TODO: This code belongs in the Models module - function background_velocity_fields(fields, grid, clock) u = get(fields, :u, ZeroField()) v = get(fields, :v, ZeroField()) From 07ccb2e50b55bc5fdbed08b099c8c2812ab9a371 Mon Sep 17 00:00:00 2001 From: "Gregory L. Wagner" Date: Thu, 8 Aug 2024 09:07:36 -0600 Subject: [PATCH 6/8] Update src/Models/NonhydrostaticModels/background_fields.jl --- src/Models/NonhydrostaticModels/background_fields.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Models/NonhydrostaticModels/background_fields.jl b/src/Models/NonhydrostaticModels/background_fields.jl index 5a9a29a1e7..a878068d4b 100644 --- a/src/Models/NonhydrostaticModels/background_fields.jl +++ b/src/Models/NonhydrostaticModels/background_fields.jl @@ -94,7 +94,7 @@ func(x, y, z, t, parameters) BackgroundField(func; parameters=nothing) = BackgroundField(func, parameters) regularize_background_field(LX, LY, LZ, f::BackgroundField{<:Function}, grid, clock) = - FunctionField{LX, LY, LZ}(f.func, grid; clock=clock, parameters=f.parameters) + FunctionField{LX, LY, LZ}(f.func, grid; clock, parameters=f.parameters) regularize_background_field(LX, LY, LZ, func::Function, grid, clock) = FunctionField{LX, LY, LZ}(func, grid; clock=clock) From fa3e3f02968b954cf1e42207abfd835665f1ff1d Mon Sep 17 00:00:00 2001 From: Gregory Wagner Date: Thu, 8 Aug 2024 09:21:37 -0600 Subject: [PATCH 7/8] Try to make things behave in expected ways --- ...onhydrostatic_tendency_kernel_functions.jl | 89 +++++++++++++------ 1 file changed, 62 insertions(+), 27 deletions(-) diff --git a/src/Models/NonhydrostaticModels/nonhydrostatic_tendency_kernel_functions.jl b/src/Models/NonhydrostaticModels/nonhydrostatic_tendency_kernel_functions.jl index 9e735d9c1c..a59197074f 100644 --- a/src/Models/NonhydrostaticModels/nonhydrostatic_tendency_kernel_functions.jl +++ b/src/Models/NonhydrostaticModels/nonhydrostatic_tendency_kernel_functions.jl @@ -8,6 +8,7 @@ using Oceananigans.Biogeochemistry: biogeochemical_transition, biogeochemical_dr using Oceananigans.TurbulenceClosures: ∂ⱼ_τ₁ⱼ, ∂ⱼ_τ₂ⱼ, ∂ⱼ_τ₃ⱼ, ∇_dot_qᶜ using Oceananigans.TurbulenceClosures: immersed_∂ⱼ_τ₁ⱼ, immersed_∂ⱼ_τ₂ⱼ, immersed_∂ⱼ_τ₃ⱼ, immersed_∇_dot_qᶜ using Oceananigans.Forcings: with_advective_forcing +using Oceananigans.Fields: ZeroField "return the ``x``-gradient of hydrostatic pressure" hydrostatic_pressure_gradient_x(i, j, k, grid, hydrostatic_pressure) = ∂xᶠᶜᶜ(i, j, k, grid, hydrostatic_pressure) @@ -17,6 +18,28 @@ hydrostatic_pressure_gradient_x(i, j, k, grid, ::Nothing) = zero(grid) hydrostatic_pressure_gradient_y(i, j, k, grid, hydrostatic_pressure) = ∂yᶜᶠᶜ(i, j, k, grid, hydrostatic_pressure) hydrostatic_pressure_gradient_y(i, j, k, grid, ::Nothing) = zero(grid) +# Compiler shortcut, for the paranoid about ZeroField +@inline sum_fields(a, b::ZeroField) = a +@inline sum_fields(a, b) = SumOfArrays{2}(a, b) + +@inline sum_fields(a, b::ZeroField, c::ZeroField) = a +@inline sum_fields(a, b, c::ZeroField) = SumOfArrays{2}(a, b) +@inline sum_fields(a, b::ZeroField, c) = SumOfArrays{2}(a, c) +@inline sum_fields(a, b, c) = SumOfArrays{3}(a, b, c) + +@inline assemble_closure_velocities(velocities, background_fields) = velocities + +@inline function assemble_closure_velocities(velocities, + background_fields::BackgroundFieldsWithClosureFluxes) + + u = sum_fields(velocities.u, background_fields.u) + v = sum_fields(velocities.v, background_fields.v) + w = sum_fields(velocities.w, background_fields.w) + + return (; u, v, w) +end + + """ $(SIGNATURES) @@ -60,20 +83,22 @@ pressure anomaly. hydrostatic_pressure, clock) - model_fields = merge(velocities, tracers, auxiliary_fields) - - total_velocities = (u = SumOfArrays{2}(velocities.u, background_fields.velocities.u), - v = SumOfArrays{2}(velocities.v, background_fields.velocities.v), - w = SumOfArrays{2}(velocities.w, background_fields.velocities.w)) + total_velocities = (u = sum_fields(velocities.u, background_fields.velocities.u), + v = sum_fields(velocities.v, background_fields.velocities.v), + w = sum_fields(velocities.w, background_fields.velocities.w)) total_velocities = with_advective_forcing(forcings.u, total_velocities) + closure_velocities = assemble_closure_velocities(velocities, background_fields) + closure_model_fields = merge(closure_velocities, tracers, auxiliary_fields) + model_fields = merge(velocities, tracers, auxiliary_fields) + return ( - div_𝐯u(i, j, k, grid, advection, total_velocities, velocities.u) - div_𝐯u(i, j, k, grid, advection, velocities, background_fields.velocities.u) + x_dot_g_bᶠᶜᶜ(i, j, k, grid, buoyancy, tracers) - x_f_cross_U(i, j, k, grid, coriolis, velocities) - hydrostatic_pressure_gradient_x(i, j, k, grid, hydrostatic_pressure) - - ∂ⱼ_τ₁ⱼ(i, j, k, grid, closure, diffusivities, clock, model_fields, buoyancy) + - ∂ⱼ_τ₁ⱼ(i, j, k, grid, closure, diffusivities, clock, closure_model_fields, buoyancy) - immersed_∂ⱼ_τ₁ⱼ(i, j, k, grid, velocities, u_immersed_bc, closure, diffusivities, clock, model_fields) + x_curl_Uˢ_cross_U(i, j, k, grid, stokes_drift, velocities, clock.time) + ∂t_uˢ(i, j, k, grid, stokes_drift, clock.time) @@ -123,20 +148,22 @@ pressure anomaly. hydrostatic_pressure, clock) - model_fields = merge(velocities, tracers, auxiliary_fields) - - total_velocities = (u = SumOfArrays{2}(velocities.u, background_fields.velocities.u), - v = SumOfArrays{2}(velocities.v, background_fields.velocities.v), - w = SumOfArrays{2}(velocities.w, background_fields.velocities.w)) + total_velocities = (u = sum_fields(velocities.u, background_fields.velocities.u), + v = sum_fields(velocities.v, background_fields.velocities.v), + w = sum_fields(velocities.w, background_fields.velocities.w)) total_velocities = with_advective_forcing(forcings.v, total_velocities) + closure_velocities = assemble_closure_velocities(velocities, background_fields) + closure_model_fields = merge(closure_velocities, tracers, auxiliary_fields) + model_fields = merge(velocities, tracers, auxiliary_fields) + return ( - div_𝐯v(i, j, k, grid, advection, total_velocities, velocities.v) - div_𝐯v(i, j, k, grid, advection, velocities, background_fields.velocities.v) + y_dot_g_bᶜᶠᶜ(i, j, k, grid, buoyancy, tracers) - y_f_cross_U(i, j, k, grid, coriolis, velocities) - hydrostatic_pressure_gradient_y(i, j, k, grid, hydrostatic_pressure) - - ∂ⱼ_τ₂ⱼ(i, j, k, grid, closure, diffusivities, clock, model_fields, buoyancy) + - ∂ⱼ_τ₂ⱼ(i, j, k, grid, closure, diffusivities, clock, closure_model_fields, buoyancy) - immersed_∂ⱼ_τ₂ⱼ(i, j, k, grid, velocities, v_immersed_bc, closure, diffusivities, clock, model_fields) + y_curl_Uˢ_cross_U(i, j, k, grid, stokes_drift, velocities, clock.time) + ∂t_vˢ(i, j, k, grid, stokes_drift, clock.time) @@ -189,19 +216,22 @@ velocity components, tracer fields, and precalculated diffusivities where applic hydrostatic_pressure, clock) - model_fields = merge(velocities, tracers, auxiliary_fields) - total_velocities = (u = SumOfArrays{2}(velocities.u, background_fields.velocities.u), - v = SumOfArrays{2}(velocities.v, background_fields.velocities.v), - w = SumOfArrays{2}(velocities.w, background_fields.velocities.w)) + total_velocities = (u = sum_fields(velocities.u, background_fields.velocities.u), + v = sum_fields(velocities.v, background_fields.velocities.v), + w = sum_fields(velocities.w, background_fields.velocities.w)) total_velocities = with_advective_forcing(forcings.w, total_velocities) + closure_velocities = assemble_closure_velocities(velocities, background_fields) + closure_model_fields = merge(closure_velocities, tracers, auxiliary_fields) + model_fields = merge(velocities, tracers, auxiliary_fields) + return ( - div_𝐯w(i, j, k, grid, advection, total_velocities, velocities.w) - div_𝐯w(i, j, k, grid, advection, velocities, background_fields.velocities.w) + maybe_z_dot_g_bᶜᶜᶠ(i, j, k, grid, hydrostatic_pressure, buoyancy, tracers) - z_f_cross_U(i, j, k, grid, coriolis, velocities) - - ∂ⱼ_τ₃ⱼ(i, j, k, grid, closure, diffusivities, clock, model_fields, buoyancy) + - ∂ⱼ_τ₃ⱼ(i, j, k, grid, closure, diffusivities, clock, closure_model_fields, buoyancy) - immersed_∂ⱼ_τ₃ⱼ(i, j, k, grid, velocities, w_immersed_bc, closure, diffusivities, clock, model_fields) + z_curl_Uˢ_cross_U(i, j, k, grid, stokes_drift, velocities, clock.time) + ∂t_wˢ(i, j, k, grid, stokes_drift, clock.time) @@ -235,7 +265,7 @@ velocity components, tracer fields, and precalculated diffusivities where applic `clock` keeps track of `clock.time` and `clock.iteration`. """ @inline function tracer_tendency(i, j, k, grid, - val_tracer_index::Val{tracer_index}, + val_index::Val{tracer_index}, val_tracer_name, advection, closure, @@ -250,28 +280,33 @@ velocity components, tracer fields, and precalculated diffusivities where applic forcing, clock) where tracer_index - @inbounds c = tracers[tracer_index] - @inbounds background_fields_c = background_fields.tracers[tracer_index] - model_fields = merge(velocities, tracers, auxiliary_fields) biogeochemical_velocities = biogeochemical_drift_velocity(biogeochemistry, val_tracer_name) - total_velocities = (u = SumOfArrays{3}(velocities.u, background_fields.velocities.u, biogeochemical_velocities.u), - v = SumOfArrays{3}(velocities.v, background_fields.velocities.v, biogeochemical_velocities.v), - w = SumOfArrays{3}(velocities.w, background_fields.velocities.w, biogeochemical_velocities.w)) + total_velocities = (u = sum_fields(velocities.u, background_fields.velocities.u, biogeochemical_velocities.u), + v = sum_fields(velocities.v, background_fields.velocities.v, biogeochemical_velocities.v), + w = sum_fields(velocities.w, background_fields.velocities.w, biogeochemical_velocities.w)) total_velocities = with_advective_forcing(forcing, total_velocities) + @inbounds c = tracers[tracer_index] + @inbounds background_fields_c = background_fields.tracers[tracer_index] + closure_c = if background_fields isa BackgroundFieldsWithClosureFluxes - SumOfArrays{2}(c, background_fields_c) + sum_fields(c, background_fields_c) else c end + closure_velocities = assemble_closure_velocities(velocities, background_fields) + closure_model_fields = merge(closure_velocities, tracers, auxiliary_fields) + model_fields = merge(velocities, tracers, auxiliary_fields) + return ( - div_Uc(i, j, k, grid, advection, total_velocities, c) - div_Uc(i, j, k, grid, advection, velocities, background_fields_c) - - ∇_dot_qᶜ(i, j, k, grid, closure, diffusivities, val_tracer_index, closure_c, clock, model_fields, buoyancy) - - immersed_∇_dot_qᶜ(i, j, k, grid, closure_c, c_immersed_bc, closure, diffusivities, val_tracer_index, clock, model_fields) + - ∇_dot_qᶜ(i, j, k, grid, closure, diffusivities, val_index, closure_c, clock, closure_model_fields, buoyancy) + - immersed_∇_dot_qᶜ(i, j, k, grid, closure_c, c_immersed_bc, closure, diffusivities, val_index, clock, model_fields) + biogeochemical_transition(i, j, k, grid, biogeochemistry, val_tracer_name, clock, model_fields) + forcing(i, j, k, grid, clock, model_fields)) end + From f89445dcc802341d5361c2f241fe48e483dbd9ff Mon Sep 17 00:00:00 2001 From: Gregory Wagner Date: Mon, 12 Aug 2024 23:32:53 -0600 Subject: [PATCH 8/8] Dont import background field from Fields --- test/test_time_stepping.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/test/test_time_stepping.jl b/test/test_time_stepping.jl index 6f5334ec87..357c92ca8f 100644 --- a/test/test_time_stepping.jl +++ b/test/test_time_stepping.jl @@ -2,7 +2,6 @@ include("dependencies_for_runtests.jl") using TimesDates: TimeDate using Oceananigans.Grids: topological_tuple_length, total_size -using Oceananigans.Fields: BackgroundField using Oceananigans.TimeSteppers: Clock using Oceananigans.TurbulenceClosures: CATKEVerticalDiffusivity