forked from CliMA/ClimateMachine.jl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Continuity3dModel.jl
85 lines (76 loc) · 2.29 KB
/
Continuity3dModel.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
struct Continuity3dModel{M} <: AbstractOceanModel
ocean::M
function Continuity3dModel(ocean::M) where {M}
return new{M}(ocean)
end
end
vars_state(cm::Continuity3dModel, ::Prognostic, FT) =
vars_state(cm.ocean, Prognostic(), FT)
# Continuity3dModel is used to compute the horizontal divergence of u
vars_state(cm::Continuity3dModel, ::Auxiliary, T) = @vars()
vars_state(cm::Continuity3dModel, ::Gradient, T) = @vars()
vars_state(cm::Continuity3dModel, ::GradientFlux, T) = @vars()
vars_state(cm::Continuity3dModel, ::UpwardIntegrals, T) = @vars()
init_state_auxiliary!(cm::Continuity3dModel, _...) = nothing
init_state_prognostic!(cm::Continuity3dModel, _...) = nothing
@inline flux_second_order!(cm::Continuity3dModel, _...) = nothing
@inline source!(cm::Continuity3dModel, _...) = nothing
@inline update_penalty!(::RusanovNumericalFlux, ::Continuity3dModel, _...) =
nothing
# This allows the balance law framework to compute the horizontal gradient of u
# (which will be stored back in the field θ)
@inline function flux_first_order!(
m::Continuity3dModel,
flux::Grad,
state::Vars,
aux::Vars,
t::Real,
direction,
)
@inbounds begin
u = state.u # Horizontal components of velocity
v = @SVector [u[1], u[2], -0]
# ∇ • (v)
# Just using θ to store w = ∇h • u
flux.θ += v
end
return nothing
end
# This is zero because when taking the horizontal gradient we're piggy-backing
# on θ and want to ensure we do not use it's jump
@inline wavespeed(cm::Continuity3dModel, n⁻, _...) = -zero(eltype(n⁻))
boundary_state!(
::CentralNumericalFluxSecondOrder,
cm::Continuity3dModel,
_...,
) = nothing
"""
boundary_state!(nf, ::Continuity3dModel, Q⁺, A⁺, Q⁻, A⁻, bctype)
applies boundary conditions for the hyperbolic fluxes
dispatches to a function in OceanBoundaryConditions.jl based on bytype defined by a problem such as SimpleBoxProblem.jl
"""
@inline function boundary_state!(
nf,
cm::Continuity3dModel,
Q⁺::Vars,
A⁺::Vars,
n⁻,
Q⁻::Vars,
A⁻::Vars,
bctype,
t,
_...,
)
return ocean_boundary_state!(
cm,
cm.ocean.problem,
bctype,
nf,
Q⁺,
A⁺,
n⁻,
Q⁻,
A⁻,
t,
)
end