|
1 | | -"`(Center, Center, Center)` vertical velocity `Field`" |
2 | | -wᶜᶜᶜ(model) = wᶜᶜᶜ(model.velocities.w, model.grid) |
3 | | -wᶜᶜᶜ(w, grid) = KernelFunctionOperation{Center, Center, Center}(ℑzᵃᵃᶜ, grid, w) |
4 | | -"`(Center, Center, Face)` vertical buoyancy gradient `Field`" |
5 | | -∂b∂z(model) = ∂b∂z(model.buoyancy, model.grid, model.tracers) |
6 | | -∂b∂z(b, grid, tracers) = KernelFunctionOperation{Center, Center, Face}(∂z_b, grid, b, tracers) |
7 | | - |
8 | | -@inline vertical_buoyancy_flux(i, j, k, grid, b::SeawaterBuoyancy, C, w) = |
9 | | - -ℑzᵃᵃᶜ(i, j, k, w) * buoyancy_perturbationᶜᶜᶜ(i, j, k, grid, b, C) |
10 | | -@inline function vertical_buoyancy_flux(model) |
11 | | - |
12 | | - grid = model.grid |
13 | | - b = model.buoyancy.model |
14 | | - C = model.tracers |
15 | | - w = model.velocities.w |
16 | | - |
17 | | - return KernelFunctionOperation{Center, Center, Center}(vertical_buoyancy_flux, grid, b, C, w) |
18 | | -end |
19 | | -@inline function Kᵥ(i, j, k, grid, b::SeawaterBuoyancy, C, w) |
20 | | - |
21 | | - if ∂z_b(i, j, k, grid, b, C) != 0 |
22 | | - (-ℑzᵃᵃᶜ(i, j, k, w) * buoyancy_perturbationᶜᶜᶜ(i, j, k, grid, b, C)) / ∂z_b(i, j, k, grid, b, C) |
23 | | - else |
24 | | - 0 |
25 | | - end |
26 | | - |
27 | | -end |
28 | | -function InferredVerticalDiffusivity(model) |
| 1 | +@inline tracer_perturbationᶜᶜᶜ(i, j, k, grid, tracer, tracer_mean) = |
| 2 | + tracer[i, j, k] - tracer_mean[i, j, k] |
| 3 | +# Only needed for testing |
| 4 | +@inline function tracer_perturbation(model, tracer) |
29 | 5 |
|
30 | 6 | grid = model.grid |
31 | | - b = model.buoyancy.model |
32 | | - C = model.tracers |
33 | | - w = model.velocities.w |
| 7 | + tracer_mean = Field(Average(tracer)) |
34 | 8 |
|
35 | | - return KernelFunctionOperation{Center, Center, Center}(Kᵥ, grid, b, C, w) |
| 9 | + return KernelFunctionOperation{Center, Center, Center}(tracer_perturbationᶜᶜᶜ, grid, tracer, tracer_mean) |
36 | 10 | end |
37 | 11 |
|
38 | | -@inline tracer_perturbationᶜᶜᶜ(i, j, k, grid, tracer, tracer_mean) = tracer[i, j, k] - tracer_mean |
39 | | -@inline vertical_tracer_flux(i, j, k, grid, tracer, tracer_mean, w) = |
| 12 | +@inline vtf(i, j, k, grid, tracer, tracer_mean, w) = |
40 | 13 | -ℑzᵃᵃᶜ(i, j, k, w) * tracer_perturbationᶜᶜᶜ(i, j, k, grid, tracer, tracer_mean) |
41 | 14 | @inline function vertical_tracer_flux(model, tracer) |
42 | 15 |
|
43 | 16 | grid = model.grid |
44 | | - tracer_mean = Average(tracer) |
| 17 | + tracer_mean = Field(Average(tracer)) |
45 | 18 | w = model.velocities.w |
46 | 19 |
|
47 | | - return KernelFunctionOperation{Center, Center, Center}(vertical_tracer_flux, grid, tracer, tracer_mean, w) |
| 20 | + return KernelFunctionOperation{Center, Center, Center}(vtf, grid, tracer, tracer_mean, w) |
48 | 21 | end |
49 | | - |
50 | | -## This has been implemented (by me) in Oceananigans.jl as of v0.89.3. Once I know |
51 | | -# everything is working I will remove this in favour of Oceananigans.jl version. |
52 | | - |
53 | | -# "Extend `ρ′` to compute at user defined reference geopotential height" |
54 | | -# SeawaterPolynomials.ρ(i, j, k, grid, eos, θ, sᴬ) = ρ(θ_and_sᴬ(i, j, k, θ, sᴬ)..., Zᶜᶜᶜ(i, j, k, grid),eos) |
55 | | -# SeawaterPolynomials.ρ(i, j, k, grid, eos, θ, sᴬ, Zᵣ) = ρ(θ_and_sᴬ(i, j, k, θ, sᴬ)..., Zᵣ, eos) |
56 | | -# """ |
57 | | -# function densityᶜᶜᶜ(i, j, k, grid, b::SeawaterBuoyancy, C) |
58 | | -# Compute the density of seawater at grid point `(i, j, k)` using `SeawaterBuoyancy`. |
59 | | -# """ |
60 | | -# @inline function densityᶜᶜᶜ(i, j, k, grid, b::SeawaterBuoyancy, C) |
61 | | -# T, S = get_temperature_and_salinity(b, C) |
62 | | -# return ρ(i, j, k, grid, b.equation_of_state, T, S) |
63 | | -# end |
64 | | -# density(model) = density(model.buoyancy, model.grid, model.tracers) |
65 | | -# density(b, grid, tracers) = |
66 | | -# KernelFunctionOperation{Center, Center, Center}(densityᶜᶜᶜ, grid, b.model, tracers) |
67 | | -# Density(model) = density(model) |
68 | | -# """ |
69 | | -# function potential_densityᶜᶜᶜ(i, j, k, grid, b::SeawaterBuoyancy, C, parameters) |
70 | | -# Compute the potential density of seawater at grid point `(i, j, k)` |
71 | | -# at reference pressure `parameters.pᵣ` using `SeawaterBuoyancy`. |
72 | | -# """ |
73 | | -# @inline function potential_densityᶜᶜᶜ(i, j, k, grid, b::SeawaterBuoyancy, C, parameters) |
74 | | -# T, S = get_temperature_and_salinity(b, C) |
75 | | -# Zᵣ = parameters.Zᵣ |
76 | | -# return ρ(i, j, k, grid, b.equation_of_state, T, S, Zᵣ) |
77 | | -# end |
78 | | -# potential_density(model, parameters) = potential_density(model.buoyancy, model.grid, |
79 | | -# model.tracers, parameters) |
80 | | -# potential_density(b, grid, tracers, parameters) = |
81 | | -# KernelFunctionOperation{Center, Center, Center}(potential_densityᶜᶜᶜ, grid, b.model, |
82 | | -# tracers, parameters) |
83 | | -# PotentialDensity(model, parameters) = potential_density(model, parameters) |
0 commit comments