-
Notifications
You must be signed in to change notification settings - Fork 188
/
solution_and_tracer_tendencies.jl
116 lines (98 loc) · 5.45 KB
/
solution_and_tracer_tendencies.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
using Oceananigans.Advection
using Oceananigans.ImmersedBoundaries: ImmersedBoundaryGrid, GridFittedBoundary
using Oceananigans.Coriolis
using Oceananigans.Operators
using Oceananigans.TurbulenceClosures: ∇_dot_qᶜ, ∂ⱼ_τ₁ⱼ, ∂ⱼ_τ₂ⱼ
@inline half_g_h²(i, j, k, grid, h, g) = @inbounds 1/2 * g * h[i, j, k]^2
@inline h_plus_hB(i, j, k, grid, h, hB) = @inbounds h[i, j, k] + hB[i, j, k]
@inline x_pressure_gradient(i, j, k, grid, g, h, hB, formulation) = ∂xᶠᶜᶜ(i, j, k, grid, half_g_h², h, g)
@inline y_pressure_gradient(i, j, k, grid, g, h, hB, formulation) = ∂yᶜᶠᶜ(i, j, k, grid, half_g_h², h, g)
@inline x_pressure_gradient(i, j, k, grid, g, h, hB, ::VectorInvariantFormulation) = g * ∂xᶠᶜᶜ(i, j, k, grid, h_plus_hB, h, hB)
@inline y_pressure_gradient(i, j, k, grid, g, h, hB, ::VectorInvariantFormulation) = g * ∂yᶜᶠᶜ(i, j, k, grid, h_plus_hB, h, hB)
@inline bathymetry_contribution_x(i, j, k, grid, g, h, hB, formulation) = g * h[i, j, k] * ∂xᶠᶜᶜ(i, j, k, grid, hB)
@inline bathymetry_contribution_y(i, j, k, grid, g, h, hB, formulation) = g * h[i, j, k] * ∂yᶜᶠᶜ(i, j, k, grid, hB)
@inline bathymetry_contribution_x(i, j, k, grid, g, h, hB, ::VectorInvariantFormulation) = zero(grid)
@inline bathymetry_contribution_y(i, j, k, grid, g, h, hB, ::VectorInvariantFormulation) = zero(grid)
"""
Compute the tendency for the x-directional transport, uh
"""
@inline function uh_solution_tendency(i, j, k, grid,
gravitational_acceleration,
advection,
velocities,
coriolis,
closure,
bathymetry,
solution,
tracers,
diffusivities,
forcings,
clock,
formulation)
g = gravitational_acceleration
model_fields = shallow_water_fields(velocities, tracers, solution, formulation)
return ( - div_mom_u(i, j, k, grid, advection, solution, formulation)
- x_pressure_gradient(i, j, k, grid, g, solution.h, bathymetry, formulation)
- x_f_cross_U(i, j, k, grid, coriolis, solution)
- bathymetry_contribution_x(i, j, k, grid, g, solution.h, bathymetry, formulation)
- sw_∂ⱼ_τ₁ⱼ(i, j, k, grid, closure, diffusivities, clock, model_fields, formulation)
+ forcings[1](i, j, k, grid, clock, merge(solution, tracers)))
end
"""
Compute the tendency for the y-directional transport, vh.
"""
@inline function vh_solution_tendency(i, j, k, grid,
gravitational_acceleration,
advection,
velocities,
coriolis,
closure,
bathymetry,
solution,
tracers,
diffusivities,
forcings,
clock,
formulation)
g = gravitational_acceleration
model_fields = shallow_water_fields(velocities, tracers, solution, formulation)
return ( - div_mom_v(i, j, k, grid, advection, solution, formulation)
- y_pressure_gradient(i, j, k, grid, g, solution.h, bathymetry, formulation)
- y_f_cross_U(i, j, k, grid, coriolis, solution)
- bathymetry_contribution_y(i, j, k, grid, g, solution.h, bathymetry, formulation)
- sw_∂ⱼ_τ₂ⱼ(i, j, k, grid, closure, diffusivities, clock, model_fields, formulation)
+ forcings[2](i, j, k, grid, clock, merge(solution, tracers)))
end
"""
Compute the tendency for the height, h.
"""
@inline function h_solution_tendency(i, j, k, grid,
gravitational_acceleration,
advection,
coriolis,
closure,
solution,
tracers,
diffusivities,
forcings,
clock,
formulation)
return ( - div_Uh(i, j, k, grid, advection, solution, formulation)
+ forcings.h(i, j, k, grid, clock, merge(solution, tracers)))
end
@inline function tracer_tendency(i, j, k, grid,
val_tracer_index::Val{tracer_index},
advection,
closure,
solution,
tracers,
diffusivities,
forcing,
clock,
formulation) where tracer_index
@inbounds c = tracers[tracer_index]
return ( - div_Uc(i, j, k, grid, advection, solution, c, formulation)
+ c_div_U(i, j, k, grid, solution, c, formulation)
+ forcing(i, j, k, grid, clock, merge(solution, tracers))
)
end