/
buoyancy.jl
64 lines (44 loc) 路 2.08 KB
/
buoyancy.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
using Oceananigans.Grids: ZDirection, validate_unit_vector
struct Buoyancy{M, G}
model :: M
gravity_unit_vector :: G
end
"""
Buoyancy(; model, gravity_unit_vector=ZDirection())
Uses a given buoyancy `model` to create buoyancy in a model. The optional keyword argument
`gravity_unit_vector` can be used to specify the direction opposite to the gravitational
acceleration (which we take here to mean the "vertical" direction).
Example
=======
```julia
using Oceananigans
grid = RectilinearGrid(size=(1, 8, 8), extent=(1, 1000, 100))
胃 = 45 # degrees
g虄 = (0, sind(胃), cosd(胃))
buoyancy = Buoyancy(model=BuoyancyTracer(), gravity_unit_vector=g虄)
model = NonhydrostaticModel(grid=grid, buoyancy=buoyancy, tracers=:b)
```
"""
function Buoyancy(; model, gravity_unit_vector=ZDirection())
gravity_unit_vector = validate_unit_vector(gravity_unit_vector)
return Buoyancy(model, gravity_unit_vector)
end
@inline g虃_x(buoyancy) = @inbounds buoyancy.gravity_unit_vector[1]
@inline g虃_y(buoyancy) = @inbounds buoyancy.gravity_unit_vector[2]
@inline g虃_z(buoyancy) = @inbounds buoyancy.gravity_unit_vector[3]
@inline g虃_x(::Buoyancy{M, ZDirection}) where M = 0
@inline g虃_y(::Buoyancy{M, ZDirection}) where M = 0
@inline g虃_z(::Buoyancy{M, ZDirection}) where M = 1
#####
##### For convenience
#####
@inline required_tracers(bm::Buoyancy) = required_tracers(bm.model)
@inline get_temperature_and_salinity(bm::Buoyancy, C) = get_temperature_and_salinity(bm.model, C)
@inline 鈭倄_b(i, j, k, grid, b::Buoyancy, C) = 鈭倄_b(i, j, k, grid, b.model, C)
@inline 鈭倅_b(i, j, k, grid, b::Buoyancy, C) = 鈭倅_b(i, j, k, grid, b.model, C)
@inline 鈭倆_b(i, j, k, grid, b::Buoyancy, C) = 鈭倆_b(i, j, k, grid, b.model, C)
@inline top_buoyancy_flux(i, j, grid, b::Buoyancy, args...) = top_buoyancy_flux(i, j, grid, b.model, args...)
regularize_buoyancy(b) = b
regularize_buoyancy(b::AbstractBuoyancyModel) = Buoyancy(model=b)
Base.summary(buoyancy::Buoyancy) = string(summary(buoyancy.model), " with -g虃 = ", summary(buoyancy.gravity_unit_vector))
Base.show(io::IO, buoyancy::Buoyancy) = summary(buoyancy)