From b8473cf3c49be8cc69e3a8248d0cfbffbb3923df Mon Sep 17 00:00:00 2001 From: Dennis Yatunin Date: Mon, 5 Aug 2024 12:28:08 -0700 Subject: [PATCH] Adjust resolutions and add tests with no sponge and no topography --- .buildkite/pipeline.yml | 199 ++++++++++++------ ...ox_analytic_no_topography_float32_test.yml | 8 +- ...ytic_no_topography_oswald_config_test.yml} | 0 .../box_analytic_no_topography_test.yml | 8 +- ...uded_plane_analytic_no_topography_test.yml | 4 +- .../plane_analytic_agnesi_mountain_test.yml | 4 +- ...ane_analytic_cosine_hills_float32_test.yml | 1 + ...nalytic_cosine_hills_long_float32_test.yml | 5 +- .../plane_analytic_cosine_hills_long_test.yml | 5 +- .../plane_analytic_cosine_hills_test.yml | 5 +- ...phy_discrete_balance_long_float32_test.yml | 7 +- ..._topography_discrete_balance_long_test.yml | 7 +- ...ne_analytic_no_topography_float32_test.yml | 5 +- ...alytic_no_topography_long_float32_test.yml | 7 +- ...plane_analytic_no_topography_long_test.yml | 7 +- ...ography_no_hyperdiff_long_float32_test.yml | 7 +- ...c_no_topography_no_hyperdiff_long_test.yml | 7 +- ...nge_no_grav_long_explicit_float32_test.yml | 21 ++ ...y_no_sponge_no_grav_long_explicit_test.yml | 21 ++ ...hy_no_sponge_no_grav_long_float32_test.yml | 20 ++ ...topography_no_sponge_no_grav_long_test.yml | 20 ++ ...no_grav_no_hyperdiff_long_float32_test.yml | 21 ++ ..._sponge_no_grav_no_hyperdiff_long_test.yml | 21 ++ .../plane_analytic_no_topography_test.yml | 5 +- ...e_analytic_schar_mountain_float32_test.yml | 4 +- .../plane_analytic_schar_mountain_test.yml | 4 +- post_processing/ci_plots.jl | 85 ++++++-- src/analytic_solutions/analytic_solutions.jl | 56 +++-- src/prognostic_equations/advection.jl | 11 +- .../implicit/implicit_tendency.jl | 7 + toml/no_gravity.toml | 2 + 31 files changed, 429 insertions(+), 155 deletions(-) rename config/model_configs/{box_analytic_no_topography_oswald_settings_test.yml => box_analytic_no_topography_oswald_config_test.yml} (100%) create mode 100644 config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_long_explicit_float32_test.yml create mode 100644 config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_long_explicit_test.yml create mode 100644 config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_long_float32_test.yml create mode 100644 config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_long_test.yml create mode 100644 config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_no_hyperdiff_long_float32_test.yml create mode 100644 config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_no_hyperdiff_long_test.yml create mode 100644 toml/no_gravity.toml diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index f59102a5f4a..e31d3b6e0fc 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -146,7 +146,7 @@ steps: # --job_id single_column_hydrostatic_balance_ft64 # artifact_paths: "single_column_hydrostatic_balance_ft64/output_active/*" - # - group: "Box Examples" + - group: "Box Examples" # steps: # - label: ":computer: Box hydrostatic balance (ρe_tot)" @@ -170,6 +170,13 @@ steps: # --job_id rcemipii_box_diagnostic_edmfx # artifact_paths: "rcemipii_box_diagnostic_edmfx/output_active/*" + - label: ":computer: Analytic No Topography Test (3D, Oswald's configuration)" + command: > + julia --color=yes --project=examples examples/hybrid/driver.jl + --config_file $CONFIG_PATH/box_analytic_no_topography_oswald_config_test.yml + --job_id box_analytic_no_topography_oswald_config_test + artifact_paths: "box_analytic_no_topography_oswald_config_test/output_active/*" + - group: "Plane Examples" steps: # - label: ":computer: Agnesi linear hydrostatic mountain experiment (uniform)" @@ -207,19 +214,19 @@ steps: --job_id plane_analytic_no_topography_float32_test artifact_paths: "plane_analytic_no_topography_float32_test/output_active/*" - # - label: ":computer: Analytic Cosine Hills Test (2D)" - # command: > - # julia --color=yes --project=examples examples/hybrid/driver.jl - # --config_file $CONFIG_PATH/plane_analytic_cosine_hills_test.yml - # --job_id plane_analytic_cosine_hills_test - # artifact_paths: "plane_analytic_cosine_hills_test/output_active/*" + - label: ":computer: Analytic Cosine Hills Test (2D)" + command: > + julia --color=yes --project=examples examples/hybrid/driver.jl + --config_file $CONFIG_PATH/plane_analytic_cosine_hills_test.yml + --job_id plane_analytic_cosine_hills_test + artifact_paths: "plane_analytic_cosine_hills_test/output_active/*" - # - label: ":computer: Analytic Cosine Hills Test (2D, Float32)" - # command: > - # julia --color=yes --project=examples examples/hybrid/driver.jl - # --config_file $CONFIG_PATH/plane_analytic_cosine_hills_float32_test.yml - # --job_id plane_analytic_cosine_hills_float32_test - # artifact_paths: "plane_analytic_cosine_hills_float32_test/output_active/*" + - label: ":computer: Analytic Cosine Hills Test (2D, Float32)" + command: > + julia --color=yes --project=examples examples/hybrid/driver.jl + --config_file $CONFIG_PATH/plane_analytic_cosine_hills_float32_test.yml + --job_id plane_analytic_cosine_hills_float32_test + artifact_paths: "plane_analytic_cosine_hills_float32_test/output_active/*" # - group: "Conservation check" # steps: @@ -960,6 +967,72 @@ steps: agents: slurm_gpus: 1 + - label: "GPU: Analytic No Topography Test (2D, Long Duration, No Sponge, No Gravity)" + command: > + julia --color=yes --project=examples examples/hybrid/driver.jl + --config_file $CONFIG_PATH/plane_analytic_no_topography_no_sponge_no_grav_long_test.yml + --job_id gpu_plane_analytic_no_topography_no_sponge_no_grav_long_test + artifact_paths: "gpu_plane_analytic_no_topography_no_sponge_no_grav_long_test/output_active/*" + env: + CLIMACOMMS_DEVICE: "CUDA" + agents: + slurm_gpus: 1 + + - label: "GPU: Analytic No Topography Test (2D, Long Duration, No Sponge, No Gravity, Float32)" + command: > + julia --color=yes --project=examples examples/hybrid/driver.jl + --config_file $CONFIG_PATH/plane_analytic_no_topography_no_sponge_no_grav_long_float32_test.yml + --job_id gpu_plane_analytic_no_topography_no_sponge_no_grav_long_float32_test + artifact_paths: "gpu_plane_analytic_no_topography_no_sponge_no_grav_long_float32_test/output_active/*" + env: + CLIMACOMMS_DEVICE: "CUDA" + agents: + slurm_gpus: 1 + + - label: "GPU: Analytic No Topography Test (2D, Long Duration, No Sponge, No Gravity, No Hyperdiff)" + command: > + julia --color=yes --project=examples examples/hybrid/driver.jl + --config_file $CONFIG_PATH/plane_analytic_no_topography_no_sponge_no_grav_no_hyperdiff_long_test.yml + --job_id gpu_plane_analytic_no_topography_no_sponge_no_grav_no_hyperdiff_long_test + artifact_paths: "gpu_plane_analytic_no_topography_no_sponge_no_grav_no_hyperdiff_long_test/output_active/*" + env: + CLIMACOMMS_DEVICE: "CUDA" + agents: + slurm_gpus: 1 + + - label: "GPU: Analytic No Topography Test (2D, Long Duration, No Sponge, No Gravity, No Hyperdiff, Float32)" + command: > + julia --color=yes --project=examples examples/hybrid/driver.jl + --config_file $CONFIG_PATH/plane_analytic_no_topography_no_sponge_no_grav_no_hyperdiff_long_float32_test.yml + --job_id gpu_plane_analytic_no_topography_no_sponge_no_grav_no_hyperdiff_long_float32_test + artifact_paths: "gpu_plane_analytic_no_topography_no_sponge_no_grav_no_hyperdiff_long_float32_test/output_active/*" + env: + CLIMACOMMS_DEVICE: "CUDA" + agents: + slurm_gpus: 1 + + - label: "GPU: Analytic No Topography Test (2D, Long Duration, No Sponge, No Gravity, Explicit)" + command: > + julia --color=yes --project=examples examples/hybrid/driver.jl + --config_file $CONFIG_PATH/plane_analytic_no_topography_no_sponge_no_grav_long_explicit_test.yml + --job_id gpu_plane_analytic_no_topography_no_sponge_no_grav_long_explicit_test + artifact_paths: "gpu_plane_analytic_no_topography_no_sponge_no_grav_long_explicit_test/output_active/*" + env: + CLIMACOMMS_DEVICE: "CUDA" + agents: + slurm_gpus: 1 + + - label: "GPU: Analytic No Topography Test (2D, Long Duration, No Sponge, No Gravity, Explicit, Float32)" + command: > + julia --color=yes --project=examples examples/hybrid/driver.jl + --config_file $CONFIG_PATH/plane_analytic_no_topography_no_sponge_no_grav_long_explicit_float32_test.yml + --job_id gpu_plane_analytic_no_topography_no_sponge_no_grav_long_explicit_float32_test + artifact_paths: "gpu_plane_analytic_no_topography_no_sponge_no_grav_long_explicit_float32_test/output_active/*" + env: + CLIMACOMMS_DEVICE: "CUDA" + agents: + slurm_gpus: 1 + - label: "GPU: Analytic No Topography Test (Extruded 2D)" command: > julia --color=yes --project=examples examples/hybrid/driver.jl @@ -993,27 +1066,27 @@ steps: agents: slurm_gpus: 1 - # - label: "GPU: Analytic Cosine Hills Test (2D, Long Duration)" - # command: > - # julia --color=yes --project=examples examples/hybrid/driver.jl - # --config_file $CONFIG_PATH/plane_analytic_cosine_hills_long_test.yml - # --job_id gpu_plane_analytic_cosine_hills_long_test - # artifact_paths: "gpu_plane_analytic_cosine_hills_long_test/output_active/*" - # env: - # CLIMACOMMS_DEVICE: "CUDA" - # agents: - # slurm_gpus: 1 + - label: "GPU: Analytic Cosine Hills Test (2D, Long Duration)" + command: > + julia --color=yes --project=examples examples/hybrid/driver.jl + --config_file $CONFIG_PATH/plane_analytic_cosine_hills_long_test.yml + --job_id gpu_plane_analytic_cosine_hills_long_test + artifact_paths: "gpu_plane_analytic_cosine_hills_long_test/output_active/*" + env: + CLIMACOMMS_DEVICE: "CUDA" + agents: + slurm_gpus: 1 - # - label: "GPU: Analytic Cosine Hills Test (2D, Long Duration, Float32)" - # command: > - # julia --color=yes --project=examples examples/hybrid/driver.jl - # --config_file $CONFIG_PATH/plane_analytic_cosine_hills_long_float32_test.yml - # --job_id gpu_plane_analytic_cosine_hills_long_float32_test - # artifact_paths: "gpu_plane_analytic_cosine_hills_long_float32_test/output_active/*" - # env: - # CLIMACOMMS_DEVICE: "CUDA" - # agents: - # slurm_gpus: 1 + - label: "GPU: Analytic Cosine Hills Test (2D, Long Duration, Float32)" + command: > + julia --color=yes --project=examples examples/hybrid/driver.jl + --config_file $CONFIG_PATH/plane_analytic_cosine_hills_long_float32_test.yml + --job_id gpu_plane_analytic_cosine_hills_long_float32_test + artifact_paths: "gpu_plane_analytic_cosine_hills_long_float32_test/output_active/*" + env: + CLIMACOMMS_DEVICE: "CUDA" + agents: + slurm_gpus: 1 # - label: "GPU: Analytic Cosine Hills Test (2D, Long Duration, Stronger Sponge)" # command: > @@ -1092,16 +1165,16 @@ steps: # agents: # slurm_gpus: 1 - # - label: "GPU: Analytic Agnesi Mountain Test (2D)" - # command: > - # julia --color=yes --project=examples examples/hybrid/driver.jl - # --config_file $CONFIG_PATH/plane_analytic_agnesi_mountain_test.yml - # --job_id gpu_plane_analytic_agnesi_mountain_test - # artifact_paths: "gpu_plane_analytic_agnesi_mountain_test/output_active/*" - # env: - # CLIMACOMMS_DEVICE: "CUDA" - # agents: - # slurm_gpus: 1 + - label: "GPU: Analytic Agnesi Mountain Test (2D)" + command: > + julia --color=yes --project=examples examples/hybrid/driver.jl + --config_file $CONFIG_PATH/plane_analytic_agnesi_mountain_test.yml + --job_id gpu_plane_analytic_agnesi_mountain_test + artifact_paths: "gpu_plane_analytic_agnesi_mountain_test/output_active/*" + env: + CLIMACOMMS_DEVICE: "CUDA" + agents: + slurm_gpus: 1 # - label: "GPU: Analytic Huge Schar Mountain Test (2D)" # command: > @@ -1125,16 +1198,16 @@ steps: # agents: # slurm_gpus: 1 - # - label: "GPU: Analytic Schar Mountain Test (2D)" - # command: > - # julia --color=yes --project=examples examples/hybrid/driver.jl - # --config_file $CONFIG_PATH/plane_analytic_schar_mountain_test.yml - # --job_id gpu_plane_analytic_schar_mountain_test - # artifact_paths: "gpu_plane_analytic_schar_mountain_test/output_active/*" - # env: - # CLIMACOMMS_DEVICE: "CUDA" - # agents: - # slurm_gpus: 1 + - label: "GPU: Analytic Schar Mountain Test (2D)" + command: > + julia --color=yes --project=examples examples/hybrid/driver.jl + --config_file $CONFIG_PATH/plane_analytic_schar_mountain_test.yml + --job_id gpu_plane_analytic_schar_mountain_test + artifact_paths: "gpu_plane_analytic_schar_mountain_test/output_active/*" + env: + CLIMACOMMS_DEVICE: "CUDA" + agents: + slurm_gpus: 1 # - label: "GPU: Analytic Small Schar Mountain Test (2D)" # command: > @@ -1169,16 +1242,16 @@ steps: # agents: # slurm_gpus: 1 - # - label: "GPU: Analytic Schar Mountain Test (2D, Float32)" - # command: > - # julia --color=yes --project=examples examples/hybrid/driver.jl - # --config_file $CONFIG_PATH/plane_analytic_schar_mountain_float32_test.yml - # --job_id gpu_plane_analytic_schar_mountain_float32_test - # artifact_paths: "gpu_plane_analytic_schar_mountain_float32_test/output_active/*" - # env: - # CLIMACOMMS_DEVICE: "CUDA" - # agents: - # slurm_gpus: 1 + - label: "GPU: Analytic Schar Mountain Test (2D, Float32)" + command: > + julia --color=yes --project=examples examples/hybrid/driver.jl + --config_file $CONFIG_PATH/plane_analytic_schar_mountain_float32_test.yml + --job_id gpu_plane_analytic_schar_mountain_float32_test + artifact_paths: "gpu_plane_analytic_schar_mountain_float32_test/output_active/*" + env: + CLIMACOMMS_DEVICE: "CUDA" + agents: + slurm_gpus: 1 # - label: "GPU: Analytic Tiny Schar Mountain Test (2D, Float32)" # command: > diff --git a/config/model_configs/box_analytic_no_topography_float32_test.yml b/config/model_configs/box_analytic_no_topography_float32_test.yml index a14330d2045..69a59297395 100644 --- a/config/model_configs/box_analytic_no_topography_float32_test.yml +++ b/config/model_configs/box_analytic_no_topography_float32_test.yml @@ -5,13 +5,13 @@ topography: "Cosine3D" x_max: 300e3 y_max: 300e3 z_max: 21e3 -x_elem: 15 -y_elem: 15 +x_elem: 3 +y_elem: 3 z_elem: 50 z_stretch: false max_topography_height: 0 -dt: "12secs" -t_end: "4days" +dt: "5secs" +t_end: "5days" rayleigh_sponge: true toml: [toml/analytic_topography_test.toml] analytic_check: true diff --git a/config/model_configs/box_analytic_no_topography_oswald_settings_test.yml b/config/model_configs/box_analytic_no_topography_oswald_config_test.yml similarity index 100% rename from config/model_configs/box_analytic_no_topography_oswald_settings_test.yml rename to config/model_configs/box_analytic_no_topography_oswald_config_test.yml diff --git a/config/model_configs/box_analytic_no_topography_test.yml b/config/model_configs/box_analytic_no_topography_test.yml index ee50c33696b..261a60226c8 100644 --- a/config/model_configs/box_analytic_no_topography_test.yml +++ b/config/model_configs/box_analytic_no_topography_test.yml @@ -5,13 +5,13 @@ topography: "Cosine3D" x_max: 300e3 y_max: 300e3 z_max: 21e3 -x_elem: 15 -y_elem: 15 +x_elem: 3 +y_elem: 3 z_elem: 50 z_stretch: false max_topography_height: 0 -dt: "12secs" -t_end: "4days" +dt: "5secs" +t_end: "5days" rayleigh_sponge: true toml: [toml/analytic_topography_test.toml] analytic_check: true diff --git a/config/model_configs/extruded_plane_analytic_no_topography_test.yml b/config/model_configs/extruded_plane_analytic_no_topography_test.yml index 54d65515adc..5d33e8c829e 100644 --- a/config/model_configs/extruded_plane_analytic_no_topography_test.yml +++ b/config/model_configs/extruded_plane_analytic_no_topography_test.yml @@ -5,12 +5,12 @@ topography: "Cosine2D" x_max: 300e3 y_max: 40e3 z_max: 21e3 -x_elem: 15 +x_elem: 3 y_elem: 2 z_elem: 50 z_stretch: false max_topography_height: 0 -dt: "12secs" +dt: "5secs" t_end: "5days" rayleigh_sponge: true toml: [toml/analytic_topography_test.toml] diff --git a/config/model_configs/plane_analytic_agnesi_mountain_test.yml b/config/model_configs/plane_analytic_agnesi_mountain_test.yml index 8f8510f91ea..3364b29c277 100644 --- a/config/model_configs/plane_analytic_agnesi_mountain_test.yml +++ b/config/model_configs/plane_analytic_agnesi_mountain_test.yml @@ -7,8 +7,8 @@ z_max: 21e3 x_elem: 100 z_elem: 100 z_stretch: false -dt: "0.5secs" -t_end: "4days" +dt: "0.1secs" +t_end: "18hours" rayleigh_sponge: true toml: [toml/analytic_topography_test.toml] analytic_check: true diff --git a/config/model_configs/plane_analytic_cosine_hills_float32_test.yml b/config/model_configs/plane_analytic_cosine_hills_float32_test.yml index 8599300b6e1..040e12c22a6 100644 --- a/config/model_configs/plane_analytic_cosine_hills_float32_test.yml +++ b/config/model_configs/plane_analytic_cosine_hills_float32_test.yml @@ -7,6 +7,7 @@ z_max: 21e3 x_elem: 15 z_elem: 50 z_stretch: false +nh_poly: 2 dt: "12secs" t_end: "10days" rayleigh_sponge: true diff --git a/config/model_configs/plane_analytic_cosine_hills_long_float32_test.yml b/config/model_configs/plane_analytic_cosine_hills_long_float32_test.yml index 9af9b6aa0ac..ce1ffda5344 100644 --- a/config/model_configs/plane_analytic_cosine_hills_long_float32_test.yml +++ b/config/model_configs/plane_analytic_cosine_hills_long_float32_test.yml @@ -7,8 +7,9 @@ z_max: 21e3 x_elem: 15 z_elem: 50 z_stretch: false -dt: "12secs" -t_end: "100days" +nh_poly: 2 +dt: "1secs" +t_end: "9days" rayleigh_sponge: true toml: [toml/analytic_topography_test.toml] analytic_check: true diff --git a/config/model_configs/plane_analytic_cosine_hills_long_test.yml b/config/model_configs/plane_analytic_cosine_hills_long_test.yml index 32a9187e204..66089ce97ad 100644 --- a/config/model_configs/plane_analytic_cosine_hills_long_test.yml +++ b/config/model_configs/plane_analytic_cosine_hills_long_test.yml @@ -7,8 +7,9 @@ z_max: 21e3 x_elem: 15 z_elem: 50 z_stretch: false -dt: "12secs" -t_end: "100days" +nh_poly: 2 +dt: "1secs" +t_end: "9days" rayleigh_sponge: true toml: [toml/analytic_topography_test.toml] analytic_check: true diff --git a/config/model_configs/plane_analytic_cosine_hills_test.yml b/config/model_configs/plane_analytic_cosine_hills_test.yml index 0586af9c056..b25a665cc11 100644 --- a/config/model_configs/plane_analytic_cosine_hills_test.yml +++ b/config/model_configs/plane_analytic_cosine_hills_test.yml @@ -7,8 +7,9 @@ z_max: 21e3 x_elem: 15 z_elem: 50 z_stretch: false -dt: "12secs" -t_end: "10days" +nh_poly: 2 +dt: "1secs" +t_end: "1days" rayleigh_sponge: true toml: [toml/analytic_topography_test.toml] analytic_check: true diff --git a/config/model_configs/plane_analytic_no_topography_discrete_balance_long_float32_test.yml b/config/model_configs/plane_analytic_no_topography_discrete_balance_long_float32_test.yml index df23e353a3f..28d313cfcda 100644 --- a/config/model_configs/plane_analytic_no_topography_discrete_balance_long_float32_test.yml +++ b/config/model_configs/plane_analytic_no_topography_discrete_balance_long_float32_test.yml @@ -5,12 +5,13 @@ topography: "Cosine2D" discrete_hydrostatic_balance: true x_max: 300e3 z_max: 21e3 -x_elem: 15 +x_elem: 3 z_elem: 50 z_stretch: false +nh_poly: 2 max_topography_height: 0 -dt: "12secs" -t_end: "100days" +dt: "5secs" +t_end: "40days" rayleigh_sponge: true toml: [toml/analytic_topography_test.toml] analytic_check: true diff --git a/config/model_configs/plane_analytic_no_topography_discrete_balance_long_test.yml b/config/model_configs/plane_analytic_no_topography_discrete_balance_long_test.yml index df23e353a3f..28d313cfcda 100644 --- a/config/model_configs/plane_analytic_no_topography_discrete_balance_long_test.yml +++ b/config/model_configs/plane_analytic_no_topography_discrete_balance_long_test.yml @@ -5,12 +5,13 @@ topography: "Cosine2D" discrete_hydrostatic_balance: true x_max: 300e3 z_max: 21e3 -x_elem: 15 +x_elem: 3 z_elem: 50 z_stretch: false +nh_poly: 2 max_topography_height: 0 -dt: "12secs" -t_end: "100days" +dt: "5secs" +t_end: "40days" rayleigh_sponge: true toml: [toml/analytic_topography_test.toml] analytic_check: true diff --git a/config/model_configs/plane_analytic_no_topography_float32_test.yml b/config/model_configs/plane_analytic_no_topography_float32_test.yml index e1c1950dbff..e49a5d315e0 100644 --- a/config/model_configs/plane_analytic_no_topography_float32_test.yml +++ b/config/model_configs/plane_analytic_no_topography_float32_test.yml @@ -4,11 +4,12 @@ initial_condition: "ConstantBuoyancyFrequencyProfile" topography: "Cosine2D" x_max: 300e3 z_max: 21e3 -x_elem: 15 +x_elem: 3 z_elem: 50 z_stretch: false +nh_poly: 2 max_topography_height: 0 -dt: "12secs" +dt: "5secs" t_end: "10days" rayleigh_sponge: true toml: [toml/analytic_topography_test.toml] diff --git a/config/model_configs/plane_analytic_no_topography_long_float32_test.yml b/config/model_configs/plane_analytic_no_topography_long_float32_test.yml index e7375d09d9c..444770ebd8c 100644 --- a/config/model_configs/plane_analytic_no_topography_long_float32_test.yml +++ b/config/model_configs/plane_analytic_no_topography_long_float32_test.yml @@ -4,12 +4,13 @@ initial_condition: "ConstantBuoyancyFrequencyProfile" topography: "Cosine2D" x_max: 300e3 z_max: 21e3 -x_elem: 15 +x_elem: 3 z_elem: 50 z_stretch: false +nh_poly: 2 max_topography_height: 0 -dt: "12secs" -t_end: "100days" +dt: "5secs" +t_end: "50days" rayleigh_sponge: true toml: [toml/analytic_topography_test.toml] analytic_check: true diff --git a/config/model_configs/plane_analytic_no_topography_long_test.yml b/config/model_configs/plane_analytic_no_topography_long_test.yml index 12a2767b380..fad729b83be 100644 --- a/config/model_configs/plane_analytic_no_topography_long_test.yml +++ b/config/model_configs/plane_analytic_no_topography_long_test.yml @@ -4,12 +4,13 @@ initial_condition: "ConstantBuoyancyFrequencyProfile" topography: "Cosine2D" x_max: 300e3 z_max: 21e3 -x_elem: 15 +x_elem: 3 z_elem: 50 z_stretch: false +nh_poly: 2 max_topography_height: 0 -dt: "12secs" -t_end: "100days" +dt: "5secs" +t_end: "50days" rayleigh_sponge: true toml: [toml/analytic_topography_test.toml] analytic_check: true diff --git a/config/model_configs/plane_analytic_no_topography_no_hyperdiff_long_float32_test.yml b/config/model_configs/plane_analytic_no_topography_no_hyperdiff_long_float32_test.yml index 73c153e3970..07ee8a634f4 100644 --- a/config/model_configs/plane_analytic_no_topography_no_hyperdiff_long_float32_test.yml +++ b/config/model_configs/plane_analytic_no_topography_no_hyperdiff_long_float32_test.yml @@ -4,12 +4,13 @@ initial_condition: "ConstantBuoyancyFrequencyProfile" topography: "Cosine2D" x_max: 300e3 z_max: 21e3 -x_elem: 15 +x_elem: 3 z_elem: 50 z_stretch: false +nh_poly: 2 max_topography_height: 0 -dt: "12secs" -t_end: "100days" +dt: "5secs" +t_end: "50days" hyperdiff: false rayleigh_sponge: true toml: [toml/analytic_topography_test.toml] diff --git a/config/model_configs/plane_analytic_no_topography_no_hyperdiff_long_test.yml b/config/model_configs/plane_analytic_no_topography_no_hyperdiff_long_test.yml index 7b07f63ebf7..9fa10f723c9 100644 --- a/config/model_configs/plane_analytic_no_topography_no_hyperdiff_long_test.yml +++ b/config/model_configs/plane_analytic_no_topography_no_hyperdiff_long_test.yml @@ -4,12 +4,13 @@ initial_condition: "ConstantBuoyancyFrequencyProfile" topography: "Cosine2D" x_max: 300e3 z_max: 21e3 -x_elem: 15 +x_elem: 3 z_elem: 50 z_stretch: false +nh_poly: 2 max_topography_height: 0 -dt: "12secs" -t_end: "100days" +dt: "5secs" +t_end: "50days" hyperdiff: false rayleigh_sponge: true toml: [toml/analytic_topography_test.toml] diff --git a/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_long_explicit_float32_test.yml b/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_long_explicit_float32_test.yml new file mode 100644 index 00000000000..11f53360079 --- /dev/null +++ b/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_long_explicit_float32_test.yml @@ -0,0 +1,21 @@ +config: "plane" +FLOAT_TYPE: "Float32" +initial_condition: "ConstantBuoyancyFrequencyProfile" +topography: "Cosine2D" +x_max: 300e3 +z_max: 13e3 +x_elem: 3 +z_elem: 31 +z_stretch: false +nh_poly: 2 +max_topography_height: 0 +ode_algo: "RK4" +dt: "0.2secs" +t_end: "2days" +rayleigh_sponge: false +toml: [toml/no_gravity.toml] +analytic_check: true +output_default_diagnostics: false +diagnostics: + - short_name: [orog, ua, wa, uapredicted, wapredicted, uaerror, waerror, c1error, c3error] + period: 1hours diff --git a/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_long_explicit_test.yml b/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_long_explicit_test.yml new file mode 100644 index 00000000000..b7b3278ec27 --- /dev/null +++ b/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_long_explicit_test.yml @@ -0,0 +1,21 @@ +config: "plane" +FLOAT_TYPE: "Float64" +initial_condition: "ConstantBuoyancyFrequencyProfile" +topography: "Cosine2D" +x_max: 300e3 +z_max: 13e3 +x_elem: 3 +z_elem: 31 +z_stretch: false +nh_poly: 2 +max_topography_height: 0 +ode_algo: "RK4" +dt: "0.2secs" +t_end: "2days" +rayleigh_sponge: false +toml: [toml/no_gravity.toml] +analytic_check: true +output_default_diagnostics: false +diagnostics: + - short_name: [orog, ua, wa, uapredicted, wapredicted, uaerror, waerror, c1error, c3error] + period: 1hours diff --git a/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_long_float32_test.yml b/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_long_float32_test.yml new file mode 100644 index 00000000000..df57ccaf695 --- /dev/null +++ b/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_long_float32_test.yml @@ -0,0 +1,20 @@ +config: "plane" +FLOAT_TYPE: "Float32" +initial_condition: "ConstantBuoyancyFrequencyProfile" +topography: "Cosine2D" +x_max: 300e3 +z_max: 13e3 +x_elem: 3 +z_elem: 31 +z_stretch: false +nh_poly: 2 +max_topography_height: 0 +dt: "5secs" +t_end: "40days" +rayleigh_sponge: false +toml: [toml/no_gravity.toml] +analytic_check: true +output_default_diagnostics: false +diagnostics: + - short_name: [orog, ua, wa, uapredicted, wapredicted, uaerror, waerror, c1error, c3error] + period: 1hours diff --git a/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_long_test.yml b/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_long_test.yml new file mode 100644 index 00000000000..9f44fa54ac6 --- /dev/null +++ b/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_long_test.yml @@ -0,0 +1,20 @@ +config: "plane" +FLOAT_TYPE: "Float64" +initial_condition: "ConstantBuoyancyFrequencyProfile" +topography: "Cosine2D" +x_max: 300e3 +z_max: 13e3 +x_elem: 3 +z_elem: 31 +z_stretch: false +nh_poly: 2 +max_topography_height: 0 +dt: "5secs" +t_end: "40days" +rayleigh_sponge: false +toml: [toml/no_gravity.toml] +analytic_check: true +output_default_diagnostics: false +diagnostics: + - short_name: [orog, ua, wa, uapredicted, wapredicted, uaerror, waerror, c1error, c3error] + period: 1hours diff --git a/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_no_hyperdiff_long_float32_test.yml b/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_no_hyperdiff_long_float32_test.yml new file mode 100644 index 00000000000..40a1c374048 --- /dev/null +++ b/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_no_hyperdiff_long_float32_test.yml @@ -0,0 +1,21 @@ +config: "plane" +FLOAT_TYPE: "Float32" +initial_condition: "ConstantBuoyancyFrequencyProfile" +topography: "Cosine2D" +x_max: 300e3 +z_max: 13e3 +x_elem: 3 +z_elem: 31 +z_stretch: false +nh_poly: 2 +max_topography_height: 0 +dt: "5secs" +t_end: "50days" +hyperdiff: false +rayleigh_sponge: false +toml: [toml/no_gravity.toml] +analytic_check: true +output_default_diagnostics: false +diagnostics: + - short_name: [orog, ua, wa, uapredicted, wapredicted, uaerror, waerror, c1error, c3error] + period: 1hours diff --git a/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_no_hyperdiff_long_test.yml b/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_no_hyperdiff_long_test.yml new file mode 100644 index 00000000000..29deba53d63 --- /dev/null +++ b/config/model_configs/plane_analytic_no_topography_no_sponge_no_grav_no_hyperdiff_long_test.yml @@ -0,0 +1,21 @@ +config: "plane" +FLOAT_TYPE: "Float64" +initial_condition: "ConstantBuoyancyFrequencyProfile" +topography: "Cosine2D" +x_max: 300e3 +z_max: 13e3 +x_elem: 3 +z_elem: 31 +z_stretch: false +nh_poly: 2 +max_topography_height: 0 +dt: "5secs" +t_end: "50days" +hyperdiff: false +rayleigh_sponge: false +toml: [toml/no_gravity.toml] +analytic_check: true +output_default_diagnostics: false +diagnostics: + - short_name: [orog, ua, wa, uapredicted, wapredicted, uaerror, waerror, c1error, c3error] + period: 1hours diff --git a/config/model_configs/plane_analytic_no_topography_test.yml b/config/model_configs/plane_analytic_no_topography_test.yml index cdb4e41960b..135f7ad7d78 100644 --- a/config/model_configs/plane_analytic_no_topography_test.yml +++ b/config/model_configs/plane_analytic_no_topography_test.yml @@ -4,11 +4,12 @@ initial_condition: "ConstantBuoyancyFrequencyProfile" topography: "Cosine2D" x_max: 300e3 z_max: 21e3 -x_elem: 15 +x_elem: 3 z_elem: 50 z_stretch: false +nh_poly: 2 max_topography_height: 0 -dt: "12secs" +dt: "5secs" t_end: "10days" rayleigh_sponge: true toml: [toml/analytic_topography_test.toml] diff --git a/config/model_configs/plane_analytic_schar_mountain_float32_test.yml b/config/model_configs/plane_analytic_schar_mountain_float32_test.yml index 0a87fc1c045..8d6134269d6 100644 --- a/config/model_configs/plane_analytic_schar_mountain_float32_test.yml +++ b/config/model_configs/plane_analytic_schar_mountain_float32_test.yml @@ -7,8 +7,8 @@ z_max: 21e3 x_elem: 100 z_elem: 100 z_stretch: false -dt: "0.5secs" -t_end: "4days" +dt: "0.1secs" +t_end: "18hours" rayleigh_sponge: true toml: [toml/analytic_topography_test.toml] analytic_check: true diff --git a/config/model_configs/plane_analytic_schar_mountain_test.yml b/config/model_configs/plane_analytic_schar_mountain_test.yml index c3b5f2138fc..2101e90777a 100644 --- a/config/model_configs/plane_analytic_schar_mountain_test.yml +++ b/config/model_configs/plane_analytic_schar_mountain_test.yml @@ -7,8 +7,8 @@ z_max: 21e3 x_elem: 100 z_elem: 100 z_stretch: false -dt: "0.5secs" -t_end: "4days" +dt: "0.1secs" +t_end: "18hours" rayleigh_sponge: true toml: [toml/analytic_topography_test.toml] analytic_check: true diff --git a/post_processing/ci_plots.jl b/post_processing/ci_plots.jl index e8bea983d73..aeb9e53da39 100644 --- a/post_processing/ci_plots.jl +++ b/post_processing/ci_plots.jl @@ -312,7 +312,7 @@ function plot_streamlines!(place, var) u_spline = linear_interpolation((dim1, dim2), first.(var.data)) w_spline = linear_interpolation((dim1, dim2), last.(var.data)) - spline = point -> Makie.Point2f(u_spline(point...), w_spline(point...)) + spline = point -> CairoMakie.Point2f(u_spline(point...), w_spline(point...)) plot = CairoMakie.streamplot!( spline, dim1, @@ -346,23 +346,43 @@ function plot_contours!(place, var) limits = (extrema(dim1), extrema(dim2)), ) - n_levels = 21 - var_mean = round(mean(var.data)) - var_delta = maximum(value -> abs(value - var_mean), var.data) - levels = range(var_mean - var_delta, var_mean + var_delta, n_levels + 1) - - spectral_colors = Makie.to_colormap(:Spectral) - plot_kwargs = (; - levels, - colormap = setindex!(spectral_colors, Makie.RGBA(1, 1, 1, 0), 6), + # Interpolate between the 11 Spectral colors with the central color replaced + # by transparent white. + spectral_colors = CairoMakie.to_colormap(:Spectral) + color_kwargs = (; + colormap = setindex!(spectral_colors, CairoMakie.RGBA(1, 1, 1, 0), 6), extendhigh = spectral_colors[11], extendlow = spectral_colors[1], ) - plot = CairoMakie.contourf!(dim1, dim2, var.data; plot_kwargs...) - if var_delta / abs(var_mean) > 1e-7 - CairoMakie.Colorbar(place[1, 2], plot; label = "$var_name [$var_units]") - end # Colorbar's LineAxis throws an error when var_delta ≪ abs(var_mean). + # Center the contour levels around either the average of the data or the + # nearest integer that falls into the data range. + var_avg = mean(var.data) + var_avg_int = round(Int, var_avg) + var_min, var_max = extrema(var.data) + var_cent = var_min < var_avg_int < var_max ? var_avg_int : var_avg + var_delta = maximum(value -> abs(value - var_cent), var.data) + + if var_delta == 0 + # For constant data, use a heatmap to avoid Colorbar's LineAxis error. + label = "$var_name [$var_units]" + plot = CairoMakie.heatmap!(dim1, dim2, var.data; color_kwargs...) + else + n_levels = 21 + if var_delta < abs(var_cent) / 1e6 + # Recenter the data around 0 when var_delta << abs(var_cent). + data = var.data .- var_cent + label = "$var_name - $var_cent [$var_units]" + levels = range(-var_delta, var_delta, n_levels + 1) + else + data = var.data + label = "$var_name [$var_units]" + levels = + range(var_cent - var_delta, var_cent + var_delta, n_levels + 1) + end + plot = CairoMakie.contourf!(dim1, dim2, data; levels, color_kwargs...) + end + CairoMakie.Colorbar(place[1, 2], plot; label) end """ @@ -675,7 +695,7 @@ function make_plots( make_plots_generic(output_paths, vars, y = 0.0, time = LAST_SNAP) end -rms(var; dims) = sqrt.(mean(x -> x^2, var; dims)) +rms(var; dims) = sqrt.(mean(var .^ 2; dims)) function level_rms(var) reduced_var = ClimaAnalysis.Var._reduce_over(rms, "x", var) if haskey(var.dims, "y") @@ -726,7 +746,20 @@ const AnalyticTopographyTest = Union{ Val{:gpu_plane_analytic_no_topography_no_hyperdiff_long_float32_test}, Val{:gpu_plane_analytic_no_topography_discrete_balance_long_test}, Val{:gpu_plane_analytic_no_topography_discrete_balance_long_float32_test}, + Val{:gpu_plane_analytic_no_topography_no_sponge_no_grav_long_test}, + Val{:gpu_plane_analytic_no_topography_no_sponge_no_grav_long_float32_test}, + Val{ + :gpu_plane_analytic_no_topography_no_sponge_no_grav_no_hyperdiff_long_test, + }, + Val{ + :gpu_plane_analytic_no_topography_no_sponge_no_grav_no_hyperdiff_long_float32_test, + }, + Val{:gpu_plane_analytic_no_topography_no_sponge_no_grav_long_explicit_test}, + Val{ + :gpu_plane_analytic_no_topography_no_sponge_no_grav_long_explicit_float32_test, + }, Val{:gpu_extruded_plane_analytic_no_topography_test}, + Val{:box_analytic_no_topography_oswald_config_test}, Val{:gpu_box_analytic_no_topography_test}, Val{:gpu_box_analytic_no_topography_float32_test}, Val{:plane_analytic_cosine_hills_test}, @@ -757,6 +790,7 @@ function make_plots( Val(:gpu_extruded_plane_analytic_cosine_hills_test), Val(:gpu_box_analytic_cosine_hills_test), Val(:gpu_box_analytic_cosine_hills_float32_test), + Val(:box_analytic_no_topography_oswald_settings_test), ) z_bounds = (; left = 0, right = 13e3) # The Rayleigh sponge starts at 13 km. @@ -794,14 +828,19 @@ function make_plots( "wapredicted", ] slice_summary_vars = Iterators.flatmap(all_short_names) do short_name - hours_to_plot = - endswith(short_name, "predicted") ? (Inf,) : (1, 2, 24, Inf) - Iterators.flatmap(hours_to_plot) do n_hours - Iterators.map(simdirs) do simdir - data = get(simdir; short_name) - data = window(data, "z_reference"; z_bounds...) - data = slice(data; time = n_hours * 60 * 60) - is_3d ? slice(data; y = 0) : data + Iterators.flatmap(simdirs) do simdir + data = get(simdir; short_name) + data = window(data, "z_reference"; z_bounds...) + data = is_3d ? slice(data; y = 0) : data + hours_to_plot = if endswith(short_name, "predicted") + (Inf,) + elseif last(data.dims["time"]) > 24 * 60 * 60 + (1, 2, 24, Inf) + else + (1, 2, 3, 24) + end + Iterators.map(hours_to_plot) do n_hours + slice(data; time = n_hours * 60 * 60) end end end diff --git a/src/analytic_solutions/analytic_solutions.jl b/src/analytic_solutions/analytic_solutions.jl index c6656f1c169..5ed813a57ce 100644 --- a/src/analytic_solutions/analytic_solutions.jl +++ b/src/analytic_solutions/analytic_solutions.jl @@ -10,7 +10,7 @@ background_N(::Type{FT}) where {FT} = FT(0.01) background_T_sfc(::Type{FT}) where {FT} = FT(288) background_u(::Type{FT}) where {FT} = FT(10) -function initial_thermo_state(params, coord) +function background_p_and_T(params, ζ) FT = eltype(params) g = CAP.grav(params) R_d = CAP.R_d(params) @@ -19,30 +19,35 @@ function initial_thermo_state(params, coord) N = background_N(FT) T_sfc = background_T_sfc(FT) + g == 0 && return (p_sfc, T_sfc) + β = N^2 / g a = g / (cp_d * T_sfc * β) + p = p_sfc * (1 - a + a * exp(-β * ζ))^(cp_d / R_d) + T = T_sfc * ((1 - a) * exp(β * ζ) + a) - # Replace ζ with z in the constant-N profile so that the initial condition - # is hydrostatically balanced. - z = coord.z - - # Replace the constant-N profile with an isothermal profile above T = 100 to - # avoid unreasonably small or negative values of T. + # Replace the constant-N profile with an isothermal profile above T = T_iso + # to avoid unreasonably small or large values of T. T_min = FT(100) - z_iso = log((T_min / T_sfc - a) / (1 - a)) / β - p_iso = p_sfc * ((1 - a) / (1 - a * T_sfc / T_min))^(cp_d / R_d) - - # The perturbation in approximate_FΔuvw is computed around a background - # state that is not hydrostatically balanced and is unphysical above 30 km, - # but the initial condition does not need to exactly match this state. - p = - z > z_iso ? p_iso * exp(-g / (R_d * T_min) * (z - z_iso)) : - p_sfc * (1 - a + a * exp(-β * z))^(cp_d / R_d) - T = z > z_iso ? T_min : T_sfc * ((1 - a) * exp(β * z) + a) - - return TD.PhaseDry_pT(CAP.thermodynamics_params(params), p, T) + T_max = FT(500) + T_iso = a > 1 ? T_min : T_max + ζ_iso = log((T_iso / T_sfc - a) / (1 - a)) / β + p_iso = p_sfc * ((1 - a) / (1 - a * T_sfc / T_iso))^(cp_d / R_d) + if ζ > ζ_iso + p = p_iso * exp(-g / (R_d * T_iso) * (ζ - ζ_iso)) + T = T_iso + end + + return (p, T) end +# Replace ζ with z in the background thermodynamic state so that the initial +# condition is hydrostatically balanced. +initial_thermo_state(params, coord) = TD.PhaseDry_pT( + CAP.thermodynamics_params(params), + background_p_and_T(params, coord.z)..., +) + function approximate_FΔuvw(params, k_x, k_y, ζ, Fh) FT = eltype(params) g = CAP.grav(params) @@ -54,20 +59,25 @@ function approximate_FΔuvw(params, k_x, k_y, ζ, Fh) u = background_u(FT) (; z_top) = CAP.topography_params(params) + if g == 0 + Fh == 0 || + error("the analytic solution for topography without gravity has \ + not been implemented yet") # TODO: compute limits for g → 0 + return @SVector(FT[0, 0, 0]) + end + β = N^2 / g a = g / (cp_d * T_sfc * β) γ = cp_d / (cp_d - R_d) α = g / (γ * R_d * T_sfc * β) r = k_y / k_x k_h² = k_x^2 + k_y^2 - - p = p_sfc * (1 - a + a * exp(-β * ζ))^(cp_d / R_d) - T = T_sfc * ((1 - a) * exp(β * ζ) + a) - FΔζ_xh = -im * k_x * Fh # ≈ F(-∂h/∂x / (1 - h/z_top)) to first order in h FΔζ_yh = -im * k_y * Fh # ≈ F(-∂h/∂y / (1 - h/z_top)) to first order in h FΔζ_z = Fh / z_top # ≈ F(h/z_top / (1 - h/z_top)) to first order in h + (p, T) = background_p_and_T(params, ζ) + ρ_sfc = p_sfc / (R_d * T_sfc) m_sfc = u^2 / (γ * R_d * T_sfc) μ_sfc = 1 - k_x^2 / k_h² * m_sfc diff --git a/src/prognostic_equations/advection.jl b/src/prognostic_equations/advection.jl index 04957bbc281..d6c07425252 100644 --- a/src/prognostic_equations/advection.jl +++ b/src/prognostic_equations/advection.jl @@ -39,8 +39,15 @@ NVTX.@annotate function horizontal_advection_tendency!(Yₜ, Y, p, t) @. Yₜ.c.sgs⁰.ρatke -= wdivₕ(Y.c.sgs⁰.ρatke * ᶜu⁰) end - # @. Yₜ.c.uₕ -= C12(gradₕ(ᶜp) / Y.c.ρ + gradₕ(ᶜK + ᶜΦ)) - @. Yₜ.c.uₕ -= C12(ᶜp / Y.c.ρ * gradₕ(log(ᶜp)) + gradₕ(ᶜK + ᶜΦ)) + # FT = eltype(Y) + # cp_d = FT(CAP.cp_d(p.params)) + # thermo_params = CAP.thermodynamics_params(p.params) + # @. Yₜ.c.uₕ -= C12( + # cp_d * + # TD.virtual_pottemp(thermo_params, p.precomputed.ᶜts) * + # gradₕ(TD.exner(thermo_params, p.precomputed.ᶜts)) + gradₕ(ᶜK + ᶜΦ), + # ) + @. Yₜ.c.uₕ -= C12(gradₕ(ᶜp) / Y.c.ρ + gradₕ(ᶜK + ᶜΦ)) # Without the C12(), the right-hand side would be a C1 or C2 in 2D space. return nothing end diff --git a/src/prognostic_equations/implicit/implicit_tendency.jl b/src/prognostic_equations/implicit/implicit_tendency.jl index 8a80c0c1d3a..b23460da126 100644 --- a/src/prognostic_equations/implicit/implicit_tendency.jl +++ b/src/prognostic_equations/implicit/implicit_tendency.jl @@ -190,6 +190,13 @@ function implicit_vertical_advection_tendency!(Yₜ, Y, p, t) end @. Yₜ.f.u₃ -= ᶠgradᵥ(ᶜp) / ᶠinterp(Y.c.ρ) + ᶠgradᵥ_ᶜΦ + # FT = eltype(Y) + # cp_d = FT(CAP.cp_d(p.params)) + # thermo_params = CAP.thermodynamics_params(p.params) + # @. Yₜ.f.u₃ -= + # cp_d * + # ᶠinterp(TD.virtual_pottemp(thermo_params, p.precomputed.ᶜts)) * + # ᶠgradᵥ(TD.exner(thermo_params, p.precomputed.ᶜts)) + ᶠgradᵥ_ᶜΦ # @. Yₜ.f.u₃ -= ᶠinterp(ᶜp / Y.c.ρ) * ᶠgradᵥ(log(ᶜp)) + ᶠgradᵥ_ᶜΦ if rayleigh_sponge isa RayleighSponge diff --git a/toml/no_gravity.toml b/toml/no_gravity.toml new file mode 100644 index 00000000000..2fd3c790671 --- /dev/null +++ b/toml/no_gravity.toml @@ -0,0 +1,2 @@ +[gravitational_acceleration] +value = 0