Single-column ocean simulation forced by JRA55 re-analysis
In this example, we simulate the evolution of an ocean water column forced by an atmosphere derived from the JRA55 re-analysis. The simulated column is located at ocean station Papa (144.9ᵒ W and 50.1ᵒ N).
Install dependencies
First let's make sure we have all required packages installed.
using Pkg
pkg"add Oceananigans, NumericalEarth, CairoMakie"using CopernicusMarine
using NumericalEarth
using Oceananigans
using Oceananigans: prognostic_fields
using Oceananigans.Units
using Oceananigans.Models: buoyancy_frequency
using Dates
using Printf[ Info: Oceananigans will use 8 threads
Construct the grid
First, we construct a single-column grid with 2 meter spacing located at ocean station Papa.
Ocean station papa location
location_name = "ocean_station_papa"
λ★, φ★ = -144.9, 50.1
grid = RectilinearGrid(size = 200,
x = λ★,
y = φ★,
z = (-400, 0),
topology = (Flat, Flat, Bounded))1×1×200 RectilinearGrid{Float64, Flat, Flat, Bounded} on CPU with 0×0×3 halo
├── Flat x = -144.9
├── Flat y = 50.1
└── Bounded z ∈ [-400.0, 0.0] regularly spaced with Δz=2.0An "ocean simulation"
Next, we use NumericalEarth's ocean_simulation constructor to build a realistic ocean simulation on the single-column grid,
ocean = ocean_simulation(grid; Δt=10minutes, coriolis=FPlane(latitude = φ★))Simulation of HydrostaticFreeSurfaceModel{CPU, RectilinearGrid}(time = 0 seconds, iteration = 0)
├── Next time step: 10 minutes
├── run_wall_time: 0 seconds
├── run_wall_time / iteration: NaN days
├── stop_time: Inf days
├── stop_iteration: Inf
├── wall_time_limit: Inf
├── minimum_relative_step: 0.0
├── callbacks: OrderedDict with 4 entries:
│ ├── stop_time_exceeded => Callback of stop_time_exceeded on IterationInterval(1)
│ ├── stop_iteration_exceeded => Callback of stop_iteration_exceeded on IterationInterval(1)
│ ├── wall_time_limit_exceeded => Callback of wall_time_limit_exceeded on IterationInterval(1)
│ └── nan_checker => Callback of NaNChecker for u on IterationInterval(100)
└── output_writers: OrderedDict with no entrieswhich wraps around the ocean model
ocean.modelHydrostaticFreeSurfaceModel{CPU, RectilinearGrid}(time = 0 seconds, iteration = 0)
├── grid: 1×1×200 RectilinearGrid{Float64, Flat, Flat, Bounded} on CPU with 0×0×3 halo
├── timestepper: SplitRungeKuttaTimeStepper
├── tracers: (T, S, e)
├── closure: CATKEVerticalDiffusivity{VerticallyImplicitTimeDiscretization}
├── buoyancy: SeawaterBuoyancy with g=9.80665 and BoussinesqEquationOfState{Float64} with ĝ = NegativeZDirection()
├── advection scheme:
│ ├── momentum: Nothing
│ ├── T: Nothing
│ ├── S: Nothing
│ └── e: Nothing
├── vertical_coordinate: Oceananigans.Models.HydrostaticFreeSurfaceModels.ZCoordinate
└── coriolis: Oceananigans.Coriolis.FPlane{Oceananigans.Advection.EnstrophyConserving{Float64}, Float64}We set initial conditions from GLORYS, using a Column region so that only the single water column at (λ★, φ★) is downloaded from the Copernicus Marine Service.
col = Column(λ★, φ★; interpolation=Nearest())
set!(ocean.model, T=Metadatum(:temperature, dataset=GLORYSMonthly(), region=col),
S=Metadatum(:salinity, dataset=GLORYSMonthly(), region=col))A prescribed atmosphere based on JRA55 re-analysis
We build a JRA55PrescribedAtmosphere at the same location as the single-colunm grid which is based on the JRA55 reanalysis.
atmosphere = JRA55PrescribedAtmosphere(longitude = λ★,
latitude = φ★,
end_date = DateTime(1990, 1, 31), # Last day of the simulation
backend = InMemory())1×2×1×241 PrescribedAtmosphere{Float32} on Oceananigans.Grids.LatitudeLongitudeGrid:
├── times: 241-element StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}
├── surface_layer_height: 10.0
└── boundary_layer_height: 512.0This builds a representation of the atmosphere on the small grid
atmosphere.grid1×2×1 LatitudeLongitudeGrid{Float32, Oceananigans.Grids.Bounded, Oceananigans.Grids.Bounded, Oceananigans.Grids.Flat} on CPU with 1×2×0 halo
├── longitude: Bounded λ ∈ [-0.28125, 0.28125] variably spaced with min(Δλ)=0.5625, max(Δλ)=0.5625
├── latitude: Bounded φ ∈ [49.4227, 50.5459] variably spaced with min(Δφ)=0.561619, max(Δφ)=0.561623
└── z: Flat z Let's take a look at the atmospheric state
ua = interior(atmosphere.velocities.u, 1, 1, 1, :)
va = interior(atmosphere.velocities.v, 1, 1, 1, :)
Ta = interior(atmosphere.tracers.T, 1, 1, 1, :)
qa = interior(atmosphere.tracers.q, 1, 1, 1, :)
t_days = atmosphere.times / days
using CairoMakie
set_theme!(Theme(linewidth=3, fontsize=24))
fig = Figure(size=(800, 1000))
axu = Axis(fig[2, 1]; ylabel="Atmosphere \n velocity (m s⁻¹)")
axT = Axis(fig[3, 1]; ylabel="Atmosphere \n temperature (ᵒK)")
axq = Axis(fig[4, 1]; ylabel="Atmosphere \n specific humidity", xlabel = "Days since Jan 1, 1990")
Label(fig[1, 1], "Atmospheric state over ocean station Papa", tellwidth=false)
lines!(axu, t_days, ua, label="Zonal velocity")
lines!(axu, t_days, va, label="Meridional velocity")
ylims!(axu, -6, 6)
axislegend(axu, framevisible=false, nbanks=2, position=:lb)
lines!(axT, t_days, Ta)
lines!(axq, t_days, qa)
current_figure()We continue constructing a simulation.
radiation = Radiation()
coupled_model = OceanOnlyModel(ocean; atmosphere, radiation)
simulation = Simulation(coupled_model, Δt=ocean.Δt, stop_time=30days)
wall_clock = Ref(time_ns())
function progress(sim)
msg = "Ocean Station Papa"
msg *= string(", iter: ", iteration(sim), ", time: ", prettytime(sim))
elapsed = 1e-9 * (time_ns() - wall_clock[])
msg *= string(", wall time: ", prettytime(elapsed))
wall_clock[] = time_ns()
u, v, w = sim.model.ocean.model.velocities
msg *= @sprintf(", max|u|: (%.2e, %.2e)", maximum(abs, u), maximum(abs, v))
T = sim.model.ocean.model.tracers.T
S = sim.model.ocean.model.tracers.S
e = sim.model.ocean.model.tracers.e
ρ = sim.model.interfaces.ocean_properties.reference_density
c = sim.model.interfaces.ocean_properties.heat_capacity
τˣ = first(sim.model.interfaces.net_fluxes.ocean.u)
τʸ = first(sim.model.interfaces.net_fluxes.ocean.v)
Q = first(sim.model.interfaces.net_fluxes.ocean.T) * ρ * c
u★ = sqrt(sqrt(τˣ^2 + τʸ^2))
Nz = size(T, 3)
msg *= @sprintf(", u★: %.2f m s⁻¹", u★)
msg *= @sprintf(", Q: %.2f W m⁻²", Q)
msg *= @sprintf(", T₀: %.2f ᵒC", first(interior(T, 1, 1, Nz)))
msg *= @sprintf(", extrema(T): (%.2f, %.2f) ᵒC", minimum(T), maximum(T))
msg *= @sprintf(", S₀: %.2f g/kg", first(interior(S, 1, 1, Nz)))
msg *= @sprintf(", e₀: %.2e m² s⁻²", first(interior(e, 1, 1, Nz)))
@info msg
return nothing
end
simulation.callbacks[:progress] = Callback(progress, IterationInterval(100))Callback of progress on IterationInterval(100)Build flux outputs
τˣ = simulation.model.interfaces.net_fluxes.ocean.u
τʸ = simulation.model.interfaces.net_fluxes.ocean.v
JT = simulation.model.interfaces.net_fluxes.ocean.T
Jˢ = simulation.model.interfaces.net_fluxes.ocean.S
Jᵛ = simulation.model.interfaces.atmosphere_ocean_interface.fluxes.water_vapor
𝒬ᵀ = simulation.model.interfaces.atmosphere_ocean_interface.fluxes.sensible_heat
𝒬ᵛ = simulation.model.interfaces.atmosphere_ocean_interface.fluxes.latent_heat
ρᵒᶜ = simulation.model.interfaces.ocean_properties.reference_density
cᵒᶜ = simulation.model.interfaces.ocean_properties.heat_capacity
Q = ρᵒᶜ * cᵒᶜ * JT
ρτˣ = ρᵒᶜ * τˣ
ρτʸ = ρᵒᶜ * τʸ
N² = buoyancy_frequency(ocean.model)
κc = ocean.model.closure_fields.κc
fluxes = (; ρτˣ, ρτʸ, Jᵛ, Jˢ, 𝒬ᵛ, 𝒬ᵀ)
auxiliary_fields = (; N², κc)
u, v, w = ocean.model.velocities
T, S, e = ocean.model.tracers
fields = merge((; u, v, T, S, e), auxiliary_fields)(u = 1×1×200 Field{Oceananigans.Grids.Face, Oceananigans.Grids.Center, Oceananigans.Grids.Center} on Oceananigans.Grids.RectilinearGrid on CPU
├── grid: 1×1×200 RectilinearGrid{Float64, Flat, Flat, Bounded} on CPU with 0×0×3 halo
├── boundary conditions: FieldBoundaryConditions
│ └── west: Nothing, east: Nothing, south: Nothing, north: Nothing, bottom: Flux, top: Flux, immersed: Nothing
└── data: 1×1×206 OffsetArray(::Array{Float64, 3}, 1:1, 1:1, -2:203) with eltype Float64 with indices 1:1×1:1×-2:203
└── max=0.0, min=0.0, mean=0.0, v = 1×1×200 Field{Oceananigans.Grids.Center, Oceananigans.Grids.Face, Oceananigans.Grids.Center} on Oceananigans.Grids.RectilinearGrid on CPU
├── grid: 1×1×200 RectilinearGrid{Float64, Flat, Flat, Bounded} on CPU with 0×0×3 halo
├── boundary conditions: FieldBoundaryConditions
│ └── west: Nothing, east: Nothing, south: Nothing, north: Nothing, bottom: Flux, top: Flux, immersed: Nothing
└── data: 1×1×206 OffsetArray(::Array{Float64, 3}, 1:1, 1:1, -2:203) with eltype Float64 with indices 1:1×1:1×-2:203
└── max=0.0, min=0.0, mean=0.0, T = 1×1×200 Field{Oceananigans.Grids.Center, Oceananigans.Grids.Center, Oceananigans.Grids.Center} on Oceananigans.Grids.RectilinearGrid on CPU
├── grid: 1×1×200 RectilinearGrid{Float64, Flat, Flat, Bounded} on CPU with 0×0×3 halo
├── boundary conditions: FieldBoundaryConditions
│ └── west: Nothing, east: Nothing, south: Nothing, north: Nothing, bottom: ZeroFlux, top: Flux, immersed: Nothing
└── data: 1×1×206 OffsetArray(::Array{Float64, 3}, 1:1, 1:1, -2:203) with eltype Float64 with indices 1:1×1:1×-2:203
└── max=4.8094, min=4.8094, mean=4.8094, S = 1×1×200 Field{Oceananigans.Grids.Center, Oceananigans.Grids.Center, Oceananigans.Grids.Center} on Oceananigans.Grids.RectilinearGrid on CPU
├── grid: 1×1×200 RectilinearGrid{Float64, Flat, Flat, Bounded} on CPU with 0×0×3 halo
├── boundary conditions: FieldBoundaryConditions
│ └── west: Nothing, east: Nothing, south: Nothing, north: Nothing, bottom: ZeroFlux, top: Flux, immersed: Nothing
└── data: 1×1×206 OffsetArray(::Array{Float64, 3}, 1:1, 1:1, -2:203) with eltype Float64 with indices 1:1×1:1×-2:203
└── max=33.2257, min=33.2257, mean=33.2257, e = 1×1×200 Field{Oceananigans.Grids.Center, Oceananigans.Grids.Center, Oceananigans.Grids.Center} on Oceananigans.Grids.RectilinearGrid on CPU
├── grid: 1×1×200 RectilinearGrid{Float64, Flat, Flat, Bounded} on CPU with 0×0×3 halo
├── boundary conditions: FieldBoundaryConditions
│ └── west: Nothing, east: Nothing, south: Nothing, north: Nothing, bottom: ZeroFlux, top: Flux, immersed: Nothing
└── data: 1×1×206 OffsetArray(::Array{Float64, 3}, 1:1, 1:1, -2:203) with eltype Float64 with indices 1:1×1:1×-2:203
└── max=0.0, min=0.0, mean=0.0, N² = KernelFunctionOperation at (Center, Center, Face)
├── grid: 1×1×200 RectilinearGrid{Float64, Flat, Flat, Bounded} on CPU with 0×0×3 halo
├── kernel_function: ∂z_b (generic function with 5 methods)
└── arguments: ("Oceananigans.BuoyancyFormulations.SeawaterBuoyancy", "NamedTuple"), κc = 1×1×201 Field{Oceananigans.Grids.Center, Oceananigans.Grids.Center, Oceananigans.Grids.Face} on Oceananigans.Grids.RectilinearGrid on CPU
├── grid: 1×1×200 RectilinearGrid{Float64, Flat, Flat, Bounded} on CPU with 0×0×3 halo
├── boundary conditions: FieldBoundaryConditions
│ └── west: Nothing, east: Nothing, south: Nothing, north: Nothing, bottom: Nothing, top: Nothing, immersed: Nothing
└── data: 1×1×207 OffsetArray(::Array{Float64, 3}, 1:1, 1:1, -2:204) with eltype Float64 with indices 1:1×1:1×-2:204
└── max=4.62085e-5, min=0.0, mean=2.30057e-5)Slice fields at the surface
outputs = merge(fields, fluxes)
filename = "single_column_omip_$(location_name)"
ocean.output_writers[:jld2] = JLD2Writer(ocean.model, outputs; filename,
schedule = TimeInterval(3hours),
overwrite_existing = true)
run!(simulation)[ Info: Initializing simulation...
[ Info: Ocean Station Papa, iter: 0, time: 0 seconds, wall time: 2.978 minutes, max|u|: (0.00e+00, 0.00e+00), u★: 0.01 m s⁻¹, Q: 55.28 W m⁻², T₀: 4.81 ᵒC, extrema(T): (4.81, 4.81) ᵒC, S₀: 33.23 g/kg, e₀: 0.00e+00 m² s⁻²
[ Info: ... simulation initialization complete (1.153 seconds)
[ Info: Executing initial time step...
[ Info: ... initial time step complete (40.778 seconds).
[ Info: Ocean Station Papa, iter: 100, time: 16.667 hours, wall time: 42.039 seconds, max|u|: (1.83e-01, 1.08e-01), u★: 0.02 m s⁻¹, Q: -24.10 W m⁻², T₀: 4.82 ᵒC, extrema(T): (4.81, 4.82) ᵒC, S₀: 33.22 g/kg, e₀: 3.85e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 200, time: 1.389 days, wall time: 793.764 ms, max|u|: (1.20e-01, 1.36e-01), u★: 0.02 m s⁻¹, Q: -295.24 W m⁻², T₀: 4.91 ᵒC, extrema(T): (4.81, 4.91) ᵒC, S₀: 33.21 g/kg, e₀: 4.43e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 300, time: 2.083 days, wall time: 750.513 ms, max|u|: (1.60e-01, 1.18e-01), u★: 0.01 m s⁻¹, Q: -107.86 W m⁻², T₀: 4.97 ᵒC, extrema(T): (4.81, 4.97) ᵒC, S₀: 33.21 g/kg, e₀: 2.01e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 400, time: 2.778 days, wall time: 912.690 ms, max|u|: (1.32e-01, 7.95e-02), u★: 0.02 m s⁻¹, Q: -109.43 W m⁻², T₀: 5.00 ᵒC, extrema(T): (4.81, 5.00) ᵒC, S₀: 33.20 g/kg, e₀: 2.90e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 500, time: 3.472 days, wall time: 851.493 ms, max|u|: (1.15e-01, 1.10e-01), u★: 0.02 m s⁻¹, Q: -37.73 W m⁻², T₀: 4.97 ᵒC, extrema(T): (4.81, 4.97) ᵒC, S₀: 33.20 g/kg, e₀: 3.52e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 600, time: 4.167 days, wall time: 885.793 ms, max|u|: (7.53e-02, 2.22e-01), u★: 0.02 m s⁻¹, Q: 36.83 W m⁻², T₀: 4.95 ᵒC, extrema(T): (4.81, 4.95) ᵒC, S₀: 33.20 g/kg, e₀: 4.43e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 700, time: 4.861 days, wall time: 799.767 ms, max|u|: (2.15e-01, 1.25e-01), u★: 0.03 m s⁻¹, Q: 46.76 W m⁻², T₀: 4.95 ᵒC, extrema(T): (4.81, 4.95) ᵒC, S₀: 33.20 g/kg, e₀: 8.53e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 800, time: 5.556 days, wall time: 827.083 ms, max|u|: (8.24e-02, 1.79e-01), u★: 0.01 m s⁻¹, Q: -42.74 W m⁻², T₀: 4.96 ᵒC, extrema(T): (4.81, 4.96) ᵒC, S₀: 33.20 g/kg, e₀: 1.79e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 900, time: 6.250 days, wall time: 855.890 ms, max|u|: (1.67e-01, 1.69e-01), u★: 0.02 m s⁻¹, Q: -53.16 W m⁻², T₀: 4.95 ᵒC, extrema(T): (4.81, 4.95) ᵒC, S₀: 33.20 g/kg, e₀: 3.14e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 1000, time: 6.944 days, wall time: 818.785 ms, max|u|: (3.07e-01, 2.47e-01), u★: 0.02 m s⁻¹, Q: -17.92 W m⁻², T₀: 4.95 ᵒC, extrema(T): (4.81, 4.95) ᵒC, S₀: 33.20 g/kg, e₀: 3.22e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 1100, time: 7.639 days, wall time: 869.376 ms, max|u|: (3.97e-01, 3.75e-01), u★: 0.02 m s⁻¹, Q: -115.38 W m⁻², T₀: 4.98 ᵒC, extrema(T): (4.81, 4.98) ᵒC, S₀: 33.20 g/kg, e₀: 7.59e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 1200, time: 8.333 days, wall time: 840.064 ms, max|u|: (1.56e-01, 2.61e-01), u★: 0.01 m s⁻¹, Q: -69.05 W m⁻², T₀: 4.97 ᵒC, extrema(T): (4.81, 4.97) ᵒC, S₀: 33.20 g/kg, e₀: 1.78e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 1300, time: 9.028 days, wall time: 894.026 ms, max|u|: (4.93e-01, 3.50e-01), u★: 0.02 m s⁻¹, Q: -249.76 W m⁻², T₀: 5.03 ᵒC, extrema(T): (4.81, 5.03) ᵒC, S₀: 33.19 g/kg, e₀: 8.21e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 1400, time: 9.722 days, wall time: 836.530 ms, max|u|: (3.06e-01, 8.25e-02), u★: 0.01 m s⁻¹, Q: 5.98 W m⁻², T₀: 5.05 ᵒC, extrema(T): (4.81, 5.05) ᵒC, S₀: 33.19 g/kg, e₀: 1.11e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 1500, time: 10.417 days, wall time: 923.038 ms, max|u|: (3.16e-01, 8.79e-02), u★: 0.01 m s⁻¹, Q: -115.12 W m⁻², T₀: 5.06 ᵒC, extrema(T): (4.81, 5.06) ᵒC, S₀: 33.19 g/kg, e₀: 2.64e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 1600, time: 11.111 days, wall time: 882.554 ms, max|u|: (2.02e-01, 1.57e-01), u★: 0.01 m s⁻¹, Q: 50.01 W m⁻², T₀: 5.03 ᵒC, extrema(T): (4.81, 5.03) ᵒC, S₀: 33.19 g/kg, e₀: 1.85e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 1700, time: 11.806 days, wall time: 913.438 ms, max|u|: (1.14e-01, 2.04e-01), u★: 0.01 m s⁻¹, Q: 78.58 W m⁻², T₀: 5.02 ᵒC, extrema(T): (4.81, 5.03) ᵒC, S₀: 33.19 g/kg, e₀: 1.04e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 1800, time: 12.500 days, wall time: 892.174 ms, max|u|: (6.34e-02, 2.11e-01), u★: 0.01 m s⁻¹, Q: -64.62 W m⁻², T₀: 5.02 ᵒC, extrema(T): (4.81, 5.02) ᵒC, S₀: 33.19 g/kg, e₀: 1.66e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 1900, time: 13.194 days, wall time: 793.881 ms, max|u|: (1.18e-01, 1.83e-01), u★: 0.01 m s⁻¹, Q: 155.88 W m⁻², T₀: 4.95 ᵒC, extrema(T): (4.81, 5.00) ᵒC, S₀: 33.19 g/kg, e₀: 2.99e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 2000, time: 13.889 days, wall time: 874.634 ms, max|u|: (1.52e-01, 1.36e-01), u★: 0.01 m s⁻¹, Q: 186.42 W m⁻², T₀: 4.93 ᵒC, extrema(T): (4.81, 4.97) ᵒC, S₀: 33.20 g/kg, e₀: 3.68e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 2100, time: 14.583 days, wall time: 882.862 ms, max|u|: (1.63e-01, 7.75e-02), u★: 0.01 m s⁻¹, Q: 38.48 W m⁻², T₀: 4.91 ᵒC, extrema(T): (4.81, 4.95) ᵒC, S₀: 33.20 g/kg, e₀: 1.03e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 2200, time: 15.278 days, wall time: 924.525 ms, max|u|: (1.48e-01, 7.03e-02), u★: 0.01 m s⁻¹, Q: 63.39 W m⁻², T₀: 4.88 ᵒC, extrema(T): (4.81, 4.93) ᵒC, S₀: 33.20 g/kg, e₀: 9.01e-05 m² s⁻²
[ Info: Ocean Station Papa, iter: 2300, time: 15.972 days, wall time: 800.071 ms, max|u|: (1.26e-01, 1.29e-01), u★: 0.01 m s⁻¹, Q: 68.53 W m⁻², T₀: 4.89 ᵒC, extrema(T): (4.81, 4.93) ᵒC, S₀: 33.20 g/kg, e₀: 2.39e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 2400, time: 16.667 days, wall time: 915.658 ms, max|u|: (1.09e-01, 1.30e-01), u★: 0.01 m s⁻¹, Q: -11.32 W m⁻², T₀: 4.91 ᵒC, extrema(T): (4.81, 4.92) ᵒC, S₀: 33.19 g/kg, e₀: 6.02e-05 m² s⁻²
[ Info: Ocean Station Papa, iter: 2500, time: 17.361 days, wall time: 953.033 ms, max|u|: (6.03e-02, 1.55e-01), u★: 0.01 m s⁻¹, Q: -131.67 W m⁻², T₀: 4.93 ᵒC, extrema(T): (4.81, 4.93) ᵒC, S₀: 33.19 g/kg, e₀: 1.13e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 2600, time: 18.056 days, wall time: 934.857 ms, max|u|: (1.74e-01, 1.51e-01), u★: 0.01 m s⁻¹, Q: -23.46 W m⁻², T₀: 4.94 ᵒC, extrema(T): (4.81, 4.94) ᵒC, S₀: 33.18 g/kg, e₀: 1.21e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 2700, time: 18.750 days, wall time: 1.282 seconds, max|u|: (1.29e-01, 1.16e-01), u★: 0.00 m s⁻¹, Q: 73.33 W m⁻², T₀: 4.95 ᵒC, extrema(T): (4.81, 4.95) ᵒC, S₀: 33.19 g/kg, e₀: 3.77e-05 m² s⁻²
[ Info: Ocean Station Papa, iter: 2800, time: 19.444 days, wall time: 678.780 ms, max|u|: (1.89e-01, 8.19e-02), u★: 0.01 m s⁻¹, Q: -135.68 W m⁻², T₀: 4.96 ᵒC, extrema(T): (4.81, 4.96) ᵒC, S₀: 33.19 g/kg, e₀: 4.61e-05 m² s⁻²
[ Info: Ocean Station Papa, iter: 2900, time: 20.139 days, wall time: 854.767 ms, max|u|: (2.02e-01, 1.06e-01), u★: 0.01 m s⁻¹, Q: -24.17 W m⁻², T₀: 4.95 ᵒC, extrema(T): (4.81, 4.95) ᵒC, S₀: 33.19 g/kg, e₀: 1.07e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 3000, time: 20.833 days, wall time: 855.106 ms, max|u|: (1.28e-01, 1.25e-01), u★: 0.01 m s⁻¹, Q: 45.78 W m⁻², T₀: 4.96 ᵒC, extrema(T): (4.81, 4.96) ᵒC, S₀: 33.19 g/kg, e₀: 2.84e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 3100, time: 21.528 days, wall time: 903.954 ms, max|u|: (1.32e-01, 1.18e-01), u★: 0.01 m s⁻¹, Q: -56.32 W m⁻², T₀: 4.95 ᵒC, extrema(T): (4.81, 4.95) ᵒC, S₀: 33.19 g/kg, e₀: 2.56e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 3200, time: 22.222 days, wall time: 837.814 ms, max|u|: (6.27e-02, 1.32e-01), u★: 0.01 m s⁻¹, Q: 106.79 W m⁻², T₀: 4.89 ᵒC, extrema(T): (4.81, 4.93) ᵒC, S₀: 33.19 g/kg, e₀: 6.61e-05 m² s⁻²
[ Info: Ocean Station Papa, iter: 3300, time: 22.917 days, wall time: 813.626 ms, max|u|: (1.01e-01, 1.33e-01), u★: 0.01 m s⁻¹, Q: 68.35 W m⁻², T₀: 4.89 ᵒC, extrema(T): (4.81, 4.92) ᵒC, S₀: 33.19 g/kg, e₀: 7.26e-05 m² s⁻²
[ Info: Ocean Station Papa, iter: 3400, time: 23.611 days, wall time: 790.231 ms, max|u|: (1.28e-01, 1.15e-01), u★: 0.01 m s⁻¹, Q: 106.34 W m⁻², T₀: 4.89 ᵒC, extrema(T): (4.81, 4.92) ᵒC, S₀: 33.19 g/kg, e₀: 1.12e-04 m² s⁻²
[ Info: Ocean Station Papa, iter: 3500, time: 24.306 days, wall time: 873.774 ms, max|u|: (1.25e-01, 6.86e-02), u★: 0.01 m s⁻¹, Q: 63.85 W m⁻², T₀: 4.82 ᵒC, extrema(T): (4.81, 4.92) ᵒC, S₀: 33.20 g/kg, e₀: 7.83e-05 m² s⁻²
[ Info: Ocean Station Papa, iter: 3600, time: 25 days, wall time: 945.762 ms, max|u|: (1.32e-01, 4.41e-02), u★: 0.00 m s⁻¹, Q: 141.94 W m⁻², T₀: 4.84 ᵒC, extrema(T): (4.81, 4.91) ᵒC, S₀: 33.20 g/kg, e₀: 6.68e-05 m² s⁻²
[ Info: Ocean Station Papa, iter: 3700, time: 25.694 days, wall time: 890.193 ms, max|u|: (1.12e-01, 8.04e-02), u★: 0.01 m s⁻¹, Q: 103.61 W m⁻², T₀: 4.85 ᵒC, extrema(T): (4.81, 4.91) ᵒC, S₀: 33.20 g/kg, e₀: 5.93e-05 m² s⁻²
[ Info: Ocean Station Papa, iter: 3800, time: 26.389 days, wall time: 1.040 seconds, max|u|: (9.27e-02, 1.29e-01), u★: 0.01 m s⁻¹, Q: -58.59 W m⁻², T₀: 4.85 ᵒC, extrema(T): (4.81, 4.89) ᵒC, S₀: 33.20 g/kg, e₀: 6.50e-05 m² s⁻²
[ Info: Ocean Station Papa, iter: 3900, time: 27.083 days, wall time: 873.533 ms, max|u|: (2.53e-02, 1.57e-01), u★: 0.01 m s⁻¹, Q: 142.49 W m⁻², T₀: 4.79 ᵒC, extrema(T): (4.79, 4.89) ᵒC, S₀: 33.20 g/kg, e₀: 7.60e-05 m² s⁻²
[ Info: Ocean Station Papa, iter: 4000, time: 27.778 days, wall time: 896.089 ms, max|u|: (5.44e-02, 1.07e-01), u★: 0.00 m s⁻¹, Q: 137.09 W m⁻², T₀: 4.82 ᵒC, extrema(T): (4.81, 4.88) ᵒC, S₀: 33.20 g/kg, e₀: 9.93e-05 m² s⁻²
[ Info: Ocean Station Papa, iter: 4100, time: 28.472 days, wall time: 925.849 ms, max|u|: (8.66e-02, 1.12e-01), u★: 0.01 m s⁻¹, Q: -82.33 W m⁻², T₀: 4.83 ᵒC, extrema(T): (4.81, 4.86) ᵒC, S₀: 33.20 g/kg, e₀: 2.95e-05 m² s⁻²
[ Info: Ocean Station Papa, iter: 4200, time: 29.167 days, wall time: 906.524 ms, max|u|: (9.86e-02, 4.21e-02), u★: 0.00 m s⁻¹, Q: 67.45 W m⁻², T₀: 4.80 ᵒC, extrema(T): (4.80, 4.86) ᵒC, S₀: 33.20 g/kg, e₀: 9.34e-05 m² s⁻²
[ Info: Ocean Station Papa, iter: 4300, time: 29.861 days, wall time: 875.977 ms, max|u|: (1.05e-01, 2.78e-02), u★: 0.01 m s⁻¹, Q: 83.54 W m⁻², T₀: 4.81 ᵒC, extrema(T): (4.80, 4.85) ᵒC, S₀: 33.20 g/kg, e₀: 5.83e-05 m² s⁻²
[ Info: Simulation is stopping after running for 1.348 minutes.
[ Info: Simulation time 30 days equals or exceeds stop time 30 days.
Now let's load the saved output and visualise.
filename *= ".jld2"
u = FieldTimeSeries(filename, "u")
v = FieldTimeSeries(filename, "v")
T = FieldTimeSeries(filename, "T")
S = FieldTimeSeries(filename, "S")
e = FieldTimeSeries(filename, "e")
N² = FieldTimeSeries(filename, "N²")
κ = FieldTimeSeries(filename, "κc")
𝒬ᵛ = FieldTimeSeries(filename, "𝒬ᵛ")
𝒬ᵀ = FieldTimeSeries(filename, "𝒬ᵀ")
Jˢ = FieldTimeSeries(filename, "Jˢ")
Ev = FieldTimeSeries(filename, "Jᵛ")
ρτˣ = FieldTimeSeries(filename, "ρτˣ")
ρτʸ = FieldTimeSeries(filename, "ρτʸ")
Nz = size(T, 3)
times = 𝒬ᵀ.times
ua = atmosphere.velocities.u
va = atmosphere.velocities.v
Ta = atmosphere.tracers.T
qa = atmosphere.tracers.q
ℐꜜˡʷ = atmosphere.downwelling_radiation.longwave
ℐꜜˢʷ = atmosphere.downwelling_radiation.shortwave
Pr = atmosphere.freshwater_flux.rain
Ps = atmosphere.freshwater_flux.snow
Nt = length(times)
uat = zeros(Nt)
vat = zeros(Nt)
Tat = zeros(Nt)
qat = zeros(Nt)
ℐꜜˢʷt = zeros(Nt)
ℐꜜˡʷt = zeros(Nt)
Pt = zeros(Nt)
for n = 1:Nt
t = Oceananigans.Units.Time(times[n])
uat[n] = ua[1, 1, 1, t]
vat[n] = va[1, 1, 1, t]
Tat[n] = Ta[1, 1, 1, t]
qat[n] = qa[1, 1, 1, t]
ℐꜜˢʷt[n] = ℐꜜˢʷ[1, 1, 1, t]
ℐꜜˡʷt[n] = ℐꜜˡʷ[1, 1, 1, t]
Pt[n] = Pr[1, 1, 1, t] + Ps[1, 1, 1, t]
end
fig = Figure(size=(1800, 1800))
axτ = Axis(fig[1, 1:3], xlabel="Days since Oct 1 1992", ylabel="Wind stress (N m⁻²)")
axQ = Axis(fig[1, 4:6], xlabel="Days since Oct 1 1992", ylabel="Heat flux (W m⁻²)")
axu = Axis(fig[2, 1:3], xlabel="Days since Oct 1 1992", ylabel="Velocities (m s⁻¹)")
axT = Axis(fig[2, 4:6], xlabel="Days since Oct 1 1992", ylabel="Surface temperature (ᵒC)")
axF = Axis(fig[3, 1:3], xlabel="Days since Oct 1 1992", ylabel="Freshwater volume flux (m s⁻¹)")
axS = Axis(fig[3, 4:6], xlabel="Days since Oct 1 1992", ylabel="Surface salinity (g kg⁻¹)")
axuz = Axis(fig[4:5, 1:2], xlabel="Velocities (m s⁻¹)", ylabel="z (m)")
axTz = Axis(fig[4:5, 3:4], xlabel="Temperature (ᵒC)", ylabel="z (m)")
axSz = Axis(fig[4:5, 5:6], xlabel="Salinity (g kg⁻¹)", ylabel="z (m)")
axNz = Axis(fig[6:7, 1:2], xlabel="Buoyancy frequency (s⁻²)", ylabel="z (m)")
axκz = Axis(fig[6:7, 3:4], xlabel="Eddy diffusivity (m² s⁻¹)", ylabel="z (m)", xscale=log10)
axez = Axis(fig[6:7, 5:6], xlabel="Turbulent kinetic energy (m² s⁻²)", ylabel="z (m)", xscale=log10)
title = @sprintf("Single-column simulation at %.2f, %.2f", φ★, λ★)
Label(fig[0, 1:6], title)
n = Observable(1)
times = (times .- times[1]) ./days
Nt = length(times)
tn = @lift times[$n]
colors = Makie.wong_colors()
ρᵒᶜ = coupled_model.interfaces.ocean_properties.reference_density
τˣ = interior(ρτˣ, 1, 1, 1, :) ./ ρᵒᶜ
τʸ = interior(ρτʸ, 1, 1, 1, :) ./ ρᵒᶜ
u★ = @. (τˣ^2 + τʸ^2)^(1/4)
lines!(axu, times, interior(u, 1, 1, Nz, :), color=colors[1], label="Zonal")
lines!(axu, times, interior(v, 1, 1, Nz, :), color=colors[2], label="Meridional")
lines!(axu, times, u★, color=colors[3], label="Ocean-side u★")
vlines!(axu, tn, linewidth=4, color=(:black, 0.5))
axislegend(axu)
lines!(axτ, times, interior(ρτˣ, 1, 1, 1, :), label="Zonal")
lines!(axτ, times, interior(ρτʸ, 1, 1, 1, :), label="Meridional")
vlines!(axτ, tn, linewidth=4, color=(:black, 0.5))
axislegend(axτ)
lines!(axT, times, Tat[1:Nt] .- 273.15, color=colors[1], linewidth=2, linestyle=:dash, label="Atmosphere temperature")
lines!(axT, times, interior(T, 1, 1, Nz, :), color=colors[2], linewidth=4, label="Ocean surface temperature")
vlines!(axT, tn, linewidth=4, color=(:black, 0.5))
axislegend(axT)
lines!(axQ, times, interior(𝒬ᵛ, 1, 1, 1, 1:Nt), color=colors[2], label="Latent", linewidth=2)
lines!(axQ, times, interior(𝒬ᵀ, 1, 1, 1, 1:Nt), color=colors[3], label="Sensible", linewidth=2)
lines!(axQ, times, - interior(ℐꜜˢʷ, 1, 1, 1, 1:Nt), color=colors[4], label="Shortwave", linewidth=2)
lines!(axQ, times, - interior(ℐꜜˡʷ, 1, 1, 1, 1:Nt), color=colors[5], label="Longwave", linewidth=2)
vlines!(axQ, tn, linewidth=4, color=(:black, 0.5))
axislegend(axQ)
lines!(axF, times, Pt[1:Nt], label="Prescribed freshwater flux")
lines!(axF, times, - interior(Ev, 1, 1, 1, 1:Nt), label="Evaporation")
vlines!(axF, tn, linewidth=4, color=(:black, 0.5))
axislegend(axF)
lines!(axS, times, interior(S, 1, 1, Nz, :))
vlines!(axS, tn, linewidth=4, color=(:black, 0.5))
un = @lift u[$n]
vn = @lift v[$n]
Tn = @lift T[$n]
Sn = @lift S[$n]
κn = @lift κ[$n]
en = @lift e[$n]
N²n = @lift N²[$n]
scatterlines!(axuz, un, label="u")
scatterlines!(axuz, vn, label="v")
scatterlines!(axTz, Tn)
scatterlines!(axSz, Sn)
scatterlines!(axez, en)
scatterlines!(axNz, N²n)
scatterlines!(axκz, κn)
axislegend(axuz)
ulim = max(maximum(abs, u), maximum(abs, v))
xlims!(axuz, -ulim, ulim)
Tmin, Tmax = extrema(T)
xlims!(axTz, Tmin - 0.1, Tmax + 0.1)
Nmax = maximum(N²)
xlims!(axNz, -Nmax/10, Nmax * 1.05)
κmax = maximum(κ)
xlims!(axκz, 1e-9, κmax * 1.1)
emax = maximum(e)
xlims!(axez, 1e-11, emax * 1.1)
Smin, Smax = extrema(S)
xlims!(axSz, Smin - 0.2, Smax + 0.2)
CairoMakie.record(fig, "single_column_profiles.mp4", 1:Nt, framerate=24) do nn
@info "Drawing frame $nn of $Nt..."
n[] = nn
end[ Info: Drawing frame 1 of 241...
[ Info: Drawing frame 2 of 241...
[ Info: Drawing frame 3 of 241...
[ Info: Drawing frame 4 of 241...
[ Info: Drawing frame 5 of 241...
[ Info: Drawing frame 6 of 241...
[ Info: Drawing frame 7 of 241...
[ Info: Drawing frame 8 of 241...
[ Info: Drawing frame 9 of 241...
[ Info: Drawing frame 10 of 241...
[ Info: Drawing frame 11 of 241...
[ Info: Drawing frame 12 of 241...
[ Info: Drawing frame 13 of 241...
[ Info: Drawing frame 14 of 241...
[ Info: Drawing frame 15 of 241...
[ Info: Drawing frame 16 of 241...
[ Info: Drawing frame 17 of 241...
[ Info: Drawing frame 18 of 241...
[ Info: Drawing frame 19 of 241...
[ Info: Drawing frame 20 of 241...
[ Info: Drawing frame 21 of 241...
[ Info: Drawing frame 22 of 241...
[ Info: Drawing frame 23 of 241...
[ Info: Drawing frame 24 of 241...
[ Info: Drawing frame 25 of 241...
[ Info: Drawing frame 26 of 241...
[ Info: Drawing frame 27 of 241...
[ Info: Drawing frame 28 of 241...
[ Info: Drawing frame 29 of 241...
[ Info: Drawing frame 30 of 241...
[ Info: Drawing frame 31 of 241...
[ Info: Drawing frame 32 of 241...
[ Info: Drawing frame 33 of 241...
[ Info: Drawing frame 34 of 241...
[ Info: Drawing frame 35 of 241...
[ Info: Drawing frame 36 of 241...
[ Info: Drawing frame 37 of 241...
[ Info: Drawing frame 38 of 241...
[ Info: Drawing frame 39 of 241...
[ Info: Drawing frame 40 of 241...
[ Info: Drawing frame 41 of 241...
[ Info: Drawing frame 42 of 241...
[ Info: Drawing frame 43 of 241...
[ Info: Drawing frame 44 of 241...
[ Info: Drawing frame 45 of 241...
[ Info: Drawing frame 46 of 241...
[ Info: Drawing frame 47 of 241...
[ Info: Drawing frame 48 of 241...
[ Info: Drawing frame 49 of 241...
[ Info: Drawing frame 50 of 241...
[ Info: Drawing frame 51 of 241...
[ Info: Drawing frame 52 of 241...
[ Info: Drawing frame 53 of 241...
[ Info: Drawing frame 54 of 241...
[ Info: Drawing frame 55 of 241...
[ Info: Drawing frame 56 of 241...
[ Info: Drawing frame 57 of 241...
[ Info: Drawing frame 58 of 241...
[ Info: Drawing frame 59 of 241...
[ Info: Drawing frame 60 of 241...
[ Info: Drawing frame 61 of 241...
[ Info: Drawing frame 62 of 241...
[ Info: Drawing frame 63 of 241...
[ Info: Drawing frame 64 of 241...
[ Info: Drawing frame 65 of 241...
[ Info: Drawing frame 66 of 241...
[ Info: Drawing frame 67 of 241...
[ Info: Drawing frame 68 of 241...
[ Info: Drawing frame 69 of 241...
[ Info: Drawing frame 70 of 241...
[ Info: Drawing frame 71 of 241...
[ Info: Drawing frame 72 of 241...
[ Info: Drawing frame 73 of 241...
[ Info: Drawing frame 74 of 241...
[ Info: Drawing frame 75 of 241...
[ Info: Drawing frame 76 of 241...
[ Info: Drawing frame 77 of 241...
[ Info: Drawing frame 78 of 241...
[ Info: Drawing frame 79 of 241...
[ Info: Drawing frame 80 of 241...
[ Info: Drawing frame 81 of 241...
[ Info: Drawing frame 82 of 241...
[ Info: Drawing frame 83 of 241...
[ Info: Drawing frame 84 of 241...
[ Info: Drawing frame 85 of 241...
[ Info: Drawing frame 86 of 241...
[ Info: Drawing frame 87 of 241...
[ Info: Drawing frame 88 of 241...
[ Info: Drawing frame 89 of 241...
[ Info: Drawing frame 90 of 241...
[ Info: Drawing frame 91 of 241...
[ Info: Drawing frame 92 of 241...
[ Info: Drawing frame 93 of 241...
[ Info: Drawing frame 94 of 241...
[ Info: Drawing frame 95 of 241...
[ Info: Drawing frame 96 of 241...
[ Info: Drawing frame 97 of 241...
[ Info: Drawing frame 98 of 241...
[ Info: Drawing frame 99 of 241...
[ Info: Drawing frame 100 of 241...
[ Info: Drawing frame 101 of 241...
[ Info: Drawing frame 102 of 241...
[ Info: Drawing frame 103 of 241...
[ Info: Drawing frame 104 of 241...
[ Info: Drawing frame 105 of 241...
[ Info: Drawing frame 106 of 241...
[ Info: Drawing frame 107 of 241...
[ Info: Drawing frame 108 of 241...
[ Info: Drawing frame 109 of 241...
[ Info: Drawing frame 110 of 241...
[ Info: Drawing frame 111 of 241...
[ Info: Drawing frame 112 of 241...
[ Info: Drawing frame 113 of 241...
[ Info: Drawing frame 114 of 241...
[ Info: Drawing frame 115 of 241...
[ Info: Drawing frame 116 of 241...
[ Info: Drawing frame 117 of 241...
[ Info: Drawing frame 118 of 241...
[ Info: Drawing frame 119 of 241...
[ Info: Drawing frame 120 of 241...
[ Info: Drawing frame 121 of 241...
[ Info: Drawing frame 122 of 241...
[ Info: Drawing frame 123 of 241...
[ Info: Drawing frame 124 of 241...
[ Info: Drawing frame 125 of 241...
[ Info: Drawing frame 126 of 241...
[ Info: Drawing frame 127 of 241...
[ Info: Drawing frame 128 of 241...
[ Info: Drawing frame 129 of 241...
[ Info: Drawing frame 130 of 241...
[ Info: Drawing frame 131 of 241...
[ Info: Drawing frame 132 of 241...
[ Info: Drawing frame 133 of 241...
[ Info: Drawing frame 134 of 241...
[ Info: Drawing frame 135 of 241...
[ Info: Drawing frame 136 of 241...
[ Info: Drawing frame 137 of 241...
[ Info: Drawing frame 138 of 241...
[ Info: Drawing frame 139 of 241...
[ Info: Drawing frame 140 of 241...
[ Info: Drawing frame 141 of 241...
[ Info: Drawing frame 142 of 241...
[ Info: Drawing frame 143 of 241...
[ Info: Drawing frame 144 of 241...
[ Info: Drawing frame 145 of 241...
[ Info: Drawing frame 146 of 241...
[ Info: Drawing frame 147 of 241...
[ Info: Drawing frame 148 of 241...
[ Info: Drawing frame 149 of 241...
[ Info: Drawing frame 150 of 241...
[ Info: Drawing frame 151 of 241...
[ Info: Drawing frame 152 of 241...
[ Info: Drawing frame 153 of 241...
[ Info: Drawing frame 154 of 241...
[ Info: Drawing frame 155 of 241...
[ Info: Drawing frame 156 of 241...
[ Info: Drawing frame 157 of 241...
[ Info: Drawing frame 158 of 241...
[ Info: Drawing frame 159 of 241...
[ Info: Drawing frame 160 of 241...
[ Info: Drawing frame 161 of 241...
[ Info: Drawing frame 162 of 241...
[ Info: Drawing frame 163 of 241...
[ Info: Drawing frame 164 of 241...
[ Info: Drawing frame 165 of 241...
[ Info: Drawing frame 166 of 241...
[ Info: Drawing frame 167 of 241...
[ Info: Drawing frame 168 of 241...
[ Info: Drawing frame 169 of 241...
[ Info: Drawing frame 170 of 241...
[ Info: Drawing frame 171 of 241...
[ Info: Drawing frame 172 of 241...
[ Info: Drawing frame 173 of 241...
[ Info: Drawing frame 174 of 241...
[ Info: Drawing frame 175 of 241...
[ Info: Drawing frame 176 of 241...
[ Info: Drawing frame 177 of 241...
[ Info: Drawing frame 178 of 241...
[ Info: Drawing frame 179 of 241...
[ Info: Drawing frame 180 of 241...
[ Info: Drawing frame 181 of 241...
[ Info: Drawing frame 182 of 241...
[ Info: Drawing frame 183 of 241...
[ Info: Drawing frame 184 of 241...
[ Info: Drawing frame 185 of 241...
[ Info: Drawing frame 186 of 241...
[ Info: Drawing frame 187 of 241...
[ Info: Drawing frame 188 of 241...
[ Info: Drawing frame 189 of 241...
[ Info: Drawing frame 190 of 241...
[ Info: Drawing frame 191 of 241...
[ Info: Drawing frame 192 of 241...
[ Info: Drawing frame 193 of 241...
[ Info: Drawing frame 194 of 241...
[ Info: Drawing frame 195 of 241...
[ Info: Drawing frame 196 of 241...
[ Info: Drawing frame 197 of 241...
[ Info: Drawing frame 198 of 241...
[ Info: Drawing frame 199 of 241...
[ Info: Drawing frame 200 of 241...
[ Info: Drawing frame 201 of 241...
[ Info: Drawing frame 202 of 241...
[ Info: Drawing frame 203 of 241...
[ Info: Drawing frame 204 of 241...
[ Info: Drawing frame 205 of 241...
[ Info: Drawing frame 206 of 241...
[ Info: Drawing frame 207 of 241...
[ Info: Drawing frame 208 of 241...
[ Info: Drawing frame 209 of 241...
[ Info: Drawing frame 210 of 241...
[ Info: Drawing frame 211 of 241...
[ Info: Drawing frame 212 of 241...
[ Info: Drawing frame 213 of 241...
[ Info: Drawing frame 214 of 241...
[ Info: Drawing frame 215 of 241...
[ Info: Drawing frame 216 of 241...
[ Info: Drawing frame 217 of 241...
[ Info: Drawing frame 218 of 241...
[ Info: Drawing frame 219 of 241...
[ Info: Drawing frame 220 of 241...
[ Info: Drawing frame 221 of 241...
[ Info: Drawing frame 222 of 241...
[ Info: Drawing frame 223 of 241...
[ Info: Drawing frame 224 of 241...
[ Info: Drawing frame 225 of 241...
[ Info: Drawing frame 226 of 241...
[ Info: Drawing frame 227 of 241...
[ Info: Drawing frame 228 of 241...
[ Info: Drawing frame 229 of 241...
[ Info: Drawing frame 230 of 241...
[ Info: Drawing frame 231 of 241...
[ Info: Drawing frame 232 of 241...
[ Info: Drawing frame 233 of 241...
[ Info: Drawing frame 234 of 241...
[ Info: Drawing frame 235 of 241...
[ Info: Drawing frame 236 of 241...
[ Info: Drawing frame 237 of 241...
[ Info: Drawing frame 238 of 241...
[ Info: Drawing frame 239 of 241...
[ Info: Drawing frame 240 of 241...
[ Info: Drawing frame 241 of 241...
This page was generated using Literate.jl.