diff --git a/.buildkite/gpu_pipeline/pipeline.yml b/.buildkite/gpu_pipeline/pipeline.yml
index 407698cf71f..ca0080f65d1 100644
--- a/.buildkite/gpu_pipeline/pipeline.yml
+++ b/.buildkite/gpu_pipeline/pipeline.yml
@@ -4,7 +4,6 @@ agents:
modules: julia/1.10.0 cuda/julia-pref openmpi/4.1.5-mpitrampoline nsight-systems/2024.2.1
env:
- JULIA_CUDA_MEMORY_POOL: none
JULIA_MPI_HAS_CUDA: "true"
JULIA_NVTX_CALLBACKS: gc
JULIA_MAX_NUM_PRECOMPILE_FILES: 100
@@ -51,7 +50,7 @@ steps:
# nsys profile --trace=nvtx,mpi,cuda,osrt --output=target_gpu_implicit_baroclinic_wave/report
# julia --threads=3 --color=yes --project=examples examples/hybrid/driver.jl
# --config_file ${GPU_CONFIG_PATH}target_gpu_implicit_baroclinic_wave.yml
- # artifact_paths: "target_gpu_implicit_baroclinic_wave/*"
+ # artifact_paths: "target_gpu_implicit_baroclinic_wave/output_active/*"
# agents:
# slurm_gpus: 1
# slurm_cpus_per_task: 4
@@ -65,7 +64,7 @@ steps:
nsys profile --trace=nvtx,mpi,cuda,osrt --output=gpu_hs_rhoe_equil_55km_nz63_0M/report
julia --threads=3 --color=yes --project=examples examples/hybrid/driver.jl
--config_file ${GPU_CONFIG_PATH}gpu_hs_rhoe_equil_55km_nz63_0M.yml
- artifact_paths: "gpu_hs_rhoe_equil_55km_nz63_0M/*"
+ artifact_paths: "gpu_hs_rhoe_equil_55km_nz63_0M/output_active/*"
agents:
slurm_gpus: 1
slurm_cpus_per_task: 4
@@ -80,7 +79,7 @@ steps:
# nsys profile --trace=nvtx,mpi,cuda,osrt --output=gpu_hs_rhoe_equil_55km_nz63_0M_4process/report-%q{PMI_RANK}
# julia --threads=3 --color=yes --project=examples examples/hybrid/driver.jl
# --config_file ${GPU_CONFIG_PATH}gpu_hs_rhoe_equil_55km_nz63_0M_4process.yml
- # artifact_paths: "gpu_hs_rhoe_equil_55km_nz63_0M_4process/*"
+ # artifact_paths: "gpu_hs_rhoe_equil_55km_nz63_0M_4process/output_active/*"
# agents:
# slurm_gpus_per_task: 1
# slurm_cpus_per_task: 4
@@ -96,7 +95,7 @@ steps:
# nsys profile --trace=osrt,nvtx,cuda,mpi,ucx --output=target_gpu_implicit_baroclinic_wave_4process/report-%q{PMI_RANK}
# julia --threads=3 --color=yes --project=examples examples/hybrid/driver.jl
# --config_file ${GPU_CONFIG_PATH}target_gpu_implicit_baroclinic_wave_4process.yml
- # artifact_paths: "target_gpu_implicit_baroclinic_wave_4process/*"
+ # artifact_paths: "target_gpu_implicit_baroclinic_wave_4process/output_active/*"
# agents:
# slurm_gpus_per_task: 1
# slurm_cpus_per_task: 4
@@ -113,7 +112,7 @@ steps:
srun --cpu-bind=threads --cpus-per-task=4
julia --threads=3 --color=yes --project=examples examples/hybrid/driver.jl
--config_file ${GPU_CONFIG_PATH}gpu_aquaplanet_dyamond_ss_1process.yml
- artifact_paths: "gpu_aquaplanet_dyamond_ss_1process/*"
+ artifact_paths: "gpu_aquaplanet_dyamond_ss_1process/output_active/*"
agents:
slurm_gpus_per_task: 1
slurm_cpus_per_task: 4
@@ -122,114 +121,114 @@ steps:
slurm_time: 8:00:00
slurm_exclusive:
- # - label: "gpu_aquaplanet_dyamond - strong scaling - 2 GPUs"
- # command:
- # - mkdir -p gpu_aquaplanet_dyamond_ss_2process
- # - >
- # srun --cpu-bind=threads --cpus-per-task=4
- # julia --threads=3 --color=yes --project=examples examples/hybrid/driver.jl
- # --config_file ${GPU_CONFIG_PATH}gpu_aquaplanet_dyamond_ss_2process.yml
- # artifact_paths: "gpu_aquaplanet_dyamond_ss_2process/*"
- # agents:
- # slurm_gpus_per_task: 1
- # slurm_cpus_per_task: 4
- # slurm_ntasks: 2
- # slurm_mem: 32G
- # slurm_time: 8:00:00
- # slurm_exclusive:
-
- # - label: "gpu_aquaplanet_dyamond - strong scaling - 4 GPUs"
- # command:
- # - mkdir -p gpu_aquaplanet_dyamond_ss_4process
- # - >
- # srun --cpu-bind=threads --cpus-per-task=4
- # julia --threads=3 --color=yes --project=examples examples/hybrid/driver.jl
- # --config_file ${GPU_CONFIG_PATH}gpu_aquaplanet_dyamond_ss_4process.yml
- # artifact_paths: "gpu_aquaplanet_dyamond_ss_4process/*"
- # agents:
- # slurm_gpus_per_task: 1
- # slurm_cpus_per_task: 4
- # slurm_ntasks: 4
- # slurm_mem: 32G
- # slurm_time: 8:00:00
- # slurm_exclusive:
-
- # - wait
-
- # - label: "gpu_aquaplanet_dyamond - strong scaling plots"
- # command:
- # - mkdir -p gpu_aquaplanet_dyamond_ss
- # - >
- # julia --color=yes --project=examples post_processing/plot_gpu_strong_scaling.jl gpu_aquaplanet_dyamond_ss
- # artifact_paths: "gpu_aquaplanet_dyamond_ss/*"
- # agents:
- # slurm_cpus_per_task: 1
- # slurm_ntasks: 1
- # slurm_exclusive:
+ # - label: "gpu_aquaplanet_dyamond - strong scaling - 2 GPUs"
+ # command:
+ # - mkdir -p gpu_aquaplanet_dyamond_ss_2process
+ # - >
+ # srun --cpu-bind=threads --cpus-per-task=4
+ # julia --threads=3 --color=yes --project=examples examples/hybrid/driver.jl
+ # --config_file ${GPU_CONFIG_PATH}gpu_aquaplanet_dyamond_ss_2process.yml
+ # artifact_paths: "gpu_aquaplanet_dyamond_ss_2process/output_active/*"
+ # agents:
+ # slurm_gpus_per_task: 1
+ # slurm_cpus_per_task: 4
+ # slurm_ntasks: 2
+ # slurm_mem: 32G
+ # slurm_time: 8:00:00
+ # slurm_exclusive:
+
+ # - label: "gpu_aquaplanet_dyamond - strong scaling - 4 GPUs"
+ # command:
+ # - mkdir -p gpu_aquaplanet_dyamond_ss_4process
+ # - >
+ # srun --cpu-bind=threads --cpus-per-task=4
+ # julia --threads=3 --color=yes --project=examples examples/hybrid/driver.jl
+ # --config_file ${GPU_CONFIG_PATH}gpu_aquaplanet_dyamond_ss_4process.yml
+ # artifact_paths: "gpu_aquaplanet_dyamond_ss_4process/output_active/*"
+ # agents:
+ # slurm_gpus_per_task: 1
+ # slurm_cpus_per_task: 4
+ # slurm_ntasks: 4
+ # slurm_mem: 32G
+ # slurm_time: 8:00:00
+ # slurm_exclusive:
+
+ # - wait
+
+ # - label: "gpu_aquaplanet_dyamond - strong scaling plots"
+ # command:
+ # - mkdir -p gpu_aquaplanet_dyamond_ss
+ # - >
+ # julia --color=yes --project=examples post_processing/plot_gpu_strong_scaling.jl gpu_aquaplanet_dyamond_ss
+ # artifact_paths: "gpu_aquaplanet_dyamond_ss/output_active/*"
+ # agents:
+ # slurm_cpus_per_task: 1
+ # slurm_ntasks: 1
+ # slurm_exclusive:
# - group: "DYAMOND GPU weak scaling"
# steps:
- # - label: "gpu_aquaplanet_dyamond - weak scaling - 1 GPU"
- # command:
- # - mkdir -p gpu_aquaplanet_dyamond_ws_1process
- # - >
- # srun --cpu-bind=threads --cpus-per-task=4
- # julia --threads=3 --color=yes --project=examples examples/hybrid/driver.jl
- # --config_file ${GPU_CONFIG_PATH}gpu_aquaplanet_dyamond_ws_1process.yml
- # artifact_paths: "gpu_aquaplanet_dyamond_ws_1process/*"
- # agents:
- # slurm_gpus_per_task: 1
- # slurm_cpus_per_task: 4
- # slurm_ntasks: 1
- # slurm_mem: 32G
- # slurm_time: 8:00:00
- # slurm_exclusive:
-
- # - label: "gpu_aquaplanet_dyamond - weak scaling - 2 GPUs"
- # command:
- # - mkdir -p gpu_aquaplanet_dyamond_ws_2process
- # - >
- # srun --cpu-bind=threads --cpus-per-task=4
- # julia --threads=3 --color=yes --project=examples examples/hybrid/driver.jl
- # --config_file ${GPU_CONFIG_PATH}gpu_aquaplanet_dyamond_ws_2process.yml
- # artifact_paths: "gpu_aquaplanet_dyamond_ws_2process/*"
- # agents:
- # slurm_gpus_per_task: 1
- # slurm_cpus_per_task: 4
- # slurm_ntasks: 2
- # slurm_mem: 32G
- # slurm_time: 8:00:00
- # slurm_exclusive:
-
- # - label: "gpu_aquaplanet_dyamond - weak scaling - 4 GPUs"
- # command:
- # - mkdir -p gpu_aquaplanet_dyamond_ws_4process
- # - >
- # srun --cpu-bind=threads --cpus-per-task=4
- # julia --threads=3 --color=yes --project=examples examples/hybrid/driver.jl
- # --config_file ${GPU_CONFIG_PATH}gpu_aquaplanet_dyamond_ws_4process.yml
- # artifact_paths: "gpu_aquaplanet_dyamond_ws_4process/*"
- # agents:
- # slurm_gpus_per_task: 1
- # slurm_cpus_per_task: 4
- # slurm_ntasks: 4
- # slurm_mem: 32G
- # slurm_time: 8:00:00
- # slurm_exclusive:
-
- # - wait
-
- # - label: "gpu_aquaplanet_dyamond - weak scaling plots"
- # command:
- # - mkdir -p gpu_aquaplanet_dyamond_ws
- # - >
- # julia --color=yes --project=examples post_processing/plot_gpu_weak_scaling.jl gpu_aquaplanet_dyamond_ws
- # artifact_paths: "gpu_aquaplanet_dyamond_ws/*"
- # agents:
- # slurm_cpus_per_task: 1
- # slurm_ntasks: 1
- # slurm_exclusive:
+ # - label: "gpu_aquaplanet_dyamond - weak scaling - 1 GPU"
+ # command:
+ # - mkdir -p gpu_aquaplanet_dyamond_ws_1process
+ # - >
+ # srun --cpu-bind=threads --cpus-per-task=4
+ # julia --threads=3 --color=yes --project=examples examples/hybrid/driver.jl
+ # --config_file ${GPU_CONFIG_PATH}gpu_aquaplanet_dyamond_ws_1process.yml
+ # artifact_paths: "gpu_aquaplanet_dyamond_ws_1process/output_active/*"
+ # agents:
+ # slurm_gpus_per_task: 1
+ # slurm_cpus_per_task: 4
+ # slurm_ntasks: 1
+ # slurm_mem: 32G
+ # slurm_time: 8:00:00
+ # slurm_exclusive:
+
+ # - label: "gpu_aquaplanet_dyamond - weak scaling - 2 GPUs"
+ # command:
+ # - mkdir -p gpu_aquaplanet_dyamond_ws_2process
+ # - >
+ # srun --cpu-bind=threads --cpus-per-task=4
+ # julia --threads=3 --color=yes --project=examples examples/hybrid/driver.jl
+ # --config_file ${GPU_CONFIG_PATH}gpu_aquaplanet_dyamond_ws_2process.yml
+ # artifact_paths: "gpu_aquaplanet_dyamond_ws_2process/output_active/*"
+ # agents:
+ # slurm_gpus_per_task: 1
+ # slurm_cpus_per_task: 4
+ # slurm_ntasks: 2
+ # slurm_mem: 32G
+ # slurm_time: 8:00:00
+ # slurm_exclusive:
+
+ # - label: "gpu_aquaplanet_dyamond - weak scaling - 4 GPUs"
+ # command:
+ # - mkdir -p gpu_aquaplanet_dyamond_ws_4process
+ # - >
+ # srun --cpu-bind=threads --cpus-per-task=4
+ # julia --threads=3 --color=yes --project=examples examples/hybrid/driver.jl
+ # --config_file ${GPU_CONFIG_PATH}gpu_aquaplanet_dyamond_ws_4process.yml
+ # artifact_paths: "gpu_aquaplanet_dyamond_ws_4process/output_active/*"
+ # agents:
+ # slurm_gpus_per_task: 1
+ # slurm_cpus_per_task: 4
+ # slurm_ntasks: 4
+ # slurm_mem: 32G
+ # slurm_time: 8:00:00
+ # slurm_exclusive:
+
+ # - wait
+
+ # - label: "gpu_aquaplanet_dyamond - weak scaling plots"
+ # command:
+ # - mkdir -p gpu_aquaplanet_dyamond_ws
+ # - >
+ # julia --color=yes --project=examples post_processing/plot_gpu_weak_scaling.jl gpu_aquaplanet_dyamond_ws
+ # artifact_paths: "gpu_aquaplanet_dyamond_ws/output_active/*"
+ # agents:
+ # slurm_cpus_per_task: 1
+ # slurm_ntasks: 1
+ # slurm_exclusive:
@@ -243,7 +242,7 @@ steps:
nsys profile --trace=nvtx,mpi,cuda,osrt --output=gpu_aquaplanet_diagedmf/report
julia --threads=3 --color=yes --project=examples examples/hybrid/driver.jl
--config_file ${GPU_CONFIG_PATH}gpu_aquaplanet_diagedmf.yml
- artifact_paths: "gpu_aquaplanet_diagedmf/*"
+ artifact_paths: "gpu_aquaplanet_diagedmf/output_active/*"
agents:
slurm_gpus_per_task: 1
slurm_cpus_per_task: 4
diff --git a/.buildkite/longruns/pipeline.yml b/.buildkite/longruns/pipeline.yml
index 7ee9dcc178b..3cb87e39827 100644
--- a/.buildkite/longruns/pipeline.yml
+++ b/.buildkite/longruns/pipeline.yml
@@ -47,7 +47,7 @@ steps:
# - label: ":computer: lim ARS zalesak baroclinic wave (ρe_tot) equilmoist high resolution"
# command:
# - srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- # artifact_paths: "$$JOB_NAME/*"
+ # artifact_paths: "$$JOB_NAME/output_active/*"
# agents:
# slurm_ntasks: 32
# slurm_mem_per_cpu: 32GB
@@ -58,12 +58,25 @@ steps:
- label: ":computer: SSP baroclinic wave (ρe_tot) equilmoist high resolution centered diff"
command:
- "srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml"
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
agents:
slurm_ntasks: 32
+ slurm_nodes: 2
slurm_time: 24:00:00
env:
JOB_NAME: "longrun_ssp_bw_rhoe_equil_highres"
+
+ - label: ":computer: aquaplanet equilmoist clearsky radiation + prognostic edmf diffusion only + 0M microphysics"
+ command:
+ - srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
+ artifact_paths: "$$JOB_NAME/*"
+ agents:
+ slurm_ntasks: 64
+ slurm_nodes: 4
+ slurm_mem_per_cpu: 16GB
+ slurm_time: 24:00:00
+ env:
+ JOB_NAME: "longrun_aquaplanet_rhoe_equil_55km_nz63_clearsky_progedmf_diffonly_0M"
- group: "Low resolution long runs"
@@ -72,7 +85,7 @@ steps:
- label: ":computer: low resolution aquaplanet equilmoist clearsky radiation + time-varying insolation + slab ocean"
command:
- srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
agents:
slurm_ntasks: 8
slurm_mem_per_cpu: 16GB
diff --git a/.buildkite/longruns_gpu/pipeline.yml b/.buildkite/longruns_gpu/pipeline.yml
index b86356019a1..62839cec67b 100644
--- a/.buildkite/longruns_gpu/pipeline.yml
+++ b/.buildkite/longruns_gpu/pipeline.yml
@@ -45,7 +45,7 @@ steps:
- label: ":computer: hydrostatic balance (ρe_tot)"
command:
- srun julia --color=yes --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
agents:
slurm_gpus: 1
slurm_time: 12:00:00
@@ -55,7 +55,7 @@ steps:
- label: ":computer: dry baroclinic wave"
command:
- srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
agents:
slurm_gpus: 1
slurm_time: 12:00:00
@@ -65,7 +65,7 @@ steps:
- label: ":computer: baroclinic wave equilmoist"
command:
- srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
agents:
slurm_gpus: 1
slurm_time: 12:00:00
@@ -75,7 +75,7 @@ steps:
- label: ":computer: dry held-suarez"
command:
- srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
agents:
slurm_gpus: 1
slurm_time: 12:00:00
@@ -85,7 +85,7 @@ steps:
- label: ":computer: held-suarez, equilmoist"
command:
- srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
agents:
slurm_gpus: 1
slurm_time: 12:00:00
@@ -95,7 +95,7 @@ steps:
- label: ":computer: aquaplanet equilmoist gray radiation + 0M microphysics"
command:
- srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
env:
CLIMACORE_DISTRIBUTED: "MPI"
JOB_NAME: "longrun_aquaplanet_rhoe_equil_55km_nz63_gray_0M"
@@ -106,7 +106,7 @@ steps:
- label: ":computer: aquaplanet equilmoist clearsky radiation + diagnostic edmf diffusion only + 0M microphysics"
command:
- srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
agents:
slurm_gpus: 1
slurm_time: 12:00:00
@@ -116,7 +116,7 @@ steps:
- label: ":computer: aquaplanet equilmoist clearsky radiation + time-varying insolation + 0M microphysics + slab ocean"
command:
- srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
agents:
slurm_gpus: 1
slurm_time: 12:00:00
@@ -126,7 +126,7 @@ steps:
- label: ":computer: held-suarez equilmoist + deep-atmosphere eqns"
command:
- srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
env:
CLIMACORE_DISTRIBUTED: "MPI"
JOB_NAME: "longrun_hs_rhoe_equil_55km_nz63_0M_deepatmos"
@@ -137,7 +137,7 @@ steps:
- label: ":computer: aquaplanet equilmoist clearsky radiation + 0M microphysics"
command:
- srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
agents:
slurm_gpus: 1
slurm_time: 12:00:00
@@ -147,7 +147,7 @@ steps:
- label: ":computer: aquaplanet equilmoist clearsky radiation + diagnostic edmf + 0M microphysics"
command:
- srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
agents:
slurm_gpus: 1
slurm_time: 12:00:00
@@ -157,7 +157,7 @@ steps:
- label: ":computer: aquaplanet equilmoist allsky radiation + diagnostic edmf + 0M microphysics"
command:
- srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
agents:
slurm_gpus: 1
slurm_time: 12:00:00
@@ -167,7 +167,7 @@ steps:
- label: ":computer: aquaplanet equilmoist clearsky radiation + 0M microphysics + earth topography"
command:
- srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
agents:
slurm_gpus: 1
slurm_time: 12:00:00
@@ -177,7 +177,7 @@ steps:
- label: ":computer: aquaplanet equilmoist clearsky radiation + 0M microphysics + earth topography (SLEVE)"
command:
- srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
agents:
slurm_gpus: 1
slurm_time: 6:00:00
@@ -187,7 +187,7 @@ steps:
- label: ":umbrella: aquaplanet equilmoist clearsky radiation + 1M microphysics"
command:
- srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
agents:
slurm_gpus: 1
slurm_time: 6:00:00
@@ -201,7 +201,7 @@ steps:
- label: ":computer: aquaplanet dyamond"
command:
- srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
agents:
slurm_gpus: 1
slurm_time: 12:00:00
@@ -215,7 +215,7 @@ steps:
- label: ":computer: amip target diagnostic edmf"
command:
- srun julia --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml
- artifact_paths: "$$JOB_NAME/*"
+ artifact_paths: "$$JOB_NAME/output_active/*"
agents:
slurm_gpus: 1
slurm_time: 12:00:00
diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml
index 922c94801c4..6e0fc53b699 100644
--- a/.buildkite/pipeline.yml
+++ b/.buildkite/pipeline.yml
@@ -19,6 +19,8 @@ env:
steps:
- label: "init :computer:"
key: "init_cpu_env"
+ concurrency: 1
+ concurrency_group: 'depot/climaatmos-ci'
command:
- "echo $$JULIA_DEPOT_PATH"
@@ -63,25 +65,25 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/single_column_radiative_equilibrium_gray.yml
- artifact_paths: "single_column_radiative_equilibrium_gray/*"
+ artifact_paths: "single_column_radiative_equilibrium_gray/output_active/*"
- label: ":computer: single column radiative equilibrium clearsky"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/single_column_radiative_equilibrium_clearsky.yml
- artifact_paths: "single_column_radiative_equilibrium_clearsky/*"
+ artifact_paths: "single_column_radiative_equilibrium_clearsky/output_active/*"
- label: ":computer: single column radiative equilibrium clearsky prognostic surface temperature"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/single_column_radiative_equilibrium_clearsky_prognostic_surface_temp.yml
- artifact_paths: "single_column_radiative_equilibrium_clearsky_prognostic_surface_temp/*"
+ artifact_paths: "single_column_radiative_equilibrium_clearsky_prognostic_surface_temp/output_active/*"
- label: ":computer: single column radiative equilibrium allsky idealized clouds varying insolation"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/single_column_radiative_equilibrium_allsky_idealized_clouds.yml
- artifact_paths: "single_column_radiative_equilibrium_allsky_idealized_clouds/*"
+ artifact_paths: "single_column_radiative_equilibrium_allsky_idealized_clouds/output_active/*"
- group: "Precipitation"
steps:
@@ -89,40 +91,40 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/single_column_precipitation_test.yml
- artifact_paths: "single_column_precipitation_test/*"
+ artifact_paths: "single_column_precipitation_test/output_active/*"
- group: "Gravity wave"
steps:
- label: ":computer: non-orographic gravity wave parameterization unit test 3d"
command: "julia --color=yes --project=examples test/gravity_wave/non_orographic_gravity_wave/nogw_test_3d.jl"
- artifact_paths: "nonorographic_gravity_wave_test_3d/*"
+ artifact_paths: "nonorographic_gravity_wave_test_3d/output_active/*"
agents:
slurm_mem: 20GB
- label: ":computer: non-orographic gravity wave parameterization test with MiMA output"
command: "julia --color=yes --project=examples test/gravity_wave/non_orographic_gravity_wave/nogw_test_mima.jl"
- artifact_paths: "nonorographic_gravity_wave_test_mima/*"
+ artifact_paths: "nonorographic_gravity_wave_test_mima/output_active/*"
agents:
slurm_mem: 20GB
- label: ":computer: non-orographic gravity wave parameterization unit test single column"
command: "julia --color=yes --project=examples test/gravity_wave/non_orographic_gravity_wave/nogw_test_single_column.jl"
- artifact_paths: "nonorographic_gravity_wave_test_single_column/*"
+ artifact_paths: "nonorographic_gravity_wave_test_single_column/output_active/*"
- label: ":computer: orographic gravity wave parameterization unit test for base flux calculation"
command: "julia --color=yes --project=examples test/gravity_wave/orographic_gravity_wave/ogwd_baseflux.jl"
- artifact_paths: "orographic_gravity_wave_test_baseflux/*"
+ artifact_paths: "orographic_gravity_wave_test_baseflux/output_active/*"
- label: ":computer: orographic gravity wave parameterization unit test for 3d calculation"
command: "julia --color=yes --project=examples test/gravity_wave/orographic_gravity_wave/ogwd_3d.jl"
- artifact_paths: "orographic_gravity_wave_test_3d/*"
+ artifact_paths: "orographic_gravity_wave_test_3d/output_active/*"
- label: ":computer: single column non-orographic gravity wave parameterization"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/single_column_nonorographic_gravity_wave.yml
- artifact_paths: "single_column_nonorographic_gravity_wave/*"
+ artifact_paths: "single_column_nonorographic_gravity_wave/output_active/*"
- group: "Column Examples"
steps:
@@ -131,7 +133,7 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/single_column_hydrostatic_balance_ft64.yml
- artifact_paths: "single_column_hydrostatic_balance_ft64/*"
+ artifact_paths: "single_column_hydrostatic_balance_ft64/output_active/*"
- group: "Box Examples"
steps:
@@ -140,13 +142,13 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/box_hydrostatic_balance_rhoe.yml
- artifact_paths: "box_hydrostatic_balance_rhoe/*"
+ artifact_paths: "box_hydrostatic_balance_rhoe/output_active/*"
- label: ":computer: 3D density current"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/box_density_current_test.yml
- artifact_paths: "box_density_current_test/*"
+ artifact_paths: "box_density_current_test/output_active/*"
- group: "Plane Examples"
steps:
@@ -154,31 +156,31 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/plane_agnesi_mountain_test_uniform.yml
- artifact_paths: "plane_agnesi_mountain_test_uniform/*"
+ artifact_paths: "plane_agnesi_mountain_test_uniform/output_active/*"
- label: ":computer: Agnesi linear hydrostatic mountain experiment (stretched)"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/plane_agnesi_mountain_test_stretched.yml
- artifact_paths: "plane_agnesi_mountain_test_stretched/*"
+ artifact_paths: "plane_agnesi_mountain_test_stretched/output_active/*"
- label: ":computer: Schar mountain experiment (uniform grid)"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/plane_schar_mountain_test_uniform.yml
- artifact_paths: "plane_schar_mountain_test_uniform/*"
+ artifact_paths: "plane_schar_mountain_test_uniform/output_active/*"
- label: ":computer: Schar mountain experiment (stretched grid)"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/plane_schar_mountain_test_stretched.yml
- artifact_paths: "plane_schar_mountain_test_stretched/*"
+ artifact_paths: "plane_schar_mountain_test_stretched/output_active/*"
- label: ":computer: Density current experiment"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/plane_density_current_test.yml
- artifact_paths: "plane_density_current_test/*"
+ artifact_paths: "plane_density_current_test/output_active/*"
- group: "Sphere Examples (Dycore)"
@@ -188,7 +190,7 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/sphere_hydrostatic_balance_rhoe_ft64.yml
- artifact_paths: "sphere_hydrostatic_balance_rhoe_ft64/*"
+ artifact_paths: "sphere_hydrostatic_balance_rhoe_ft64/output_active/*"
agents:
slurm_mem: 20GB
@@ -197,7 +199,7 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/sphere_baroclinic_wave_rhoe.yml
- artifact_paths: "sphere_baroclinic_wave_rhoe/*"
+ artifact_paths: "sphere_baroclinic_wave_rhoe/output_active/*"
- label: ":computer: no lim ARS baroclinic wave (ρe) equilmoist"
command: >
@@ -206,8 +208,8 @@ steps:
julia --color=yes --project=examples regression_tests/test_mse.jl
--job_id sphere_baroclinic_wave_rhoe_equilmoist
- --out_dir sphere_baroclinic_wave_rhoe_equilmoist
- artifact_paths: "sphere_baroclinic_wave_rhoe_equilmoist/*"
+ --out_dir sphere_baroclinic_wave_rhoe_equilmoist/output_active
+ artifact_paths: "sphere_baroclinic_wave_rhoe_equilmoist/output_active/*"
agents:
slurm_constraint: icelake|cascadelake|skylake|epyc
@@ -218,8 +220,8 @@ steps:
julia --color=yes --project=examples regression_tests/test_mse.jl
--job_id deep_sphere_baroclinic_wave_rhoe_equilmoist
- --out_dir deep_sphere_baroclinic_wave_rhoe_equilmoist
- artifact_paths: "deep_sphere_baroclinic_wave_rhoe_equilmoist/*"
+ --out_dir deep_sphere_baroclinic_wave_rhoe_equilmoist/output_active
+ artifact_paths: "deep_sphere_baroclinic_wave_rhoe_equilmoist/output_active/*"
agents:
slurm_constraint: icelake|cascadelake|skylake|epyc
@@ -227,26 +229,26 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/sphere_baroclinic_wave_rhoe_equilmoist_cldiag.yml
- artifact_paths: "sphere_baroclinic_wave_rhoe_equilmoist_cldiag/*"
+ artifact_paths: "sphere_baroclinic_wave_rhoe_equilmoist_cldiag/output_active/*"
- label: ":computer: no lim ARS baroclinic wave (ρe) equilmoist explicit vertdiff"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/sphere_baroclinic_wave_rhoe_equilmoist_expvdiff.yml
- artifact_paths: "sphere_baroclinic_wave_rhoe_equilmoist_expvdiff/*"
+ artifact_paths: "sphere_baroclinic_wave_rhoe_equilmoist_expvdiff/output_active/*"
- label: ":computer: no lim ARS baroclinic wave (ρe) equilmoist implicit vertdiff"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/sphere_baroclinic_wave_rhoe_equilmoist_impvdiff.yml
- artifact_paths: "sphere_baroclinic_wave_rhoe_equilmoist_impvdiff/*"
+ artifact_paths: "sphere_baroclinic_wave_rhoe_equilmoist_impvdiff/output_active/*"
# Add this back when we figure out what to do with SSP and zalesak
# - label: ":computer: SSP zalesak tracer & energy upwind baroclinic wave (ρe_tot) equilmoist"
# command: >
# julia --color=yes --project=examples examples/hybrid/driver.jl
# --config_file $CONFIG_PATH/$$JOB_NAME.yml
- # artifact_paths: "$$JOB_NAME/*"
+ # artifact_paths: "$$JOB_NAME/output_active/*"
# agents:
# slurm_mem: 64GB
# env:
@@ -255,14 +257,14 @@ steps:
- label: ":computer: no lim ARS baroclinic wave (ρe) equilmoist check conservation float64"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl --config_file $CONFIG_PATH/sphere_baroclinic_wave_rhoe_equilmoist_conservation_ft64.yml
- artifact_paths: "sphere_baroclinic_wave_rhoe_equilmoist_conservation_ft64/*"
+ artifact_paths: "sphere_baroclinic_wave_rhoe_equilmoist_conservation_ft64/output_active/*"
- label: ":computer: held suarez (ρe) hightop"
key: sphere_held_suarez_rhoe_hightop
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/sphere_held_suarez_rhoe_hightop.yml
- artifact_paths: "sphere_held_suarez_rhoe_hightop/*"
+ artifact_paths: "sphere_held_suarez_rhoe_hightop/output_active/*"
- label: ":computer: no lim ARS held suarez (ρe) equilmoist hightop sponge"
command: >
@@ -271,8 +273,8 @@ steps:
julia --color=yes --project=examples regression_tests/test_mse.jl
--job_id sphere_held_suarez_rhoe_equilmoist_hightop_sponge
- --out_dir sphere_held_suarez_rhoe_equilmoist_hightop_sponge
- artifact_paths: "sphere_held_suarez_rhoe_equilmoist_hightop_sponge/*"
+ --out_dir sphere_held_suarez_rhoe_equilmoist_hightop_sponge/output_active
+ artifact_paths: "sphere_held_suarez_rhoe_equilmoist_hightop_sponge/output_active/*"
agents:
slurm_constraint: icelake|cascadelake|skylake|epyc
@@ -283,7 +285,7 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/sphere_aquaplanet_rhoe_equilmoist_allsky_gw_res.yml
- artifact_paths: "sphere_aquaplanet_rhoe_equilmoist_allsky_gw_res/*"
+ artifact_paths: "sphere_aquaplanet_rhoe_equilmoist_allsky_gw_res/output_active/*"
agents:
slurm_mem: 20GB
@@ -294,8 +296,8 @@ steps:
julia --color=yes --project=examples regression_tests/test_mse.jl
--job_id sphere_aquaplanet_rhoe_equilmoist_allsky_gw_raw_zonallyasymmetric
- --out_dir sphere_aquaplanet_rhoe_equilmoist_allsky_gw_raw_zonallyasymmetric
- artifact_paths: "sphere_aquaplanet_rhoe_equilmoist_allsky_gw_raw_zonallyasymmetric/*"
+ --out_dir sphere_aquaplanet_rhoe_equilmoist_allsky_gw_raw_zonallyasymmetric/output_active
+ artifact_paths: "sphere_aquaplanet_rhoe_equilmoist_allsky_gw_raw_zonallyasymmetric/output_active/*"
agents:
slurm_mem: 20GB
slurm_constraint: icelake|cascadelake|skylake|epyc
@@ -304,7 +306,7 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/aquaplanet_rhoe_equil_clearsky_tvinsol_0M_slabocean.yml
- artifact_paths: "aquaplanet_rhoe_equil_clearsky_tvinsol_0M_slabocean/*"
+ artifact_paths: "aquaplanet_rhoe_equil_clearsky_tvinsol_0M_slabocean/output_active/*"
agents:
slurm_mem: 20GB
@@ -315,19 +317,19 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/sphere_baroclinic_wave_rhoe_topography_dcmip_rs.yml
- artifact_paths: "sphere_baroclinic_wave_rhoe_topography_dcmip_rs/*"
+ artifact_paths: "sphere_baroclinic_wave_rhoe_topography_dcmip_rs/output_active/*"
- label: ":computer: held suarez (ρe) topography (dcmip)"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/sphere_held_suarez_rhoe_topography_dcmip.yml
- artifact_paths: "sphere_held_suarez_rhoe_topography_dcmip/*"
+ artifact_paths: "sphere_held_suarez_rhoe_topography_dcmip/output_active/*"
- label: ":computer: held suarez (ρe) equilmoist topography (dcmip)"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/sphere_held_suarez_rhoe_equilmoist_topography_dcmip.yml
- artifact_paths: "sphere_held_suarez_rhoe_equilmoist_topography_dcmip/*"
+ artifact_paths: "sphere_held_suarez_rhoe_equilmoist_topography_dcmip/output_active/*"
agents:
slurm_mem: 20GB
@@ -335,13 +337,13 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/sphere_ssp_baroclinic_wave_rhoe_equilmoist_dcmip200.yml
- artifact_paths: "sphere_ssp_baroclinic_wave_rhoe_equilmoist_dcmip200/*"
+ artifact_paths: "sphere_ssp_baroclinic_wave_rhoe_equilmoist_dcmip200/output_active/*"
- label: ":computer: Diagnostic Earth surface elevation spectra"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/sphere_ssp_baroclinic_wave_rhoe_equilmoist_earth.yml
- artifact_paths: "sphere_ssp_baroclinic_wave_rhoe_equilmoist_earth/*"
+ artifact_paths: "sphere_ssp_baroclinic_wave_rhoe_equilmoist_earth/output_active/*"
- group: "MPI Examples"
steps:
@@ -351,7 +353,7 @@ steps:
command: >
srun julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $MPI_CONFIG_PATH/mpi_make_restart.yml
- artifact_paths: "mpi_make_restart/*"
+ artifact_paths: "mpi_make_restart/output_active/*"
env:
CLIMACORE_DISTRIBUTED: "MPI"
agents:
@@ -362,11 +364,11 @@ steps:
key: "restart_mpi_baro_wave"
depends_on: "mpi_baro_wave_make_restart"
command: >
- tar xvf mpi_make_restart/hdf5_files.tar -C mpi_make_restart
+ tar xvf mpi_make_restart/output_active/hdf5_files.tar -C mpi_make_restart/output_active
srun julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $MPI_CONFIG_PATH/restart_mpi_baroclinic_wave_rhoe.yml
- artifact_paths: "restart_mpi_baroclinic_wave_rhoe/*"
+ artifact_paths: "restart_mpi_baroclinic_wave_rhoe/output_active/*"
env:
CLIMACORE_DISTRIBUTED: "MPI"
agents:
@@ -381,7 +383,7 @@ steps:
command: >
srun julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $MPI_CONFIG_PATH/mpi_sphere_aquaplanet_rhoe_equilmoist_clearsky.yml
- artifact_paths: "mpi_sphere_aquaplanet_rhoe_equilmoist_clearsky/*"
+ artifact_paths: "mpi_sphere_aquaplanet_rhoe_equilmoist_clearsky/output_active/*"
env:
CLIMACORE_DISTRIBUTED: "MPI"
agents:
@@ -393,7 +395,7 @@ steps:
command: >
srun julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $MPI_CONFIG_PATH/prep_remap.yml
- artifact_paths: "prep_remap/*"
+ artifact_paths: "prep_remap/output_active/*"
env:
CLIMACORE_DISTRIBUTED: "MPI"
agents:
@@ -404,10 +406,10 @@ steps:
key: "remap_pipeline"
depends_on: "prep_remap"
command: >
- tar xvf prep_remap/hdf5_files.tar -C prep_remap
+ tar xvf prep_remap/output_active/hdf5_files.tar -C prep_remap/output_active
julia --color=yes --project=examples post_processing/remap/remap_pipeline.jl
- --data_dir prep_remap/ --out_dir remap_pipeline_output
+ --data_dir prep_remap/output_active --out_dir remap_pipeline_output
artifact_paths: "remap_pipeline_output/*"
- group: "Configs"
@@ -417,7 +419,7 @@ steps:
command: >
julia --color=yes --project=examples --threads=8 examples/hybrid/driver.jl
--config_file $CONFIG_PATH/test_io.yml
- artifact_paths: "test_io/*"
+ artifact_paths: "test_io/output_active/*"
agents:
slurm_cpus_per_task: 8
@@ -425,7 +427,7 @@ steps:
command: >
srun julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/test_mpi_io.yml
- artifact_paths: "test_mpi_io/*"
+ artifact_paths: "test_mpi_io/output_active/*"
env:
CLIMACORE_DISTRIBUTED: "MPI"
agents:
@@ -437,7 +439,7 @@ steps:
command: >
julia --color=yes --check-bounds=yes --project=perf perf/benchmark.jl
$PERF_CONFIG_PATH/checkbounds.yml
- artifact_paths: "checkbounds/*"
+ artifact_paths: "checkbounds/output_active/*"
agents:
slurm_mem: 20GB
@@ -448,7 +450,7 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/diagnostic_edmfx_test_box.yml
- artifact_paths: "diagnostic_edmfx_test_box/*"
+ artifact_paths: "diagnostic_edmfx_test_box/output_active/*"
agents:
slurm_mem: 20GB
@@ -456,7 +458,7 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/diagnostic_edmfx_gabls_box.yml
- artifact_paths: "diagnostic_edmfx_gabls_box/*"
+ artifact_paths: "diagnostic_edmfx_gabls_box/output_active/*"
agents:
slurm_mem: 20GB
@@ -464,7 +466,7 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/diagnostic_edmfx_bomex_box.yml
- artifact_paths: "diagnostic_edmfx_bomex_box/*"
+ artifact_paths: "diagnostic_edmfx_bomex_box/output_active/*"
agents:
slurm_mem: 20GB
@@ -472,7 +474,7 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/diagnostic_edmfx_bomex_stretched_box.yml
- artifact_paths: "diagnostic_edmfx_bomex_stretched_box/*"
+ artifact_paths: "diagnostic_edmfx_bomex_stretched_box/output_active/*"
agents:
slurm_mem: 20GB
@@ -480,7 +482,7 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/diagnostic_edmfx_dycoms_rf01_explicit_box.yml
- artifact_paths: "diagnostic_edmfx_dycoms_rf01_explicit_box/*"
+ artifact_paths: "diagnostic_edmfx_dycoms_rf01_explicit_box/output_active/*"
agents:
slurm_mem: 20GB
@@ -488,7 +490,7 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/diagnostic_edmfx_dycoms_rf01_box.yml
- artifact_paths: "diagnostic_edmfx_dycoms_rf01_box/*"
+ artifact_paths: "diagnostic_edmfx_dycoms_rf01_box/output_active/*"
agents:
slurm_mem: 20GB
@@ -496,7 +498,7 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/diagnostic_edmfx_rico_box.yml
- artifact_paths: "diagnostic_edmfx_rico_box/*"
+ artifact_paths: "diagnostic_edmfx_rico_box/output_active/*"
agents:
slurm_mem: 20GB
@@ -504,7 +506,7 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/diagnostic_edmfx_trmm_box.yml
- artifact_paths: "diagnostic_edmfx_trmm_box/*"
+ artifact_paths: "diagnostic_edmfx_trmm_box/output_active/*"
agents:
slurm_mem: 20GB
@@ -512,7 +514,7 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/diagnostic_edmfx_trmm_stretched_box.yml
- artifact_paths: "diagnostic_edmfx_trmm_stretched_box/*"
+ artifact_paths: "diagnostic_edmfx_trmm_stretched_box/output_active/*"
agents:
slurm_mem: 20GB
@@ -523,8 +525,8 @@ steps:
julia --color=yes --project=examples regression_tests/test_mse.jl
--job_id diagnostic_edmfx_aquaplanet
- --out_dir diagnostic_edmfx_aquaplanet
- artifact_paths: "diagnostic_edmfx_aquaplanet/*"
+ --out_dir diagnostic_edmfx_aquaplanet/output_active
+ artifact_paths: "diagnostic_edmfx_aquaplanet/output_active/*"
agents:
slurm_mem: 20GB
slurm_constraint: icelake|cascadelake|skylake|epyc
@@ -532,11 +534,12 @@ steps:
- group: "Prognostic EDMFX"
steps:
- - label: ":genie: Prognostic EDMFX advection test in a box"
+ - label: ":genie: Prognostic EDMFX advection test in a column"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
- --config_file $CONFIG_PATH/prognostic_edmfx_adv_test_box.yml
- artifact_paths: "prognostic_edmfx_adv_test_box/*"
+ --config_file $CONFIG_PATH/prognostic_edmfx_adv_test_column.yml
+ artifact_paths: "prognostic_edmfx_adv_test_column/output_active/*"
+
agents:
slurm_mem: 20GB
@@ -544,63 +547,79 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/prognostic_edmfx_simpleplume_column.yml
- artifact_paths: "prognostic_edmfx_simpleplume_column/*"
+ artifact_paths: "prognostic_edmfx_simpleplume_column/output_active/*"
agents:
slurm_mem: 20GB
- - label: ":genie: Prognostic EDMFX GABLS in a box"
+ - label: ":genie: Prognostic EDMFX GABLS in a column"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
- --config_file $CONFIG_PATH/prognostic_edmfx_gabls_box.yml
- artifact_paths: "prognostic_edmfx_gabls_box/*"
+ --config_file $CONFIG_PATH/prognostic_edmfx_gabls_column.yml
+ artifact_paths: "prognostic_edmfx_gabls_column/output_active/*"
agents:
slurm_mem: 20GB
- - label: ":genie: Prognostic EDMFX Bomex with precribed TKE in a box"
+ - label: ":genie: Prognostic EDMFX Bomex with precribed TKE in a column"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
- --config_file $CONFIG_PATH/prognostic_edmfx_bomex_fixtke_box.yml
- artifact_paths: "prognostic_edmfx_bomex_fixtke_box/*"
+ --config_file $CONFIG_PATH/prognostic_edmfx_bomex_fixtke_column.yml
+ artifact_paths: "prognostic_edmfx_bomex_fixtke_column/output_active/*"
agents:
slurm_mem: 20GB
- - label: ":genie: Prognostic EDMFX Bomex in a box"
+ - label: ":genie: Prognostic EDMFX Bomex stretched grid in a column"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
- --config_file $CONFIG_PATH/prognostic_edmfx_bomex_box.yml
- artifact_paths: "prognostic_edmfx_bomex_box/*"
+ --config_file $CONFIG_PATH/prognostic_edmfx_bomex_stretched_column.yml
+ artifact_paths: "prognostic_edmfx_bomex_stretched_column/output_active/*"
agents:
slurm_mem: 20GB
- - label: ":genie: Prognostic EDMFX Bomex stretched grid in a box"
+ - label: ":genie: Prognostic EDMFX Bomex in a column"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
- --config_file $CONFIG_PATH/prognostic_edmfx_bomex_stretched_box.yml
- artifact_paths: "prognostic_edmfx_bomex_stretched_box/*"
+ --config_file $CONFIG_PATH/prognostic_edmfx_bomex_column.yml
+ artifact_paths: "prognostic_edmfx_bomex_column/output_active/*"
agents:
slurm_mem: 20GB
- - label: ":genie: Prognostic EDMFX Dycoms RF01 in a box"
+ - label: ":genie: Prognostic EDMFX Dycoms RF01 in a column"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
- --config_file $CONFIG_PATH/prognostic_edmfx_dycoms_rf01_box.yml
- artifact_paths: "prognostic_edmfx_dycoms_rf01_box/*"
+ --config_file $CONFIG_PATH/prognostic_edmfx_dycoms_rf01_column.yml
+ artifact_paths: "prognostic_edmfx_dycoms_rf01_column/output_active/*"
agents:
slurm_mem: 20GB
- - label: ":genie: Prognostic EDMFX Rico in a column"
+ - label: ":umbrella: Prognostic EDMFX Rico in a column"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/prognostic_edmfx_rico_column.yml
- artifact_paths: "prognostic_edmfx_rico_column/*"
+ artifact_paths: "prognostic_edmfx_rico_column/output_active/*"
agents:
slurm_mem: 20GB
- - label: ":genie: Prognostic EDMFX TRMM in a column"
+ - label: ":umbrella: Prognostic EDMFX TRMM in a column"
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/prognostic_edmfx_trmm_column.yml
- artifact_paths: "prognostic_edmfx_trmm_column/*"
+ artifact_paths: "prognostic_edmfx_trmm_column/output_active/*"
+ agents:
+ slurm_mem: 20GB
+
+ - label: ":genie: Prognostic EDMFX TRMM in a column"
+ command: >
+ julia --color=yes --project=examples examples/hybrid/driver.jl
+ --config_file $CONFIG_PATH/prognostic_edmfx_trmm_column_0M.yml
+ artifact_paths: "prognostic_edmfx_trmm_column_0M/*"
+ agents:
+ slurm_mem: 20GB
+
+ - label: ":genie: Prognostic EDMFX Bomex in a box"
+ command: >
+ julia --color=yes --project=examples examples/hybrid/driver.jl
+ --config_file $CONFIG_PATH/prognostic_edmfx_bomex_box.yml
+ artifact_paths: "prognostic_edmfx_bomex_box/*"
agents:
slurm_mem: 20GB
@@ -608,7 +627,7 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $CONFIG_PATH/prognostic_edmfx_aquaplanet.yml
- artifact_paths: "prognostic_edmfx_aquaplanet/*"
+ artifact_paths: "prognostic_edmfx_aquaplanet/output_active/*"
agents:
slurm_mem: 20GB
@@ -620,20 +639,20 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $PERF_CONFIG_PATH/gpu_baroclinic_wave_rhoe.yml
- artifact_paths: "gpu_implicit_barowave_ref/*"
+ artifact_paths: "gpu_implicit_barowave_ref/output_active/*"
agents:
slurm_mem: 16G
slurm_gpus: 1
- label: "GPU: compare BW with CPU"
command: >
- tar xvf sphere_baroclinic_wave_rhoe/hdf5_files.tar -C sphere_baroclinic_wave_rhoe
+ tar xvf sphere_baroclinic_wave_rhoe/output_active/hdf5_files.tar -C sphere_baroclinic_wave_rhoe
- tar xvf gpu_baroclinic_wave_rhoe/hdf5_files.tar -C gpu_baroclinic_wave_rhoe
+ tar xvf gpu_baroclinic_wave_rhoe//output_active/hdf5_files.tar -C gpu_baroclinic_wave_rhoe
julia --color=yes --project=examples post_processing/compare_outputs.jl
- --output_folder_1 sphere_baroclinic_wave_rhoe/
- --output_folder_2 gpu_baroclinic_wave_rhoe/ --t_end 10days
+ --output_folder_1 sphere_baroclinic_wave_rhoe
+ --output_folder_2 gpu_baroclinic_wave_rhoe --t_end 10days
--compare_state false
depends_on:
- "sphere_baroclinic_wave_rhoe"
@@ -647,7 +666,7 @@ steps:
nsys profile --trace=nvtx,cuda --output=target_gpu_implicit_baroclinic_wave/report
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file ${GPU_CONFIG_PATH}target_gpu_implicit_baroclinic_wave.yml
- artifact_paths: "target_gpu_implicit_baroclinic_wave/*"
+ artifact_paths: "target_gpu_implicit_baroclinic_wave/output_active/*"
agents:
slurm_gpus: 1
slurm_mem: 32G
@@ -661,7 +680,7 @@ steps:
srun --cpu-bind=threads --cpus-per-task=4
julia --threads=3 --color=yes --project=examples examples/hybrid/driver.jl
--config_file ${GPU_CONFIG_PATH}target_gpu_implicit_baroclinic_wave_4process.yml
- artifact_paths: "target_gpu_implicit_baroclinic_wave_4process/*"
+ artifact_paths: "target_gpu_implicit_baroclinic_wave_4process/output_active/*"
env:
CLIMACORE_DISTRIBUTED: "MPI"
agents:
@@ -675,7 +694,7 @@ steps:
- >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $GPU_CONFIG_PATH/central_gpu_hs_rhoe_equil_55km_nz63_0M.yml
- artifact_paths: "central_gpu_hs_rhoe_equil_55km_nz63_0M/*"
+ artifact_paths: "central_gpu_hs_rhoe_equil_55km_nz63_0M/output_active/*"
agents:
slurm_gpus: 1
slurm_mem: 16G
@@ -684,10 +703,9 @@ steps:
command:
- mkdir -p gpu_aquaplanet_dyamond
- >
- nsys profile --trace=nvtx,cuda --output=gpu_aquaplanet_dyamond/report
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file ${GPU_CONFIG_PATH}gpu_aquaplanet_dyamond.yml
- artifact_paths: "gpu_aquaplanet_dyamond/*"
+ artifact_paths: "gpu_aquaplanet_dyamond/output_active/*"
agents:
slurm_gpus: 1
@@ -695,7 +713,7 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $GPU_CONFIG_PATH/gpu_diagnostic_edmfx_aquaplanet.yml
- artifact_paths: "gpu_diagnostic_edmfx_aquaplanet/*"
+ artifact_paths: "gpu_diagnostic_edmfx_aquaplanet/output_active/*"
agents:
slurm_gpus: 1
slurm_mem: 20G
@@ -704,7 +722,7 @@ steps:
command: >
julia --color=yes --project=examples examples/hybrid/driver.jl
--config_file $GPU_CONFIG_PATH/gpu_prognostic_edmfx_aquaplanet.yml
- artifact_paths: "gpu_prognostic_edmfx_aquaplanet/*"
+ artifact_paths: "gpu_prognostic_edmfx_aquaplanet/output_active/*"
agents:
slurm_gpus: 1
slurm_mem: 20G
@@ -718,7 +736,7 @@ steps:
julia --color=yes --project=examples perf/benchmark_dump.jl
--config_file $PERF_CONFIG_PATH/gpu_implicit_barowave_wrt_h_elem.yml
- artifact_paths: "gpu_implicit_barowave_wrt_h_elem/*"
+ artifact_paths: "gpu_implicit_barowave_wrt_h_elem/output_active/*"
agents:
slurm_gpus: 1
@@ -727,7 +745,7 @@ steps:
julia --color=yes --project=examples perf/benchmark_step.jl
--config_file $PERF_CONFIG_PATH/gpu_implicit_barowave.yml
- artifact_paths: "gpu_implicit_barowave/*"
+ artifact_paths: "gpu_implicit_barowave/output_active/*"
agents:
slurm_gpus: 1
@@ -736,7 +754,7 @@ steps:
julia --color=yes --project=examples perf/benchmark_step.jl
--config_file $PERF_CONFIG_PATH/gpu_implicit_barowave_moist.yml
- artifact_paths: "gpu_implicit_barowave_moist/*"
+ artifact_paths: "gpu_implicit_barowave_moist/output_active/*"
agents:
slurm_mem: 16G
slurm_gpus: 1
@@ -745,7 +763,7 @@ steps:
command: >
julia --color=yes --project=examples perf/benchmark_step.jl
--config_file $PERF_CONFIG_PATH/cpu_implicit_barowave.yml
- artifact_paths: "cpu_implicit_barowave/*"
+ artifact_paths: "cpu_implicit_barowave/output_active/*"
- group: "Performance"
steps:
diff --git a/Artifacts.toml b/Artifacts.toml
new file mode 100644
index 00000000000..81a5be8599a
--- /dev/null
+++ b/Artifacts.toml
@@ -0,0 +1,6 @@
+[aerosol2005]
+git-tree-sha1 = "9da4af348af2606764e5e2c94d9439714221dff1"
+
+ [[aerosol2005.download]]
+ sha256 = "952d723b8462439c266dc0df79d0d4e71f774559edb941e03b7979e8ad743f56"
+ url = "https://caltech.box.com/shared/static/chmel1vdthfvfac0yl61ayw2jqnjzr2c.gz"
diff --git a/NEWS.md b/NEWS.md
index 1078fc4305d..f3a77cba092 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -4,6 +4,21 @@ ClimaAtmos.jl Release Notes
Main
-------
+- ![][badge-✨feature/enhancement]![][badge-💥breaking]. Use
+ [ClimaUtilities](https://github.com/CliMA/ClimaUtilities.jl) for
+ `TimeVaryingInputs` to read in prescribed aerosol mass concentrations. This PR
+ is considered breaking because it changes `AtmosCache` adding a new field,
+ `tracers`. PR [#2815](https://github.com/CliMA/ClimaAtmos.jl/pull/2815).
+
+- ![][badge-✨feature/enhancement]![][badge-💥breaking]. Use
+ [ClimaUtilities](https://github.com/CliMA/ClimaUtilities.jl) for
+ `OutputPathGenerator` to handle where the output of a simulation should be
+ saved. Previously, the output was saved to a folder named `$job_id`. Now, it
+ is saved to `$job_id/output-active`, where `output-active` is a link that
+ points to `$job_id/output-XXXX`, with `XXXX` a counter that increases ever
+ time a simulation is run with this output directory. PR
+ [#2606](https://github.com/CliMA/ClimaAtmos.jl/pull/2606).
+
v0.22.1
-------
- ![][badge-🚀performance] Reduced the number of allocations in the NetCDF
diff --git a/Project.toml b/Project.toml
index 2590329ef0d..5d2e1fe1690 100644
--- a/Project.toml
+++ b/Project.toml
@@ -13,6 +13,7 @@ ClimaComms = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d"
ClimaCore = "d414da3d-4745-48bb-8d80-42e94e092884"
ClimaParams = "5c42b081-d73a-476f-9059-fd94b934656c"
ClimaTimeSteppers = "595c0a79-7f3d-439a-bc5a-b232dc3bde79"
+ClimaUtilities = "b3f4f4ca-9299-4f7f-bd9b-81e1242a7513"
CloudMicrophysics = "6a9e3e04-43cd-43ba-94b9-e8782df3c71b"
Colors = "5ae59095-9a9b-59fe-a467-6f913c188581"
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
@@ -53,6 +54,7 @@ ClimaComms = "0.5"
ClimaCore = "0.13"
ClimaParams = "0.10.4"
ClimaTimeSteppers = "0.7.18"
+ClimaUtilities = "0.1.3"
CloudMicrophysics = "0.18"
Colors = "0.12"
Dates = "1"
diff --git a/README.md b/README.md
index 82b87d8b02c..33bd8b686e9 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,7 @@
- ClimaAtmos.jl
+
+ClimaAtmos.jl
diff --git a/config/default_configs/default_config.yml b/config/default_configs/default_config.yml
index bf75c88f376..b63e5a3fd73 100644
--- a/config/default_configs/default_config.yml
+++ b/config/default_configs/default_config.yml
@@ -141,7 +141,7 @@ bubble:
value: true
start_date:
help: "Start date of the simulation"
- value: "19790101"
+ value: "20050117" # Where the current aerosol data begins
forcing:
help: "Forcing [`nothing` (default), `held_suarez`]"
value: ~
@@ -277,3 +277,6 @@ deep_atmosphere:
restart_file:
help: "Path to HDF5 file to use as simulation starting point"
value: ~
+prescribed_aerosols:
+ help: "Which aerosols to add. List of keys from the data file (e.g., CB1, CB2)."
+ value: []
diff --git a/config/default_configs/default_edmf_config.yml b/config/default_configs/default_edmf_config.yml
index 374d7cf2e23..2a1399fdf02 100644
--- a/config/default_configs/default_edmf_config.yml
+++ b/config/default_configs/default_edmf_config.yml
@@ -5,9 +5,12 @@ turbconv:
advection_test:
help: "Switches off all grid-scale and subgrid-scale momentum tendencies [`false` (default), `true`]"
value: false
-gs_tendency:
- help: "Turns on all grid-scale tendencies [`true` (default), `false`]"
- value: true
+zero_tendency:
+ help: "Turns off tendencies [`nothing` (default), `grid_scale`, `subgrid_scale`]"
+ value: ~
+implicit_sgs_advection:
+ help: "Whether to treat the subgrid-scale vertical advection tendency implicitly [`false` (default), `true`]"
+ value: false
edmf_coriolis:
help: "EDMF coriolis [`nothing` (default), `Bomex`,`LifeCycleTan2018`,`Rico`,`ARM_SGP`,`DYCOMS_RF01`,`DYCOMS_RF02`,`GABLS`]"
value: ~
diff --git a/config/gpu_configs/gpu_aquaplanet_dyamond.yml b/config/gpu_configs/gpu_aquaplanet_dyamond.yml
index 45c0cb9d9e1..4cfbeecfe29 100644
--- a/config/gpu_configs/gpu_aquaplanet_dyamond.yml
+++ b/config/gpu_configs/gpu_aquaplanet_dyamond.yml
@@ -18,5 +18,6 @@ surface_setup: "DefaultMoninObukhov"
rayleigh_sponge: true
dt: "100secs"
t_end: "12hours"
+prescribed_aerosols: ["CB1", "CB2", "DST01", "DST02", "DST03", "DST04", "OC1", "OC2", "SO4", "SOA", "SSLT01", "SSLT02", "SSLT03", "SSLT04"]
job_id: "gpu_aquaplanet_dyamond"
toml: [toml/longrun_aquaplanet_dyamond.toml]
diff --git a/config/gpu_configs/gpu_prognostic_edmfx_aquaplanet.yml b/config/gpu_configs/gpu_prognostic_edmfx_aquaplanet.yml
index 43972f80998..53ed848b1a8 100644
--- a/config/gpu_configs/gpu_prognostic_edmfx_aquaplanet.yml
+++ b/config/gpu_configs/gpu_prognostic_edmfx_aquaplanet.yml
@@ -15,7 +15,7 @@ precip_model: 0M
dt: 10secs
t_end: 1hours
dt_save_to_disk: 600secs
-toml: [toml/prognostic_edmfx_box.toml]
+toml: [toml/prognostic_edmfx.toml]
output_default_diagnostics: false
diagnostics:
- short_name: [ts, ta, thetaa, ha, pfull, rhoa, ua, va, wa, hfes, hur, hus, cl, clw, cli, evspsbl, rsd, rsu, rld, rlu]
diff --git a/config/longrun_configs/longrun_aquaplanet_rhoe_equil_55km_nz63_clearsky_progedmf_diffonly_0M.yml b/config/longrun_configs/longrun_aquaplanet_rhoe_equil_55km_nz63_clearsky_progedmf_diffonly_0M.yml
new file mode 100644
index 00000000000..90ed3254c31
--- /dev/null
+++ b/config/longrun_configs/longrun_aquaplanet_rhoe_equil_55km_nz63_clearsky_progedmf_diffonly_0M.yml
@@ -0,0 +1,30 @@
+h_elem: 16
+z_max: 55000.0
+z_elem: 63
+dz_bottom: 30.0
+dz_top: 3000.0
+moist: "equil"
+precip_model: "0M"
+override_τ_precip: false
+rad: "clearsky"
+dt_rad: "6hours"
+surface_setup: "DefaultMoninObukhov"
+turbconv: "prognostic_edmfx"
+implicit_diffusion: true
+approximate_linear_solve_iters: 2
+max_newton_iters_ode: 3
+zero_tendency: "subgrid_scale"
+prognostic_tke: true
+edmfx_upwinding: "first_order"
+edmfx_entr_model: "Generalized"
+edmfx_detr_model: "Generalized"
+edmfx_nh_pressure: false
+edmfx_velocity_relaxation: true
+edmfx_sgs_mass_flux: false
+edmfx_sgs_diffusive_flux: true
+rayleigh_sponge: true
+dt_save_state_to_disk: "10days"
+dt: "100secs"
+t_end: "30days"
+job_id: "longrun_aquaplanet_rhoe_equil_55km_nz63_clearsky_progedmf_diffonly_0M"
+toml: [toml/longrun_aquaplanet_rhoe_equil_55km_nz63_clearsky_progedmf_0M.toml]
diff --git a/config/model_configs/prognostic_edmfx_adv_test_box.yml b/config/model_configs/prognostic_edmfx_adv_test_column.yml
similarity index 77%
rename from config/model_configs/prognostic_edmfx_adv_test_box.yml
rename to config/model_configs/prognostic_edmfx_adv_test_column.yml
index 7191721684d..881f82cf398 100644
--- a/config/model_configs/prognostic_edmfx_adv_test_box.yml
+++ b/config/model_configs/prognostic_edmfx_adv_test_column.yml
@@ -1,14 +1,11 @@
-job_id: "prognostic_edmfx_adv_test_box"
+job_id: "prognostic_edmfx_adv_test_column"
initial_condition: "MoistAdiabaticProfileEDMFX"
advection_test: true
turbconv: "prognostic_edmfx"
ode_algo: "SSP33ShuOsher"
edmfx_upwinding: "first_order"
-config: "box"
+config: "column"
moist: "equil"
-hyperdiff: "true"
-x_max: 1e8
-y_max: 1e8
z_max: 5.5e4
x_elem: 2
y_elem: 2
@@ -19,9 +16,9 @@ dt: "10secs"
t_end: "3600secs"
dt_save_state_to_disk: "100secs"
FLOAT_TYPE: "Float64"
-toml: [toml/prognostic_edmfx_box_advection.toml]
+toml: [toml/prognostic_edmfx_advection.toml]
netcdf_output_at_levels: true
-netcdf_interpolation_num_points: [8, 8, 63]
+netcdf_interpolation_num_points: [2, 2, 63]
diagnostics:
- short_name: [ts, ta, thetaa, ha, pfull, rhoa, ua, va, wa, hur, hus, cl, clw, cli, hussfc, evspsbl]
period: 10mins
diff --git a/config/model_configs/prognostic_edmfx_aquaplanet.yml b/config/model_configs/prognostic_edmfx_aquaplanet.yml
index cb429c0a73c..b8a11ab16eb 100644
--- a/config/model_configs/prognostic_edmfx_aquaplanet.yml
+++ b/config/model_configs/prognostic_edmfx_aquaplanet.yml
@@ -15,7 +15,7 @@ precip_model: 0M
dt: 10secs
t_end: 1hours
dt_save_state_to_disk: 600secs
-toml: [toml/prognostic_edmfx_box.toml]
+toml: [toml/prognostic_edmfx.toml]
output_default_diagnostics: false
diagnostics:
- short_name: [ts, ta, thetaa, ha, pfull, rhoa, ua, va, wa, hfes, hur, hus, cl, clw, cli, evspsbl, rsd, rsu, rld, rlu]
diff --git a/config/model_configs/prognostic_edmfx_bomex_box.yml b/config/model_configs/prognostic_edmfx_bomex_box.yml
index 6a9e419895b..6b55e27780e 100644
--- a/config/model_configs/prognostic_edmfx_bomex_box.yml
+++ b/config/model_configs/prognostic_edmfx_bomex_box.yml
@@ -6,6 +6,7 @@ ls_adv: "Bomex"
surface_setup: "Bomex"
turbconv: "prognostic_edmfx"
implicit_diffusion: true
+implicit_sgs_advection: true
approximate_linear_solve_iters: 2
max_newton_iters_ode: 3
edmfx_upwinding: first_order
@@ -30,11 +31,13 @@ perturb_initstate: false
dt: "50secs"
t_end: "6hours"
dt_save_state_to_disk: "30mins"
-toml: [toml/prognostic_edmfx_bomex_box.toml]
+toml: [toml/prognostic_edmfx_bomex.toml]
netcdf_output_at_levels: true
netcdf_interpolation_num_points: [8, 8, 60]
diagnostics:
- short_name: [ts, ta, thetaa, ha, pfull, rhoa, ua, va, wa, hur, hus, cl, clw, cli, hussfc, evspsbl]
period: 10mins
- - short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke, lmix]
+ - short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke]
+ period: 10mins
+ - short_name: [entr, detr, lmix, bgrad, strain, edt, evu]
period: 10mins
diff --git a/config/model_configs/prognostic_edmfx_bomex_column.yml b/config/model_configs/prognostic_edmfx_bomex_column.yml
new file mode 100644
index 00000000000..3c842d8acdb
--- /dev/null
+++ b/config/model_configs/prognostic_edmfx_bomex_column.yml
@@ -0,0 +1,38 @@
+job_id: "prognostic_edmfx_bomex_column"
+initial_condition: "Bomex"
+subsidence: "Bomex"
+edmf_coriolis: "Bomex"
+ls_adv: "Bomex"
+surface_setup: "Bomex"
+turbconv: "prognostic_edmfx"
+implicit_diffusion: true
+implicit_sgs_advection: true
+approximate_linear_solve_iters: 2
+max_newton_iters_ode: 3
+edmfx_upwinding: first_order
+edmfx_entr_model: "Generalized"
+edmfx_detr_model: "Generalized"
+edmfx_sgs_mass_flux: true
+edmfx_sgs_diffusive_flux: true
+edmfx_nh_pressure: true
+edmfx_velocity_relaxation: true
+prognostic_tke: true
+moist: "equil"
+config: "column"
+z_max: 3e3
+z_elem: 60
+z_stretch: false
+perturb_initstate: false
+dt: "50secs"
+t_end: "6hours"
+dt_save_to_disk: "10mins"
+toml: [toml/prognostic_edmfx_bomex.toml]
+netcdf_output_at_levels: true
+netcdf_interpolation_num_points: [2, 2, 60]
+diagnostics:
+ - short_name: [ts, ta, thetaa, ha, pfull, rhoa, ua, va, wa, hur, hus, cl, clw, cli, hussfc, evspsbl]
+ period: 10mins
+ - short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke]
+ period: 10mins
+ - short_name: [entr, detr, lmix, bgrad, strain, edt, evu]
+ period: 10mins
diff --git a/config/model_configs/prognostic_edmfx_bomex_fixtke_box.yml b/config/model_configs/prognostic_edmfx_bomex_fixtke_column.yml
similarity index 77%
rename from config/model_configs/prognostic_edmfx_bomex_fixtke_box.yml
rename to config/model_configs/prognostic_edmfx_bomex_fixtke_column.yml
index d146d6b9835..25e9b936404 100644
--- a/config/model_configs/prognostic_edmfx_bomex_fixtke_box.yml
+++ b/config/model_configs/prognostic_edmfx_bomex_fixtke_column.yml
@@ -1,4 +1,4 @@
-job_id: "prognostic_edmfx_bomex_fixtke_box"
+job_id: "prognostic_edmfx_bomex_fixtke_column"
initial_condition: "Bomex"
subsidence: "Bomex"
edmf_coriolis: "Bomex"
@@ -14,10 +14,7 @@ edmfx_nh_pressure: true
edmfx_velocity_relaxation: true
prognostic_tke: false
moist: "equil"
-config: "box"
-hyperdiff: "true"
-x_max: 1e8
-y_max: 1e8
+config: "column"
z_max: 3e3
x_elem: 2
y_elem: 2
@@ -27,11 +24,13 @@ perturb_initstate: false
dt: "5secs"
t_end: "6hours"
dt_save_state_to_disk: "10mins"
-toml: [toml/prognostic_edmfx_bomex_box.toml]
+toml: [toml/prognostic_edmfx_bomex.toml]
netcdf_output_at_levels: true
-netcdf_interpolation_num_points: [8, 8, 60]
+netcdf_interpolation_num_points: [2, 2, 60]
diagnostics:
- short_name: [ts, ta, thetaa, ha, pfull, rhoa, ua, va, wa, hur, hus, cl, clw, cli, hussfc, evspsbl]
period: 10mins
- - short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke, lmix]
+ - short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke]
+ period: 10mins
+ - short_name: [entr, detr, lmix, bgrad, strain, edt, evu]
period: 10mins
diff --git a/config/model_configs/prognostic_edmfx_bomex_stretched_box.yml b/config/model_configs/prognostic_edmfx_bomex_stretched_column.yml
similarity index 77%
rename from config/model_configs/prognostic_edmfx_bomex_stretched_box.yml
rename to config/model_configs/prognostic_edmfx_bomex_stretched_column.yml
index b4df0106018..360f686dac5 100644
--- a/config/model_configs/prognostic_edmfx_bomex_stretched_box.yml
+++ b/config/model_configs/prognostic_edmfx_bomex_stretched_column.yml
@@ -1,4 +1,4 @@
-job_id: "prognostic_edmfx_bomex_stretched_box"
+job_id: "prognostic_edmfx_bomex_stretched_column"
initial_condition: "Bomex"
subsidence: "Bomex"
edmf_coriolis: "Bomex"
@@ -6,6 +6,7 @@ ls_adv: "Bomex"
surface_setup: "Bomex"
turbconv: "prognostic_edmfx"
implicit_diffusion: true
+implicit_sgs_advection: true
approximate_linear_solve_iters: 2
max_newton_iters_ode: 3
edmfx_upwinding: first_order
@@ -17,10 +18,8 @@ edmfx_nh_pressure: true
edmfx_velocity_relaxation: true
prognostic_tke: true
moist: "equil"
-config: "box"
+config: "column"
hyperdiff: "true"
-x_max: 1e8
-y_max: 1e8
z_max: 3e3
x_elem: 2
y_elem: 2
@@ -31,11 +30,13 @@ perturb_initstate: false
dt: "50secs"
t_end: "6hours"
dt_save_state_to_disk: "10mins"
-toml: [toml/prognostic_edmfx_bomex_box.toml]
+toml: [toml/prognostic_edmfx_bomex.toml]
netcdf_output_at_levels: true
-netcdf_interpolation_num_points: [8, 8, 30]
+netcdf_interpolation_num_points: [2, 2, 30]
diagnostics:
- short_name: [ts, ta, thetaa, ha, pfull, rhoa, ua, va, wa, hur, hus, cl, clw, cli, hussfc, evspsbl]
period: 10mins
- - short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke, lmix]
+ - short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke]
+ period: 10mins
+ - short_name: [entr, detr, lmix, bgrad, strain, edt, evu]
period: 10mins
diff --git a/config/model_configs/prognostic_edmfx_dycoms_rf01_box.yml b/config/model_configs/prognostic_edmfx_dycoms_rf01_column.yml
similarity index 77%
rename from config/model_configs/prognostic_edmfx_dycoms_rf01_box.yml
rename to config/model_configs/prognostic_edmfx_dycoms_rf01_column.yml
index 57cdd14155f..c7a099625e4 100644
--- a/config/model_configs/prognostic_edmfx_dycoms_rf01_box.yml
+++ b/config/model_configs/prognostic_edmfx_dycoms_rf01_column.yml
@@ -1,4 +1,4 @@
-job_id: prognostic_edmfx_dycoms_rf01_box
+job_id: prognostic_edmfx_dycoms_rf01_column
initial_condition: DYCOMS_RF01
subsidence: DYCOMS
edmf_coriolis: DYCOMS_RF01
@@ -6,6 +6,7 @@ rad: DYCOMS_RF01
surface_setup: DYCOMS_RF01
turbconv: prognostic_edmfx
implicit_diffusion: true
+implicit_sgs_advection: true
approximate_linear_solve_iters: 2
max_newton_iters_ode: 3
edmfx_upwinding: first_order
@@ -18,10 +19,8 @@ edmfx_nh_pressure: true
edmfx_velocity_relaxation: true
prognostic_tke: true
moist: equil
-config: box
+config: column
hyperdiff: "true"
-x_max: 1e8
-y_max: 1e8
z_max: 1500
x_elem: 2
y_elem: 2
@@ -30,11 +29,13 @@ z_stretch: false
dt: 40secs
t_end: 4hours
dt_save_state_to_disk: 10mins
-toml: [toml/prognostic_edmfx_dycoms_rf01_box.toml]
+toml: [toml/prognostic_edmfx_dycoms_rf01.toml]
netcdf_output_at_levels: true
-netcdf_interpolation_num_points: [8, 8, 30]
+netcdf_interpolation_num_points: [2, 2, 30]
diagnostics:
- short_name: [ts, ta, thetaa, ha, pfull, rhoa, ua, va, wa, hur, hus, cl, clw, cli, hussfc, evspsbl]
period: 10mins
- - short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke, lmix]
+ - short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke]
+ period: 10mins
+ - short_name: [entr, detr, lmix, bgrad, strain, edt, evu]
period: 10mins
diff --git a/config/model_configs/prognostic_edmfx_gabls_box.yml b/config/model_configs/prognostic_edmfx_gabls_column.yml
similarity index 77%
rename from config/model_configs/prognostic_edmfx_gabls_box.yml
rename to config/model_configs/prognostic_edmfx_gabls_column.yml
index db7891b0bc4..67b078e9256 100644
--- a/config/model_configs/prognostic_edmfx_gabls_box.yml
+++ b/config/model_configs/prognostic_edmfx_gabls_column.yml
@@ -1,9 +1,10 @@
-job_id: "prognostic_edmfx_gabls_box"
+job_id: "prognostic_edmfx_gabls_column"
initial_condition: GABLS
edmf_coriolis: GABLS
surface_setup: GABLS
turbconv: "prognostic_edmfx"
implicit_diffusion: true
+implicit_sgs_advection: true
approximate_linear_solve_iters: 2
max_newton_iters_ode: 3
edmfx_upwinding: "first_order"
@@ -15,10 +16,8 @@ edmfx_nh_pressure: true
edmfx_velocity_relaxation: true
prognostic_tke: true
moist: "equil"
-config: "box"
+config: "column"
hyperdiff: "true"
-x_max: 1e8
-y_max: 1e8
z_max: 400
x_elem: 2
y_elem: 2
@@ -28,11 +27,13 @@ dt: "60secs"
t_end: "9hours"
dt_save_state_to_disk: "30mins"
perturb_initstate: false
-toml: [toml/prognostic_edmfx_box.toml]
+toml: [toml/prognostic_edmfx.toml]
netcdf_output_at_levels: true
-netcdf_interpolation_num_points: [8, 8, 8]
+netcdf_interpolation_num_points: [2, 2, 8]
diagnostics:
- short_name: [ts, ta, thetaa, ha, pfull, rhoa, ua, va, wa, hur, hus, cl, clw, cli, hussfc, evspsbl]
period: 10mins
- - short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke, lmix]
+ - short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke]
+ period: 10mins
+ - short_name: [entr, detr, lmix, bgrad, strain, edt, evu]
period: 10mins
diff --git a/config/model_configs/prognostic_edmfx_rico_column.yml b/config/model_configs/prognostic_edmfx_rico_column.yml
index c4bd76f6286..24ce74c8f12 100644
--- a/config/model_configs/prognostic_edmfx_rico_column.yml
+++ b/config/model_configs/prognostic_edmfx_rico_column.yml
@@ -13,7 +13,7 @@ edmfx_nh_pressure: true
edmfx_velocity_relaxation: true
prognostic_tke: true
moist: "equil"
-precip_model: "0M"
+precip_model: "1M"
config: "column"
z_max: 4e3
x_elem: 2
@@ -24,11 +24,15 @@ perturb_initstate: false
dt: "5secs"
t_end: "6hours"
dt_save_state_to_disk: "10mins"
-toml: [toml/prognostic_edmfx_box.toml]
+toml: [toml/prognostic_edmfx.toml]
netcdf_output_at_levels: true
netcdf_interpolation_num_points: [8, 8, 100]
diagnostics:
- short_name: [ts, ta, thetaa, ha, pfull, rhoa, ua, va, wa, hur, hus, cl, clw, cli, hussfc, evspsbl]
period: 10mins
- - short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke, lmix]
+ - short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke]
+ period: 10mins
+ - short_name: [entr, detr, lmix, bgrad, strain, edt, evu]
+ period: 10mins
+ - short_name: [husra, hussn]
period: 10mins
diff --git a/config/model_configs/prognostic_edmfx_simpleplume_column.yml b/config/model_configs/prognostic_edmfx_simpleplume_column.yml
index 6d387684d03..23a76c3f7aa 100644
--- a/config/model_configs/prognostic_edmfx_simpleplume_column.yml
+++ b/config/model_configs/prognostic_edmfx_simpleplume_column.yml
@@ -3,9 +3,10 @@ initial_condition: "SimplePlume"
surface_setup: "SimplePlume"
turbconv: "prognostic_edmfx"
implicit_diffusion: true
+implicit_sgs_advection: true
approximate_linear_solve_iters: 2
max_newton_iters_ode: 3
-gs_tendency: false
+zero_tendency: "grid_scale"
edmfx_upwinding: first_order
edmfx_entr_model: "Generalized"
edmfx_detr_model: "Generalized"
@@ -29,5 +30,7 @@ netcdf_interpolation_num_points: [2, 2, 80]
diagnostics:
- short_name: [ts, ta, thetaa, ha, pfull, rhoa, ua, va, wa, hur, hus, cl, clw, cli, hussfc, evspsbl]
period: 10mins
- - short_name: [arup, waup, taup, rhoaup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke, lmix]
+ - short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke]
+ period: 10mins
+ - short_name: [entr, detr, lmix, bgrad, strain, edt, evu]
period: 10mins
diff --git a/config/model_configs/prognostic_edmfx_trmm_column.yml b/config/model_configs/prognostic_edmfx_trmm_column.yml
index 7bb47d44fb5..63683c3de5a 100644
--- a/config/model_configs/prognostic_edmfx_trmm_column.yml
+++ b/config/model_configs/prognostic_edmfx_trmm_column.yml
@@ -13,7 +13,7 @@ edmfx_velocity_relaxation: true
prognostic_tke: true
moist: equil
apply_limiter: false
-precip_model: "0M"
+precip_model: "1M"
config: column
z_max: 16400
x_elem: 2
@@ -24,11 +24,15 @@ dt: 5secs
t_end: 6hours
dt_save_state_to_disk: 10mins
FLOAT_TYPE: "Float64"
-toml: [toml/prognostic_edmfx_box.toml]
+toml: [toml/prognostic_edmfx.toml]
netcdf_output_at_levels: true
netcdf_interpolation_num_points: [8, 8, 82]
diagnostics:
- short_name: [ts, ta, thetaa, ha, pfull, rhoa, ua, va, wa, hur, hus, cl, clw, cli, hussfc, evspsbl]
period: 10mins
- - short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke, lmix]
+ - short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke]
+ period: 10mins
+ - short_name: [entr, detr, lmix, bgrad, strain, edt, evu]
+ period: 10mins
+ - short_name: [husra, hussn]
period: 10mins
diff --git a/config/model_configs/prognostic_edmfx_trmm_column_0M.yml b/config/model_configs/prognostic_edmfx_trmm_column_0M.yml
new file mode 100644
index 00000000000..eb019a4e3cb
--- /dev/null
+++ b/config/model_configs/prognostic_edmfx_trmm_column_0M.yml
@@ -0,0 +1,34 @@
+job_id: prognostic_edmfx_trmm_column_0M
+initial_condition: TRMM_LBA
+rad: TRMM_LBA
+surface_setup: TRMM_LBA
+turbconv: prognostic_edmfx
+edmfx_upwinding: first_order
+edmfx_entr_model: "Generalized"
+edmfx_detr_model: "Generalized"
+edmfx_sgs_mass_flux: true
+edmfx_sgs_diffusive_flux: true
+edmfx_nh_pressure: true
+edmfx_velocity_relaxation: true
+prognostic_tke: true
+moist: equil
+apply_limiter: false
+precip_model: "0M"
+config: column
+z_max: 16400
+x_elem: 2
+y_elem: 2
+z_elem: 82
+z_stretch: false
+dt: 5secs
+t_end: 6hours
+dt_save_state_to_disk: 10mins
+FLOAT_TYPE: "Float64"
+toml: [toml/prognostic_edmfx.toml]
+netcdf_output_at_levels: true
+netcdf_interpolation_num_points: [8, 8, 82]
+diagnostics:
+ - short_name: [ts, ta, thetaa, ha, pfull, rhoa, ua, va, wa, hur, hus, cl, clw, cli, hussfc, evspsbl]
+ period: 10mins
+ - short_name: [arup, waup, taup, thetaaup, haup, husup, hurup, clwup, cliup, waen, taen, thetaaen, haen, husen, huren, clwen, clien, tke, lmix]
+ period: 10mins
diff --git a/config/model_configs/sphere_aquaplanet_rhoe_equilmoist_allsky_gw_res.yml b/config/model_configs/sphere_aquaplanet_rhoe_equilmoist_allsky_gw_res.yml
index 2b6ec404197..ad8a56093b4 100644
--- a/config/model_configs/sphere_aquaplanet_rhoe_equilmoist_allsky_gw_res.yml
+++ b/config/model_configs/sphere_aquaplanet_rhoe_equilmoist_allsky_gw_res.yml
@@ -15,5 +15,10 @@ rayleigh_sponge: true
non_orographic_gravity_wave: true
orographic_gravity_wave: "gfdl_restart"
surface_setup: "DefaultMoninObukhov"
+prescribed_aerosols: ["CB1", "CB2"]
job_id: "sphere_aquaplanet_rhoe_equilmoist_allsky_gw_res"
toml: [toml/sphere_aquaplanet_rhoe_equilmoist_allsky_gw_res.toml]
+diagnostics:
+ - short_name: [edt, evu]
+ reduction_time: average
+ period: "1days"
diff --git a/config/mpi_configs/restart_mpi_baroclinic_wave_rhoe.yml b/config/mpi_configs/restart_mpi_baroclinic_wave_rhoe.yml
index 2d1c7373e4f..0e4abd2ca34 100644
--- a/config/mpi_configs/restart_mpi_baroclinic_wave_rhoe.yml
+++ b/config/mpi_configs/restart_mpi_baroclinic_wave_rhoe.yml
@@ -1,4 +1,4 @@
job_id: "restart_mpi_baroclinic_wave_rhoe"
t_end: "20days"
initial_condition: "DryBaroclinicWave"
-restart_file: "mpi_make_restart/day5.0.hdf5"
+restart_file: "mpi_make_restart/output_active/day5.0.hdf5"
diff --git a/config/perf_configs/flame_perf_target_prognostic_edmfx_aquaplanet.yml b/config/perf_configs/flame_perf_target_prognostic_edmfx_aquaplanet.yml
index 33c7648e68f..fead8459e77 100644
--- a/config/perf_configs/flame_perf_target_prognostic_edmfx_aquaplanet.yml
+++ b/config/perf_configs/flame_perf_target_prognostic_edmfx_aquaplanet.yml
@@ -3,6 +3,8 @@ surface_setup: DefaultExchangeCoefficients
rad: gray
vert_diff: "false"
turbconv: prognostic_edmfx
+implicit_diffusion: true
+implicit_sgs_advection: true
prognostic_tke: true
edmfx_upwinding: first_order
edmfx_entr_model: "Generalized"
@@ -15,4 +17,4 @@ precip_model: 0M
dt: 10secs
t_end: 1hours
dt_save_state_to_disk: 600secs
-toml: [toml/prognostic_edmfx_box.toml]
+toml: [toml/prognostic_edmfx.toml]
diff --git a/docs/Manifest.toml b/docs/Manifest.toml
index 50373bc4163..f63eab364e9 100644
--- a/docs/Manifest.toml
+++ b/docs/Manifest.toml
@@ -41,6 +41,27 @@ git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177"
uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
version = "0.4.5"
+[[deps.Accessors]]
+deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown", "Test"]
+git-tree-sha1 = "c0d491ef0b135fd7d63cbc6404286bc633329425"
+uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"
+version = "0.1.36"
+
+ [deps.Accessors.extensions]
+ AccessorsAxisKeysExt = "AxisKeys"
+ AccessorsIntervalSetsExt = "IntervalSets"
+ AccessorsStaticArraysExt = "StaticArrays"
+ AccessorsStructArraysExt = "StructArrays"
+ AccessorsUnitfulExt = "Unitful"
+
+ [deps.Accessors.weakdeps]
+ AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5"
+ IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
+ Requires = "ae029012-a4dd-5104-9daa-d747884805df"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+ StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
+ Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
+
[[deps.Adapt]]
deps = ["LinearAlgebra", "Requires"]
git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099"
@@ -186,9 +207,9 @@ version = "0.1.5"
[[deps.BlockArrays]]
deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra"]
-git-tree-sha1 = "3c62e3006c23082d2ae524b468298d27788a8502"
+git-tree-sha1 = "9a9610fbe5779636f75229e423e367124034af41"
uuid = "8e7c35d0-a365-5155-bbbb-fb81a777f24e"
-version = "0.16.40"
+version = "0.16.43"
[[deps.Blosc_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Lz4_jll", "Zlib_jll", "Zstd_jll"]
@@ -298,16 +319,16 @@ weakdeps = ["SparseArrays"]
ChainRulesCoreSparseArraysExt = "SparseArrays"
[[deps.ClimaAtmos]]
-deps = ["Adapt", "ArgParse", "ArtifactWrappers", "Artifacts", "AtmosphericProfilesLibrary", "ClimaComms", "ClimaCore", "ClimaParams", "ClimaTimeSteppers", "CloudMicrophysics", "Colors", "Dates", "Dierckx", "DiffEqBase", "DiffEqCallbacks", "DocStringExtensions", "FastGaussQuadrature", "Insolation", "Interpolations", "IntervalSets", "Krylov", "LinearAlgebra", "Logging", "NCDatasets", "NVTX", "Pkg", "Printf", "RRTMGP", "Random", "RootSolvers", "SciMLBase", "StaticArrays", "Statistics", "StatsBase", "SurfaceFluxes", "Thermodynamics", "YAML"]
+deps = ["Adapt", "ArgParse", "ArtifactWrappers", "Artifacts", "AtmosphericProfilesLibrary", "ClimaComms", "ClimaCore", "ClimaParams", "ClimaTimeSteppers", "ClimaUtilities", "CloudMicrophysics", "Colors", "Dates", "Dierckx", "DiffEqBase", "DiffEqCallbacks", "DocStringExtensions", "FastGaussQuadrature", "Insolation", "Interpolations", "IntervalSets", "Krylov", "LinearAlgebra", "Logging", "NCDatasets", "NVTX", "Pkg", "Printf", "RRTMGP", "Random", "RootSolvers", "SciMLBase", "StaticArrays", "Statistics", "StatsBase", "SurfaceFluxes", "Thermodynamics", "YAML"]
path = ".."
uuid = "b2c96348-7fb7-4fe0-8da9-78d88439e717"
version = "0.22.1"
[[deps.ClimaComms]]
deps = ["CUDA", "MPI"]
-git-tree-sha1 = "f0350e34c91c8f3b5a11b5e39990439303d727b1"
+git-tree-sha1 = "ef5d206be51fdf62cd0cbd63058e237128652cf7"
uuid = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d"
-version = "0.5.7"
+version = "0.5.8"
[[deps.ClimaCore]]
deps = ["Adapt", "BandedMatrices", "BlockArrays", "CUDA", "ClimaComms", "CubedSphere", "DataStructures", "DocStringExtensions", "ForwardDiff", "GaussQuadrature", "GilbertCurves", "HDF5", "InteractiveUtils", "IntervalSets", "KrylovKit", "LinearAlgebra", "PkgVersion", "RecursiveArrayTools", "RootSolvers", "SparseArrays", "Static", "StaticArrays", "Statistics", "Unrolled"]
@@ -331,6 +352,30 @@ git-tree-sha1 = "9c203f39784c968700c55f555754a7771b3410df"
uuid = "595c0a79-7f3d-439a-bc5a-b232dc3bde79"
version = "0.7.19"
+[[deps.ClimaUtilities]]
+deps = ["Artifacts", "CFTime", "Dates"]
+git-tree-sha1 = "d1b30a07829248b325ffffbb739d0f6fe79dfe7c"
+uuid = "b3f4f4ca-9299-4f7f-bd9b-81e1242a7513"
+version = "0.1.3"
+
+ [deps.ClimaUtilities.extensions]
+ DataHandlingExt = ["ClimaCore", "NCDatasets"]
+ InterpolationsRegridderExt = ["Interpolations", "ClimaCore"]
+ MPIUtilsExt = "ClimaComms"
+ NCFileReaderExt = "NCDatasets"
+ SpaceVaryingInputsExt = ["ClimaCore", "NCDatasets"]
+ TempestRegridderExt = "ClimaCoreTempestRemap"
+ TimeVaryingInputs0DExt = "ClimaCore"
+ TimeVaryingInputsExt = ["ClimaCore", "NCDatasets"]
+
+ [deps.ClimaUtilities.weakdeps]
+ Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
+ ClimaComms = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d"
+ ClimaCore = "d414da3d-4745-48bb-8d80-42e94e092884"
+ ClimaCoreTempestRemap = "d934ef94-cdd4-4710-83d6-720549644b70"
+ Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59"
+ NCDatasets = "85f8d34a-cbdd-5861-8df4-14fed0d494ab"
+
[[deps.CloseOpenIntervals]]
deps = ["Static", "StaticArrayInterface"]
git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1"
@@ -420,6 +465,20 @@ deps = ["Artifacts", "Libdl"]
uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"
version = "1.1.0+0"
+[[deps.CompositionsBase]]
+git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad"
+uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b"
+version = "0.1.2"
+weakdeps = ["InverseFunctions"]
+
+ [deps.CompositionsBase.extensions]
+ CompositionsBaseInverseFunctionsExt = "InverseFunctions"
+
+[[deps.ConcreteStructs]]
+git-tree-sha1 = "f749037478283d372048690eb3b5f92a79432b34"
+uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471"
+version = "0.2.3"
+
[[deps.ConstructionBase]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "260fd2400ed2dab602a7c15cf10c1933c59930a2"
@@ -432,9 +491,9 @@ weakdeps = ["IntervalSets", "StaticArrays"]
ConstructionBaseStaticArraysExt = "StaticArrays"
[[deps.Contour]]
-git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781"
+git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8"
uuid = "d38c429a-6771-53c6-b99e-75d170b6e991"
-version = "0.6.2"
+version = "0.6.3"
[[deps.CpuId]]
deps = ["Markdown"]
@@ -504,10 +563,10 @@ uuid = "cd4c43a9-7502-52ba-aa6d-59fb2a88580b"
version = "0.1.0+0"
[[deps.DiffEqBase]]
-deps = ["ArrayInterface", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "ForwardDiff", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PreallocationTools", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "SparseArrays", "Static", "StaticArraysCore", "Statistics", "Tricks", "TruncatedStacktraces"]
-git-tree-sha1 = "b19b2bb1ecd1271334e4b25d605e50f75e68fcae"
+deps = ["ArrayInterface", "ConcreteStructs", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "FastClosures", "ForwardDiff", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PreallocationTools", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "SparseArrays", "Static", "StaticArraysCore", "Statistics", "Tricks", "TruncatedStacktraces"]
+git-tree-sha1 = "4fa023dbb15b3485426bbc6c43e030c14250d664"
uuid = "2b5f629d-d688-5b77-993f-72d75c75574e"
-version = "6.148.0"
+version = "6.149.0"
[deps.DiffEqBase.extensions]
DiffEqBaseChainRulesCoreExt = "ChainRulesCore"
@@ -638,9 +697,9 @@ uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56"
version = "1.0.4"
[[deps.EnzymeCore]]
-git-tree-sha1 = "2c0192b96d5c45dbfb0f54e8cfb1256fece7b4ff"
+git-tree-sha1 = "18394bc78ac2814ff38fe5e0c9dc2cd171e2810c"
uuid = "f151be2c-9106-41f4-ab19-57ee4f262869"
-version = "0.7.1"
+version = "0.7.2"
weakdeps = ["Adapt"]
[deps.EnzymeCore.extensions]
@@ -736,10 +795,10 @@ version = "0.9.21"
uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee"
[[deps.FillArrays]]
-deps = ["LinearAlgebra", "Random"]
-git-tree-sha1 = "5b93957f6dcd33fc343044af3d48c215be2562f1"
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "bfe82a708416cf00b73a3198db0859c82f741558"
uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"
-version = "1.9.3"
+version = "1.10.0"
weakdeps = ["PDMats", "SparseArrays", "Statistics"]
[deps.FillArrays.extensions]
@@ -776,9 +835,9 @@ uuid = "a3f928ae-7b40-5064-980b-68af3947d34b"
version = "2.13.93+0"
[[deps.Format]]
-git-tree-sha1 = "f3cf88025f6d03c194d73f5d13fee9004a108329"
+git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc"
uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8"
-version = "1.3.6"
+version = "1.3.7"
[[deps.ForwardDiff]]
deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"]
@@ -827,9 +886,9 @@ version = "0.1.3"
[[deps.Functors]]
deps = ["LinearAlgebra"]
-git-tree-sha1 = "8ae30e786837ce0a24f5e2186938bf3251ab94b2"
+git-tree-sha1 = "fa8d8fcfa6c38a9a7aa07233e35b3d9a39ec751a"
uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196"
-version = "0.4.8"
+version = "0.4.9"
[[deps.Future]]
deps = ["Random"]
@@ -907,9 +966,9 @@ version = "2.80.0+0"
[[deps.GnuTLS_jll]]
deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Nettle_jll", "P11Kit_jll", "Zlib_jll"]
-git-tree-sha1 = "f3c0936dd685d57fa0b1eee7dbebf382b969ea63"
+git-tree-sha1 = "383db7d3f900f4c1f47a8a04115b053c095e48d3"
uuid = "0951126a-58fd-58f1-b5b3-b08c7c4a876d"
-version = "3.8.3+0"
+version = "3.8.4+0"
[[deps.Graphics]]
deps = ["Colors", "LinearAlgebra", "NaNMath"]
@@ -1085,6 +1144,16 @@ weakdeps = ["Random", "RecipesBase", "Statistics"]
IntervalSetsRecipesBaseExt = "RecipesBase"
IntervalSetsStatisticsExt = "Statistics"
+[[deps.InverseFunctions]]
+deps = ["Test"]
+git-tree-sha1 = "896385798a8d49a255c398bd49162062e4a4c435"
+uuid = "3587e190-3f89-42d0-90ee-14403ec27112"
+version = "0.1.13"
+weakdeps = ["Dates"]
+
+ [deps.InverseFunctions.extensions]
+ DatesExt = "Dates"
+
[[deps.InvertedIndices]]
git-tree-sha1 = "0dc7b50b8d436461be01300fd8cd45aa0274b038"
uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f"
@@ -1621,9 +1690,9 @@ version = "4.1.6+0"
[[deps.OpenSSL_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "60e3045590bd104a16fefb12836c00c0ef8c7f8c"
+git-tree-sha1 = "3da7367955dcc5c54c1ba4d402ccdc09a1a3e046"
uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
-version = "3.0.13+0"
+version = "3.0.13+1"
[[deps.OpenSpecFun_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"]
@@ -1632,10 +1701,10 @@ uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e"
version = "0.5.5+0"
[[deps.Optim]]
-deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "PackageExtensionCompat", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"]
-git-tree-sha1 = "d1223e69af90b6d26cea5b6f3b289b3148ba702c"
+deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"]
+git-tree-sha1 = "d9b79c4eed437421ac4285148fcadf42e0700e89"
uuid = "429524aa-4258-5aef-a3af-852621145aeb"
-version = "1.9.3"
+version = "1.9.4"
[deps.Optim.extensions]
OptimMOIExt = "MathOptInterface"
@@ -1677,12 +1746,6 @@ git-tree-sha1 = "67186a2bc9a90f9f85ff3cc8277868961fb57cbd"
uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883"
version = "0.4.3"
-[[deps.PackageExtensionCompat]]
-git-tree-sha1 = "fb28e33b8a95c4cee25ce296c817d89cc2e53518"
-uuid = "65ce6f38-6b18-4e1d-a461-8949797d7930"
-version = "1.0.2"
-weakdeps = ["Requires", "TOML"]
-
[[deps.Packing]]
deps = ["GeometryBasics"]
git-tree-sha1 = "ec3edfe723df33528e085e632414499f26650501"
@@ -1750,9 +1813,9 @@ version = "1.4.1"
[[deps.Polyester]]
deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"]
-git-tree-sha1 = "8df43bbe60029526dd628af7e9951f5af680d4d7"
+git-tree-sha1 = "09f59c6dda37c7f73efddc5bdf6f92bc940eb484"
uuid = "f517fe37-dbe3-4b94-8317-1923a5111588"
-version = "0.7.10"
+version = "0.7.12"
[[deps.PolyesterWeave]]
deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"]
@@ -1912,9 +1975,9 @@ version = "1.3.4"
[[deps.RecursiveArrayTools]]
deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "SparseArrays", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"]
-git-tree-sha1 = "a94d22ca9ad49a7a169ecbc5419c59b9793937cc"
+git-tree-sha1 = "d8f131090f2e44b145084928856a561c83f43b27"
uuid = "731186ca-8d62-57ce-b412-fbd966d074cd"
-version = "3.12.0"
+version = "3.13.0"
[deps.RecursiveArrayTools.extensions]
RecursiveArrayToolsFastBroadcastExt = "FastBroadcast"
@@ -2003,9 +2066,9 @@ version = "0.1.0"
[[deps.SciMLBase]]
deps = ["ADTypes", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"]
-git-tree-sha1 = "3daaea955c0905200943175637f184a968574a2d"
+git-tree-sha1 = "d15c65e25615272e1b1c5edb1d307484c7942824"
uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
-version = "2.30.3"
+version = "2.31.0"
[deps.SciMLBase.extensions]
SciMLBaseChainRulesCoreExt = "ChainRulesCore"
@@ -2203,24 +2266,21 @@ version = "1.7.0"
[[deps.StatsBase]]
deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"]
-git-tree-sha1 = "1d77abd07f617c4868c33d4f5b9e1dbb2643c9cf"
+git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21"
uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
-version = "0.34.2"
+version = "0.34.3"
[[deps.StatsFuns]]
deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"]
git-tree-sha1 = "cef0472124fab0695b58ca35a77c6fb942fdab8a"
uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c"
version = "1.3.1"
+weakdeps = ["ChainRulesCore", "InverseFunctions"]
[deps.StatsFuns.extensions]
StatsFunsChainRulesCoreExt = "ChainRulesCore"
StatsFunsInverseFunctionsExt = "InverseFunctions"
- [deps.StatsFuns.weakdeps]
- ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
- InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112"
-
[[deps.StrideArraysCore]]
deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"]
git-tree-sha1 = "d6415f66f3d89c615929af907fdc6a3e17af0d8c"
@@ -2278,10 +2338,10 @@ weakdeps = ["ClimaParams"]
CreateParametersExt = "ClimaParams"
[[deps.SymbolicIndexingInterface]]
-deps = ["MacroTools", "RuntimeGeneratedFunctions"]
-git-tree-sha1 = "f7b1fc9fc2bc938436b7684c243be7d317919056"
+deps = ["Accessors", "ArrayInterface", "MacroTools", "RuntimeGeneratedFunctions", "StaticArraysCore"]
+git-tree-sha1 = "4b7f4c80449d8baae8857d55535033981862619c"
uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5"
-version = "0.3.11"
+version = "0.3.15"
[[deps.TOML]]
deps = ["Dates"]
@@ -2332,9 +2392,9 @@ version = "1.0.1"
[[deps.Thermodynamics]]
deps = ["DocStringExtensions", "KernelAbstractions", "Random", "RootSolvers"]
-git-tree-sha1 = "6098c65a2ad62312ac74cb1627c8fb33efe33287"
+git-tree-sha1 = "deac04ad36638b10fde82470d5f128419f627e9a"
uuid = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c"
-version = "0.12.5"
+version = "0.12.6"
weakdeps = ["ClimaParams"]
[deps.Thermodynamics.extensions]
@@ -2359,9 +2419,9 @@ uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f"
version = "0.5.23"
[[deps.TranscodingStreams]]
-git-tree-sha1 = "14389d51751169994b2e1317d5c72f7dc4f21045"
+git-tree-sha1 = "71509f04d045ec714c4748c785a59045c3736349"
uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
-version = "0.10.6"
+version = "0.10.7"
weakdeps = ["Random", "Test"]
[deps.TranscodingStreams.extensions]
@@ -2436,9 +2496,9 @@ version = "1.0.0"
[[deps.XML2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"]
-git-tree-sha1 = "07e470dabc5a6a4254ffebc29a1b3fc01464e105"
+git-tree-sha1 = "532e22cf7be8462035d092ff21fada7527e2c488"
uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a"
-version = "2.12.5+0"
+version = "2.12.6+0"
[[deps.XSLT_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"]
@@ -2448,9 +2508,9 @@ version = "1.1.34+0"
[[deps.XZ_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "31c421e5516a6248dfb22c194519e37effbf1f30"
+git-tree-sha1 = "ac88fb95ae6447c8dda6a5503f3bafd496ae8632"
uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800"
-version = "5.6.1+0"
+version = "5.4.6+0"
[[deps.Xorg_libX11_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"]
@@ -2513,9 +2573,9 @@ version = "1.2.13+1"
[[deps.Zstd_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "49ce682769cd5de6c72dcf1b94ed7790cd08974c"
+git-tree-sha1 = "e678132f07ddb5bfa46857f0d7620fb9be675d3b"
uuid = "3161d3a3-bdf6-5164-811a-617609db77b4"
-version = "1.5.5+0"
+version = "1.5.6+0"
[[deps.isoband_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
diff --git a/docs/src/assets/logo.svg b/docs/src/assets/logo.svg
new file mode 100644
index 00000000000..599e1454d71
--- /dev/null
+++ b/docs/src/assets/logo.svg
@@ -0,0 +1,77 @@
+
+
+
+
diff --git a/docs/src/config.md b/docs/src/config.md
index de1812e6102..457f0bb57f0 100644
--- a/docs/src/config.md
+++ b/docs/src/config.md
@@ -40,7 +40,7 @@ perturb_initstate: false
dt: "5secs"
t_end: "6hours"
dt_save_state_to_disk: "10mins"
-toml: [toml/prognostic_edmfx_box.toml]
+toml: [toml/prognostic_edmfx.toml]
```
To add a new configuration argument/key, open `.buildkite/default_config.yml`.
diff --git a/examples/Manifest.toml b/examples/Manifest.toml
index ea41b5e7d5f..b1fd50d7269 100644
--- a/examples/Manifest.toml
+++ b/examples/Manifest.toml
@@ -2,7 +2,7 @@
julia_version = "1.10.2"
manifest_format = "2.0"
-project_hash = "f5b1fcb410aed0e48423c671cbcacf28aec0e1d1"
+project_hash = "60f53d07d79df5008ec331956e3787f67e499da0"
[[deps.ADTypes]]
git-tree-sha1 = "016833eb52ba2d6bea9fcb50ca295980e728ee24"
@@ -36,6 +36,27 @@ git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177"
uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
version = "0.4.5"
+[[deps.Accessors]]
+deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown", "Test"]
+git-tree-sha1 = "c0d491ef0b135fd7d63cbc6404286bc633329425"
+uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"
+version = "0.1.36"
+
+ [deps.Accessors.extensions]
+ AccessorsAxisKeysExt = "AxisKeys"
+ AccessorsIntervalSetsExt = "IntervalSets"
+ AccessorsStaticArraysExt = "StaticArrays"
+ AccessorsStructArraysExt = "StructArrays"
+ AccessorsUnitfulExt = "Unitful"
+
+ [deps.Accessors.weakdeps]
+ AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5"
+ IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
+ Requires = "ae029012-a4dd-5104-9daa-d747884805df"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+ StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
+ Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
+
[[deps.Adapt]]
deps = ["LinearAlgebra", "Requires"]
git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099"
@@ -164,9 +185,9 @@ version = "0.1.5"
[[deps.BlockArrays]]
deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra"]
-git-tree-sha1 = "3c62e3006c23082d2ae524b468298d27788a8502"
+git-tree-sha1 = "9a9610fbe5779636f75229e423e367124034af41"
uuid = "8e7c35d0-a365-5155-bbbb-fb81a777f24e"
-version = "0.16.40"
+version = "0.16.43"
[[deps.Blosc_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Lz4_jll", "Zlib_jll", "Zstd_jll"]
@@ -286,16 +307,16 @@ weakdeps = ["CairoMakie"]
CairoMakieExt = "CairoMakie"
[[deps.ClimaAtmos]]
-deps = ["Adapt", "ArgParse", "ArtifactWrappers", "Artifacts", "AtmosphericProfilesLibrary", "ClimaComms", "ClimaCore", "ClimaParams", "ClimaTimeSteppers", "CloudMicrophysics", "Colors", "Dates", "Dierckx", "DiffEqBase", "DiffEqCallbacks", "DocStringExtensions", "FastGaussQuadrature", "Insolation", "Interpolations", "IntervalSets", "Krylov", "LinearAlgebra", "Logging", "NCDatasets", "NVTX", "Pkg", "Printf", "RRTMGP", "Random", "RootSolvers", "SciMLBase", "StaticArrays", "Statistics", "StatsBase", "SurfaceFluxes", "Thermodynamics", "YAML"]
+deps = ["Adapt", "ArgParse", "ArtifactWrappers", "Artifacts", "AtmosphericProfilesLibrary", "ClimaComms", "ClimaCore", "ClimaParams", "ClimaTimeSteppers", "ClimaUtilities", "CloudMicrophysics", "Colors", "Dates", "Dierckx", "DiffEqBase", "DiffEqCallbacks", "DocStringExtensions", "FastGaussQuadrature", "Insolation", "Interpolations", "IntervalSets", "Krylov", "LinearAlgebra", "Logging", "NCDatasets", "NVTX", "Pkg", "Printf", "RRTMGP", "Random", "RootSolvers", "SciMLBase", "StaticArrays", "Statistics", "StatsBase", "SurfaceFluxes", "Thermodynamics", "YAML"]
path = ".."
uuid = "b2c96348-7fb7-4fe0-8da9-78d88439e717"
version = "0.22.1"
[[deps.ClimaComms]]
deps = ["CUDA", "MPI"]
-git-tree-sha1 = "f0350e34c91c8f3b5a11b5e39990439303d727b1"
+git-tree-sha1 = "ef5d206be51fdf62cd0cbd63058e237128652cf7"
uuid = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d"
-version = "0.5.7"
+version = "0.5.8"
[[deps.ClimaCore]]
deps = ["Adapt", "BandedMatrices", "BlockArrays", "CUDA", "ClimaComms", "CubedSphere", "DataStructures", "DocStringExtensions", "ForwardDiff", "GaussQuadrature", "GilbertCurves", "HDF5", "InteractiveUtils", "IntervalSets", "KrylovKit", "LinearAlgebra", "PkgVersion", "RecursiveArrayTools", "RootSolvers", "SparseArrays", "Static", "StaticArrays", "Statistics", "Unrolled"]
@@ -349,6 +370,23 @@ git-tree-sha1 = "9c203f39784c968700c55f555754a7771b3410df"
uuid = "595c0a79-7f3d-439a-bc5a-b232dc3bde79"
version = "0.7.19"
+[[deps.ClimaUtilities]]
+deps = ["Artifacts", "CFTime", "Dates"]
+git-tree-sha1 = "d1b30a07829248b325ffffbb739d0f6fe79dfe7c"
+uuid = "b3f4f4ca-9299-4f7f-bd9b-81e1242a7513"
+version = "0.1.3"
+weakdeps = ["Adapt", "ClimaComms", "ClimaCore", "ClimaCoreTempestRemap", "Interpolations", "NCDatasets"]
+
+ [deps.ClimaUtilities.extensions]
+ DataHandlingExt = ["ClimaCore", "NCDatasets"]
+ InterpolationsRegridderExt = ["Interpolations", "ClimaCore"]
+ MPIUtilsExt = "ClimaComms"
+ NCFileReaderExt = "NCDatasets"
+ SpaceVaryingInputsExt = ["ClimaCore", "NCDatasets"]
+ TempestRegridderExt = "ClimaCoreTempestRemap"
+ TimeVaryingInputs0DExt = "ClimaCore"
+ TimeVaryingInputsExt = ["ClimaCore", "NCDatasets"]
+
[[deps.CloseOpenIntervals]]
deps = ["Static", "StaticArrayInterface"]
git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1"
@@ -444,6 +482,20 @@ deps = ["Artifacts", "Libdl"]
uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"
version = "1.1.0+0"
+[[deps.CompositionsBase]]
+git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad"
+uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b"
+version = "0.1.2"
+weakdeps = ["InverseFunctions"]
+
+ [deps.CompositionsBase.extensions]
+ CompositionsBaseInverseFunctionsExt = "InverseFunctions"
+
+[[deps.ConcreteStructs]]
+git-tree-sha1 = "f749037478283d372048690eb3b5f92a79432b34"
+uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471"
+version = "0.2.3"
+
[[deps.ConstructionBase]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "260fd2400ed2dab602a7c15cf10c1933c59930a2"
@@ -456,9 +508,9 @@ weakdeps = ["IntervalSets", "StaticArrays"]
ConstructionBaseStaticArraysExt = "StaticArrays"
[[deps.Contour]]
-git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781"
+git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8"
uuid = "d38c429a-6771-53c6-b99e-75d170b6e991"
-version = "0.6.2"
+version = "0.6.3"
[[deps.CpuId]]
deps = ["Markdown"]
@@ -528,10 +580,10 @@ uuid = "cd4c43a9-7502-52ba-aa6d-59fb2a88580b"
version = "0.1.0+0"
[[deps.DiffEqBase]]
-deps = ["ArrayInterface", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "ForwardDiff", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PreallocationTools", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "SparseArrays", "Static", "StaticArraysCore", "Statistics", "Tricks", "TruncatedStacktraces"]
-git-tree-sha1 = "b19b2bb1ecd1271334e4b25d605e50f75e68fcae"
+deps = ["ArrayInterface", "ConcreteStructs", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "FastClosures", "ForwardDiff", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PreallocationTools", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "SparseArrays", "Static", "StaticArraysCore", "Statistics", "Tricks", "TruncatedStacktraces"]
+git-tree-sha1 = "4fa023dbb15b3485426bbc6c43e030c14250d664"
uuid = "2b5f629d-d688-5b77-993f-72d75c75574e"
-version = "6.148.0"
+version = "6.149.0"
[deps.DiffEqBase.extensions]
DiffEqBaseChainRulesCoreExt = "ChainRulesCore"
@@ -650,9 +702,9 @@ uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56"
version = "1.0.4"
[[deps.EnzymeCore]]
-git-tree-sha1 = "2c0192b96d5c45dbfb0f54e8cfb1256fece7b4ff"
+git-tree-sha1 = "18394bc78ac2814ff38fe5e0c9dc2cd171e2810c"
uuid = "f151be2c-9106-41f4-ab19-57ee4f262869"
-version = "0.7.1"
+version = "0.7.2"
weakdeps = ["Adapt"]
[deps.EnzymeCore.extensions]
@@ -748,10 +800,10 @@ version = "0.9.21"
uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee"
[[deps.FillArrays]]
-deps = ["LinearAlgebra", "Random"]
-git-tree-sha1 = "5b93957f6dcd33fc343044af3d48c215be2562f1"
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "bfe82a708416cf00b73a3198db0859c82f741558"
uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"
-version = "1.9.3"
+version = "1.10.0"
weakdeps = ["PDMats", "SparseArrays", "Statistics"]
[deps.FillArrays.extensions]
@@ -788,9 +840,9 @@ uuid = "a3f928ae-7b40-5064-980b-68af3947d34b"
version = "2.13.93+0"
[[deps.Format]]
-git-tree-sha1 = "f3cf88025f6d03c194d73f5d13fee9004a108329"
+git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc"
uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8"
-version = "1.3.6"
+version = "1.3.7"
[[deps.ForwardDiff]]
deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"]
@@ -839,9 +891,9 @@ version = "0.1.3"
[[deps.Functors]]
deps = ["LinearAlgebra"]
-git-tree-sha1 = "8ae30e786837ce0a24f5e2186938bf3251ab94b2"
+git-tree-sha1 = "fa8d8fcfa6c38a9a7aa07233e35b3d9a39ec751a"
uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196"
-version = "0.4.8"
+version = "0.4.9"
[[deps.Future]]
deps = ["Random"]
@@ -912,9 +964,9 @@ version = "1.3.1"
[[deps.GnuTLS_jll]]
deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Nettle_jll", "P11Kit_jll", "Zlib_jll"]
-git-tree-sha1 = "f3c0936dd685d57fa0b1eee7dbebf382b969ea63"
+git-tree-sha1 = "383db7d3f900f4c1f47a8a04115b053c095e48d3"
uuid = "0951126a-58fd-58f1-b5b3-b08c7c4a876d"
-version = "3.8.3+0"
+version = "3.8.4+0"
[[deps.Graphics]]
deps = ["Colors", "LinearAlgebra", "NaNMath"]
@@ -1084,6 +1136,16 @@ weakdeps = ["Random", "RecipesBase", "Statistics"]
IntervalSetsRecipesBaseExt = "RecipesBase"
IntervalSetsStatisticsExt = "Statistics"
+[[deps.InverseFunctions]]
+deps = ["Test"]
+git-tree-sha1 = "896385798a8d49a255c398bd49162062e4a4c435"
+uuid = "3587e190-3f89-42d0-90ee-14403ec27112"
+version = "0.1.13"
+weakdeps = ["Dates"]
+
+ [deps.InverseFunctions.extensions]
+ DatesExt = "Dates"
+
[[deps.InvertedIndices]]
git-tree-sha1 = "0dc7b50b8d436461be01300fd8cd45aa0274b038"
uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f"
@@ -1148,9 +1210,9 @@ version = "3.0.2+0"
[[deps.JuliaInterpreter]]
deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"]
-git-tree-sha1 = "0015726aa3eb28973fbbdbb7ca2ed6396ffe3a23"
+git-tree-sha1 = "e9648d90370e2d0317f9518c9c6e0841db54a90b"
uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a"
-version = "0.9.30"
+version = "0.9.31"
[[deps.JuliaNVTXCallbacks_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
@@ -1651,9 +1713,9 @@ version = "4.1.6+0"
[[deps.OpenSSL_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "60e3045590bd104a16fefb12836c00c0ef8c7f8c"
+git-tree-sha1 = "3da7367955dcc5c54c1ba4d402ccdc09a1a3e046"
uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
-version = "3.0.13+0"
+version = "3.0.13+1"
[[deps.OpenSpecFun_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"]
@@ -1662,10 +1724,10 @@ uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e"
version = "0.5.5+0"
[[deps.Optim]]
-deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "PackageExtensionCompat", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"]
-git-tree-sha1 = "d1223e69af90b6d26cea5b6f3b289b3148ba702c"
+deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"]
+git-tree-sha1 = "d9b79c4eed437421ac4285148fcadf42e0700e89"
uuid = "429524aa-4258-5aef-a3af-852621145aeb"
-version = "1.9.3"
+version = "1.9.4"
[deps.Optim.extensions]
OptimMOIExt = "MathOptInterface"
@@ -1707,12 +1769,6 @@ git-tree-sha1 = "67186a2bc9a90f9f85ff3cc8277868961fb57cbd"
uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883"
version = "0.4.3"
-[[deps.PackageExtensionCompat]]
-git-tree-sha1 = "fb28e33b8a95c4cee25ce296c817d89cc2e53518"
-uuid = "65ce6f38-6b18-4e1d-a461-8949797d7930"
-version = "1.0.2"
-weakdeps = ["Requires", "TOML"]
-
[[deps.Packing]]
deps = ["GeometryBasics"]
git-tree-sha1 = "ec3edfe723df33528e085e632414499f26650501"
@@ -1786,9 +1842,9 @@ version = "0.4.4"
[[deps.Polyester]]
deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"]
-git-tree-sha1 = "8df43bbe60029526dd628af7e9951f5af680d4d7"
+git-tree-sha1 = "09f59c6dda37c7f73efddc5bdf6f92bc940eb484"
uuid = "f517fe37-dbe3-4b94-8317-1923a5111588"
-version = "0.7.10"
+version = "0.7.12"
[[deps.PolyesterWeave]]
deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"]
@@ -1964,9 +2020,9 @@ version = "1.3.4"
[[deps.RecursiveArrayTools]]
deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "SparseArrays", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"]
-git-tree-sha1 = "a94d22ca9ad49a7a169ecbc5419c59b9793937cc"
+git-tree-sha1 = "d8f131090f2e44b145084928856a561c83f43b27"
uuid = "731186ca-8d62-57ce-b412-fbd966d074cd"
-version = "3.12.0"
+version = "3.13.0"
[deps.RecursiveArrayTools.extensions]
RecursiveArrayToolsFastBroadcastExt = "FastBroadcast"
@@ -2055,9 +2111,9 @@ version = "0.1.0"
[[deps.SciMLBase]]
deps = ["ADTypes", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"]
-git-tree-sha1 = "3daaea955c0905200943175637f184a968574a2d"
+git-tree-sha1 = "d15c65e25615272e1b1c5edb1d307484c7942824"
uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
-version = "2.30.3"
+version = "2.31.0"
[deps.SciMLBase.extensions]
SciMLBaseChainRulesCoreExt = "ChainRulesCore"
@@ -2255,24 +2311,21 @@ version = "1.7.0"
[[deps.StatsBase]]
deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"]
-git-tree-sha1 = "1d77abd07f617c4868c33d4f5b9e1dbb2643c9cf"
+git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21"
uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
-version = "0.34.2"
+version = "0.34.3"
[[deps.StatsFuns]]
deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"]
git-tree-sha1 = "cef0472124fab0695b58ca35a77c6fb942fdab8a"
uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c"
version = "1.3.1"
+weakdeps = ["ChainRulesCore", "InverseFunctions"]
[deps.StatsFuns.extensions]
StatsFunsChainRulesCoreExt = "ChainRulesCore"
StatsFunsInverseFunctionsExt = "InverseFunctions"
- [deps.StatsFuns.weakdeps]
- ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
- InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112"
-
[[deps.StrideArraysCore]]
deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"]
git-tree-sha1 = "d6415f66f3d89c615929af907fdc6a3e17af0d8c"
@@ -2324,10 +2377,10 @@ weakdeps = ["ClimaParams"]
CreateParametersExt = "ClimaParams"
[[deps.SymbolicIndexingInterface]]
-deps = ["MacroTools", "RuntimeGeneratedFunctions"]
-git-tree-sha1 = "f7b1fc9fc2bc938436b7684c243be7d317919056"
+deps = ["Accessors", "ArrayInterface", "MacroTools", "RuntimeGeneratedFunctions", "StaticArraysCore"]
+git-tree-sha1 = "4b7f4c80449d8baae8857d55535033981862619c"
uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5"
-version = "0.3.11"
+version = "0.3.15"
[[deps.TOML]]
deps = ["Dates"]
@@ -2384,9 +2437,9 @@ version = "1.0.1"
[[deps.Thermodynamics]]
deps = ["DocStringExtensions", "KernelAbstractions", "Random", "RootSolvers"]
-git-tree-sha1 = "6098c65a2ad62312ac74cb1627c8fb33efe33287"
+git-tree-sha1 = "deac04ad36638b10fde82470d5f128419f627e9a"
uuid = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c"
-version = "0.12.5"
+version = "0.12.6"
weakdeps = ["ClimaParams"]
[deps.Thermodynamics.extensions]
@@ -2411,9 +2464,9 @@ uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f"
version = "0.5.23"
[[deps.TranscodingStreams]]
-git-tree-sha1 = "14389d51751169994b2e1317d5c72f7dc4f21045"
+git-tree-sha1 = "71509f04d045ec714c4748c785a59045c3736349"
uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
-version = "0.10.6"
+version = "0.10.7"
weakdeps = ["Random", "Test"]
[deps.TranscodingStreams.extensions]
@@ -2494,9 +2547,9 @@ version = "1.18.3"
[[deps.XML2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"]
-git-tree-sha1 = "07e470dabc5a6a4254ffebc29a1b3fc01464e105"
+git-tree-sha1 = "532e22cf7be8462035d092ff21fada7527e2c488"
uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a"
-version = "2.12.5+0"
+version = "2.12.6+0"
[[deps.XSLT_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"]
@@ -2506,9 +2559,9 @@ version = "1.1.34+0"
[[deps.XZ_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "31c421e5516a6248dfb22c194519e37effbf1f30"
+git-tree-sha1 = "ac88fb95ae6447c8dda6a5503f3bafd496ae8632"
uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800"
-version = "5.6.1+0"
+version = "5.4.6+0"
[[deps.Xorg_libX11_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"]
@@ -2571,9 +2624,9 @@ version = "1.2.13+1"
[[deps.Zstd_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "49ce682769cd5de6c72dcf1b94ed7790cd08974c"
+git-tree-sha1 = "e678132f07ddb5bfa46857f0d7620fb9be675d3b"
uuid = "3161d3a3-bdf6-5164-811a-617609db77b4"
-version = "1.5.5+0"
+version = "1.5.6+0"
[[deps.isoband_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
diff --git a/examples/Project.toml b/examples/Project.toml
index 568bab88d09..5d1443c8896 100644
--- a/examples/Project.toml
+++ b/examples/Project.toml
@@ -17,6 +17,7 @@ ClimaCoreTempestRemap = "d934ef94-cdd4-4710-83d6-720549644b70"
ClimaCoreVTK = "c8b6d40d-e815-466f-95ae-c48aefa668fa"
ClimaParams = "5c42b081-d73a-476f-9059-fd94b934656c"
ClimaTimeSteppers = "595c0a79-7f3d-439a-bc5a-b232dc3bde79"
+ClimaUtilities = "b3f4f4ca-9299-4f7f-bd9b-81e1242a7513"
CloudMicrophysics = "6a9e3e04-43cd-43ba-94b9-e8782df3c71b"
Colors = "5ae59095-9a9b-59fe-a467-6f913c188581"
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
diff --git a/examples/hybrid/driver.jl b/examples/hybrid/driver.jl
index aafad7a83e3..a895d11eb28 100644
--- a/examples/hybrid/driver.jl
+++ b/examples/hybrid/driver.jl
@@ -36,9 +36,6 @@ using Test
import Tar
import Base.Filesystem: rm
import OrderedCollections
-using ClimaCoreTempestRemap
-using ClimaCorePlots
-using ClimaCoreMakie, CairoMakie
include(joinpath(pkgdir(CA), "post_processing", "ci_plots.jl"))
ref_job_id = config.parsed_args["reference_job_id"]
@@ -186,6 +183,7 @@ if config.parsed_args["check_precipitation"]
sol.t[end],
colidx,
sol.prob.p.atmos.precip_model,
+ sol.prob.p.atmos.turbconv_model,
)
@. Yₜ_ρqₚ[colidx] = -Yₜ.c.ρq_rai[colidx] - Yₜ.c.ρq_sno[colidx]
@@ -260,12 +258,16 @@ if ClimaComms.iamroot(config.comms_ctx)
paths = if isempty(readdir(nc_dir))
simulation.output_dir
else
- [nc_dir, simulation.output_dir]
+ [simulation.output_dir, nc_dir]
end
make_plots(Val(Symbol(reference_job_id)), paths)
end
@info "Plotting done"
+ function symlink_to_fullpath(path)
+ return joinpath(dirname(path), readlink(path))
+ end
+
@info "Creating tarballs"
# These NC files are used by our reproducibility tests,
# and need to be found later when comparing against the
@@ -274,12 +276,12 @@ if ClimaComms.iamroot(config.comms_ctx)
# reproducibility test folder.
Tar.create(
f -> endswith(f, ".nc"),
- simulation.output_dir,
+ symlink_to_fullpath(simulation.output_dir),
joinpath(simulation.output_dir, "nc_files.tar"),
)
Tar.create(
f -> endswith(f, r"hdf5|h5"),
- simulation.output_dir,
+ symlink_to_fullpath(simulation.output_dir),
joinpath(simulation.output_dir, "hdf5_files.tar"),
)
diff --git a/logo.svg b/logo.svg
new file mode 100644
index 00000000000..599e1454d71
--- /dev/null
+++ b/logo.svg
@@ -0,0 +1,77 @@
+
+
+
+
diff --git a/perf/Manifest.toml b/perf/Manifest.toml
index 1cc75317040..268030abd8b 100644
--- a/perf/Manifest.toml
+++ b/perf/Manifest.toml
@@ -36,6 +36,27 @@ git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177"
uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
version = "0.4.5"
+[[deps.Accessors]]
+deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown", "Test"]
+git-tree-sha1 = "c0d491ef0b135fd7d63cbc6404286bc633329425"
+uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"
+version = "0.1.36"
+
+ [deps.Accessors.extensions]
+ AccessorsAxisKeysExt = "AxisKeys"
+ AccessorsIntervalSetsExt = "IntervalSets"
+ AccessorsStaticArraysExt = "StaticArrays"
+ AccessorsStructArraysExt = "StructArrays"
+ AccessorsUnitfulExt = "Unitful"
+
+ [deps.Accessors.weakdeps]
+ AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5"
+ IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
+ Requires = "ae029012-a4dd-5104-9daa-d747884805df"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+ StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
+ Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
+
[[deps.Adapt]]
deps = ["LinearAlgebra", "Requires"]
git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099"
@@ -170,9 +191,9 @@ version = "0.1.5"
[[deps.BlockArrays]]
deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra"]
-git-tree-sha1 = "3c62e3006c23082d2ae524b468298d27788a8502"
+git-tree-sha1 = "9a9610fbe5779636f75229e423e367124034af41"
uuid = "8e7c35d0-a365-5155-bbbb-fb81a777f24e"
-version = "0.16.40"
+version = "0.16.43"
[[deps.Blosc_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Lz4_jll", "Zlib_jll", "Zstd_jll"]
@@ -301,16 +322,16 @@ version = "0.5.0"
GeoMakie = "db073c08-6b98-4ee5-b6a4-5efafb3259c6"
[[deps.ClimaAtmos]]
-deps = ["Adapt", "ArgParse", "ArtifactWrappers", "Artifacts", "AtmosphericProfilesLibrary", "ClimaComms", "ClimaCore", "ClimaParams", "ClimaTimeSteppers", "CloudMicrophysics", "Colors", "Dates", "Dierckx", "DiffEqBase", "DiffEqCallbacks", "DocStringExtensions", "FastGaussQuadrature", "Insolation", "Interpolations", "IntervalSets", "Krylov", "LinearAlgebra", "Logging", "NCDatasets", "NVTX", "Pkg", "Printf", "RRTMGP", "Random", "RootSolvers", "SciMLBase", "StaticArrays", "Statistics", "StatsBase", "SurfaceFluxes", "Thermodynamics", "YAML"]
+deps = ["Adapt", "ArgParse", "ArtifactWrappers", "Artifacts", "AtmosphericProfilesLibrary", "ClimaComms", "ClimaCore", "ClimaParams", "ClimaTimeSteppers", "ClimaUtilities", "CloudMicrophysics", "Colors", "Dates", "Dierckx", "DiffEqBase", "DiffEqCallbacks", "DocStringExtensions", "FastGaussQuadrature", "Insolation", "Interpolations", "IntervalSets", "Krylov", "LinearAlgebra", "Logging", "NCDatasets", "NVTX", "Pkg", "Printf", "RRTMGP", "Random", "RootSolvers", "SciMLBase", "StaticArrays", "Statistics", "StatsBase", "SurfaceFluxes", "Thermodynamics", "YAML"]
path = ".."
uuid = "b2c96348-7fb7-4fe0-8da9-78d88439e717"
version = "0.22.1"
[[deps.ClimaComms]]
deps = ["CUDA", "MPI"]
-git-tree-sha1 = "f0350e34c91c8f3b5a11b5e39990439303d727b1"
+git-tree-sha1 = "ef5d206be51fdf62cd0cbd63058e237128652cf7"
uuid = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d"
-version = "0.5.7"
+version = "0.5.8"
[[deps.ClimaCore]]
deps = ["Adapt", "BandedMatrices", "BlockArrays", "CUDA", "ClimaComms", "CubedSphere", "DataStructures", "DocStringExtensions", "ForwardDiff", "GaussQuadrature", "GilbertCurves", "HDF5", "InteractiveUtils", "IntervalSets", "KrylovKit", "LinearAlgebra", "PkgVersion", "RecursiveArrayTools", "RootSolvers", "SparseArrays", "Static", "StaticArrays", "Statistics", "Unrolled"]
@@ -364,6 +385,23 @@ git-tree-sha1 = "9c203f39784c968700c55f555754a7771b3410df"
uuid = "595c0a79-7f3d-439a-bc5a-b232dc3bde79"
version = "0.7.19"
+[[deps.ClimaUtilities]]
+deps = ["Artifacts", "CFTime", "Dates"]
+git-tree-sha1 = "d1b30a07829248b325ffffbb739d0f6fe79dfe7c"
+uuid = "b3f4f4ca-9299-4f7f-bd9b-81e1242a7513"
+version = "0.1.3"
+weakdeps = ["Adapt", "ClimaComms", "ClimaCore", "ClimaCoreTempestRemap", "Interpolations", "NCDatasets"]
+
+ [deps.ClimaUtilities.extensions]
+ DataHandlingExt = ["ClimaCore", "NCDatasets"]
+ InterpolationsRegridderExt = ["Interpolations", "ClimaCore"]
+ MPIUtilsExt = "ClimaComms"
+ NCFileReaderExt = "NCDatasets"
+ SpaceVaryingInputsExt = ["ClimaCore", "NCDatasets"]
+ TempestRegridderExt = "ClimaCoreTempestRemap"
+ TimeVaryingInputs0DExt = "ClimaCore"
+ TimeVaryingInputsExt = ["ClimaCore", "NCDatasets"]
+
[[deps.CloseOpenIntervals]]
deps = ["Static", "StaticArrayInterface"]
git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1"
@@ -459,6 +497,20 @@ deps = ["Artifacts", "Libdl"]
uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"
version = "1.1.0+0"
+[[deps.CompositionsBase]]
+git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad"
+uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b"
+version = "0.1.2"
+weakdeps = ["InverseFunctions"]
+
+ [deps.CompositionsBase.extensions]
+ CompositionsBaseInverseFunctionsExt = "InverseFunctions"
+
+[[deps.ConcreteStructs]]
+git-tree-sha1 = "f749037478283d372048690eb3b5f92a79432b34"
+uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471"
+version = "0.2.3"
+
[[deps.ConstructionBase]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "260fd2400ed2dab602a7c15cf10c1933c59930a2"
@@ -471,9 +523,9 @@ weakdeps = ["IntervalSets", "StaticArrays"]
ConstructionBaseStaticArraysExt = "StaticArrays"
[[deps.Contour]]
-git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781"
+git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8"
uuid = "d38c429a-6771-53c6-b99e-75d170b6e991"
-version = "0.6.2"
+version = "0.6.3"
[[deps.CpuId]]
deps = ["Markdown"]
@@ -488,9 +540,9 @@ version = "4.1.1"
[[deps.Cthulhu]]
deps = ["CodeTracking", "FoldingTrees", "InteractiveUtils", "JuliaSyntax", "PrecompileTools", "Preferences", "REPL", "TypedSyntax", "UUIDs", "Unicode", "WidthLimitedIO"]
-git-tree-sha1 = "f2149929cf1a400d4befc184685c221e2bc2516d"
+git-tree-sha1 = "f56f917d4d89b131400cf87291b7c9f986321275"
uuid = "f68482b8-f384-11e8-15f7-abe071a5a75f"
-version = "2.12.0"
+version = "2.12.2"
[[deps.CubedSphere]]
deps = ["Elliptic", "FFTW", "Printf", "ProgressBars", "SpecialFunctions", "TaylorSeries", "Test"]
@@ -549,10 +601,10 @@ uuid = "cd4c43a9-7502-52ba-aa6d-59fb2a88580b"
version = "0.1.0+0"
[[deps.DiffEqBase]]
-deps = ["ArrayInterface", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "ForwardDiff", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PreallocationTools", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "SparseArrays", "Static", "StaticArraysCore", "Statistics", "Tricks", "TruncatedStacktraces"]
-git-tree-sha1 = "b19b2bb1ecd1271334e4b25d605e50f75e68fcae"
+deps = ["ArrayInterface", "ConcreteStructs", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "FastClosures", "ForwardDiff", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PreallocationTools", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "SparseArrays", "Static", "StaticArraysCore", "Statistics", "Tricks", "TruncatedStacktraces"]
+git-tree-sha1 = "4fa023dbb15b3485426bbc6c43e030c14250d664"
uuid = "2b5f629d-d688-5b77-993f-72d75c75574e"
-version = "6.148.0"
+version = "6.149.0"
[deps.DiffEqBase.extensions]
DiffEqBaseChainRulesCoreExt = "ChainRulesCore"
@@ -683,9 +735,9 @@ uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56"
version = "1.0.4"
[[deps.EnzymeCore]]
-git-tree-sha1 = "2c0192b96d5c45dbfb0f54e8cfb1256fece7b4ff"
+git-tree-sha1 = "18394bc78ac2814ff38fe5e0c9dc2cd171e2810c"
uuid = "f151be2c-9106-41f4-ab19-57ee4f262869"
-version = "0.7.1"
+version = "0.7.2"
weakdeps = ["Adapt"]
[deps.EnzymeCore.extensions]
@@ -781,10 +833,10 @@ version = "0.9.21"
uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee"
[[deps.FillArrays]]
-deps = ["LinearAlgebra", "Random"]
-git-tree-sha1 = "5b93957f6dcd33fc343044af3d48c215be2562f1"
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "bfe82a708416cf00b73a3198db0859c82f741558"
uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"
-version = "1.9.3"
+version = "1.10.0"
weakdeps = ["PDMats", "SparseArrays", "Statistics"]
[deps.FillArrays.extensions]
@@ -833,9 +885,9 @@ uuid = "a3f928ae-7b40-5064-980b-68af3947d34b"
version = "2.13.93+0"
[[deps.Format]]
-git-tree-sha1 = "f3cf88025f6d03c194d73f5d13fee9004a108329"
+git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc"
uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8"
-version = "1.3.6"
+version = "1.3.7"
[[deps.ForwardDiff]]
deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"]
@@ -884,9 +936,9 @@ version = "0.1.3"
[[deps.Functors]]
deps = ["LinearAlgebra"]
-git-tree-sha1 = "8ae30e786837ce0a24f5e2186938bf3251ab94b2"
+git-tree-sha1 = "fa8d8fcfa6c38a9a7aa07233e35b3d9a39ec751a"
uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196"
-version = "0.4.8"
+version = "0.4.9"
[[deps.Future]]
deps = ["Random"]
@@ -957,9 +1009,9 @@ version = "1.3.1"
[[deps.GnuTLS_jll]]
deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Nettle_jll", "P11Kit_jll", "Zlib_jll"]
-git-tree-sha1 = "f3c0936dd685d57fa0b1eee7dbebf382b969ea63"
+git-tree-sha1 = "383db7d3f900f4c1f47a8a04115b053c095e48d3"
uuid = "0951126a-58fd-58f1-b5b3-b08c7c4a876d"
-version = "3.8.3+0"
+version = "3.8.4+0"
[[deps.Graphics]]
deps = ["Colors", "LinearAlgebra", "NaNMath"]
@@ -1135,6 +1187,16 @@ weakdeps = ["Random", "RecipesBase", "Statistics"]
IntervalSetsRecipesBaseExt = "RecipesBase"
IntervalSetsStatisticsExt = "Statistics"
+[[deps.InverseFunctions]]
+deps = ["Test"]
+git-tree-sha1 = "896385798a8d49a255c398bd49162062e4a4c435"
+uuid = "3587e190-3f89-42d0-90ee-14403ec27112"
+version = "0.1.13"
+weakdeps = ["Dates"]
+
+ [deps.InverseFunctions.extensions]
+ DatesExt = "Dates"
+
[[deps.InvertedIndices]]
git-tree-sha1 = "0dc7b50b8d436461be01300fd8cd45aa0274b038"
uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f"
@@ -1199,9 +1261,9 @@ version = "3.0.2+0"
[[deps.JuliaInterpreter]]
deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"]
-git-tree-sha1 = "0015726aa3eb28973fbbdbb7ca2ed6396ffe3a23"
+git-tree-sha1 = "e9648d90370e2d0317f9518c9c6e0841db54a90b"
uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a"
-version = "0.9.30"
+version = "0.9.31"
[[deps.JuliaNVTXCallbacks_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
@@ -1707,9 +1769,9 @@ version = "4.1.6+0"
[[deps.OpenSSL_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "60e3045590bd104a16fefb12836c00c0ef8c7f8c"
+git-tree-sha1 = "3da7367955dcc5c54c1ba4d402ccdc09a1a3e046"
uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
-version = "3.0.13+0"
+version = "3.0.13+1"
[[deps.OpenSpecFun_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"]
@@ -1718,10 +1780,10 @@ uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e"
version = "0.5.5+0"
[[deps.Optim]]
-deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "PackageExtensionCompat", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"]
-git-tree-sha1 = "d1223e69af90b6d26cea5b6f3b289b3148ba702c"
+deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"]
+git-tree-sha1 = "d9b79c4eed437421ac4285148fcadf42e0700e89"
uuid = "429524aa-4258-5aef-a3af-852621145aeb"
-version = "1.9.3"
+version = "1.9.4"
[deps.Optim.extensions]
OptimMOIExt = "MathOptInterface"
@@ -1769,12 +1831,6 @@ git-tree-sha1 = "1c650abb80d2a417318a9d303443487b226901cd"
uuid = "e4faabce-9ead-11e9-39d9-4379958e3056"
version = "2.3.0"
-[[deps.PackageExtensionCompat]]
-git-tree-sha1 = "fb28e33b8a95c4cee25ce296c817d89cc2e53518"
-uuid = "65ce6f38-6b18-4e1d-a461-8949797d7930"
-version = "1.0.2"
-weakdeps = ["Requires", "TOML"]
-
[[deps.Packing]]
deps = ["GeometryBasics"]
git-tree-sha1 = "ec3edfe723df33528e085e632414499f26650501"
@@ -1848,9 +1904,9 @@ version = "0.4.4"
[[deps.Polyester]]
deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"]
-git-tree-sha1 = "8df43bbe60029526dd628af7e9951f5af680d4d7"
+git-tree-sha1 = "09f59c6dda37c7f73efddc5bdf6f92bc940eb484"
uuid = "f517fe37-dbe3-4b94-8317-1923a5111588"
-version = "0.7.10"
+version = "0.7.12"
[[deps.PolyesterWeave]]
deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"]
@@ -2038,9 +2094,9 @@ version = "1.3.4"
[[deps.RecursiveArrayTools]]
deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "SparseArrays", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"]
-git-tree-sha1 = "a94d22ca9ad49a7a169ecbc5419c59b9793937cc"
+git-tree-sha1 = "d8f131090f2e44b145084928856a561c83f43b27"
uuid = "731186ca-8d62-57ce-b412-fbd966d074cd"
-version = "3.12.0"
+version = "3.13.0"
[deps.RecursiveArrayTools.extensions]
RecursiveArrayToolsFastBroadcastExt = "FastBroadcast"
@@ -2135,9 +2191,9 @@ version = "0.1.0"
[[deps.SciMLBase]]
deps = ["ADTypes", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"]
-git-tree-sha1 = "3daaea955c0905200943175637f184a968574a2d"
+git-tree-sha1 = "d15c65e25615272e1b1c5edb1d307484c7942824"
uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
-version = "2.30.3"
+version = "2.31.0"
[deps.SciMLBase.extensions]
SciMLBaseChainRulesCoreExt = "ChainRulesCore"
@@ -2347,24 +2403,21 @@ version = "1.7.0"
[[deps.StatsBase]]
deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"]
-git-tree-sha1 = "1d77abd07f617c4868c33d4f5b9e1dbb2643c9cf"
+git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21"
uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
-version = "0.34.2"
+version = "0.34.3"
[[deps.StatsFuns]]
deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"]
git-tree-sha1 = "cef0472124fab0695b58ca35a77c6fb942fdab8a"
uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c"
version = "1.3.1"
+weakdeps = ["ChainRulesCore", "InverseFunctions"]
[deps.StatsFuns.extensions]
StatsFunsChainRulesCoreExt = "ChainRulesCore"
StatsFunsInverseFunctionsExt = "InverseFunctions"
- [deps.StatsFuns.weakdeps]
- ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
- InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112"
-
[[deps.StrideArraysCore]]
deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"]
git-tree-sha1 = "d6415f66f3d89c615929af907fdc6a3e17af0d8c"
@@ -2416,10 +2469,10 @@ weakdeps = ["ClimaParams"]
CreateParametersExt = "ClimaParams"
[[deps.SymbolicIndexingInterface]]
-deps = ["MacroTools", "RuntimeGeneratedFunctions"]
-git-tree-sha1 = "f7b1fc9fc2bc938436b7684c243be7d317919056"
+deps = ["Accessors", "ArrayInterface", "MacroTools", "RuntimeGeneratedFunctions", "StaticArraysCore"]
+git-tree-sha1 = "4b7f4c80449d8baae8857d55535033981862619c"
uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5"
-version = "0.3.11"
+version = "0.3.15"
[[deps.TOML]]
deps = ["Dates"]
@@ -2476,9 +2529,9 @@ version = "1.0.1"
[[deps.Thermodynamics]]
deps = ["DocStringExtensions", "KernelAbstractions", "Random", "RootSolvers"]
-git-tree-sha1 = "6098c65a2ad62312ac74cb1627c8fb33efe33287"
+git-tree-sha1 = "deac04ad36638b10fde82470d5f128419f627e9a"
uuid = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c"
-version = "0.12.5"
+version = "0.12.6"
weakdeps = ["ClimaParams"]
[deps.Thermodynamics.extensions]
@@ -2503,9 +2556,9 @@ uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f"
version = "0.5.23"
[[deps.TranscodingStreams]]
-git-tree-sha1 = "14389d51751169994b2e1317d5c72f7dc4f21045"
+git-tree-sha1 = "71509f04d045ec714c4748c785a59045c3736349"
uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
-version = "0.10.6"
+version = "0.10.7"
weakdeps = ["Random", "Test"]
[deps.TranscodingStreams.extensions]
@@ -2534,9 +2587,9 @@ version = "1.5.0"
[[deps.TypedSyntax]]
deps = ["CodeTracking", "JuliaSyntax"]
-git-tree-sha1 = "59ccd5febe932ee23af9e8d7e217ba6d27506b79"
+git-tree-sha1 = "f3ea2aa283e95df02d6c9bf1e1896af88874579e"
uuid = "d265eb64-f81a-44ad-a842-4247ee1503de"
-version = "1.3.0"
+version = "1.3.1"
[[deps.URIs]]
git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b"
@@ -2603,9 +2656,9 @@ version = "1.18.3"
[[deps.XML2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"]
-git-tree-sha1 = "07e470dabc5a6a4254ffebc29a1b3fc01464e105"
+git-tree-sha1 = "532e22cf7be8462035d092ff21fada7527e2c488"
uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a"
-version = "2.12.5+0"
+version = "2.12.6+0"
[[deps.XSLT_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"]
@@ -2615,9 +2668,9 @@ version = "1.1.34+0"
[[deps.XZ_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "31c421e5516a6248dfb22c194519e37effbf1f30"
+git-tree-sha1 = "ac88fb95ae6447c8dda6a5503f3bafd496ae8632"
uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800"
-version = "5.6.1+0"
+version = "5.4.6+0"
[[deps.Xorg_libX11_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"]
@@ -2680,9 +2733,9 @@ version = "1.2.13+1"
[[deps.Zstd_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "49ce682769cd5de6c72dcf1b94ed7790cd08974c"
+git-tree-sha1 = "e678132f07ddb5bfa46857f0d7620fb9be675d3b"
uuid = "3161d3a3-bdf6-5164-811a-617609db77b4"
-version = "1.5.5+0"
+version = "1.5.6+0"
[[deps.isoband_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
diff --git a/perf/benchmark_netcdf_io.jl b/perf/benchmark_netcdf_io.jl
index 8b9cf220089..4950fb76195 100644
--- a/perf/benchmark_netcdf_io.jl
+++ b/perf/benchmark_netcdf_io.jl
@@ -104,7 +104,7 @@ for device in keys(timings)
NCDatasets.defDim(nc, "x", NUM)
NCDatasets.defDim(nc, "y", NUM)
NCDatasets.defDim(nc, "z", NUM)
- v = NCDatasets.defVar(nc, "rhoa", Float32, ("time", "x", "y", "z"))
+ v = NCDatasets.defVar(nc, "rhoa", Float64, ("time", "x", "y", "z"))
outarray = Array(netcdf_writer.remappers["rhoa"]._interpolated_values)
v[1, :, :, :] = outarray
diff --git a/perf/jet.jl b/perf/jet.jl
index 85fd9fe3f91..021395f528f 100644
--- a/perf/jet.jl
+++ b/perf/jet.jl
@@ -1,3 +1,12 @@
+#=
+# to get a target configuration:
+julia --project=perf
+import ClimaAtmos as CA
+using Revise; include(joinpath(pkgdir(CA), "perf", "common.jl"))
+config = TargetJobConfig("gpu_prognostic_edmfx_aquaplanet")
+
+include(joinpath(pkgdir(CA), "perf", "jet.jl"))
+=#
redirect_stderr(IOContext(stderr, :stacktrace_types_limited => Ref(false)))
import Random
import HDF5, NCDatasets, CUDA
@@ -6,16 +15,31 @@ import ClimaAtmos as CA
include("common.jl")
-config_dict = Dict("z_elem" => 63, "dt" => "10secs", "t_end" => "3600secs")
-config = AtmosCoveragePerfConfig(config_dict)
+if !(@isdefined config)
+ config_dict = Dict("z_elem" => 63, "dt" => "10secs", "t_end" => "3600secs")
+ config = AtmosCoveragePerfConfig(config_dict)
+end
+
+import JET
+
+function jet_test(f, args)
+ f(args...) # compile first
+ JET.@test_opt ignored_modules = (HDF5, CUDA, NCDatasets) f(args...)
+end
simulation = CA.get_simulation(config)
(; integrator) = simulation
-import JET
-
import SciMLBase
-SciMLBase.step!(integrator) # Make sure no errors
-JET.@test_opt ignored_modules = (HDF5, CUDA, NCDatasets) SciMLBase.step!(
- integrator,
-)
+W = get_W(integrator);
+(; u, p, dt, t) = integrator;
+
+# jet_test(wfact_fun(integrator), (W, u, p, dt, t))
+# jet_test(LA.ldiv!, (X, W, u))
+# jet_test(implicit_fun(integrator), implicit_args(integrator))
+# jet_test(remaining_fun(integrator), remaining_args(integrator))
+# jet_test(CA.additional_tendency!, (X, u, p, t))
+# jet_test(CA.hyperdiffusion_tendency!, remaining_args(integrator))
+# jet_test(CA.dss!, (u, p, t))
+# jet_test(CA.set_precomputed_quantities!, (u, p, t))
+jet_test(SciMLBase.step!, (integrator,))
diff --git a/post_processing/ci_plots.jl b/post_processing/ci_plots.jl
index 03395f5ed7f..f072752667e 100644
--- a/post_processing/ci_plots.jl
+++ b/post_processing/ci_plots.jl
@@ -829,6 +829,7 @@ AquaplanetPlots = Union{
Val{:longrun_aquaplanet_rhoe_equil_55km_nz63_clearsky_diagedmf_diffonly_0M},
Val{:longrun_aquaplanet_rhoe_equil_55km_nz63_clearsky_diagedmf_0M},
Val{:longrun_aquaplanet_rhoe_equil_55km_nz63_allsky_diagedmf_0M},
+ Val{:longrun_aquaplanet_rhoe_equil_55km_nz63_clearsky_progedmf_diffonly_0M},
Val{:longrun_aquaplanet_rhoe_equil_55km_nz63_clearsky_0M_earth},
Val{:longrun_aquaplanet_rhoe_equil_highres_allsky_ft32},
Val{:longrun_aquaplanet_dyamond},
@@ -939,17 +940,23 @@ EDMFBoxPlots = Union{
Val{:diagnostic_edmfx_trmm_box},
Val{:diagnostic_edmfx_trmm_stretched_box},
Val{:diagnostic_edmfx_dycoms_rf01_explicit_box},
- Val{:prognostic_edmfx_adv_test_box},
- Val{:prognostic_edmfx_gabls_box},
- Val{:prognostic_edmfx_bomex_fixtke_box},
+ Val{:prognostic_edmfx_adv_test_column},
+ Val{:prognostic_edmfx_gabls_column},
+ Val{:prognostic_edmfx_bomex_fixtke_column},
+ Val{:prognostic_edmfx_bomex_column},
+ Val{:prognostic_edmfx_bomex_stretched_column},
+ Val{:prognostic_edmfx_dycoms_rf01_column},
+ Val{:prognostic_edmfx_trmm_column_0M},
+ Val{:prognostic_edmfx_simpleplume_column},
Val{:prognostic_edmfx_bomex_box},
- Val{:prognostic_edmfx_bomex_stretched_box},
- Val{:prognostic_edmfx_dycoms_rf01_box},
+}
+
+EDMFBoxPlotsWithPrecip = Union{
Val{:prognostic_edmfx_rico_column},
Val{:prognostic_edmfx_trmm_column},
- Val{:prognostic_edmfx_simpleplume_column},
}
+
"""
plot_edmf_vert_profile!(grid_loc, var_group)
@@ -1023,9 +1030,14 @@ function pair_edmf_names(short_names)
return grouped_vars
end
-function make_plots(::EDMFBoxPlots, output_paths::Vector{<:AbstractString})
+function make_plots(
+ sim_type::Union{EDMFBoxPlots, EDMFBoxPlotsWithPrecip},
+ output_paths::Vector{<:AbstractString},
+)
simdirs = SimDir.(output_paths)
+ precip_names = sim_type isa EDMFBoxPlotsWithPrecip ? ("husra", "hussn") : ()
+
short_names = [
"ua",
"wa",
@@ -1037,6 +1049,7 @@ function make_plots(::EDMFBoxPlots, output_paths::Vector{<:AbstractString})
"haup",
"waup",
"tke",
+ "lmix",
"arup",
"hus",
"husup",
@@ -1047,6 +1060,7 @@ function make_plots(::EDMFBoxPlots, output_paths::Vector{<:AbstractString})
"clwup",
"cli",
"cliup",
+ precip_names...,
]
reduction = "inst"
period = "30m"
diff --git a/regression_tests/print_new_mse.jl b/regression_tests/print_new_mse.jl
index 0c70a63ae76..f998a7fea45 100644
--- a/regression_tests/print_new_mse.jl
+++ b/regression_tests/print_new_mse.jl
@@ -19,7 +19,7 @@ percent_reduction_mse = Dict()
computed_mse = OrderedCollections.OrderedDict()
files_skipped = OrderedCollections.OrderedDict()
for job_id in job_ids
- filename = joinpath(job_id, "computed_mse.json")
+ filename = joinpath(job_id, "output_active/computed_mse.json")
if !isfile(filename)
@warn "File $filename skipped"
files_skipped[job_id] = true
diff --git a/regression_tests/ref_counter.jl b/regression_tests/ref_counter.jl
index bb79365350b..7a9aee41ba3 100644
--- a/regression_tests/ref_counter.jl
+++ b/regression_tests/ref_counter.jl
@@ -1 +1,13 @@
-155
+158
+
+# 158:
+# - Switched back the precipitation threshold defintion in the
+# 0-moment scheme to specific humidity
+# 157:
+# - For the grid mean precipitation tendency in the 0-moment scheme:
+# - added limiting by q_tot/dt
+# - switched the precipitation threshold defintion
+# from specific humidity based to supersaturation based
+
+# 156:
+# - Changed start date (changes insolation)
diff --git a/src/ClimaAtmos.jl b/src/ClimaAtmos.jl
index 2a2d3ef0936..4294fe61b1c 100644
--- a/src/ClimaAtmos.jl
+++ b/src/ClimaAtmos.jl
@@ -43,7 +43,7 @@ include(joinpath("utils", "discrete_hydrostatic_balance.jl"))
include(joinpath("prognostic_equations", "pressure_work.jl"))
include(joinpath("prognostic_equations", "zero_velocity.jl"))
-include(joinpath("prognostic_equations", "zero_gridscale_tendency.jl"))
+include(joinpath("prognostic_equations", "zero_tendency.jl"))
include(joinpath("prognostic_equations", "implicit", "implicit_tendency.jl"))
include(joinpath("prognostic_equations", "implicit", "implicit_solver.jl"))
@@ -105,6 +105,7 @@ include(joinpath("parameterized_tendencies", "sponge", "viscous_sponge.jl"))
include(joinpath("prognostic_equations", "advection.jl"))
include(joinpath("cache", "temporary_quantities.jl"))
+include(joinpath("cache", "tracer_cache.jl"))
include(joinpath("cache", "cache.jl"))
include(joinpath("prognostic_equations", "dss.jl"))
include(joinpath("prognostic_equations", "limited_tendencies.jl"))
diff --git a/src/cache/cache.jl b/src/cache/cache.jl
index 1131dde27d2..a31c75f0ef4 100644
--- a/src/cache/cache.jl
+++ b/src/cache/cache.jl
@@ -24,6 +24,7 @@ struct AtmosCache{
NONGW,
ORGW,
RAD,
+ TRAC,
NETFLUXTOA,
NETFLUXSFC,
CONSCHECK,
@@ -38,7 +39,7 @@ struct AtmosCache{
"""Walltime estimate"""
walltime_estimate::WTE
- """Start date (used for insolation)."""
+ """Start date (used for insolation and for data files)."""
start_date::SD
"""AtmosModel"""
@@ -85,6 +86,7 @@ struct AtmosCache{
non_orographic_gravity_wave::NONGW
orographic_gravity_wave::ORGW
radiation::RAD
+ tracers::TRAC
"""Net energy flux coming through top of atmosphere and surface"""
net_energy_flux_toa::NETFLUXTOA
@@ -109,7 +111,7 @@ end
# The model also depends on f_plane_coriolis_frequency(params)
# This is a constant Coriolis frequency that is only used if space is flat
-function build_cache(Y, atmos, params, surface_setup, sim_info)
+function build_cache(Y, atmos, params, surface_setup, sim_info, aerosol_names)
(; dt, t_end, start_date, output_dir) = sim_info
FT = eltype(params)
@@ -228,6 +230,7 @@ function build_cache(Y, atmos, params, surface_setup, sim_info)
non_orographic_gravity_wave = non_orographic_gravity_wave_cache(Y, atmos)
orographic_gravity_wave = orographic_gravity_wave_cache(Y, atmos)
radiation = radiation_model_cache(Y, atmos, radiation_args...)
+ tracers = tracer_cache(Y, atmos, aerosol_names, start_date)
args = (
dt,
@@ -255,6 +258,7 @@ function build_cache(Y, atmos, params, surface_setup, sim_info)
non_orographic_gravity_wave,
orographic_gravity_wave,
radiation,
+ tracers,
net_energy_flux_toa,
net_energy_flux_sfc,
conservation_check,
diff --git a/src/cache/cloud_fraction.jl b/src/cache/cloud_fraction.jl
index 73ddaa8a473..0ae48fa3cd2 100644
--- a/src/cache/cloud_fraction.jl
+++ b/src/cache/cloud_fraction.jl
@@ -1,3 +1,4 @@
+import NVTX
import StaticArrays as SA
import ClimaCore.RecursiveApply: rzero, ⊞, ⊠
@@ -13,7 +14,7 @@ end
"""
Compute the grid scale cloud fraction based on sub-grid scale properties
"""
-function set_cloud_fraction!(Y, p, ::DryModel, _)
+NVTX.@annotate function set_cloud_fraction!(Y, p, ::DryModel, _)
(; ᶜmixing_length) = p.precomputed
(; turbconv_model) = p.atmos
if isnothing(turbconv_model)
@@ -21,7 +22,7 @@ function set_cloud_fraction!(Y, p, ::DryModel, _)
end
@. p.precomputed.ᶜcloud_fraction = 0
end
-function set_cloud_fraction!(
+NVTX.@annotate function set_cloud_fraction!(
Y,
p,
::Union{EquilMoistModel, NonEquilMoistModel},
@@ -44,7 +45,7 @@ function set_cloud_fraction!(
end
@. ᶜcloud_fraction = ifelse(TD.has_condensate(thermo_params, ᶜts), 1, 0)
end
-function set_cloud_fraction!(
+NVTX.@annotate function set_cloud_fraction!(
Y,
p,
::Union{EquilMoistModel, NonEquilMoistModel},
diff --git a/src/cache/diagnostic_edmf_precomputed_quantities.jl b/src/cache/diagnostic_edmf_precomputed_quantities.jl
index f6f6982a33d..d94c8671d0a 100644
--- a/src/cache/diagnostic_edmf_precomputed_quantities.jl
+++ b/src/cache/diagnostic_edmf_precomputed_quantities.jl
@@ -1,10 +1,11 @@
#####
##### Precomputed quantities
#####
+import NVTX
import Thermodynamics as TD
import ClimaCore: Spaces, Fields, RecursiveApply
-function kinetic_energy!(
+NVTX.@annotate function kinetic_energy!(
K_level,
uₕ_level,
u³_halflevel,
@@ -28,7 +29,7 @@ function kinetic_energy!(
) / 2
end
-function set_diagnostic_edmfx_draft_quantities_level!(
+NVTX.@annotate function set_diagnostic_edmfx_draft_quantities_level!(
thermo_params,
ts_level,
ρ_level,
@@ -50,7 +51,7 @@ function set_diagnostic_edmfx_draft_quantities_level!(
return nothing
end
-function set_diagnostic_edmfx_env_quantities_level!(
+NVTX.@annotate function set_diagnostic_edmfx_env_quantities_level!(
ρ_level,
ρaʲs_level,
u³_halflevel,
@@ -86,7 +87,11 @@ end
Updates the bottom boundary conditions in precomputed quantities
stored in `p` for diagnostic edmfx.
"""
-function set_diagnostic_edmf_precomputed_quantities_bottom_bc!(Y, p, t)
+NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_bottom_bc!(
+ Y,
+ p,
+ t,
+)
(; turbconv_model) = p.atmos
FT = eltype(Y)
n = n_mass_flux_subdomains(turbconv_model)
@@ -207,7 +212,11 @@ function set_diagnostic_edmf_precomputed_quantities_bottom_bc!(Y, p, t)
return nothing
end
-function set_diagnostic_edmf_precomputed_quantities_do_integral!(Y, p, t)
+NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_do_integral!(
+ Y,
+ p,
+ t,
+)
(; turbconv_model, precip_model) = p.atmos
FT = eltype(Y)
n = n_mass_flux_subdomains(turbconv_model)
@@ -693,7 +702,11 @@ end
Updates the top boundary condition of precomputed quantities stored in `p` for diagnostic edmfx.
"""
-function set_diagnostic_edmf_precomputed_quantities_top_bc!(Y, p, t)
+NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_top_bc!(
+ Y,
+ p,
+ t,
+)
n = n_mass_flux_subdomains(p.atmos.turbconv_model)
(; ᶜentrʲs, ᶜdetrʲs, ᶜS_q_totʲs, ᶜS_e_totʲs_helper) = p.precomputed
(; ᶠu³⁰, ᶠu³ʲs, ᶜuʲs, ᶠnh_pressure³ʲs) = p.precomputed
@@ -741,7 +754,11 @@ end
Updates the environment closures in precomputed quantities stored in `p` for diagnostic edmfx.
"""
-function set_diagnostic_edmf_precomputed_quantities_env_closures!(Y, p, t)
+NVTX.@annotate function set_diagnostic_edmf_precomputed_quantities_env_closures!(
+ Y,
+ p,
+ t,
+)
(; moisture_model, turbconv_model, precip_model) = p.atmos
n = n_mass_flux_subdomains(turbconv_model)
ᶜz = Fields.coordinate_field(Y.c).z
diff --git a/src/cache/precipitation_precomputed_quantities.jl b/src/cache/precipitation_precomputed_quantities.jl
index 2b327783df1..21c0fc7f238 100644
--- a/src/cache/precipitation_precomputed_quantities.jl
+++ b/src/cache/precipitation_precomputed_quantities.jl
@@ -3,6 +3,11 @@
#####
import CloudMicrophysics.Microphysics1M as CM1
+# helper function to safely get precipitation from state
+function qₚ(ρqₚ::FT, ρ::FT) where {FT}
+ return max(FT(0), ρqₚ / ρ)
+end
+
"""
set_precipitation_precomputed_quantities!(Y, p, t)
@@ -12,10 +17,14 @@ for the 1-moment microphysics scheme
function set_precipitation_precomputed_quantities!(Y, p, t)
@assert (p.atmos.precip_model isa Microphysics1Moment)
- (; ᶜwᵣ, ᶜwₛ) = p.precomputed
+ (; ᶜwᵣ, ᶜwₛ, ᶜqᵣ, ᶜqₛ) = p.precomputed
cmp = CAP.microphysics_params(p.params)
+ # compute the precipitation specific humidities
+ @. ᶜqᵣ = qₚ(Y.c.ρq_rai, Y.c.ρ)
+ @. ᶜqₛ = qₚ(Y.c.ρq_sno, Y.c.ρ)
+
# compute the precipitation terminal velocity [m/s]
@. ᶜwᵣ = CM1.terminal_velocity(
cmp.pr,
diff --git a/src/cache/precomputed_quantities.jl b/src/cache/precomputed_quantities.jl
index 9f1b70dd71e..4ef6da543f1 100644
--- a/src/cache/precomputed_quantities.jl
+++ b/src/cache/precomputed_quantities.jl
@@ -56,6 +56,23 @@ function precomputed_quantities(Y, atmos)
sfc_conditions = Fields.Field(SCT, Spaces.level(axes(Y.f), half)),
)
cloud_diagnostics = (; ᶜcloud_fraction = similar(Y.c, FT),)
+ precipitation_sgs_quantities =
+ atmos.precip_model isa Microphysics0Moment ?
+ (;
+ ᶜS_q_totʲs = similar(Y.c, NTuple{n, FT}),
+ ᶜS_q_tot⁰ = similar(Y.c, FT),
+ ) :
+ atmos.precip_model isa Microphysics1Moment ?
+ (;
+ ᶜSeₜᵖʲs = similar(Y.c, NTuple{n, FT}),
+ ᶜSqₜᵖʲs = similar(Y.c, NTuple{n, FT}),
+ ᶜSqᵣᵖʲs = similar(Y.c, NTuple{n, FT}),
+ ᶜSqₛᵖʲs = similar(Y.c, NTuple{n, FT}),
+ ᶜSeₜᵖ⁰ = similar(Y.c, FT),
+ ᶜSqₜᵖ⁰ = similar(Y.c, FT),
+ ᶜSqᵣᵖ⁰ = similar(Y.c, FT),
+ ᶜSqₛᵖ⁰ = similar(Y.c, FT),
+ ) : (;)
advective_sgs_quantities =
atmos.turbconv_model isa PrognosticEDMFX ?
(;
@@ -83,8 +100,7 @@ function precomputed_quantities(Y, atmos)
ᶜentrʲs = similar(Y.c, NTuple{n, FT}),
ᶜdetrʲs = similar(Y.c, NTuple{n, FT}),
ᶠnh_pressure₃ʲs = similar(Y.f, NTuple{n, C3{FT}}),
- ᶜS_q_totʲs = similar(Y.c, NTuple{n, FT}),
- ᶜS_q_tot⁰ = similar(Y.c, FT),
+ precipitation_sgs_quantities...,
) : (;)
sgs_quantities = (;
ᶜgradᵥ_θ_virt = Fields.Field(C3{FT}, cspace),
@@ -130,7 +146,12 @@ function precomputed_quantities(Y, atmos)
end
precipitation_quantities =
atmos.precip_model isa Microphysics1Moment ?
- (; ᶜwᵣ = similar(Y.c, FT), ᶜwₛ = similar(Y.c, FT)) : (;)
+ (;
+ ᶜwᵣ = similar(Y.c, FT),
+ ᶜwₛ = similar(Y.c, FT),
+ ᶜqᵣ = similar(Y.c, FT),
+ ᶜqₛ = similar(Y.c, FT),
+ ) : (;)
return (;
gs_quantities...,
sgs_quantities...,
@@ -483,6 +504,11 @@ NVTX.@annotate function set_precomputed_quantities!(Y, p, t)
set_prognostic_edmf_precomputed_quantities_draft_and_bc!(Y, p, ᶠuₕ³, t)
set_prognostic_edmf_precomputed_quantities_environment!(Y, p, ᶠuₕ³, t)
set_prognostic_edmf_precomputed_quantities_closures!(Y, p, t)
+ set_prognostic_edmf_precomputed_quantities_precipitation!(
+ Y,
+ p,
+ p.atmos.precip_model,
+ )
end
if turbconv_model isa DiagnosticEDMFX
diff --git a/src/cache/prognostic_edmf_precomputed_quantities.jl b/src/cache/prognostic_edmf_precomputed_quantities.jl
index df85dbcb16a..fcc17e0f376 100644
--- a/src/cache/prognostic_edmf_precomputed_quantities.jl
+++ b/src/cache/prognostic_edmf_precomputed_quantities.jl
@@ -1,6 +1,7 @@
#####
##### Precomputed quantities
#####
+import NVTX
import Thermodynamics as TD
import ClimaCore: Spaces, Fields
@@ -9,7 +10,12 @@ import ClimaCore: Spaces, Fields
Updates the edmf environment precomputed quantities stored in `p` for edmfx.
"""
-function set_prognostic_edmf_precomputed_quantities_environment!(Y, p, ᶠuₕ³, t)
+NVTX.@annotate function set_prognostic_edmf_precomputed_quantities_environment!(
+ Y,
+ p,
+ ᶠuₕ³,
+ t,
+)
@assert !(p.atmos.moisture_model isa DryModel)
thermo_params = CAP.thermodynamics_params(p.params)
@@ -49,7 +55,12 @@ end
Updates the draft thermo state and boundary conditions
precomputed quantities stored in `p` for edmfx.
"""
-function set_prognostic_edmf_precomputed_quantities_draft_and_bc!(Y, p, ᶠuₕ³, t)
+NVTX.@annotate function set_prognostic_edmf_precomputed_quantities_draft_and_bc!(
+ Y,
+ p,
+ ᶠuₕ³,
+ t,
+)
(; moisture_model, turbconv_model) = p.atmos
#EDMFX BCs only support total energy as state variable
@assert !(moisture_model isa DryModel)
@@ -161,15 +172,18 @@ end
Updates the precomputed quantities stored in `p` for edmfx closures.
"""
-function set_prognostic_edmf_precomputed_quantities_closures!(Y, p, t)
+NVTX.@annotate function set_prognostic_edmf_precomputed_quantities_closures!(
+ Y,
+ p,
+ t,
+)
- (; moisture_model, turbconv_model, precip_model) = p.atmos
+ (; moisture_model, turbconv_model) = p.atmos
@assert !(moisture_model isa DryModel)
(; params) = p
(; dt) = p
thermo_params = CAP.thermodynamics_params(params)
- microphys_params = CAP.microphysics_params(params)
FT = eltype(params)
n = n_mass_flux_subdomains(turbconv_model)
@@ -184,7 +198,6 @@ function set_prognostic_edmf_precomputed_quantities_closures!(Y, p, t)
ρatke_flux,
) = p.precomputed
(; ᶜuʲs, ᶜtsʲs, ᶠu³ʲs, ᶜρʲs, ᶜentrʲs, ᶜdetrʲs) = p.precomputed
- (; ᶜS_q_totʲs, ᶜS_q_tot⁰) = p.precomputed
(; ustar, obukhov_length, buoyancy_flux) = p.precomputed.sfc_conditions
ᶜz = Fields.coordinate_field(Y.c).z
@@ -245,26 +258,8 @@ function set_prognostic_edmf_precomputed_quantities_closures!(Y, p, t)
draft_area(Y.c.sgsʲs.:($$j).ρa, ᶜρʲs.:($$j)),
dt,
)
- # precipitation
- @. ᶜS_q_totʲs.:($$j) = q_tot_precipitation_sources(
- precip_model,
- thermo_params,
- microphys_params,
- dt,
- Y.c.sgsʲs.:($$j).q_tot,
- ᶜtsʲs.:($$j),
- )
end
- @. ᶜS_q_tot⁰ = q_tot_precipitation_sources(
- precip_model,
- thermo_params,
- microphys_params,
- dt,
- ᶜq_tot⁰,
- ᶜts⁰,
- )
-
# First order approximation: Use environmental mean fields.
@. ᶜlinear_buoygrad = buoyancy_gradients(
BuoyGradMean(),
@@ -346,3 +341,114 @@ function set_prognostic_edmf_precomputed_quantities_closures!(Y, p, t)
return nothing
end
+
+"""
+ set_prognostic_edmf_precomputed_quantities_precipitation!(Y, p, precip_model)
+
+Updates the precomputed quantities stored in `p` for edmfx precipitation sources.
+"""
+function set_prognostic_edmf_precomputed_quantities_precipitation!(
+ Y,
+ p,
+ ::NoPrecipitation,
+)
+ return nothing
+end
+NVTX.@annotate function set_prognostic_edmf_precomputed_quantities_precipitation!(
+ Y,
+ p,
+ ::Microphysics0Moment,
+)
+ @assert !(p.atmos.moisture_model isa DryModel)
+
+ (; params, dt) = p
+ thp = CAP.thermodynamics_params(params)
+ cmp = CAP.microphysics_params(params)
+ (; ᶜts⁰, ᶜq_tot⁰, ᶜtsʲs, ᶜS_q_totʲs, ᶜS_q_tot⁰) = p.precomputed
+
+ # Sources from the updrafts
+ n = n_mass_flux_subdomains(p.atmos.turbconv_model)
+ for j in 1:n
+ @. ᶜS_q_totʲs.:($$j) = q_tot_precipitation_sources(
+ Microphysics0Moment(),
+ thp,
+ cmp,
+ dt,
+ Y.c.sgsʲs.:($$j).q_tot,
+ ᶜtsʲs.:($$j),
+ )
+ end
+ # sources from the environment
+ @. ᶜS_q_tot⁰ = q_tot_precipitation_sources(
+ Microphysics0Moment(),
+ thp,
+ cmp,
+ dt,
+ ᶜq_tot⁰,
+ ᶜts⁰,
+ )
+ return nothing
+end
+NVTX.@annotate function set_prognostic_edmf_precomputed_quantities_precipitation!(
+ Y,
+ p,
+ ::Microphysics1Moment,
+)
+ @assert !(p.atmos.moisture_model isa DryModel)
+
+ (; params, dt) = p
+ (; ᶜΦ,) = p.core
+ thp = CAP.thermodynamics_params(params)
+ cmp = CAP.microphysics_params(params)
+
+ (; ᶜSeₜᵖʲs, ᶜSqₜᵖʲs, ᶜSqᵣᵖʲs, ᶜSqₛᵖʲs, ᶜρʲs, ᶜtsʲs) = p.precomputed
+ (; ᶜSeₜᵖ⁰, ᶜSqₜᵖ⁰, ᶜSqᵣᵖ⁰, ᶜSqₛᵖ⁰, ᶜρ⁰, ᶜts⁰) = p.precomputed
+ (; ᶜqᵣ, ᶜqₛ) = p.precomputed
+
+ # TODO - can I re-use them between js and env?
+ ᶜSᵖ = p.scratch.ᶜtemp_scalar
+ ᶜSᵖ_snow = p.scratch.ᶜtemp_scalar_2
+
+ n = n_mass_flux_subdomains(p.atmos.turbconv_model)
+
+ Fields.bycolumn(axes(Y.c.ρ)) do colidx
+ # Sources from the updrafts
+ for j in 1:n
+ compute_precipitation_sources!(
+ ᶜSᵖ[colidx],
+ ᶜSᵖ_snow[colidx],
+ ᶜSqₜᵖʲs.:($j)[colidx],
+ ᶜSqᵣᵖʲs.:($j)[colidx],
+ ᶜSqₛᵖʲs.:($j)[colidx],
+ ᶜSeₜᵖʲs.:($j)[colidx],
+ ᶜρʲs.:($j)[colidx],
+ ᶜqᵣ[colidx],
+ ᶜqₛ[colidx],
+ ᶜtsʲs.:($j)[colidx],
+ ᶜΦ[colidx],
+ dt,
+ cmp,
+ thp,
+ )
+ end
+
+ # Sources from the environment
+ compute_precipitation_sources!(
+ ᶜSᵖ[colidx],
+ ᶜSᵖ_snow[colidx],
+ ᶜSqₜᵖ⁰[colidx],
+ ᶜSqᵣᵖ⁰[colidx],
+ ᶜSqₛᵖ⁰[colidx],
+ ᶜSeₜᵖ⁰[colidx],
+ ᶜρ⁰[colidx],
+ ᶜqᵣ[colidx],
+ ᶜqₛ[colidx],
+ ᶜts⁰[colidx],
+ ᶜΦ[colidx],
+ dt,
+ cmp,
+ thp,
+ )
+ end
+ return nothing
+end
diff --git a/src/cache/tracer_cache.jl b/src/cache/tracer_cache.jl
new file mode 100644
index 00000000000..4ac582f7a04
--- /dev/null
+++ b/src/cache/tracer_cache.jl
@@ -0,0 +1,42 @@
+using ClimaUtilities.ClimaArtifacts
+import ClimaUtilities.TimeVaryingInputs: TimeVaryingInput
+
+function tracer_cache(Y, atmos, prescribed_aerosol_names, start_date)
+ prescribed_aerosol_timevaryinginputs = (;)
+ prescribed_aerosol_fields = (;)
+
+ # Take the aerosol2005/aero_2005.nc file, read the keys with names matching
+ # the ones passed in the prescribed_aerosol_names option, and create a
+ # NamedTuple that uses the same keys and has as values the TimeVaryingInputs
+ # for those variables.
+ #
+ # The keys in the aero_2005.nc file have to match the ones passed with the
+ # configuration. The file also has to be defined on the globe and provide
+ # time series of lon-lat-z data.
+ if !isempty(prescribed_aerosol_names)
+ prescribed_aerosol_names_as_symbols = Symbol.(prescribed_aerosol_names)
+ target_space = axes(Y.c)
+ timevaryinginputs = [
+ TimeVaryingInput(
+ joinpath(
+ @clima_artifact("aerosol2005", ClimaComms.context(Y.c)),
+ "aero_2005.nc",
+ ),
+ name,
+ target_space;
+ reference_date = start_date,
+ regridder_type = :InterpolationsRegridder,
+ ) for name in prescribed_aerosol_names
+ ]
+ empty_fields =
+ [zero(Y.c.ρ) for _ in prescribed_aerosol_names_as_symbols]
+
+ prescribed_aerosol_timevaryinginputs =
+ (; zip(prescribed_aerosol_names_as_symbols, timevaryinginputs)...)
+
+ # We add empty Fields here. Fields are updated in the radiation callback
+ prescribed_aerosol_fields =
+ (; zip(prescribed_aerosol_names_as_symbols, empty_fields)...)
+ end
+ return (; prescribed_aerosol_fields, prescribed_aerosol_timevaryinginputs)
+end
diff --git a/src/callbacks/callbacks.jl b/src/callbacks/callbacks.jl
index 463f905ad93..3a0c92368c1 100644
--- a/src/callbacks/callbacks.jl
+++ b/src/callbacks/callbacks.jl
@@ -14,6 +14,8 @@ using Dates
using Insolation: instantaneous_zenith_angle
import ClimaCore.Fields: ColumnField
+import ClimaUtilities.TimeVaryingInputs: evaluate!
+
include("callback_helpers.jl")
function flux_accumulation!(integrator)
@@ -61,6 +63,12 @@ NVTX.@annotate function rrtmgp_model_callback!(integrator)
(; idealized_insolation, idealized_h2o, idealized_clouds) = p.radiation
(; ᶠradiation_flux, radiation_model) = p.radiation
+ # If we have prescribed aerosols, we need to update them
+ for (key, tv) in pairs(p.tracers.prescribed_aerosol_timevaryinginputs)
+ field = getfield(p.tracers.prescribed_aerosol_fields, key)
+ evaluate!(field, tv, t)
+ end
+
FT = Spaces.undertype(axes(Y.c))
thermo_params = CAP.thermodynamics_params(params)
diff --git a/src/diagnostics/Diagnostics.jl b/src/diagnostics/Diagnostics.jl
index 51d36696085..d3807b07cdc 100644
--- a/src/diagnostics/Diagnostics.jl
+++ b/src/diagnostics/Diagnostics.jl
@@ -29,6 +29,10 @@ import ..Microphysics1Moment
# radiation
import ClimaAtmos.RRTMGPInterface as RRTMGPI
+# vert_diff
+import ..VerticalDiffusion
+import ..FriersonDiffusion
+
# turbconv_model
import ..PrognosticEDMFX
import ..DiagnosticEDMFX
diff --git a/src/diagnostics/edmfx_diagnostics.jl b/src/diagnostics/edmfx_diagnostics.jl
index abeb8c30ce5..a7eb2f2d0df 100644
--- a/src/diagnostics/edmfx_diagnostics.jl
+++ b/src/diagnostics/edmfx_diagnostics.jl
@@ -412,6 +412,66 @@ add_diagnostic_variable!(
compute! = compute_cliup!,
)
+###
+# Entrainment (3d)
+###
+compute_entr!(out, state, cache, time) =
+ compute_entr!(out, state, cache, time, cache.atmos.turbconv_model)
+compute_entr!(_, _, _, _, turbconv_model::T) where {T} =
+ error_diagnostic_variable("entr", turbconv_model)
+
+function compute_entr!(
+ out,
+ state,
+ cache,
+ time,
+ turbconv_model::Union{PrognosticEDMFX, DiagnosticEDMFX},
+)
+ if isnothing(out)
+ return copy(cache.precomputed.ᶜentrʲs.:1)
+ else
+ out .= cache.precomputed.ᶜentrʲs.:1
+ end
+end
+
+add_diagnostic_variable!(
+ short_name = "entr",
+ long_name = "Entrainment rate",
+ units = "s^-1",
+ comments = "Entrainment rate of the first updraft",
+ compute! = compute_entr!,
+)
+
+###
+# Detrainment (3d)
+###
+compute_detr!(out, state, cache, time) =
+ compute_detr!(out, state, cache, time, cache.atmos.turbconv_model)
+compute_detr!(_, _, _, _, turbconv_model::T) where {T} =
+ error_diagnostic_variable("detr", turbconv_model)
+
+function compute_detr!(
+ out,
+ state,
+ cache,
+ time,
+ turbconv_model::Union{PrognosticEDMFX, DiagnosticEDMFX},
+)
+ if isnothing(out)
+ return copy(cache.precomputed.ᶜdetrʲs.:1)
+ else
+ out .= cache.precomputed.ᶜdetrʲs.:1
+ end
+end
+
+add_diagnostic_variable!(
+ short_name = "detr",
+ long_name = "Detrainment rate",
+ units = "s^-1",
+ comments = "Detrainment rate of the first updraft",
+ compute! = compute_detr!,
+)
+
###
# Environment area fraction (3d)
###
@@ -821,3 +881,171 @@ add_diagnostic_variable!(
units = "m^2 s^-2",
compute! = compute_tke!,
)
+
+###
+# Buoyancy gradient (3d)
+###
+compute_bgrad!(out, state, cache, time) =
+ compute_bgrad!(out, state, cache, time, cache.atmos.turbconv_model)
+compute_bgrad!(_, _, _, _, turbconv_model::T) where {T} =
+ error_diagnostic_variable("bgrad", turbconv_model)
+
+function compute_bgrad!(
+ out,
+ state,
+ cache,
+ time,
+ turbconv_model::Union{PrognosticEDMFX, DiagnosticEDMFX},
+)
+ if isnothing(out)
+ return copy(cache.precomputed.ᶜlinear_buoygrad)
+ else
+ out .= cache.precomputed.ᶜlinear_buoygrad
+ end
+end
+
+add_diagnostic_variable!(
+ short_name = "bgrad",
+ long_name = "Linearized Buoyancy Gradient",
+ units = "s^-2",
+ compute! = compute_bgrad!,
+)
+
+###
+# Strain rate magnitude (3d)
+###
+compute_strain!(out, state, cache, time) =
+ compute_strain!(out, state, cache, time, cache.atmos.turbconv_model)
+compute_strain!(_, _, _, _, turbconv_model::T) where {T} =
+ error_diagnostic_variable("strain", turbconv_model)
+
+function compute_strain!(
+ out,
+ state,
+ cache,
+ time,
+ turbconv_model::Union{PrognosticEDMFX, DiagnosticEDMFX},
+)
+ if isnothing(out)
+ return copy(cache.precomputed.ᶜstrain_rate_norm)
+ else
+ out .= cache.precomputed.ᶜstrain_rate_norm
+ end
+end
+
+add_diagnostic_variable!(
+ short_name = "strain",
+ long_name = "String Rate Magnitude",
+ units = "s^-2",
+ compute! = compute_strain!,
+)
+
+###
+# Diffusivity of heat (3d)
+###
+compute_edt!(out, state, cache, time) = compute_edt!(
+ out,
+ state,
+ cache,
+ time,
+ cache.atmos.vert_diff,
+ cache.atmos.turbconv_model,
+)
+compute_edt!(_, _, _, _, vert_diff::T1, turbconv_model::T2) where {T1, T2} =
+ error_diagnostic_variable(
+ "Can only compute heat diffusivity with vertical diffusion or EDMFX",
+ )
+
+function compute_edt!(
+ out,
+ state,
+ cache,
+ time,
+ vert_diff::Union{VerticalDiffusion, FriersonDiffusion},
+ turbconv_model::Nothing,
+)
+ if isnothing(out)
+ return copy(cache.precomputed.ᶜK_h)
+ else
+ out .= cache.precomputed.ᶜK_h
+ end
+end
+
+function compute_edt!(
+ out,
+ state,
+ cache,
+ time,
+ vert_diff::Nothing,
+ turbconv_model::Union{PrognosticEDMFX, DiagnosticEDMFX},
+)
+ if isnothing(out)
+ return copy(cache.precomputed.ᶜK_h)
+ else
+ out .= cache.precomputed.ᶜK_h
+ end
+end
+
+add_diagnostic_variable!(
+ short_name = "edt",
+ long_name = "Eddy Diffusivity Coefficient for Temperature",
+ standard_name = "atmosphere_heat_diffusivity",
+ units = "m^2 s^-1",
+ comments = "Vertical diffusion coefficient for temperature due to parameterized eddies",
+ compute! = compute_edt!,
+)
+
+###
+# Diffusivity of momentum (3d)
+###
+compute_evu!(out, state, cache, time) = compute_evu!(
+ out,
+ state,
+ cache,
+ time,
+ cache.atmos.vert_diff,
+ cache.atmos.turbconv_model,
+)
+compute_evu!(_, _, _, _, vert_diff::T1, turbconv_model::T2) where {T1, T2} =
+ error_diagnostic_variable(
+ "Can only compute momentum diffusivity with vertical diffusion or EDMFX",
+ )
+
+function compute_evu!(
+ out,
+ state,
+ cache,
+ time,
+ vert_diff::Union{VerticalDiffusion, FriersonDiffusion},
+ turbconv_model::Nothing,
+)
+ if isnothing(out)
+ return copy(cache.precomputed.ᶜK_u)
+ else
+ out .= cache.precomputed.ᶜK_u
+ end
+end
+
+function compute_evu!(
+ out,
+ state,
+ cache,
+ time,
+ vert_diff::Nothing,
+ turbconv_model::Union{PrognosticEDMFX, DiagnosticEDMFX},
+)
+ if isnothing(out)
+ return copy(cache.precomputed.ᶜK_u)
+ else
+ out .= cache.precomputed.ᶜK_u
+ end
+end
+
+add_diagnostic_variable!(
+ short_name = "evu",
+ long_name = "Eddy Viscosity Coefficient for Momentum",
+ standard_name = "atmosphere_momentum_diffusivity",
+ units = "m^2 s^-1",
+ comments = "Vertical diffusion coefficient for momentum due to parameterized eddies",
+ compute! = compute_evu!,
+)
diff --git a/src/diagnostics/netcdf_writer.jl b/src/diagnostics/netcdf_writer.jl
index 3f8d08869b4..9b7952153f6 100644
--- a/src/diagnostics/netcdf_writer.jl
+++ b/src/diagnostics/netcdf_writer.jl
@@ -527,7 +527,7 @@ function NetCDFWriter(;
cspace,
num_points = (180, 90, 50),
disable_vertical_interpolation = false,
- compression_level = 9,
+ compression_level = 0,
)
space = cspace
horizontal_space = Spaces.horizontal_space(space)
diff --git a/src/parameterized_tendencies/microphysics/microphysics_wrappers.jl b/src/parameterized_tendencies/microphysics/microphysics_wrappers.jl
index c2d85a95902..ca1559f2431 100644
--- a/src/parameterized_tendencies/microphysics/microphysics_wrappers.jl
+++ b/src/parameterized_tendencies/microphysics/microphysics_wrappers.jl
@@ -3,64 +3,273 @@
import Thermodynamics as TD
import CloudMicrophysics.Microphysics0M as CM0
+# define some aliases and functions to make the code more readable
+const Iₗ = TD.internal_energy_liquid
+const Iᵢ = TD.internal_energy_ice
+const Lf = TD.latent_heat_fusion
+const Tₐ = TD.air_temperature
+const PP = TD.PhasePartition
+const qᵥ = TD.vapor_specific_humidity
+qₗ(thp, ts) = TD.PhasePartition(thp, ts).liq
+qᵢ(thp, ts) = TD.PhasePartition(thp, ts).ice
+
+# helper function to limit the tendency
+function limit(q::FT, dt::FT) where {FT}
+ return q / dt / 5
+end
+
"""
- q_tot_precipitation_sources(precip_model, t_prs, m_prs, dt, q_tot, ts)
+ q_tot_precipitation_sources(precip_model, thp, cmp, dt, qₜ, ts)
- precip_model - a type for precipitation scheme choice
- - t_prs, m_prs - stricts with thermodynamic and microphysics parameters
+ - thp, cmp - structs with thermodynamic and microphysics parameters
- dt - model time step
- - q_tot - total water specific humidity
- - ts - thermodynamic state (see td package for details)
+ - qₜ - total water specific humidity
+ - ts - thermodynamic state (see Thermodynamics.jl package for details)
-Returns the q_tot source term due to precipitation formation
+Returns the qₜ source term due to precipitation formation
defined as Δm_tot / (m_dry + m_tot)
"""
function q_tot_precipitation_sources(
::NoPrecipitation,
- t_prs,
- m_prs,
+ thp,
+ cmp,
dt,
- q_tot::FT,
+ qₜ::FT,
ts,
) where {FT <: Real}
return FT(0)
end
function q_tot_precipitation_sources(
::Microphysics0Moment,
- t_prs,
- m_prs,
+ thp,
+ cmp,
dt,
- q_tot::FT,
+ qₜ::FT,
ts,
) where {FT <: Real}
- return -min(
- max(q_tot, 0) / dt,
- -CM0.remove_precipitation(
- m_prs,
- TD.PhasePartition(t_prs, ts),
- TD.q_vap_saturation(t_prs, ts),
- ),
- )
+ return -min(max(qₜ, 0) / dt, -CM0.remove_precipitation(cmp, PP(thp, ts)))
end
"""
- e_tot_0M_precipitation_sources_helper(t_prs, ts, Φ)
+ e_tot_0M_precipitation_sources_helper(thp, ts, Φ)
- - t_prs - set with thermodynamics parameters
+ - thp - set with thermodynamics parameters
- ts - thermodynamic state (see td package for details)
- Φ - geopotential
Returns the total energy source term multiplier from precipitation formation
+for the 0-moment scheme
"""
function e_tot_0M_precipitation_sources_helper(
- t_prs,
+ thp,
ts,
Φ::FT,
) where {FT <: Real}
- λ::FT = TD.liquid_fraction(t_prs, ts)
- I_l::FT = TD.internal_energy_liquid(t_prs, ts)
- I_i::FT = TD.internal_energy_ice(t_prs, ts)
+ λ::FT = TD.liquid_fraction(thp, ts)
+
+ return λ * Iₗ(thp, ts) + (1 - λ) * Iᵢ(thp, ts) + Φ
+end
+
+"""
+ compute_precipitation_sources!(Sᵖ, Sᵖ_snow, Sqₜᵖ, Sqᵣᵖ, Sqₛᵖ, Seₜᵖ, ρ, qᵣ, qₛ, ts, Φ, dt, mp, thp)
+
+ - Sᵖ, Sᵖ_snow - temporary containters to help compute precipitation source terms
+ - Sqₜᵖ, Sqᵣᵖ, Sqₛᵖ, Seₜᵖ - cached storage for precipitation source terms
+ - ρ - air density
+ - qᵣ, qₛ - precipitation (rain and snow) specific humidity
+ - ts - thermodynamic state (see td package for details)
+ - Φ - geopotential
+ - dt - model time step
+ - thp, cmp - structs with thermodynamic and microphysics parameters
- return λ * I_l + (1 - λ) * I_i + Φ
+Returns the q source terms due to precipitation formation from the 1-moment scheme.
+The specific humidity source terms are defined as defined as Δmᵢ / (m_dry + m_tot)
+where i stands for total, rain or snow.
+Also returns the total energy source term due to the microphysics processes.
+"""
+function compute_precipitation_sources!(
+ Sᵖ,
+ Sᵖ_snow,
+ Sqₜᵖ,
+ Sqᵣᵖ,
+ Sqₛᵖ,
+ Seₜᵖ,
+ ρ,
+ qᵣ,
+ qₛ,
+ ts,
+ Φ,
+ dt,
+ mp,
+ thp,
+)
+ FT = eltype(Sqₜᵖ)
+ @. Sqₜᵖ = FT(0)
+ @. Sqᵣᵖ = FT(0)
+ @. Sqₛᵖ = FT(0)
+ @. Seₜᵖ = FT(0)
+
+ #! format: off
+ # rain autoconversion: q_liq -> q_rain
+ @. Sᵖ = min(
+ limit(qₗ(thp, ts), dt),
+ CM1.conv_q_liq_to_q_rai(mp.pr.acnv1M, qₗ(thp, ts), true),
+ )
+ @. Sqₜᵖ -= Sᵖ
+ @. Sqᵣᵖ += Sᵖ
+ @. Seₜᵖ -= Sᵖ * (Iₗ(thp, ts) + Φ)
+
+ # snow autoconversion assuming no supersaturation: q_ice -> q_snow
+ @. Sᵖ = min(
+ limit(qᵢ(thp, ts), dt),
+ CM1.conv_q_ice_to_q_sno_no_supersat(mp.ps.acnv1M, qᵢ(thp, ts), true),
+ )
+ @. Sqₜᵖ -= Sᵖ
+ @. Sqₛᵖ += Sᵖ
+ @. Seₜᵖ -= Sᵖ * (Iᵢ(thp, ts) + Φ)
+
+ # accretion: q_liq + q_rain -> q_rain
+ @. Sᵖ = min(
+ limit(qₗ(thp, ts), dt),
+ CM1.accretion(mp.cl, mp.pr, mp.tv.rain, mp.ce, qₗ(thp, ts), qᵣ, ρ),
+ )
+ @. Sqₜᵖ -= Sᵖ
+ @. Sqᵣᵖ += Sᵖ
+ @. Seₜᵖ -= Sᵖ * (Iₗ(thp, ts) + Φ)
+
+ # accretion: q_ice + q_snow -> q_snow
+ @. Sᵖ = min(
+ limit(qᵢ(thp, ts), dt),
+ CM1.accretion(mp.ci, mp.ps, mp.tv.snow, mp.ce, qᵢ(thp, ts), qₛ, ρ),
+ )
+ @. Sqₜᵖ -= Sᵖ
+ @. Sqₛᵖ += Sᵖ
+ @. Seₜᵖ -= Sᵖ * (Iᵢ(thp, ts) + Φ)
+
+ # accretion: q_liq + q_sno -> q_sno or q_rai
+ # sink of cloud water via accretion cloud water + snow
+ @. Sᵖ = min(
+ limit(qₗ(thp, ts), dt),
+ CM1.accretion(mp.cl, mp.ps, mp.tv.snow, mp.ce, qₗ(thp, ts), qₛ, ρ),
+ )
+ # if T < T_freeze cloud droplets freeze to become snow
+ # else the snow melts and both cloud water and snow become rain
+ α(thp, ts) = TD.Parameters.cv_l(thp) / Lf(thp, ts) * (Tₐ(thp, ts) - mp.ps.T_freeze)
+ @. Sᵖ_snow = ifelse(
+ Tₐ(thp, ts) < mp.ps.T_freeze,
+ Sᵖ,
+ FT(-1) * min(Sᵖ * α(thp, ts), limit(qₛ, dt)),
+ )
+ @. Sqₛᵖ += Sᵖ_snow
+ @. Sqₜᵖ -= Sᵖ
+ @. Sqᵣᵖ += ifelse(Tₐ(thp, ts) < mp.ps.T_freeze, FT(0), Sᵖ - Sᵖ_snow)
+ @. Seₜᵖ -= ifelse(
+ Tₐ(thp, ts) < mp.ps.T_freeze,
+ Sᵖ * (Iᵢ(thp, ts) + Φ),
+ Sᵖ * (Iₗ(thp, ts) + Φ) - Sᵖ_snow * (Iₗ(thp, ts) - Iᵢ(thp, ts)),
+ )
+
+ # accretion: q_ice + q_rai -> q_sno
+ @. Sᵖ = min(
+ limit(qᵢ(thp, ts), dt),
+ CM1.accretion(mp.ci, mp.pr, mp.tv.rain, mp.ce, qᵢ(thp, ts), qᵣ, ρ),
+ )
+ @. Sqₜᵖ -= Sᵖ
+ @. Sqₛᵖ += Sᵖ
+ @. Seₜᵖ -= Sᵖ * (Iᵢ(thp, ts) + Φ)
+ # sink of rain via accretion cloud ice - rain
+ @. Sᵖ = min(
+ limit(qᵣ, dt),
+ CM1.accretion_rain_sink(mp.pr, mp.ci, mp.tv.rain, mp.ce, qᵢ(thp, ts), qᵣ, ρ),
+ )
+ @. Sqᵣᵖ -= Sᵖ
+ @. Sqₛᵖ += Sᵖ
+ @. Seₜᵖ += Sᵖ * Lf(thp, ts)
+
+ # accretion: q_rai + q_sno -> q_rai or q_sno
+ @. Sᵖ = ifelse(
+ Tₐ(thp, ts) < mp.ps.T_freeze,
+ min(
+ limit(qᵣ, dt),
+ CM1.accretion_snow_rain(mp.ps, mp.pr, mp.tv.rain, mp.tv.snow, mp.ce, qₛ, qᵣ, ρ),
+ ),
+ -min(
+ limit(qₛ, dt),
+ CM1.accretion_snow_rain(mp.pr, mp.ps, mp.tv.snow, mp.tv.rain, mp.ce, qᵣ, qₛ, ρ),
+ ),
+ )
+ @. Sqₛᵖ += Sᵖ
+ @. Sqᵣᵖ -= Sᵖ
+ @. Seₜᵖ += Sᵖ * Lf(thp, ts)
+ #! format: on
+end
+
+"""
+ compute_precipitation_sinks!(Sᵖ, Sqₜᵖ, Sqᵣᵖ, Sqₛᵖ, Seₜᵖ, ρ, qᵣ, qₛ, ts, Φ, dt, mp, thp)
+
+ - Sᵖ - a temporary containter to help compute precipitation source terms
+ - Sqₜᵖ, Sqᵣᵖ, Sqₛᵖ, Seₜᵖ - cached storage for precipitation source terms
+ - ρ - air density
+ - qᵣ, qₛ - precipitation (rain and snow) specific humidities
+ - ts - thermodynamic state (see td package for details)
+ - Φ - geopotential
+ - dt - model time step
+ - thp, cmp - structs with thermodynamic and microphysics parameters
+
+Returns the q source terms due to precipitation sinks from the 1-moment scheme.
+The specific humidity source terms are defined as defined as Δmᵢ / (m_dry + m_tot)
+where i stands for total, rain or snow.
+Also returns the total energy source term due to the microphysics processes.
+"""
+function compute_precipitation_sinks!(
+ Sᵖ,
+ Sqₜᵖ,
+ Sqᵣᵖ,
+ Sqₛᵖ,
+ Seₜᵖ,
+ ρ,
+ qᵣ,
+ qₛ,
+ ts,
+ Φ,
+ dt,
+ mp,
+ thp,
+)
+ FT = eltype(Sqₜᵖ)
+ sps = (mp.ps, mp.tv.snow, mp.aps, thp)
+ rps = (mp.pr, mp.tv.rain, mp.aps, thp)
+
+ #! format: off
+ # evaporation: q_rai -> q_vap
+ @. Sᵖ = -min(
+ limit(qᵣ, dt),
+ -CM1.evaporation_sublimation(rps..., PP(thp, ts), qᵣ, ρ, Tₐ(thp, ts)),
+ )
+ @. Sqₜᵖ -= Sᵖ
+ @. Sqᵣᵖ += Sᵖ
+ @. Seₜᵖ -= Sᵖ * (Iₗ(thp, ts) + Φ)
+
+ # melting: q_sno -> q_rai
+ @. Sᵖ = min(
+ limit(qₛ, dt),
+ CM1.snow_melt(sps..., qₛ, ρ, Tₐ(thp, ts)),
+ )
+ @. Sqᵣᵖ += Sᵖ
+ @. Sqₛᵖ -= Sᵖ
+ @. Seₜᵖ -= Sᵖ * Lf(thp, ts)
+
+ # deposition/sublimation: q_vap <-> q_sno
+ @. Sᵖ = CM1.evaporation_sublimation(sps..., PP(thp, ts), qₛ, ρ, Tₐ(thp, ts))
+ @. Sᵖ = ifelse(
+ Sᵖ > FT(0),
+ min(limit(qᵥ(thp, ts), dt), Sᵖ),
+ -min(limit(qₛ, dt), FT(-1) * Sᵖ),
+ )
+ @. Sqₜᵖ -= Sᵖ
+ @. Sqₛᵖ += Sᵖ
+ @. Seₜᵖ -= Sᵖ * (Iᵢ(thp, ts) + Φ)
+ #! format: on
end
diff --git a/src/parameterized_tendencies/microphysics/precipitation.jl b/src/parameterized_tendencies/microphysics/precipitation.jl
index 0e84ad11e95..9003dc139a8 100644
--- a/src/parameterized_tendencies/microphysics/precipitation.jl
+++ b/src/parameterized_tendencies/microphysics/precipitation.jl
@@ -18,10 +18,10 @@ precipitation_cache(Y, atmos::AtmosModel) =
#####
precipitation_cache(Y, precip_model::NoPrecipitation) = (;)
-precipitation_tendency!(Yₜ, Y, p, t, colidx, ::NoPrecipitation) = nothing
+precipitation_tendency!(Yₜ, Y, p, t, colidx, ::NoPrecipitation, _) = nothing
#####
-##### 0-Moment without sgs scheme or with diagnostic edmf
+##### 0-Moment without sgs scheme or with diagnostic/prognostic edmf
#####
function precipitation_cache(Y, precip_model::Microphysics0Moment)
@@ -40,16 +40,19 @@ function precipitation_cache(Y, precip_model::Microphysics0Moment)
end
function compute_precipitation_cache!(Y, p, colidx, ::Microphysics0Moment, _)
- (; params) = p
+ (; params, dt) = p
(; ᶜts) = p.precomputed
(; ᶜS_ρq_tot) = p.precipitation
cm_params = CAP.microphysics_params(params)
thermo_params = CAP.thermodynamics_params(params)
- #TODO missing limiting by q_tot/Δt
@. ᶜS_ρq_tot[colidx] =
- Y.c.ρ[colidx] * CM.Microphysics0M.remove_precipitation(
+ Y.c.ρ[colidx] * q_tot_precipitation_sources(
+ Microphysics0Moment(),
+ thermo_params,
cm_params,
- TD.PhasePartition(thermo_params, ᶜts[colidx]),
+ dt,
+ Y.c.ρq_tot[colidx] / Y.c.ρ[colidx],
+ ᶜts[colidx],
)
end
@@ -99,6 +102,7 @@ function precipitation_tendency!(
t,
colidx,
precip_model::Microphysics0Moment,
+ _,
)
(; ᶜT, ᶜΦ) = p.core
(; ᶜts,) = p.precomputed # assume ᶜts has been updated
@@ -185,268 +189,100 @@ function precipitation_cache(Y, precip_model::Microphysics1Moment)
)
end
-function qₚ(ρqₚ::FT, ρ::FT) where {FT}
- return max(FT(0), ρqₚ / ρ)
-end
+function compute_precipitation_cache!(Y, p, colidx, ::Microphysics1Moment, _)
+ FT = Spaces.undertype(axes(Y.c))
+ (; dt) = p
+ (; ᶜts, ᶜqᵣ, ᶜqₛ) = p.precomputed
+ (; ᶜΦ) = p.core
+ (; ᶜSqₜᵖ, ᶜSqᵣᵖ, ᶜSqₛᵖ, ᶜSeₜᵖ) = p.precipitation
+ ᶜSᵖ = p.scratch.ᶜtemp_scalar
+ ᶜSᵖ_snow = p.scratch.ᶜtemp_scalar_2
-function limit(q::FT, dt::FT) where {FT}
- return q / dt / 5
+ # get thermodynamics and 1-moment microphysics params
+ (; params) = p
+ cmp = CAP.microphysics_params(params)
+ thp = CAP.thermodynamics_params(params)
+
+ # compute precipitation source terms on the grid mean
+ compute_precipitation_sources!(
+ ᶜSᵖ[colidx],
+ ᶜSᵖ_snow[colidx],
+ ᶜSqₜᵖ[colidx],
+ ᶜSqᵣᵖ[colidx],
+ ᶜSqₛᵖ[colidx],
+ ᶜSeₜᵖ[colidx],
+ Y.c.ρ[colidx],
+ ᶜqᵣ[colidx],
+ ᶜqₛ[colidx],
+ ᶜts[colidx],
+ ᶜΦ[colidx],
+ dt,
+ cmp,
+ thp,
+ )
+
+ # compute precipitation sinks
+ # (For now only done on the grid mean)
+ compute_precipitation_sinks!(
+ ᶜSᵖ[colidx],
+ ᶜSqₜᵖ[colidx],
+ ᶜSqᵣᵖ[colidx],
+ ᶜSqₛᵖ[colidx],
+ ᶜSeₜᵖ[colidx],
+ Y.c.ρ[colidx],
+ ᶜqᵣ[colidx],
+ ᶜqₛ[colidx],
+ ᶜts[colidx],
+ ᶜΦ[colidx],
+ dt,
+ cmp,
+ thp,
+ )
end
-function compute_precipitation_cache!(Y, p, colidx, ::Microphysics1Moment, _)
+function compute_precipitation_cache!(
+ Y,
+ p,
+ colidx,
+ ::Microphysics1Moment,
+ ::PrognosticEDMFX,
+)
FT = Spaces.undertype(axes(Y.c))
- (; params) = p
(; dt) = p
- (; ᶜts) = p.precomputed
+ (; ᶜts, ᶜqᵣ, ᶜqₛ) = p.precomputed
(; ᶜΦ) = p.core
+ # Grid mean precipitation sinks
(; ᶜSqₜᵖ, ᶜSqᵣᵖ, ᶜSqₛᵖ, ᶜSeₜᵖ) = p.precipitation
- ᶜz = Fields.coordinate_field(Y.c).z
-
+ # additional scratch storage
ᶜSᵖ = p.scratch.ᶜtemp_scalar
# get thermodynamics and 1-moment microphysics params
+ (; params) = p
cmp = CAP.microphysics_params(params)
thp = CAP.thermodynamics_params(params)
- # some helper functions to make the code more readable
- Iₗ(ts) = TD.internal_energy_liquid(thp, ts)
- Iᵢ(ts) = TD.internal_energy_ice(thp, ts)
- qₗ(ts) = TD.PhasePartition(thp, ts).liq
- qᵢ(ts) = TD.PhasePartition(thp, ts).ice
- qᵥ(ts) = TD.vapor_specific_humidity(thp, ts)
- Lf(ts) = TD.latent_heat_fusion(thp, ts)
- Tₐ(ts) = TD.air_temperature(thp, ts)
- α(ts) = TD.Parameters.cv_l(thp) / Lf(ts) * (Tₐ(ts) - cmp.ps.T_freeze)
-
- # zero out the source terms
+ # zero out the helper source terms
@. ᶜSqₜᵖ[colidx] = FT(0)
- @. ᶜSeₜᵖ[colidx] = FT(0)
@. ᶜSqᵣᵖ[colidx] = FT(0)
@. ᶜSqₛᵖ[colidx] = FT(0)
-
- # All the tendencies are individually limited
- # by the available condensate (q_ / dt).
-
- # rain autoconversion: q_liq -> q_rain
- @. ᶜSᵖ[colidx] = min(
- limit(qₗ(ᶜts[colidx]), dt),
- CM1.conv_q_liq_to_q_rai(cmp.pr.acnv1M, qₗ(ᶜts[colidx]), true),
- )
- @. ᶜSqₜᵖ[colidx] -= ᶜSᵖ[colidx]
- @. ᶜSqᵣᵖ[colidx] += ᶜSᵖ[colidx]
- @. ᶜSeₜᵖ[colidx] -= ᶜSᵖ[colidx] * (Iₗ(ᶜts[colidx]) + ᶜΦ[colidx])
-
- # snow autoconversion assuming no supersaturation: q_ice -> q_snow
- @. ᶜSᵖ[colidx] = min(
- limit(qᵢ(ᶜts[colidx]), dt),
- CM1.conv_q_ice_to_q_sno_no_supersat(
- cmp.ps.acnv1M,
- qᵢ(ᶜts[colidx]),
- true,
- ),
- )
- @. ᶜSqₜᵖ[colidx] -= ᶜSᵖ[colidx]
- @. ᶜSqₛᵖ[colidx] += ᶜSᵖ[colidx]
- @. ᶜSeₜᵖ[colidx] -= ᶜSᵖ[colidx] * (Iᵢ(ᶜts[colidx]) + ᶜΦ[colidx])
-
- # accretion: q_liq + q_rain -> q_rain
- @. ᶜSᵖ[colidx] = min(
- limit(qₗ(ᶜts[colidx]), dt),
- CM1.accretion(
- cmp.cl,
- cmp.pr,
- cmp.tv.rain,
- cmp.ce,
- qₗ(ᶜts[colidx]),
- qₚ(Y.c.ρq_rai[colidx], Y.c.ρ[colidx]),
- Y.c.ρ[colidx],
- ),
- )
- @. ᶜSqₜᵖ[colidx] -= ᶜSᵖ[colidx]
- @. ᶜSqᵣᵖ[colidx] += ᶜSᵖ[colidx]
- @. ᶜSeₜᵖ[colidx] -= ᶜSᵖ[colidx] * (Iₗ(ᶜts[colidx]) + ᶜΦ[colidx])
-
- # accretion: q_ice + q_snow -> q_snow
- @. ᶜSᵖ[colidx] = min(
- limit(qᵢ(ᶜts[colidx]), dt),
- CM1.accretion(
- cmp.ci,
- cmp.ps,
- cmp.tv.snow,
- cmp.ce,
- qᵢ(ᶜts[colidx]),
- qₚ(Y.c.ρq_sno[colidx], Y.c.ρ[colidx]),
- Y.c.ρ[colidx],
- ),
- )
- @. ᶜSqₜᵖ[colidx] -= ᶜSᵖ[colidx]
- @. ᶜSqₛᵖ[colidx] += ᶜSᵖ[colidx]
- @. ᶜSeₜᵖ[colidx] -= ᶜSᵖ[colidx] * (Iᵢ(ᶜts[colidx]) + ᶜΦ[colidx])
-
- # accretion: q_liq + q_sno -> q_sno or q_rai
- # sink of cloud water via accretion cloud water + snow
- @. ᶜSᵖ[colidx] = min(
- limit(qₗ(ᶜts[colidx]), dt),
- CM1.accretion(
- cmp.cl,
- cmp.ps,
- cmp.tv.snow,
- cmp.ce,
- qₗ(ᶜts[colidx]),
- qₚ(Y.c.ρq_sno[colidx], Y.c.ρ[colidx]),
- Y.c.ρ[colidx],
- ),
- )
- # if T < T_freeze cloud droplets freeze to become snow
- # else the snow melts and both cloud water and snow become rain
- ᶜSᵖ_snow = p.scratch.ᶜtemp_scalar_2
- @. ᶜSᵖ_snow[colidx] = ifelse(
- Tₐ(ᶜts[colidx]) < cmp.ps.T_freeze,
+ @. ᶜSeₜᵖ[colidx] = FT(0)
+ # compute precipitation sinks
+ # (For now only done on the grid mean)
+ compute_precipitation_sinks!(
ᶜSᵖ[colidx],
- FT(-1) * min(
- ᶜSᵖ[colidx] * α(ᶜts[colidx]),
- limit(qₚ(Y.c.ρq_sno[colidx], Y.c.ρ[colidx]), dt),
- ),
- )
- @. ᶜSqₛᵖ[colidx] += ᶜSᵖ_snow[colidx]
- @. ᶜSqₜᵖ[colidx] -= ᶜSᵖ[colidx]
- @. ᶜSqᵣᵖ[colidx] += ifelse(
- Tₐ(ᶜts[colidx]) < cmp.ps.T_freeze,
- FT(0),
- ᶜSᵖ[colidx] - ᶜSᵖ_snow[colidx],
- )
- @. ᶜSeₜᵖ[colidx] -= ifelse(
- Tₐ(ᶜts[colidx]) < cmp.ps.T_freeze,
- ᶜSᵖ[colidx] * (Iᵢ(ᶜts[colidx]) + ᶜΦ[colidx]),
- ᶜSᵖ[colidx] * (Iₗ(ᶜts[colidx]) + ᶜΦ[colidx]) -
- ᶜSᵖ_snow[colidx] * (Iₗ(ᶜts[colidx]) - Iᵢ(ᶜts[colidx])),
- )
-
- # accretion: q_ice + q_rai -> q_sno
- @. ᶜSᵖ[colidx] = min(
- limit(qᵢ(ᶜts[colidx]), dt),
- CM1.accretion(
- cmp.ci,
- cmp.pr,
- cmp.tv.rain,
- cmp.ce,
- qᵢ(ᶜts[colidx]),
- qₚ(Y.c.ρq_rai[colidx], Y.c.ρ[colidx]),
- Y.c.ρ[colidx],
- ),
- )
- @. ᶜSqₜᵖ[colidx] -= ᶜSᵖ[colidx]
- @. ᶜSqₛᵖ[colidx] += ᶜSᵖ[colidx]
- @. ᶜSeₜᵖ[colidx] -= ᶜSᵖ[colidx] * (Iᵢ(ᶜts[colidx]) + ᶜΦ[colidx])
- # sink of rain via accretion cloud ice - rain
- @. ᶜSᵖ[colidx] = min(
- limit(qₚ(Y.c.ρq_rai[colidx], Y.c.ρ[colidx]), dt),
- CM1.accretion_rain_sink(
- cmp.pr,
- cmp.ci,
- cmp.tv.rain,
- cmp.ce,
- qᵢ(ᶜts[colidx]),
- qₚ(Y.c.ρq_rai[colidx], Y.c.ρ[colidx]),
- Y.c.ρ[colidx],
- ),
- )
- @. ᶜSqᵣᵖ[colidx] -= ᶜSᵖ[colidx]
- @. ᶜSqₛᵖ[colidx] += ᶜSᵖ[colidx]
- @. ᶜSeₜᵖ[colidx] += ᶜSᵖ[colidx] * Lf(ᶜts[colidx])
-
- # accretion: q_rai + q_sno -> q_rai or q_sno
- @. ᶜSᵖ[colidx] = ifelse(
- Tₐ(ᶜts[colidx]) < cmp.ps.T_freeze,
- min(
- limit(qₚ(Y.c.ρq_rai[colidx], Y.c.ρ[colidx]), dt),
- CM1.accretion_snow_rain(
- cmp.ps,
- cmp.pr,
- cmp.tv.rain,
- cmp.tv.snow,
- cmp.ce,
- qₚ(Y.c.ρq_sno[colidx], Y.c.ρ[colidx]),
- qₚ(Y.c.ρq_rai[colidx], Y.c.ρ[colidx]),
- Y.c.ρ[colidx],
- ),
- ),
- -min(
- limit(qₚ(Y.c.ρq_sno[colidx], Y.c.ρ[colidx]), dt),
- CM1.accretion_snow_rain(
- cmp.pr,
- cmp.ps,
- cmp.tv.snow,
- cmp.tv.rain,
- cmp.ce,
- qₚ(Y.c.ρq_rai[colidx], Y.c.ρ[colidx]),
- qₚ(Y.c.ρq_sno[colidx], Y.c.ρ[colidx]),
- Y.c.ρ[colidx],
- ),
- ),
- )
- @. ᶜSqₛᵖ[colidx] += ᶜSᵖ[colidx]
- @. ᶜSqᵣᵖ[colidx] -= ᶜSᵖ[colidx]
- @. ᶜSeₜᵖ[colidx] += ᶜSᵖ[colidx] * Lf(ᶜts[colidx])
-
- # evaporation: q_rai -> q_vap
- @. ᶜSᵖ[colidx] =
- -min(
- limit(qₚ(Y.c.ρq_rai[colidx], Y.c.ρ[colidx]), dt),
- -CM1.evaporation_sublimation(
- cmp.pr,
- cmp.tv.rain,
- cmp.aps,
- thp,
- TD.PhasePartition(thp, ᶜts[colidx]),
- qₚ(Y.c.ρq_rai[colidx], Y.c.ρ[colidx]),
- Y.c.ρ[colidx],
- Tₐ(ᶜts[colidx]),
- ),
- )
- @. ᶜSqₜᵖ[colidx] -= ᶜSᵖ[colidx]
- @. ᶜSqᵣᵖ[colidx] += ᶜSᵖ[colidx]
- @. ᶜSeₜᵖ[colidx] -= ᶜSᵖ[colidx] * (Iₗ(ᶜts[colidx]) + ᶜΦ[colidx])
-
- # melting: q_sno -> q_rai
- @. ᶜSᵖ[colidx] = min(
- limit(qₚ(Y.c.ρq_sno[colidx], Y.c.ρ[colidx]), dt),
- CM1.snow_melt(
- cmp.ps,
- cmp.tv.snow,
- cmp.aps,
- thp,
- qₚ(Y.c.ρq_sno[colidx], Y.c.ρ[colidx]),
- Y.c.ρ[colidx],
- Tₐ(ᶜts[colidx]),
- ),
- )
- @. ᶜSqᵣᵖ[colidx] += ᶜSᵖ[colidx]
- @. ᶜSqₛᵖ[colidx] -= ᶜSᵖ[colidx]
- @. ᶜSeₜᵖ[colidx] -= ᶜSᵖ[colidx] * Lf(ᶜts[colidx])
-
- # deposition/sublimation: q_vap <-> q_sno
- @. ᶜSᵖ[colidx] = CM1.evaporation_sublimation(
- cmp.ps,
- cmp.tv.snow,
- cmp.aps,
- thp,
- TD.PhasePartition(thp, ᶜts[colidx]),
- qₚ(Y.c.ρq_sno[colidx], Y.c.ρ[colidx]),
+ ᶜSqₜᵖ[colidx],
+ ᶜSqᵣᵖ[colidx],
+ ᶜSqₛᵖ[colidx],
+ ᶜSeₜᵖ[colidx],
Y.c.ρ[colidx],
- Tₐ(ᶜts[colidx]),
- )
- @. ᶜSᵖ[colidx] = ifelse(
- ᶜSᵖ[colidx] > FT(0),
- min(limit(qᵥ(ᶜts[colidx]), dt), ᶜSᵖ[colidx]),
- -min(
- limit(qₚ(Y.c.ρq_sno[colidx], Y.c.ρ[colidx]), dt),
- FT(-1) * ᶜSᵖ[colidx],
- ),
+ ᶜqᵣ[colidx],
+ ᶜqₛ[colidx],
+ ᶜts[colidx],
+ ᶜΦ[colidx],
+ dt,
+ cmp,
+ thp,
)
- @. ᶜSqₜᵖ[colidx] -= ᶜSᵖ[colidx]
- @. ᶜSqₛᵖ[colidx] += ᶜSᵖ[colidx]
- @. ᶜSeₜᵖ[colidx] -= ᶜSᵖ[colidx] * (Iᵢ(ᶜts[colidx]) + ᶜΦ[colidx])
end
function precipitation_tendency!(
@@ -456,18 +292,14 @@ function precipitation_tendency!(
t,
colidx,
precip_model::Microphysics1Moment,
+ _,
)
- FT = Spaces.undertype(axes(Y.c))
- (; ᶜSqₜᵖ, ᶜSqᵣᵖ, ᶜSqₛᵖ, ᶜSeₜᵖ) = p.precipitation
+ (; turbconv_model) = p.atmos
+ compute_precipitation_cache!(Y, p, colidx, precip_model, turbconv_model)
- compute_precipitation_cache!(
- Y,
- p,
- colidx,
- precip_model,
- p.atmos.turbconv_model,
- )
+ (; ᶜSqₜᵖ, ᶜSqᵣᵖ, ᶜSqₛᵖ, ᶜSeₜᵖ) = p.precipitation
+ # Update grid mean tendencies
@. Yₜ.c.ρ[colidx] += Y.c.ρ[colidx] * ᶜSqₜᵖ[colidx]
@. Yₜ.c.ρq_tot[colidx] += Y.c.ρ[colidx] * ᶜSqₜᵖ[colidx]
@. Yₜ.c.ρe_tot[colidx] += Y.c.ρ[colidx] * ᶜSeₜᵖ[colidx]
@@ -476,3 +308,50 @@ function precipitation_tendency!(
return nothing
end
+
+function precipitation_tendency!(
+ Yₜ,
+ Y,
+ p,
+ t,
+ colidx,
+ precip_model::Microphysics1Moment,
+ turbconv_model::PrognosticEDMFX,
+)
+ # Source terms from EDMFX environment
+ (; ᶜSeₜᵖ⁰, ᶜSqₜᵖ⁰, ᶜSqᵣᵖ⁰, ᶜSqₛᵖ⁰, ᶜρa⁰) = p.precomputed
+ # Source terms from EDMFX updrafts
+ (; ᶜSeₜᵖʲs, ᶜSqₜᵖʲs, ᶜSqᵣᵖʲs, ᶜSqₛᵖʲs) = p.precomputed
+ # Grid mean precipitation sinks
+ (; ᶜSqₜᵖ, ᶜSqᵣᵖ, ᶜSqₛᵖ, ᶜSeₜᵖ) = p.precipitation
+
+ compute_precipitation_cache!(Y, p, colidx, precip_model, turbconv_model)
+
+ # Update from environment precipitation sources
+ # and the grid mean precipitation sinks
+ @. Yₜ.c.ρ[colidx] +=
+ ᶜρa⁰[colidx] * ᶜSqₜᵖ⁰[colidx] + Y.c.ρ[colidx] * ᶜSqₜᵖ[colidx]
+ @. Yₜ.c.ρq_tot[colidx] +=
+ ᶜρa⁰[colidx] * ᶜSqₜᵖ⁰[colidx] + Y.c.ρ[colidx] * ᶜSqₜᵖ[colidx]
+ @. Yₜ.c.ρe_tot[colidx] +=
+ ᶜρa⁰[colidx] * ᶜSeₜᵖ⁰[colidx] + Y.c.ρ[colidx] * ᶜSeₜᵖ[colidx]
+ @. Yₜ.c.ρq_rai[colidx] +=
+ ᶜρa⁰[colidx] * ᶜSqᵣᵖ⁰[colidx] + Y.c.ρ[colidx] * ᶜSqᵣᵖ[colidx]
+ @. Yₜ.c.ρq_sno[colidx] +=
+ ᶜρa⁰[colidx] * ᶜSqₛᵖ⁰[colidx] + Y.c.ρ[colidx] * ᶜSqₛᵖ[colidx]
+
+ # Update from the updraft precipitation sources
+ n = n_mass_flux_subdomains(p.atmos.turbconv_model)
+ for j in 1:n
+ @. Yₜ.c.ρ[colidx] +=
+ Y.c.sgsʲs.:($$j).ρa[colidx] * ᶜSqₜᵖʲs.:($$j)[colidx]
+ @. Yₜ.c.ρq_tot[colidx] +=
+ Y.c.sgsʲs.:($$j).ρa[colidx] * ᶜSqₜᵖʲs.:($$j)[colidx]
+ @. Yₜ.c.ρe_tot[colidx] +=
+ Y.c.sgsʲs.:($$j).ρa[colidx] * ᶜSeₜᵖʲs.:($$j)[colidx]
+ @. Yₜ.c.ρq_rai[colidx] +=
+ Y.c.sgsʲs.:($$j).ρa[colidx] * ᶜSqᵣᵖʲs.:($$j)[colidx]
+ @. Yₜ.c.ρq_sno[colidx] +=
+ Y.c.sgsʲs.:($$j).ρa[colidx] * ᶜSqₛᵖʲs.:($$j)[colidx]
+ end
+end
diff --git a/src/prognostic_equations/edmfx_precipitation.jl b/src/prognostic_equations/edmfx_precipitation.jl
index 7b0dcc2cd69..b020ac0c922 100644
--- a/src/prognostic_equations/edmfx_precipitation.jl
+++ b/src/prognostic_equations/edmfx_precipitation.jl
@@ -45,3 +45,33 @@ function edmfx_precipitation_tendency!(
end
return nothing
end
+
+function edmfx_precipitation_tendency!(
+ Yₜ,
+ Y,
+ p,
+ t,
+ colidx,
+ turbconv_model::PrognosticEDMFX,
+ precip_model::Microphysics1Moment,
+)
+ n = n_mass_flux_subdomains(turbconv_model)
+ (; ᶜSeₜᵖʲs, ᶜSqₜᵖʲs, ᶜtsʲs) = p.precomputed
+ thp = CAP.thermodynamics_params(p.params)
+ (; ᶜΦ) = p.core
+
+ for j in 1:n
+
+ @. Yₜ.c.sgsʲs.:($$j).ρa[colidx] +=
+ Y.c.sgsʲs.:($$j).ρa[colidx] * ᶜSqₜᵖʲs.:($$j)[colidx]
+
+ @. Yₜ.c.sgsʲs.:($$j).mse[colidx] +=
+ ᶜSeₜᵖʲs.:($$j)[colidx] -
+ ᶜSqₜᵖʲs.:($$j)[colidx] *
+ TD.internal_energy(thp, ᶜtsʲs.:($$j)[colidx])
+
+ @. Yₜ.c.sgsʲs.:($$j).q_tot[colidx] +=
+ ᶜSqₜᵖʲs.:($$j)[colidx] * (1 - Y.c.sgsʲs.:($$j).q_tot[colidx])
+ end
+ return nothing
+end
diff --git a/src/prognostic_equations/gm_sgs_closures.jl b/src/prognostic_equations/gm_sgs_closures.jl
index 07a752e7fb2..6635d2a4ce6 100644
--- a/src/prognostic_equations/gm_sgs_closures.jl
+++ b/src/prognostic_equations/gm_sgs_closures.jl
@@ -2,6 +2,7 @@
##### Grid-mean SGS closures (mixing length)
#####
+import NVTX
import ClimaCore.Geometry as Geometry
import ClimaCore.Fields as Fields
@@ -22,7 +23,7 @@ function smagorinsky_lilly_length(c_smag, N_eff, dz, Pr, ϵ_st)
c_smag * dz
end
-function compute_gm_mixing_length!(ᶜmixing_length, Y, p)
+NVTX.@annotate function compute_gm_mixing_length!(ᶜmixing_length, Y, p)
(; params) = p
thermo_params = CAP.thermodynamics_params(params)
diff --git a/src/prognostic_equations/implicit/implicit_solver.jl b/src/prognostic_equations/implicit/implicit_solver.jl
index e03bd90b9a2..1847ded9889 100644
--- a/src/prognostic_equations/implicit/implicit_solver.jl
+++ b/src/prognostic_equations/implicit/implicit_solver.jl
@@ -9,7 +9,10 @@ use_derivative(::UseDerivative) = true
use_derivative(::IgnoreDerivative) = false
"""
- ImplicitEquationJacobian(Y, atmos; approximate_solve_iters, diffusion_flag, topography_flag, transform_flag)
+ ImplicitEquationJacobian(
+ Y, atmos;
+ approximate_solve_iters, diffusion_flag, topography_flag, sgs_advection_flag, transform_flag
+ )
A wrapper for the matrix ``∂E/∂Y``, where ``E(Y)`` is the "error" of the
implicit step with the state ``Y``.
@@ -76,11 +79,15 @@ is reached.
- `diffusion_flag::DerivativeFlag`: whether the derivative of the
diffusion tendency with respect to the quantities being diffused should be
computed or approximated as 0; must be either `UseDerivative()` or
- `Ignoreerivative()` instead of a `Bool` to ensure type-stability
+ `IgnoreDerivative()` instead of a `Bool` to ensure type-stability
- `topography_flag::DerivativeFlag`: whether the derivative of vertical
contravariant velocity with respect to horizontal covariant velocity should be
computed or approximated as 0; must be either `UseDerivative()` or
`IgnoreDerivative()` instead of a `Bool` to ensure type-stability
+- `sgs_advection_flag::DerivativeFlag`: whether the derivative of the
+ subgrid-scale advection tendency with respect to the updraft quantities should be
+ computed or approximated as 0; must be either `UseDerivative()` or
+ `IgnoreDerivative()` instead of a `Bool` to ensure type-stability
- `transform_flag::Bool`: whether the error should be transformed from ``E(Y)``
to ``E(Y)/Δt``, which is required for non-Rosenbrock timestepping schemes from
OrdinaryDiffEq.jl
@@ -90,6 +97,7 @@ struct ImplicitEquationJacobian{
S <: MatrixFields.FieldMatrixSolver,
F1 <: DerivativeFlag,
F2 <: DerivativeFlag,
+ F3 <: DerivativeFlag,
T <: Fields.FieldVector,
R <: Base.RefValue,
}
@@ -102,6 +110,7 @@ struct ImplicitEquationJacobian{
# flags that determine how E'(Y) is approximated
diffusion_flag::F1
topography_flag::F2
+ sgs_advection_flag::F3
# required by Krylov.jl to evaluate ldiv! with AbstractVector inputs
temp_b::T
@@ -120,6 +129,8 @@ function ImplicitEquationJacobian(
IgnoreDerivative(),
topography_flag = has_topography(axes(Y.c)) ? UseDerivative() :
IgnoreDerivative(),
+ sgs_advection_flag = atmos.sgs_adv_mode == Implicit() ? UseDerivative() :
+ IgnoreDerivative(),
transform_flag = false,
)
FT = Spaces.undertype(axes(Y.c))
@@ -214,14 +225,14 @@ function ImplicitEquationJacobian(
)
end
- sgs_blocks = if atmos.turbconv_model isa PrognosticEDMFX
+ sgs_advection_blocks = if atmos.turbconv_model isa PrognosticEDMFX
@assert n_prognostic_mass_flux_subdomains(atmos.turbconv_model) == 1
sgs_scalar_names = (
@name(c.sgsʲs.:(1).q_tot),
@name(c.sgsʲs.:(1).mse),
@name(c.sgsʲs.:(1).ρa)
)
- if use_derivative(diffusion_flag)
+ if use_derivative(sgs_advection_flag)
(
MatrixFields.unrolled_map(
name -> (name, name) => similar(Y.c, TridiagonalRow),
@@ -261,7 +272,7 @@ function ImplicitEquationJacobian(
matrix = MatrixFields.FieldMatrix(
identity_blocks...,
- sgs_blocks...,
+ sgs_advection_blocks...,
advection_blocks...,
diffusion_blocks...,
)
@@ -287,49 +298,60 @@ function ImplicitEquationJacobian(
)
alg₂ = MatrixFields.BlockLowerTriangularSolve(@name(c.uₕ))
- alg = if use_derivative(diffusion_flag)
- alg₁_subalg₂ = if atmos.turbconv_model isa PrognosticEDMFX
- (;
- alg₂ = MatrixFields.BlockLowerTriangularSolve(
- @name(c.sgsʲs.:(1).q_tot);
- alg₂ = MatrixFields.BlockLowerTriangularSolve(
- @name(c.sgsʲs.:(1).mse);
- alg₂ = MatrixFields.BlockLowerTriangularSolve(
- @name(c.sgsʲs.:(1).ρa),
- @name(f.sgsʲs.:(1).u₃);
+ alg =
+ if use_derivative(diffusion_flag) || use_derivative(sgs_advection_flag)
+ alg₁_subalg₂ =
+ if atmos.turbconv_model isa PrognosticEDMFX &&
+ use_derivative(sgs_advection_flag)
+ diff_subalg =
+ use_derivative(diffusion_flag) ?
+ (;
alg₂ = MatrixFields.BlockLowerTriangularSolve(
names₁_group₂...,
+ )
+ ) : (;)
+ (;
+ alg₂ = MatrixFields.BlockLowerTriangularSolve(
+ @name(c.sgsʲs.:(1).q_tot);
+ alg₂ = MatrixFields.BlockLowerTriangularSolve(
+ @name(c.sgsʲs.:(1).mse);
+ alg₂ = MatrixFields.BlockLowerTriangularSolve(
+ @name(c.sgsʲs.:(1).ρa),
+ @name(f.sgsʲs.:(1).u₃);
+ diff_subalg...,
+ ),
),
- ),
- ),
- )
+ )
+ )
+ else
+ is_in_Y(@name(c.ρq_tot)) ?
+ (;
+ alg₂ = MatrixFields.BlockLowerTriangularSolve(
+ names₁_group₂...,
+ )
+ ) : (;)
+ end
+ alg₁ = MatrixFields.BlockLowerTriangularSolve(
+ names₁_group₁...;
+ alg₁_subalg₂...,
+ )
+ MatrixFields.ApproximateBlockArrowheadIterativeSolve(
+ names₁...;
+ alg₁,
+ alg₂,
+ P_alg₁ = MatrixFields.MainDiagonalPreconditioner(),
+ n_iters = approximate_solve_iters,
)
else
- is_in_Y(@name(c.ρq_tot)) ?
- (;
- alg₂ = MatrixFields.BlockLowerTriangularSolve(names₁_group₂...)
- ) : (;)
+ MatrixFields.BlockArrowheadSolve(names₁...; alg₂)
end
- alg₁ = MatrixFields.BlockLowerTriangularSolve(
- names₁_group₁...;
- alg₁_subalg₂...,
- )
- MatrixFields.ApproximateBlockArrowheadIterativeSolve(
- names₁...;
- alg₁,
- alg₂,
- P_alg₁ = MatrixFields.MainDiagonalPreconditioner(),
- n_iters = approximate_solve_iters,
- )
- else
- MatrixFields.BlockArrowheadSolve(names₁...; alg₂)
- end
return ImplicitEquationJacobian(
matrix,
MatrixFields.FieldMatrixSolver(alg, matrix, Y),
diffusion_flag,
topography_flag,
+ sgs_advection_flag,
similar(Y),
similar(Y),
transform_flag,
@@ -397,9 +419,13 @@ NVTX.@annotate function Wfact!(A, Y, p, dtγ, t)
(
use_derivative(A.diffusion_flag) &&
p.atmos.turbconv_model isa PrognosticEDMFX ?
+ (; p.precomputed.ᶜρa⁰) : (;)
+ )...,
+ (
+ use_derivative(A.sgs_advection_flag) &&
+ p.atmos.turbconv_model isa PrognosticEDMFX ?
(;
p.core.ᶜgradᵥ_ᶠΦ,
- p.precomputed.ᶜρa⁰,
p.precomputed.ᶜρʲs,
p.precomputed.ᶠu³ʲs,
p.precomputed.ᶜtsʲs,
@@ -441,7 +467,7 @@ NVTX.@annotate function Wfact!(A, Y, p, dtγ, t)
end
function update_implicit_equation_jacobian!(A, Y, p, dtγ, colidx)
- (; matrix, diffusion_flag, topography_flag) = A
+ (; matrix, diffusion_flag, sgs_advection_flag, topography_flag) = A
(; ᶜspecific, ᶜK, ᶜts, ᶜp, ᶜΦ, ᶠgradᵥ_ᶜΦ, ᶜρ_ref, ᶜp_ref) = p
(;
ᶜtemp_C3,
@@ -695,7 +721,7 @@ function update_implicit_equation_jacobian!(A, Y, p, dtγ, colidx)
end
if p.atmos.turbconv_model isa PrognosticEDMFX
- if use_derivative(diffusion_flag)
+ if use_derivative(sgs_advection_flag)
(; ᶜgradᵥ_ᶠΦ, ᶜρʲs, ᶠu³ʲs, ᶜtsʲs) = p
is_third_order = edmfx_upwinding == Val(:third_order)
ᶠupwind = is_third_order ? ᶠupwind3 : ᶠupwind1
diff --git a/src/prognostic_equations/implicit/implicit_tendency.jl b/src/prognostic_equations/implicit/implicit_tendency.jl
index aedcc00b076..e3b217dc5a4 100644
--- a/src/prognostic_equations/implicit/implicit_tendency.jl
+++ b/src/prognostic_equations/implicit/implicit_tendency.jl
@@ -9,7 +9,7 @@ NVTX.@annotate function implicit_tendency!(Yₜ, Y, p, t)
Yₜ .= zero(eltype(Yₜ))
Fields.bycolumn(axes(Y.c)) do colidx
implicit_vertical_advection_tendency!(Yₜ, Y, p, t, colidx)
- if p.atmos.diff_mode == Implicit()
+ if p.atmos.sgs_adv_mode == Implicit()
edmfx_sgs_vertical_advection_tendency!(
Yₜ,
Y,
@@ -18,6 +18,9 @@ NVTX.@annotate function implicit_tendency!(Yₜ, Y, p, t)
colidx,
p.atmos.turbconv_model,
)
+ end
+
+ if p.atmos.diff_mode == Implicit()
vertical_diffusion_boundary_layer_tendency!(
Yₜ,
Y,
@@ -42,10 +45,10 @@ NVTX.@annotate function implicit_tendency!(Yₜ, Y, p, t)
# please DO NOT add additional velocity tendencies after this function
zero_velocity_tendency!(Yₜ, Y, p, t, colidx)
- # NOTE: This will zero out all grid-scale tendencies in the simple edmfx test
- # please DO NOT add additional grid-scale tendencies after this function
- zero_gridscale_tendency!(Yₜ, Y, p, t, colidx)
end
+ # NOTE: This will zero out all tendencies
+ # please DO NOT add additional tendencies after this function
+ zero_tendency!(Yₜ, Y, p, t, p.atmos.tendency_model, p.atmos.turbconv_model)
return nothing
end
diff --git a/src/prognostic_equations/remaining_tendency.jl b/src/prognostic_equations/remaining_tendency.jl
index dd87abe2966..5ba03a78727 100644
--- a/src/prognostic_equations/remaining_tendency.jl
+++ b/src/prognostic_equations/remaining_tendency.jl
@@ -34,7 +34,7 @@ NVTX.@annotate function additional_tendency!(Yₜ, Y, p, t)
edmf_coriolis_tendency!(Yₜ, Y, p, t, colidx, p.atmos.edmf_coriolis)
large_scale_advection_tendency!(Yₜ, Y, p, t, colidx, p.atmos.ls_adv)
- if p.atmos.diff_mode == Explicit()
+ if p.atmos.sgs_adv_mode == Explicit()
edmfx_sgs_vertical_advection_tendency!(
Yₜ,
Y,
@@ -43,6 +43,9 @@ NVTX.@annotate function additional_tendency!(Yₜ, Y, p, t)
colidx,
p.atmos.turbconv_model,
)
+ end
+
+ if p.atmos.diff_mode == Explicit()
vertical_diffusion_boundary_layer_tendency!(
Yₜ,
Y,
@@ -81,6 +84,7 @@ NVTX.@annotate function additional_tendency!(Yₜ, Y, p, t)
p.atmos.turbconv_model,
)
edmfx_tke_tendency!(Yₜ, Y, p, t, colidx, p.atmos.turbconv_model)
+ # TODO - add the 1-moment precipitation microphysics here
edmfx_precipitation_tendency!(
Yₜ,
Y,
@@ -90,7 +94,15 @@ NVTX.@annotate function additional_tendency!(Yₜ, Y, p, t)
p.atmos.turbconv_model,
p.atmos.precip_model,
)
- precipitation_tendency!(Yₜ, Y, p, t, colidx, p.atmos.precip_model)
+ precipitation_tendency!(
+ Yₜ,
+ Y,
+ p,
+ t,
+ colidx,
+ p.atmos.precip_model,
+ p.atmos.turbconv_model,
+ )
# NOTE: All ρa tendencies should be applied before calling this function
pressure_work_tendency!(Yₜ, Y, p, t, colidx, p.atmos.turbconv_model)
@@ -99,9 +111,6 @@ NVTX.@annotate function additional_tendency!(Yₜ, Y, p, t)
# please DO NOT add additional velocity tendencies after this function
zero_velocity_tendency!(Yₜ, Y, p, t, colidx)
- # NOTE: This will zero out all grid-scale tendencies in the simple edmfx test
- # please DO NOT add additional grid-scale tendencies after this function
- zero_gridscale_tendency!(Yₜ, Y, p, t, colidx)
end
# TODO: make bycolumn-able
non_orographic_gravity_wave_tendency!(
@@ -118,4 +127,7 @@ NVTX.@annotate function additional_tendency!(Yₜ, Y, p, t)
t,
p.atmos.orographic_gravity_wave,
)
+ # NOTE: This will zero out all tendencies
+ # please DO NOT add additional tendencies after this function
+ zero_tendency!(Yₜ, Y, p, t, p.atmos.tendency_model, p.atmos.turbconv_model)
end
diff --git a/src/prognostic_equations/zero_gridscale_tendency.jl b/src/prognostic_equations/zero_gridscale_tendency.jl
deleted file mode 100644
index 04e113eaee4..00000000000
--- a/src/prognostic_equations/zero_gridscale_tendency.jl
+++ /dev/null
@@ -1,17 +0,0 @@
-###
-### simple edmfx test
-###
-
-function zero_gridscale_tendency!(Yₜ, Y, p, t, colidx)
- # turn off all grid-scale tendencies in the simple edmfx test
- if !p.atmos.gs_tendency
- @. Yₜ.c.ρ[colidx] = 0
- @. Yₜ.c.uₕ[colidx] = C12(0, 0)
- @. Yₜ.f.u₃[colidx] = C3(0)
- @. Yₜ.c.ρe_tot[colidx] = 0
- for ρχ_name in filter(is_tracer_var, propertynames(Y.c))
- @. Yₜ.c.:($$ρχ_name)[colidx] = 0
- end
- end
- return nothing
-end
diff --git a/src/prognostic_equations/zero_tendency.jl b/src/prognostic_equations/zero_tendency.jl
new file mode 100644
index 00000000000..768bdb78d8d
--- /dev/null
+++ b/src/prognostic_equations/zero_tendency.jl
@@ -0,0 +1,36 @@
+###
+### Zero grid-scale or subgrid-scale tendencies
+###
+
+zero_tendency!(Yₜ, Y, p, t, _, _) = nothing
+
+function zero_tendency!(Yₜ, Y, p, t, ::NoGridScaleTendency, _)
+ # turn off all grid-scale tendencies
+ @. Yₜ.c.ρ = 0
+ @. Yₜ.c.uₕ = C12(0, 0)
+ @. Yₜ.f.u₃ = C3(0)
+ @. Yₜ.c.ρe_tot = 0
+ for ρχ_name in filter(is_tracer_var, propertynames(Y.c))
+ @. Yₜ.c.:($$ρχ_name) = 0
+ end
+ return nothing
+end
+
+function zero_tendency!(
+ Yₜ,
+ Y,
+ p,
+ t,
+ ::NoSubgridScaleTendency,
+ ::PrognosticEDMFX,
+)
+ # turn off all subgrid-scale tendencies
+ n = n_prognostic_mass_flux_subdomains(p.atmos.turbconv_model)
+ for j in 1:n
+ @. Yₜ.c.sgsʲs.:($$j).ρa = 0
+ @. Yₜ.f.sgsʲs.:($$j).u₃ = C3(0)
+ @. Yₜ.c.sgsʲs.:($$j).mse = 0
+ @. Yₜ.c.sgsʲs.:($$j).q_tot = 0
+ end
+ return nothing
+end
diff --git a/src/solver/model_getters.jl b/src/solver/model_getters.jl
index 6a36fd42194..e8a6a765c9d 100644
--- a/src/solver/model_getters.jl
+++ b/src/solver/model_getters.jl
@@ -12,7 +12,17 @@ end
function get_model_config(parsed_args)
config = parsed_args["config"]
- @assert config in ("sphere", "column", "box", "plane")
+
+ valid_configurations = ("sphere", "column", "box", "plane")
+
+ if !(config ∈ valid_configurations)
+ error_message = string(
+ "config = $config is not one of the ",
+ "valid configurations $valid_configurations",
+ )
+ throw(ArgumentError(error_message))
+ end
+
return if config == "sphere"
SphericalModel()
elseif config == "column"
@@ -423,3 +433,20 @@ function get_surface_thermo_state_type(parsed_args)
dict["GCMSurfaceThermoState"] = GCMSurfaceThermoState()
return dict[parsed_args["surface_thermo_state_type"]]
end
+
+function get_tracers(parsed_args)
+ aerosol_names = Tuple(parsed_args["prescribed_aerosols"])
+ return (; aerosol_names)
+end
+
+function get_tendency_model(parsed_args)
+ zero_tendency_name = parsed_args["zero_tendency"]
+ @assert zero_tendency_name in (nothing, "grid_scale", "subgrid_scale")
+ return if zero_tendency_name == "grid_scale"
+ NoGridScaleTendency()
+ elseif zero_tendency_name == "subgrid_scale"
+ NoSubgridScaleTendency()
+ elseif isnothing(zero_tendency_name)
+ UseAllTendency()
+ end
+end
diff --git a/src/solver/type_getters.jl b/src/solver/type_getters.jl
index f54469c3076..0c3ebf8e546 100644
--- a/src/solver/type_getters.jl
+++ b/src/solver/type_getters.jl
@@ -3,6 +3,7 @@ using Dates: DateTime, @dateformat_str
using Dierckx
using Interpolations
import NCDatasets
+import ClimaUtilities.OutputPathGenerator
import ClimaCore: InputOutput, Meshes, Spaces, Quadratures
import ClimaAtmos.RRTMGPInterface as RRTMGPI
import ClimaAtmos as CA
@@ -26,9 +27,6 @@ function get_atmos(config::AtmosConfig, params)
advection_test = parsed_args["advection_test"]
@assert advection_test in (false, true)
- gs_tendency = parsed_args["gs_tendency"]
- @assert gs_tendency in (false, true)
-
edmfx_entr_model = get_entrainment_model(parsed_args)
edmfx_detr_model = get_detrainment_model(parsed_args)
@@ -47,6 +45,9 @@ function get_atmos(config::AtmosConfig, params)
implicit_diffusion = parsed_args["implicit_diffusion"]
@assert implicit_diffusion in (true, false)
+ implicit_sgs_advection = parsed_args["implicit_sgs_advection"]
+ @assert implicit_sgs_advection in (true, false)
+
model_config = get_model_config(parsed_args)
vert_diff =
get_vertical_diffusion_model(diffuse_momentum, parsed_args, params, FT)
@@ -59,7 +60,7 @@ function get_atmos(config::AtmosConfig, params)
ls_adv = get_large_scale_advection_model(parsed_args, FT),
edmf_coriolis = get_edmf_coriolis(parsed_args, FT),
advection_test,
- gs_tendency,
+ tendency_model = get_tendency_model(parsed_args),
edmfx_entr_model,
edmfx_detr_model,
edmfx_sgs_mass_flux,
@@ -82,6 +83,7 @@ function get_atmos(config::AtmosConfig, params)
hyperdiff = get_hyperdiffusion_model(parsed_args, FT),
vert_diff,
diff_mode = implicit_diffusion ? Implicit() : Explicit(),
+ sgs_adv_mode = implicit_sgs_advection ? Implicit() : Explicit(),
viscous_sponge = get_viscous_sponge_model(parsed_args, params, FT),
rayleigh_sponge = get_rayleigh_sponge_model(parsed_args, params, FT),
sfc_temperature = get_sfc_temperature_form(parsed_args),
@@ -469,8 +471,12 @@ function get_sim_info(config::AtmosConfig)
end
default_output = haskey(ENV, "CI") ? job_id : joinpath("output", job_id)
out_dir = parsed_args["output_dir"]
- output_dir = isnothing(out_dir) ? default_output : out_dir
- mkpath(output_dir)
+ base_output_dir = isnothing(out_dir) ? default_output : out_dir
+
+ output_dir = OutputPathGenerator.generate_output_path(
+ base_output_dir;
+ context = config.comms_ctx,
+ )
sim = (;
output_dir,
@@ -612,8 +618,17 @@ function get_simulation(config::AtmosConfig)
@info "Allocating Y: $s"
end
+ tracers = get_tracers(config.parsed_args)
+
s = @timed_str begin
- p = build_cache(Y, atmos, params, surface_setup, sim_info)
+ p = build_cache(
+ Y,
+ atmos,
+ params,
+ surface_setup,
+ sim_info,
+ tracers.aerosol_names,
+ )
end
@info "Allocating cache (p): $s"
diff --git a/src/solver/types.jl b/src/solver/types.jl
index dcbe4224697..f5618f017e7 100644
--- a/src/solver/types.jl
+++ b/src/solver/types.jl
@@ -227,6 +227,11 @@ quad_type(::SGSQuadrature{N}) where {N} = N #TODO - this seems wrong?
abstract type AbstractSurfaceThermoState end
struct GCMSurfaceThermoState <: AbstractSurfaceThermoState end
+abstract type AbstractTendencyModel end
+struct UseAllTendency <: AbstractTendencyModel end
+struct NoGridScaleTendency <: AbstractTendencyModel end
+struct NoSubgridScaleTendency <: AbstractTendencyModel end
+
# Define broadcasting for types
Base.broadcastable(x::AbstractSurfaceThermoState) = tuple(x)
Base.broadcastable(x::AbstractMoistureModel) = tuple(x)
@@ -237,6 +242,7 @@ Base.broadcastable(x::DiagnosticEDMFX) = tuple(x)
Base.broadcastable(x::AbstractEntrainmentModel) = tuple(x)
Base.broadcastable(x::AbstractDetrainmentModel) = tuple(x)
Base.broadcastable(x::AbstractSGSamplingType) = tuple(x)
+Base.broadcastable(x::AbstractTendencyModel) = tuple(x)
Base.@kwdef struct RadiationDYCOMS_RF01{FT}
"Large-scale divergence"
@@ -327,7 +333,7 @@ Base.@kwdef struct AtmosModel{
LA,
EC,
AT,
- GT,
+ TM,
EEM,
EDM,
ESMF,
@@ -340,6 +346,7 @@ Base.@kwdef struct AtmosModel{
HD,
VD,
DM,
+ SAM,
VS,
RS,
ST,
@@ -358,7 +365,7 @@ Base.@kwdef struct AtmosModel{
ls_adv::LA = nothing
edmf_coriolis::EC = nothing
advection_test::AT = nothing
- gs_tendency::GT = nothing
+ tendency_model::TM = nothing
edmfx_entr_model::EEM = nothing
edmfx_detr_model::EDM = nothing
edmfx_sgs_mass_flux::ESMF = nothing
@@ -371,6 +378,7 @@ Base.@kwdef struct AtmosModel{
hyperdiff::HD = nothing
vert_diff::VD = nothing
diff_mode::DM = nothing
+ sgs_adv_mode::SAM = nothing
viscous_sponge::VS = nothing
rayleigh_sponge::RS = nothing
sfc_temperature::ST = nothing
diff --git a/src/solver/yaml_helper.jl b/src/solver/yaml_helper.jl
index 00c980dea4c..8cc41f55976 100644
--- a/src/solver/yaml_helper.jl
+++ b/src/solver/yaml_helper.jl
@@ -72,7 +72,17 @@ function override_default_config(config_dict::AbstractDict;)
for k in intersect(keys(config_dict), keys(default_config))
default_type = typeof(default_config[k])
v = config_dict[k]
- config[k] = isnothing(default_config[k]) ? v : default_type(v)
+
+ # Attempt to convert user value `v` to the same type as
+ # the default. If that fails, throw an informative error.
+ config[k] = try
+ isnothing(default_config[k]) ? v : default_type(v)
+ catch err
+ user_entry_type = typeof(v)
+ msg = """Configuration entry "$(k)" = $v has type $(user_entry_type),
+ but must have type $default_type."""
+ throw(ArgumentError(msg))
+ end
end
# The "diagnostics" entry is a more complex type that doesn't fit the schema described in
diff --git a/test/coupler_compatibility.jl b/test/coupler_compatibility.jl
index 3ac105de887..541f483f4b0 100644
--- a/test/coupler_compatibility.jl
+++ b/test/coupler_compatibility.jl
@@ -82,6 +82,7 @@ const T2 = 290
p.non_orographic_gravity_wave,
p.orographic_gravity_wave,
p.radiation,
+ p.tracers,
p.net_energy_flux_toa,
p.net_energy_flux_sfc,
p.conservation_check,
diff --git a/toml/longrun_aquaplanet_rhoe_equil_55km_nz63_clearsky_progedmf_0M.toml b/toml/longrun_aquaplanet_rhoe_equil_55km_nz63_clearsky_progedmf_0M.toml
new file mode 100644
index 00000000000..c78bc0e113e
--- /dev/null
+++ b/toml/longrun_aquaplanet_rhoe_equil_55km_nz63_clearsky_progedmf_0M.toml
@@ -0,0 +1,47 @@
+[zd_rayleigh]
+value = 35000.0
+
+[alpha_rayleigh_uh]
+value = 0.0
+
+[precipitation_timescale]
+value = 600
+
+[EDMF_surface_area]
+value = 0
+
+[EDMF_min_area]
+value = 1.0e-5
+
+[EDMF_max_area]
+value = 0.7
+
+[entr_inv_tau]
+value = 0.0002
+
+[entr_coeff]
+value = 0.2
+
+[min_area_limiter_scale]
+value = 0
+
+[min_area_limiter_power]
+value = 100
+
+[detr_inv_tau]
+value = 0
+
+[detr_coeff]
+value = 0
+
+[detr_buoy_coeff]
+value = 0
+
+[detr_vertdiv_coeff]
+value = 0
+
+[detr_massflux_vertdiv_coeff]
+value = 1
+
+[pressure_normalmode_drag_coeff]
+value = 40.0
diff --git a/toml/prognostic_edmfx_box.toml b/toml/prognostic_edmfx.toml
similarity index 100%
rename from toml/prognostic_edmfx_box.toml
rename to toml/prognostic_edmfx.toml
diff --git a/toml/prognostic_edmfx_box_advection.toml b/toml/prognostic_edmfx_advection.toml
similarity index 100%
rename from toml/prognostic_edmfx_box_advection.toml
rename to toml/prognostic_edmfx_advection.toml
diff --git a/toml/prognostic_edmfx_bomex_box.toml b/toml/prognostic_edmfx_bomex.toml
similarity index 100%
rename from toml/prognostic_edmfx_bomex_box.toml
rename to toml/prognostic_edmfx_bomex.toml
diff --git a/toml/prognostic_edmfx_dycoms_rf01_box.toml b/toml/prognostic_edmfx_dycoms_rf01.toml
similarity index 100%
rename from toml/prognostic_edmfx_dycoms_rf01_box.toml
rename to toml/prognostic_edmfx_dycoms_rf01.toml