-
Notifications
You must be signed in to change notification settings - Fork 19
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Reorganise tests, mirror src directory structure, add helper functions,
add interface checks for RRTMGPInterface, simple tests for CM, hybrid spaces, sponges, topography modified: parameterized_tendencies/microphysics/precipitation.jl modified: parameterized_tendencies/gravity_wave/orographic_gravity_wave/ogwd_3d.jl
- Loading branch information
1 parent
1f63b3b
commit 1ac039e
Showing
18 changed files
with
749 additions
and
116 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
using Test | ||
import ClimaAtmos as CA | ||
import SciMLBase as SMB | ||
|
||
testfun!() = π | ||
cb_default = CA.call_every_n_steps(testfun!;) | ||
test_nsteps = 999 | ||
test_dt = 1 | ||
test_tend = 999.0 | ||
|
||
cb_1 = CA.call_every_n_steps( | ||
testfun!, | ||
test_nsteps; | ||
skip_first = false, | ||
call_at_end = false, | ||
condition = nothing, | ||
) | ||
cb_2 = | ||
CA.call_every_dt(testfun!, test_dt; skip_first = false, call_at_end = false) | ||
cb_3 = CA.callback_from_affect(cb_2.affect!) | ||
cb_4 = CA.call_every_n_steps( | ||
testfun!, | ||
3; | ||
skip_first = false, | ||
call_at_end = false, | ||
condition = nothing, | ||
) | ||
cb_set = SMB.CallbackSet(cb_1, cb_2, cb_4) | ||
|
||
@testset "simple default callback" begin | ||
@test cb_default.condition.n == 1 | ||
@test cb_default.affect!.f!() == π | ||
end | ||
|
||
# per n steps | ||
@testset "every n-steps callback" begin | ||
@test cb_1.initialize.skip_first == false | ||
@test cb_1.condition.n == test_nsteps | ||
@test cb_1.affect!.f!() == π | ||
@test_throws AssertionError CA.call_every_n_steps( | ||
testfun!, | ||
Inf; | ||
skip_first = false, | ||
call_at_end = false, | ||
) | ||
end | ||
|
||
# per dt interval | ||
@testset "dt interval callback" begin | ||
@test cb_2 isa SMB.DiscreteCallback | ||
@test cb_2.affect!.dt == test_dt | ||
@test cb_2.affect!.cb!.f!() == π | ||
@test_throws AssertionError CA.call_every_dt( | ||
testfun!, | ||
Inf; | ||
skip_first = false, | ||
call_at_end = false, | ||
) | ||
end | ||
|
||
@testset "atmos callbacks and callback sets" begin | ||
# atmoscallbacks from discrete callbacks | ||
@test cb_3.f!() == π | ||
atmos_cbs = CA.atmos_callbacks(cb_set) | ||
# test against expected callback outcomes | ||
tspan = [0, test_tend] | ||
@test CA.n_expected_calls(cb_set, test_dt, tspan)[2] == test_tend | ||
@test CA.n_steps_per_cycle_per_cb(cb_set, test_dt) == | ||
[test_nsteps; test_dt; 3] | ||
end | ||
|
||
# query functions |
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
93 changes: 93 additions & 0 deletions
93
test/parameterized_tendencies/microphysics/precipitation.jl
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
|
||
import ClimaAtmos as CA | ||
import SurfaceFluxes as SF | ||
import ClimaAtmos.Parameters as CAP | ||
import ClimaCore as CC | ||
import Thermodynamics as TD | ||
import CloudMicrophysics as CM | ||
|
||
include("../../test_helpers.jl") | ||
|
||
### Common Objects ### | ||
@testset begin | ||
"Precipitation tendency functions" | ||
### Boilerplate default integrator objects | ||
config = CA.AtmosConfig( | ||
Dict( | ||
"initial_condition" => "PrecipitatingColumn", | ||
"moist" => "nonequil", | ||
"precip_model" => "0M", | ||
"config" => "column", | ||
"output_default_diagnostics" => false, | ||
), | ||
) | ||
(; Y, p, params) = generate_test_simulation(config) | ||
|
||
FT = eltype(Y) | ||
ᶜYₜ = Y .* FT(0) | ||
### Component test begins here | ||
|
||
@info "0M Scheme" | ||
### 0-Moment Scheme | ||
precip_model = CA.Microphysics0Moment() | ||
precip_cache = CA.precipitation_cache(Y, precip_model) | ||
# Test cache to verify expected variables exist in tendency function | ||
test_varnames = ( | ||
:ᶜS_ρq_tot, | ||
:ᶜ3d_rain, | ||
:ᶜ3d_snow, | ||
:col_integrated_rain, | ||
:col_integrated_snow, | ||
) | ||
for var_name in test_varnames | ||
@test var_name ∈ propertynames(precip_cache) | ||
end | ||
turbconv_model = nothing # Extend to other turbulence convection models | ||
CC.Fields.bycolumn(axes(Y.c)) do colidx | ||
CA.compute_precipitation_cache!( | ||
Y, | ||
p, | ||
colidx, | ||
precip_model, | ||
turbconv_model, | ||
) | ||
end | ||
@test maximum(abs.(p.precipitation.ᶜS_ρq_tot)) <= sqrt(eps(FT)) | ||
|
||
# Test that tendencies result in correct water-mass budget, | ||
# and that the tendency modification corresponds exactly to the | ||
# cached source term. | ||
CC.Fields.bycolumn(axes(Y.c)) do colidx | ||
CA.precipitation_tendency!(ᶜYₜ, Y, p, FT(0), colidx, precip_model) | ||
end | ||
@test ᶜYₜ.c.ρ == ᶜYₜ.c.ρq_tot | ||
@test ᶜYₜ.c.ρ == p.precipitation.ᶜS_ρq_tot | ||
|
||
### 1-Moment Scheme | ||
@info "1M Scheme" | ||
config = CA.AtmosConfig( | ||
Dict( | ||
"initial_condition" => "PrecipitatingColumn", | ||
"moist" => "nonequil", | ||
"precip_model" => "1M", | ||
"config" => "column", | ||
"output_default_diagnostics" => false, | ||
), | ||
) | ||
(; Y, p, params) = generate_test_simulation(config) | ||
precip_model = CA.Microphysics1Moment() | ||
precip_cache = CA.precipitation_cache(Y, precip_model) | ||
ᶜYₜ = Y .* FT(0) | ||
test_varnames = (:ᶜSqₜᵖ, :ᶜSqᵣᵖ, :ᶜSqₛᵖ, :ᶜSeₜᵖ) | ||
for var_name in test_varnames | ||
@test var_name ∈ propertynames(precip_cache) | ||
end | ||
@test CA.qₚ(FT(10), FT(2)) == FT(5) | ||
@test CA.qₚ(FT(-10), FT(2)) == FT(0) | ||
@test CA.limit(FT(10), FT(2)) == FT(5) | ||
CC.Fields.bycolumn(axes(Y.c)) do colidx | ||
CA.precipitation_tendency!(ᶜYₜ, Y, p, FT(0), colidx, precip_model) | ||
end | ||
@test ᶜYₜ.c.ρ == ᶜYₜ.c.ρq_tot | ||
@test ᶜYₜ.c.ρ == Y.c.ρ .* p.precipitation.ᶜSqₜᵖ | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
|
||
import ClimaAtmos as CA | ||
import SurfaceFluxes as SF | ||
import ClimaAtmos.Parameters as CAP | ||
import ClimaCore as CC | ||
|
||
include("../../test_helpers.jl") | ||
### Common Objects ### | ||
@testset begin | ||
"Rayleigh-sponge functions" | ||
### Boilerplate default integrator objects | ||
config = CA.AtmosConfig(Dict("initial_condition" => "DryBaroclinicWave")) | ||
(; Y) = generate_test_simulation(config) | ||
zmax = maximum(CC.Fields.coordinate_field(Y.f).z) | ||
z = CC.Fields.coordinate_field(Y.c).z | ||
Y.c.uₕ.components.data.:1 .= ones(axes(Y.c)) | ||
Y.c.uₕ.components.data.:2 .= ones(axes(Y.c)) | ||
FT = eltype(Y) | ||
ᶜYₜ = Y .* FT(0) | ||
### Component test begins here | ||
rs = CA.RayleighSponge(; zd = FT(0), α_uₕ = FT(1), α_w = FT(1)) | ||
(; ᶜβ_rayleigh_uₕ) = CA.rayleigh_sponge_cache(Y, rs) | ||
@test ᶜβ_rayleigh_uₕ == @. sin(FT(π) / 2 * z / zmax)^2 | ||
test_cache = (; rayleigh_sponge = (; ᶜβ_rayleigh_uₕ = ᶜβ_rayleigh_uₕ)) | ||
CC.Fields.bycolumn(axes(Y.c)) do colidx | ||
CA.rayleigh_sponge_tendency!(ᶜYₜ, Y, test_cache, FT(0), colidx, rs) | ||
end | ||
# Test that only required tendencies are affected | ||
for (var_name) in filter(x -> (x != :uₕ), propertynames(Y.c)) | ||
@test ᶜYₜ.c.:($var_name) == zeros(axes(Y.c)) | ||
end | ||
for (var_name) in propertynames(Y.f) | ||
@test ᶜYₜ.f.:($var_name) == zeros(axes(Y.f)) | ||
end | ||
@test ᶜYₜ.c.uₕ.components.data.:1 == -1 .* (ᶜβ_rayleigh_uₕ) | ||
@test ᶜYₜ.c.uₕ.components.data.:2 == -1 .* (ᶜβ_rayleigh_uₕ) | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
|
||
import ClimaAtmos as CA | ||
import SurfaceFluxes as SF | ||
import ClimaAtmos.Parameters as CAP | ||
import ClimaCore as CC | ||
include("../../test_helpers.jl") | ||
|
||
### Common Objects ### | ||
@testset begin | ||
"Rayleigh-sponge functions" | ||
### Boilerplate default integrator objects | ||
config = CA.AtmosConfig(Dict("initial_condition" => "DryBaroclinicWave")) | ||
(; Y) = generate_test_simulation(config) | ||
z = CC.Fields.coordinate_field(Y.c).z | ||
zmax = maximum(CC.Fields.coordinate_field(Y.f).z) | ||
Y.c.uₕ.components.data.:1 .= ones(axes(Y.c)) | ||
Y.c.uₕ.components.data.:2 .= ones(axes(Y.c)) | ||
ᶜYₜ = Y .* FT(0) | ||
FT = eltype(Y) | ||
### Component test begins here | ||
rs = CA.RayleighSponge(; zd = FT(0), α_uₕ = FT(1), α_w = FT(1)) | ||
(; ᶜβ_rayleigh_uₕ) = CA.viscous_sponge_cache(Y, rs) | ||
@test ᶜβ_rayleigh_uₕ == @. sin(FT(π) / 2 * z / zmax)^2 | ||
test_cache = (; viscous_sponge = (; ᶜβ_rayleigh_uₕ = ᶜβ_rayleigh_uₕ)) | ||
CC.Fields.bycolumn(axes(Y.c)) do colidx | ||
CA.viscous_sponge_tendency!(ᶜYₜ, Y, test_cache, FT(0), colidx, rs) | ||
end | ||
@test ᶜYₜ.c.uₕ.components.data.:1 == -1 .* (ᶜβ_rayleigh_uₕ) | ||
@test ᶜYₜ.c.uₕ.components.data.:2 == -1 .* (ᶜβ_rayleigh_uₕ) | ||
end |
File renamed without changes.
Oops, something went wrong.