Skip to content

Commit 85ad0e1

Browse files
authored
Merge pull request #12 from SpeedyWeather/mk/drag_curl
mask=true/false for StochasticStirring, JetDrag initialization with model.spectral_transform
2 parents c224a68 + 9b12bde commit 85ad0e1

File tree

3 files changed

+54
-18
lines changed

3 files changed

+54
-18
lines changed

src/jet_drag.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ function SpeedyWeather.initialize!( drag::JetDrag,
5656
u[ij] = drag.u₀ * exp(-(lat[ij]-drag.latitude)^2/(2*drag.width^2))
5757
end
5858

59-
# to spectral space of size lmax+1 × mmax as required by the curl
60-
û = SpeedyTransforms.spectral(u, one_more_degree=true)
59+
# to spectral space, reusing the precomputed spectral transform from model
60+
û = SpeedyTransforms.spectral(u, model.spectral_transform)
6161
= zero(û)
6262
SpeedyTransforms.curl!(drag.ζ₀, û, v̂, model.spectral_transform)
6363
return nothing

src/stochastic_stirring.jl

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ Base.@kwdef struct StochasticStirring{NF} <: SpeedyWeather.AbstractForcing
2323
"Stirring latitude [˚N]"
2424
latitude::NF = 45
2525

26+
"En/disable stirring mask"
27+
mask::Bool = true
28+
2629
"Stirring width [˚]"
2730
width::NF = 24
2831

@@ -81,12 +84,13 @@ function SpeedyWeather.initialize!( forcing::StochasticStirring,
8184
forcing.a[] = A*sqrt(1 - exp(-2dt/τ))
8285
forcing.b[] = exp(-dt/τ)
8386

84-
# precompute the Gaussian latitudinal mask
85-
(;latd) = model.geometry # in ˚N on every latitude ring
86-
87-
for j in eachindex(forcing.lat_mask)
88-
# Gaussian centred at forcing.latitude of width forcing.width
89-
forcing.lat_mask[j] = exp(-(forcing.latitude-latd[j])^2/forcing.width^2*2)
87+
if forcing.mask
88+
# precompute the Gaussian latitudinal mask
89+
(;latd) = model.geometry # in ˚N on every latitude ring
90+
for j in eachindex(forcing.lat_mask)
91+
# Gaussian centred at forcing.latitude of width forcing.width
92+
forcing.lat_mask[j] = exp(-(forcing.latitude-latd[j])^2/forcing.width^2*2)
93+
end
9094
end
9195

9296
return nothing
@@ -134,16 +138,22 @@ function SpeedyWeather.forcing!(
134138
end
135139
end
136140

137-
# to grid-point space
138-
S_grid = diagn.dynamics_variables.a_grid # reuse general work array
139-
SpeedyTransforms.gridded!(S_grid, S, spectral_transform)
140-
141-
# mask everything but mid-latitudes
142-
RingGrids._scale_lat!(S_grid, forcing.lat_mask)
143-
144-
# back to spectral space, write directly into vorticity tendency
141+
# add stochastic stirring term S to vorticity tendency
142+
# with masked or without (=skip additional transform)
145143
(; vor_tend) = diagn.tendencies
146-
SpeedyTransforms.spectral!(vor_tend, S_grid, spectral_transform)
147-
144+
if forcing.mask
145+
# to grid-point space
146+
S_grid = diagn.dynamics_variables.a_grid # reuse general work array
147+
SpeedyTransforms.gridded!(S_grid, S, spectral_transform)
148+
149+
# mask everything but mid-latitudes
150+
RingGrids._scale_lat!(S_grid, forcing.lat_mask)
151+
152+
# back to spectral space, write directly into vorticity tendency
153+
SpeedyTransforms.spectral!(vor_tend, S_grid, spectral_transform)
154+
else
155+
vor_tend .= S # copy forcing S over into vor_tend
156+
end
157+
148158
return nothing
149159
end

test/runtests.jl

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,29 @@ using Test
2323
run!(simulation, period=Day(5))
2424
@test simulation.model.feedback.nars_detected == false
2525
end
26+
27+
@testset "Initialize at various resolutions" begin
28+
for trunc in (31, 42, 63, 85, 127, 170, 255, 340)
29+
spectral_grid = SpectralGrid(trunc=trunc, nlev=1)
30+
drag = JetDrag(spectral_grid, time_scale=Day(6))
31+
forcing = StochasticStirring(spectral_grid)
32+
initial_conditions = StartFromRest()
33+
34+
# with barotropic model
35+
model = BarotropicModel(;spectral_grid, initial_conditions, forcing, drag)
36+
simulation = initialize!(model)
37+
end
38+
end
39+
40+
@testset "Mask off" begin
41+
spectral_grid = SpectralGrid(trunc=31, nlev=1)
42+
drag = JetDrag(spectral_grid, time_scale=Day(6))
43+
forcing = StochasticStirring(spectral_grid, mask=false)
44+
initial_conditions = StartFromRest()
45+
46+
model = BarotropicModel(;spectral_grid, initial_conditions, forcing, drag)
47+
simulation = initialize!(model)
48+
49+
run!(simulation, period=Day(5))
50+
@test simulation.model.feedback.nars_detected == false
51+
end

0 commit comments

Comments
 (0)