diff --git a/.buildkite/Manifest-v1.11.toml b/.buildkite/Manifest-v1.11.toml index acb022f206..32a6d56bc7 100644 --- a/.buildkite/Manifest-v1.11.toml +++ b/.buildkite/Manifest-v1.11.toml @@ -352,7 +352,7 @@ version = "0.5.16" Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" [[deps.ClimaAtmos]] -deps = ["Adapt", "ArgParse", "Artifacts", "AtmosphericProfilesLibrary", "ClimaComms", "ClimaCore", "ClimaDiagnostics", "ClimaParams", "ClimaTimeSteppers", "ClimaUtilities", "CloudMicrophysics", "Dates", "Insolation", "Interpolations", "LazyArtifacts", "LazyBroadcast", "LinearAlgebra", "Logging", "NCDatasets", "NVTX", "NullBroadcasts", "RRTMGP", "Random", "SciMLBase", "StaticArrays", "Statistics", "SurfaceFluxes", "Thermodynamics", "UnrolledUtilities", "YAML"] +deps = ["Adapt", "ArgParse", "Artifacts", "AtmosphericProfilesLibrary", "ClimaComms", "ClimaCore", "ClimaDiagnostics", "ClimaParams", "ClimaTimeSteppers", "ClimaUtilities", "CloudMicrophysics", "Dates", "ForwardDiff", "Insolation", "Interpolations", "LazyArtifacts", "LazyBroadcast", "LinearAlgebra", "Logging", "NCDatasets", "NVTX", "NullBroadcasts", "RRTMGP", "Random", "SciMLBase", "StaticArrays", "Statistics", "SurfaceFluxes", "Thermodynamics", "UnrolledUtilities", "YAML"] path = ".." uuid = "b2c96348-7fb7-4fe0-8da9-78d88439e717" version = "0.30.0" diff --git a/.buildkite/ci_driver.jl b/.buildkite/ci_driver.jl index 3207bcd3a0..308cddec38 100644 --- a/.buildkite/ci_driver.jl +++ b/.buildkite/ci_driver.jl @@ -41,6 +41,7 @@ import Base.Filesystem: rm import Statistics: mean import LinearAlgebra: norm_sqr include(joinpath(pkgdir(CA), "post_processing", "ci_plots.jl")) +include(joinpath(pkgdir(CA), "post_processing", "jacobian_plots.jl")) ref_job_id = config.parsed_args["reference_job_id"] reference_job_id = isnothing(ref_job_id) ? simulation.job_id : ref_job_id @@ -187,6 +188,7 @@ if ClimaComms.iamroot(config.comms_ctx) "reproducibility_utils.jl", ), ) + @info "Plotting" paths = latest_comparable_dirs() # __build__ path (not job path) if isempty(paths) @@ -218,6 +220,17 @@ if ClimaComms.iamroot(config.comms_ctx) end make_plots(Val(Symbol(reference_job_id)), paths) end + if ( + isnothing(config.parsed_args["plot_jacobian"]) ? + config.parsed_args["debug_approximate_jacobian"] : + config.parsed_args["plot_jacobian"] + ) + make_jacobian_plots( + simulation.output_dir, + integrator.u, + float(integrator.dt), + ) + end @info "Plotting done" if islink(simulation.output_dir) diff --git a/.buildkite/longruns_gpu/pipeline.yml b/.buildkite/longruns_gpu/pipeline.yml index d752c2a90d..2f88e11805 100644 --- a/.buildkite/longruns_gpu/pipeline.yml +++ b/.buildkite/longruns_gpu/pipeline.yml @@ -25,6 +25,8 @@ steps: - julia --project=.buildkite -e 'using Pkg; Pkg.precompile()' - julia --project=.buildkite -e 'using CUDA; CUDA.precompile_runtime()' - julia --project=.buildkite -e 'using Pkg; Pkg.status()' + - julia --project=.buildkite -e 'using Pkg; Pkg.add(Pkg.PackageSpec(;name="Thermodynamics", rev="dy/more_autodiff_fixes"))' + - julia --project=.buildkite -e 'using Pkg; Pkg.add(Pkg.PackageSpec(;name="CloudMicrophysics", rev="main"))' agents: slurm_gpus: 1 @@ -35,160 +37,186 @@ steps: - wait - - group: "helem 30 dycore" - steps: + # - group: "helem 30 dycore" + # steps: - - label: ":computer: hydrostatic balance" - command: - - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME - artifact_paths: "$$JOB_NAME/output_active/*" - agents: - slurm_gpus: 1 - slurm_time: 12:00:00 - env: - CLIMACOMMS_DEVICE: "CUDA" - JOB_NAME: "longrun_hydrostatic_balance" + # - label: ":computer: hydrostatic balance" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 12:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "longrun_hydrostatic_balance" - - label: ":computer: dry baroclinic wave" - command: - - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME - artifact_paths: "$$JOB_NAME/output_active/*" - agents: - slurm_gpus: 1 - slurm_time: 12:00:00 - env: - CLIMACOMMS_DEVICE: "CUDA" - JOB_NAME: "longrun_dry_baroclinic_wave" + # - label: ":computer: dry baroclinic wave" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 12:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "longrun_dry_baroclinic_wave" - - label: ":computer: dry baroclinic wave high res" - command: - - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME - artifact_paths: "$$JOB_NAME/output_active/*" - agents: - slurm_gpus: 1 - slurm_time: 12:00:00 - env: - CLIMACOMMS_DEVICE: "CUDA" - JOB_NAME: "longrun_dry_baroclinic_wave_he60" + # - label: ":computer: dry baroclinic wave high res" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 12:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "longrun_dry_baroclinic_wave_he60" - - label: ":computer: baroclinic wave equilmoist" - command: - - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME - artifact_paths: "$$JOB_NAME/output_active/*" - agents: - slurm_gpus: 1 - slurm_time: 12:00:00 - env: - CLIMACOMMS_DEVICE: "CUDA" - JOB_NAME: "longrun_moist_baroclinic_wave" + # - label: ":computer: baroclinic wave equilmoist" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 12:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "longrun_moist_baroclinic_wave" - - label: ":computer: baroclinic wave equilmoist high res" - command: - - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME - artifact_paths: "$$JOB_NAME/output_active/*" - agents: - slurm_gpus: 1 - slurm_time: 24:00:00 - env: - CLIMACOMMS_DEVICE: "CUDA" - JOB_NAME: "longrun_moist_baroclinic_wave_he60" + # - label: ":computer: baroclinic wave equilmoist high res" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 24:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "longrun_moist_baroclinic_wave_he60" - - label: ":computer: dry held-suarez" - command: - - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME - artifact_paths: "$$JOB_NAME/output_active/*" - agents: - slurm_gpus: 1 - slurm_time: 12:00:00 - env: - CLIMACOMMS_DEVICE: "CUDA" - JOB_NAME: "longrun_dry_held_suarez" + # - label: ":computer: dry held-suarez" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 12:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "longrun_dry_held_suarez" - - label: ":computer: held-suarez, equilmoist" - command: - - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME - artifact_paths: "$$JOB_NAME/output_active/*" - agents: - slurm_gpus: 1 - slurm_time: 24:00:00 - env: - CLIMACOMMS_DEVICE: "CUDA" - JOB_NAME: "longrun_moist_held_suarez" + # - label: ":computer: held-suarez, equilmoist" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 24:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "longrun_moist_held_suarez" - - group: "helem 16 aquaplanet" - steps: + # - group: "helem 16 aquaplanet" + # steps: - - label: ":computer: aquaplanet equilmoist allsky radiation + 0M microphysics" - command: - - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME - artifact_paths: "$$JOB_NAME/output_active/*" - agents: - slurm_gpus: 1 - slurm_time: 24:00:00 - env: - CLIMACOMMS_DEVICE: "CUDA" - JOB_NAME: "longrun_aquaplanet_allsky_0M" + # - label: ":computer: aquaplanet equilmoist allsky radiation + 0M microphysics" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 24:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "longrun_aquaplanet_allsky_0M" - - label: ":computer: aquaplanet equilmoist allsky radiation + diagnostic edmf + 0M microphysics" - command: - - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME - artifact_paths: "$$JOB_NAME/output_active/*" - agents: - slurm_gpus: 1 - slurm_time: 24:00:00 - env: - CLIMACOMMS_DEVICE: "CUDA" - JOB_NAME: "longrun_aquaplanet_allsky_diagedmf_0M" + # - label: ":computer: aquaplanet equilmoist allsky radiation + diagnostic edmf + 0M microphysics" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 24:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "longrun_aquaplanet_allsky_diagedmf_0M" - - label: ":computer: aquaplanet equilmoist allsky radiation + prognostic edmf + 0M microphysics" - command: - - srun julia --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME - artifact_paths: "$$JOB_NAME/output_active/*" - agents: - slurm_gpus: 1 - slurm_time: 24:00:00 - env: - CLIMACOMMS_DEVICE: "CUDA" - JOB_NAME: "longrun_aquaplanet_allsky_progedmf_0M" + # - label: ":computer: aquaplanet equilmoist allsky radiation + prognostic edmf + 0M microphysics" + # command: + # - srun julia --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 24:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "longrun_aquaplanet_allsky_progedmf_0M" - - label: ":computer: aquaplanet equilmoist allsky radiation + 0M microphysics + earth topography" - command: - - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME - artifact_paths: "$$JOB_NAME/output_active/*" - agents: - slurm_gpus: 1 - slurm_time: 24:00:00 - env: - CLIMACOMMS_DEVICE: "CUDA" - JOB_NAME: "longrun_aquaplanet_allsky_0M_earth" + # - label: ":computer: aquaplanet equilmoist allsky radiation + 0M microphysics + earth topography" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 24:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "longrun_aquaplanet_allsky_0M_earth" - - label: ":umbrella: aquaplanet equilmoist allsky radiation + 1M microphysics" - command: - - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME - artifact_paths: "$$JOB_NAME/output_active/*" - agents: - slurm_gpus: 1 - slurm_time: 24:00:00 - env: - CLIMACOMMS_DEVICE: "CUDA" - JOB_NAME: "longrun_aquaplanet_allsky_1M" + # - label: ":umbrella: aquaplanet equilmoist allsky radiation + 1M microphysics" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 24:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "longrun_aquaplanet_allsky_1M" - - label: ":computer: aquaplanet equilmoist allsky radiation + time-varying insolation + 0M microphysics + slab ocean" - command: - - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME - artifact_paths: "$$JOB_NAME/output_active/*" - agents: - slurm_gpus: 1 - slurm_time: 24:00:00 - env: - CLIMACOMMS_DEVICE: "CUDA" - JOB_NAME: "longrun_aquaplanet_allsky_tvinsol_0M_slabocean" + # - label: ":computer: aquaplanet equilmoist allsky radiation + time-varying insolation + 0M microphysics + slab ocean" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 24:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "longrun_aquaplanet_allsky_tvinsol_0M_slabocean" - - group: "DYAMOND" + # - group: "DYAMOND" + + # steps: + + # - label: ":computer: aquaplanet dyamond" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 24:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "longrun_aquaplanet_dyamond" + + - group: "atmos-only coupler runs" steps: - - label: ":computer: aquaplanet dyamond" + # - label: ":computer: amip target diagnostic edmf" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 24:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "amip_target_diagedmf" + + - label: ":computer: amip target edonly edmf" command: - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME artifact_paths: "$$JOB_NAME/output_active/*" @@ -197,13 +225,9 @@ steps: slurm_time: 24:00:00 env: CLIMACOMMS_DEVICE: "CUDA" - JOB_NAME: "longrun_aquaplanet_dyamond" - - - group: "atmos-only coupler runs" - - steps: + JOB_NAME: "amip_target_edonly" - - label: ":computer: amip target diagnostic edmf" + - label: ":computer: amip target edonly edmf nonequil (dt = 50, slow relaxation)" command: - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME artifact_paths: "$$JOB_NAME/output_active/*" @@ -212,9 +236,9 @@ steps: slurm_time: 24:00:00 env: CLIMACOMMS_DEVICE: "CUDA" - JOB_NAME: "amip_target_diagedmf" + JOB_NAME: "amip_target_edonly_nonequil_50_slow" - - label: ":computer: amip target edonly edmf" + - label: ":computer: amip target edonly edmf nonequil (dt = 50, fast relaxation)" command: - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME artifact_paths: "$$JOB_NAME/output_active/*" @@ -223,4 +247,48 @@ steps: slurm_time: 24:00:00 env: CLIMACOMMS_DEVICE: "CUDA" - JOB_NAME: "amip_target_edonly" + JOB_NAME: "amip_target_edonly_nonequil_50_fast" + + # - label: ":computer: amip target edonly edmf nonequil (dt = 200, slow relaxation)" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 24:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "amip_target_edonly_nonequil_200_slow" + + # - label: ":computer: amip target edonly edmf nonequil (dt = 200, fast relaxation)" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 24:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "amip_target_edonly_nonequil_200_fast" + + # - label: ":computer: amip target edonly edmf nonequil (dt = 600, slow relaxation)" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 24:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "amip_target_edonly_nonequil_600_slow" + + # - label: ":computer: amip target edonly edmf nonequil (dt = 600, fast relaxation)" + # command: + # - srun julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/$$JOB_NAME.yml --job_id $$JOB_NAME + # artifact_paths: "$$JOB_NAME/output_active/*" + # agents: + # slurm_gpus: 1 + # slurm_time: 24:00:00 + # env: + # CLIMACOMMS_DEVICE: "CUDA" + # JOB_NAME: "amip_target_edonly_nonequil_600_fast" diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 93e05a210d..edd5aa4a00 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -31,6 +31,8 @@ steps: - echo "--- Instantiate .buildkite" - "julia --project=.buildkite -e 'using Pkg; Pkg.instantiate(;verbose=true); Pkg.precompile(;strict=true); using CUDA; CUDA.precompile_runtime(); Pkg.status()'" + - "julia --project=.buildkite -e 'using Pkg; Pkg.add(Pkg.PackageSpec(;name=\"Thermodynamics\", rev=\"dy/more_autodiff_fixes\"))'" + - "julia --project=.buildkite -e 'using Pkg; Pkg.add(Pkg.PackageSpec(;name=\"CloudMicrophysics\", rev=\"main\"))'" agents: slurm_cpus_per_task: 8 @@ -119,7 +121,7 @@ steps: julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/single_column_nonorographic_gravity_wave.yml --job_id single_column_nonorographic_gravity_wave - artifact_paths: "single_column_nonorographic_gravity_wave/*" + artifact_paths: "single_column_nonorographic_gravity_wave/output_active/*" - group: "Column Examples" steps: @@ -153,6 +155,8 @@ steps: --config_file $CONFIG_PATH/box_density_current_test.yml --job_id box_density_current_test artifact_paths: "box_density_current_test/output_active/*" + agents: + slurm_mem: 20GB - label: ":computer: Box rcemipii with diagnostic edmf" command: > @@ -168,7 +172,7 @@ steps: julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/les_isdac_box.yml --job_id les_isdac_box - artifact_paths: "les_isdac_box/*" + artifact_paths: "les_isdac_box/output_active/*" env: CLIMACOMMS_DEVICE: "CUDA" agents: @@ -859,7 +863,7 @@ steps: julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/prognostic_edmfx_bomex_box.yml --job_id prognostic_edmfx_bomex_box - artifact_paths: "prognostic_edmfx_bomex_box/*" + artifact_paths: "prognostic_edmfx_bomex_box/output_active/*" agents: slurm_mem: 20GB @@ -885,7 +889,7 @@ steps: julia --color=yes --project=.buildkite .buildkite/ci_driver.jl --config_file $CONFIG_PATH/sphere_nonorographic_gravity_wave.yml --job_id sphere_nonorographic_gravity_wave - artifact_paths: "sphere_nonorographic_gravity_wave/*" + artifact_paths: "sphere_nonorographic_gravity_wave/output_active/*" env: CLIMACOMMS_DEVICE: "CUDA" agents: diff --git a/Project.toml b/Project.toml index 505b09b109..49c5abfc38 100644 --- a/Project.toml +++ b/Project.toml @@ -16,6 +16,7 @@ ClimaTimeSteppers = "595c0a79-7f3d-439a-bc5a-b232dc3bde79" ClimaUtilities = "b3f4f4ca-9299-4f7f-bd9b-81e1242a7513" CloudMicrophysics = "6a9e3e04-43cd-43ba-94b9-e8782df3c71b" Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" +ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" Insolation = "e98cc03f-d57e-4e3c-b70c-8d51efe9e0d8" Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" LazyArtifacts = "4af54fe1-eca0-43a8-85a7-787d91b784e3" @@ -48,6 +49,7 @@ ClimaTimeSteppers = "0.8.2" ClimaUtilities = "0.1.22" CloudMicrophysics = "0.22.9" Dates = "1" +ForwardDiff = "0.10.36" Insolation = "0.9.2" Interpolations = "0.15.1" LazyArtifacts = "1" diff --git a/calibration/experiments/microphysics_equil/Manifest.toml b/calibration/experiments/microphysics_equil/Manifest.toml new file mode 100644 index 0000000000..54ee6c4a11 --- /dev/null +++ b/calibration/experiments/microphysics_equil/Manifest.toml @@ -0,0 +1,3145 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.11.2" +manifest_format = "2.0" +project_hash = "a26fb91bd2644d30d82d32882a487194a643a056" + +[[deps.ADTypes]] +git-tree-sha1 = "e2478490447631aedba0823d4d7a80b2cc8cdb32" +uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" +version = "1.14.0" +weakdeps = ["ChainRulesCore", "ConstructionBase", "EnzymeCore"] + + [deps.ADTypes.extensions] + ADTypesChainRulesCoreExt = "ChainRulesCore" + ADTypesConstructionBaseExt = "ConstructionBase" + ADTypesEnzymeCoreExt = "EnzymeCore" + +[[deps.AMD]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse_jll"] +git-tree-sha1 = "45a1272e3f809d36431e57ab22703c6896b8908f" +uuid = "14f7f29c-3bd6-536c-9a0b-7339e30b5a3e" +version = "0.5.3" + +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "Test"] + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + +[[deps.AbstractTrees]] +git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.5" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] +git-tree-sha1 = "3b86719127f50670efe356bc11073d84b4ed7a5d" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.42" + + [deps.Accessors.extensions] + AxisKeysExt = "AxisKeys" + IntervalSetsExt = "IntervalSets" + LinearAlgebraExt = "LinearAlgebra" + StaticArraysExt = "StaticArrays" + StructArraysExt = "StructArrays" + TestExt = "Test" + UnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "f7817e2e585aa6d924fd714df1e2a84be7896c60" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.3.0" +weakdeps = ["SparseArrays", "StaticArrays"] + + [deps.Adapt.extensions] + AdaptSparseArraysExt = "SparseArrays" + AdaptStaticArraysExt = "StaticArrays" + +[[deps.AdaptivePredicates]] +git-tree-sha1 = "7e651ea8d262d2d74ce75fdf47c4d63c07dba7a6" +uuid = "35492f91-a3bd-45ad-95db-fcad7dcfedb7" +version = "1.2.0" + +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[deps.Animations]] +deps = ["Colors"] +git-tree-sha1 = "e092fa223bf66a3c41f9c022bd074d916dc303e7" +uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340" +version = "0.4.2" + +[[deps.ArgParse]] +deps = ["Logging", "TextWrap"] +git-tree-sha1 = "22cf435ac22956a7b45b0168abbc871176e7eecc" +uuid = "c7e460c6-2fb9-53a9-8c5b-16f535851c63" +version = "1.2.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.2" + +[[deps.Arpack]] +deps = ["Arpack_jll", "Libdl", "LinearAlgebra", "Logging"] +git-tree-sha1 = "9b9b347613394885fd1c8c7729bfc60528faa436" +uuid = "7d9fca2a-8960-54d3-9f78-7d1dccf2cb97" +version = "0.5.4" + +[[deps.Arpack_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "OpenBLAS_jll", "Pkg"] +git-tree-sha1 = "5ba6c757e8feccf03a1554dfaf3e26b3cfc7fd5e" +uuid = "68821587-b530-5797-8361-c406ea357684" +version = "3.5.1+1" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "017fcb757f8e921fb44ee063a7aafe5f89b86dd1" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.18.0" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" + ArrayInterfaceChainRulesCoreExt = "ChainRulesCore" + ArrayInterfaceChainRulesExt = "ChainRules" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceSparseArraysExt = "SparseArrays" + ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" + ArrayInterfaceTrackerExt = "Tracker" + + [deps.ArrayInterface.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.ArrayLayouts]] +deps = ["FillArrays", "LinearAlgebra"] +git-tree-sha1 = "4e25216b8fea1908a0ce0f5d87368587899f75be" +uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.ArrayLayouts.extensions] + ArrayLayoutsSparseArraysExt = "SparseArrays" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" + +[[deps.AtmosphericProfilesLibrary]] +deps = ["Interpolations", "LinearAlgebra"] +git-tree-sha1 = "4f5654bb77c179b6021c21c25ad336fe886258f6" +uuid = "86bc3604-9858-485a-bdbe-831ec50de11d" +version = "0.1.7" + +[[deps.Atomix]] +deps = ["UnsafeAtomics"] +git-tree-sha1 = "b5bb4dc6248fde467be2a863eb8452993e74d402" +uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" +version = "1.1.1" + + [deps.Atomix.extensions] + AtomixCUDAExt = "CUDA" + AtomixMetalExt = "Metal" + AtomixOpenCLExt = "OpenCL" + AtomixoneAPIExt = "oneAPI" + + [deps.Atomix.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + OpenCL = "08131aa3-fb12-5dee-8b74-c09406e224a2" + oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" + +[[deps.Automa]] +deps = ["PrecompileTools", "SIMD", "TranscodingStreams"] +git-tree-sha1 = "a8f503e8e1a5f583fbef15a8440c8c7e32185df2" +uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b" +version = "1.1.0" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.1.0" + +[[deps.AxisArrays]] +deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] +git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" +uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" +version = "0.4.7" + +[[deps.BandedMatrices]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "PrecompileTools"] +git-tree-sha1 = "614c6aba1d562191d9832df2af24f594aa7ebf61" +uuid = "aae01518-5342-5314-be14-df237901396f" +version = "1.9.3" +weakdeps = ["SparseArrays"] + + [deps.BandedMatrices.extensions] + BandedMatricesSparseArraysExt = "SparseArrays" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" + +[[deps.BenchmarkTools]] +deps = ["Compat", "JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] +git-tree-sha1 = "e38fbc49a620f5d0b660d7f543db1009fe0f8336" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.6.0" + +[[deps.BitFlags]] +git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.9" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "f21cfd4950cb9f0587d5067e69405ad2acd27b87" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.6" + +[[deps.BlockArrays]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra"] +git-tree-sha1 = "df1746706459aa184ed3424b240a917b89d67b60" +uuid = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" +version = "1.6.1" +weakdeps = ["Adapt", "BandedMatrices"] + + [deps.BlockArrays.extensions] + BlockArraysAdaptExt = "Adapt" + BlockArraysBandedMatricesExt = "BandedMatrices" + +[[deps.Blosc_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Lz4_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "535c80f1c0847a4c967ea945fca21becc9de1522" +uuid = "0b7ba130-8d10-5ba8-a3d6-c5182647fed9" +version = "1.21.7+0" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.9+0" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CFTime]] +deps = ["Dates", "Printf"] +git-tree-sha1 = "937628bf8b377208ac359f57314fd85d3e0165d9" +uuid = "179af706-886a-5703-950a-314cd64e0468" +version = "0.1.4" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] +git-tree-sha1 = "5a97e67919535d6841172016c9530fd69494e5ec" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.2.6" + +[[deps.CRC32c]] +uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" +version = "1.11.0" + +[[deps.CRlibm]] +deps = ["CRlibm_jll"] +git-tree-sha1 = "66188d9d103b92b6cd705214242e27f5737a1e5e" +uuid = "96374032-68de-5a5b-8d9e-752f78720389" +version = "1.0.2" + +[[deps.CRlibm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc" +uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0" +version = "1.0.1+0" + +[[deps.CSV]] +deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"] +git-tree-sha1 = "deddd8725e5e1cc49ee205a1964256043720a6c3" +uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +version = "0.10.15" + +[[deps.Cairo]] +deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"] +git-tree-sha1 = "71aa551c5c33f1a4415867fe06b7844faadb0ae9" +uuid = "159f3aea-2a34-519c-b102-8c37f9878175" +version = "1.1.1" + +[[deps.CairoMakie]] +deps = ["CRC32c", "Cairo", "Cairo_jll", "Colors", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools"] +git-tree-sha1 = "c1c90ea6bba91f769a8fc3ccda802e96620eb24c" +uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" +version = "0.13.4" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "2ac646d71d0d24b44f3f8c84da8c9f4d70fb67df" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.4+0" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "1713c74e00545bfe14605d2a2be1712de8fbcb58" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.25.1" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.ClimaAnalysis]] +deps = ["Artifacts", "Dates", "Interpolations", "NCDatasets", "NaNStatistics", "OrderedCollections", "Reexport", "Statistics", "Unitful"] +git-tree-sha1 = "0a9f4a6de147d0a9dc09f2e8f702f76dd6777e07" +uuid = "29b5916a-a76c-4e73-9657-3c8fd22e65e6" +version = "0.5.16" + + [deps.ClimaAnalysis.extensions] + ClimaAnalysisGeoMakieExt = "GeoMakie" + ClimaAnalysisMakieExt = "Makie" + + [deps.ClimaAnalysis.weakdeps] + GeoMakie = "db073c08-6b98-4ee5-b6a4-5efafb3259c6" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + +[[deps.ClimaAtmos]] +deps = ["Adapt", "ArgParse", "Artifacts", "AtmosphericProfilesLibrary", "ClimaComms", "ClimaCore", "ClimaDiagnostics", "ClimaParams", "ClimaTimeSteppers", "ClimaUtilities", "CloudMicrophysics", "Dates", "DiffEqBase", "FastGaussQuadrature", "Insolation", "Interpolations", "LazyArtifacts", "LazyBroadcast", "LinearAlgebra", "Logging", "NCDatasets", "NVTX", "NullBroadcasts", "RRTMGP", "Random", "SciMLBase", "StaticArrays", "Statistics", "SurfaceFluxes", "Thermodynamics", "UnrolledUtilities", "YAML"] +git-tree-sha1 = "2936575250a7d9c8211f76b9979e7a0c060aa2a4" +uuid = "b2c96348-7fb7-4fe0-8da9-78d88439e717" +version = "0.29.1" + +[[deps.ClimaCalibrate]] +deps = ["Distributed", "Distributions", "EnsembleKalmanProcesses", "JLD2", "Logging", "Random", "TOML", "YAML"] +git-tree-sha1 = "318e758875b5579e0a2c9c70f4e862bb2e1ae5ba" +uuid = "4347a170-ebd6-470c-89d3-5c705c0cacc2" +version = "0.0.14" + + [deps.ClimaCalibrate.extensions] + CESExt = "CalibrateEmulateSample" + + [deps.ClimaCalibrate.weakdeps] + CalibrateEmulateSample = "95e48a1f-0bec-4818-9538-3db4340308e3" + +[[deps.ClimaComms]] +deps = ["Adapt", "Logging", "LoggingExtras"] +git-tree-sha1 = "40ad44466dfe0092e18c04bc02c849fe8e095d30" +uuid = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d" +version = "0.6.6" + + [deps.ClimaComms.extensions] + ClimaCommsCUDAExt = "CUDA" + ClimaCommsMPIExt = "MPI" + + [deps.ClimaComms.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + +[[deps.ClimaCore]] +deps = ["Adapt", "BandedMatrices", "BlockArrays", "ClimaComms", "CubedSphere", "DataStructures", "ForwardDiff", "GaussQuadrature", "GilbertCurves", "HDF5", "InteractiveUtils", "IntervalSets", "KrylovKit", "LazyBroadcast", "LinearAlgebra", "MultiBroadcastFusion", "NVTX", "PkgVersion", "RecursiveArrayTools", "RootSolvers", "SparseArrays", "StaticArrays", "Statistics", "UnrolledUtilities"] +git-tree-sha1 = "b2d001e8f6b5dd3ae3c1265c73a5a5de42acd80d" +uuid = "d414da3d-4745-48bb-8d80-42e94e092884" +version = "0.14.30" + + [deps.ClimaCore.extensions] + ClimaCoreCUDAExt = "CUDA" + KrylovExt = "Krylov" + + [deps.ClimaCore.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Krylov = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" + +[[deps.ClimaDiagnostics]] +deps = ["Accessors", "ClimaComms", "ClimaCore", "ClimaUtilities", "Dates", "NCDatasets", "OrderedCollections", "SciMLBase"] +git-tree-sha1 = "a67549b46bd3629a1af5739f161bc953914f9c5e" +uuid = "1ecacbb8-0713-4841-9a07-eb5aa8a2d53f" +version = "0.2.12" + +[[deps.ClimaParams]] +deps = ["TOML"] +git-tree-sha1 = "98f8b50fcd3efe21e79c3b98a93457d994bb3cde" +uuid = "5c42b081-d73a-476f-9059-fd94b934656c" +version = "0.10.27" + +[[deps.ClimaTimeSteppers]] +deps = ["ClimaComms", "Colors", "DataStructures", "DiffEqBase", "KernelAbstractions", "Krylov", "LinearAlgebra", "LinearOperators", "NVTX", "SciMLBase", "StaticArrays"] +git-tree-sha1 = "e719705cf15fec895abcb547946131ffe83de4d7" +uuid = "595c0a79-7f3d-439a-bc5a-b232dc3bde79" +version = "0.8.3" + + [deps.ClimaTimeSteppers.extensions] + ClimaTimeSteppersBenchmarkToolsExt = ["CUDA", "BenchmarkTools", "OrderedCollections", "StatsBase", "PrettyTables"] + + [deps.ClimaTimeSteppers.weakdeps] + BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" + PrettyTables = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" + StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" + +[[deps.ClimaUtilities]] +deps = ["Artifacts", "ClimaComms", "Dates"] +git-tree-sha1 = "420fe76968208ac2eb2837e9e0f0974456ebec78" +uuid = "b3f4f4ca-9299-4f7f-bd9b-81e1242a7513" +version = "0.1.24" + + [deps.ClimaUtilities.extensions] + ClimaUtilitiesClimaCoreExt = "ClimaCore" + ClimaUtilitiesClimaCoreInterpolationsExt = ["ClimaCore", "Interpolations"] + ClimaUtilitiesClimaCoreNCDatasetsExt = ["ClimaCore", "NCDatasets"] + ClimaUtilitiesClimaCoreTempestRemapExt = "ClimaCoreTempestRemap" + ClimaUtilitiesNCDatasetsExt = "NCDatasets" + + [deps.ClimaUtilities.weakdeps] + Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + 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 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.13" + +[[deps.CloudMicrophysics]] +deps = ["ClimaParams", "DocStringExtensions", "ForwardDiff", "HCubature", "LazyArtifacts", "LogExpFunctions", "QuadGK", "RootSolvers", "SpecialFunctions", "Thermodynamics"] +git-tree-sha1 = "5c4a7d11ea598a7873c0c2ea395653f8d7e08af3" +uuid = "6a9e3e04-43cd-43ba-94b9-e8782df3c71b" +version = "0.22.10" + + [deps.CloudMicrophysics.extensions] + EmulatorModelsExt = ["DataFrames", "MLJ"] + + [deps.CloudMicrophysics.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + MLJ = "add582a8-e3ab-11e8-2d5e-e98b27df1bc7" + +[[deps.CodecBzip2]] +deps = ["Bzip2_jll", "TranscodingStreams"] +git-tree-sha1 = "84990fa864b7f2b4901901ca12736e45ee79068c" +uuid = "523fee87-0ab8-5b00-afb7-3ecf72e48cfd" +version = "0.8.5" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.8" + +[[deps.ColorBrewer]] +deps = ["Colors", "JSON"] +git-tree-sha1 = "e771a63cc8b539eca78c85b0cabd9233d6c8f06f" +uuid = "a2cac450-b92f-5266-8821-25eda20663c8" +version = "0.4.1" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "403f2d8e209681fcbd9468a8514efff3ea08452e" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.29.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.12.1" +weakdeps = ["StyledStrings"] + + [deps.ColorTypes.extensions] + StyledStringsExt = "StyledStrings" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.11.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "64e15186f0aa277e174aa81798f7eb8598e0157e" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.13.0" + +[[deps.Combinatorics]] +git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.0.2" + +[[deps.CommonDataModel]] +deps = ["CFTime", "DataStructures", "Dates", "Preferences", "Printf", "Statistics"] +git-tree-sha1 = "358bf5a7d5c1387b995a43577673290c5d344758" +uuid = "1fbeeb36-5f17-413c-809b-666fb144f157" +version = "0.3.8" + +[[deps.CommonSolve]] +git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.4" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.1" + +[[deps.CommonWorldInvalidations]] +git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0" +uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8" +version = "1.0.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.16.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+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.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "d9d26935a0bcffc87d2613ce14c527c99fc543fd" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.5.0" + +[[deps.ConstructionBase]] +git-tree-sha1 = "76219f1ed5771adbb096743bff43fb5fdd4c1157" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.5.8" +weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"] + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.Convex]] +deps = ["AbstractTrees", "BenchmarkTools", "LDLFactorizations", "LinearAlgebra", "MathOptInterface", "OrderedCollections", "SparseArrays", "Test"] +git-tree-sha1 = "dec769959be3af9ba94970b1f14b31c196b0fb9e" +uuid = "f65535da-76fb-5f13-bab9-19810c17039a" +version = "0.16.4" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.CubedSphere]] +deps = ["TaylorSeries"] +git-tree-sha1 = "10874d1500159336863decaef665ab54805be29c" +uuid = "7445602f-e544-4518-8976-18f8e8ae6cdb" +version = "0.3.1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataFrames]] +deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] +git-tree-sha1 = "fb61b4812c49343d7ef0b533ba982c46021938a6" +uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +version = "1.7.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "4e1fe97fdaed23e9dc21d4d664bea76b65fc50a0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.22" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" +version = "1.11.0" + +[[deps.Dbus_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "473e9afc9cf30814eb67ffa5f2db7df82c3ad9fd" +uuid = "ee1fde0b-3d02-5ea6-8484-8dfef6360eab" +version = "1.16.2+0" + +[[deps.DelaunayTriangulation]] +deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"] +git-tree-sha1 = "5620ff4ee0084a6ab7097a27ba0c19290200b037" +uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" +version = "1.6.4" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.DiffEqBase]] +deps = ["ArrayInterface", "ConcreteStructs", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "FastClosures", "FastPower", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "Setfield", "Static", "StaticArraysCore", "Statistics", "TruncatedStacktraces"] +git-tree-sha1 = "e384a2cf3bb402e6dc66b1503ade22c7c1471c4d" +uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" +version = "6.167.2" + + [deps.DiffEqBase.extensions] + DiffEqBaseCUDAExt = "CUDA" + DiffEqBaseChainRulesCoreExt = "ChainRulesCore" + DiffEqBaseDistributionsExt = "Distributions" + DiffEqBaseEnzymeExt = ["ChainRulesCore", "Enzyme"] + DiffEqBaseForwardDiffExt = ["ForwardDiff"] + DiffEqBaseGTPSAExt = "GTPSA" + DiffEqBaseGeneralizedGeneratedExt = "GeneralizedGenerated" + DiffEqBaseMPIExt = "MPI" + DiffEqBaseMeasurementsExt = "Measurements" + DiffEqBaseMonteCarloMeasurementsExt = "MonteCarloMeasurements" + DiffEqBaseReverseDiffExt = "ReverseDiff" + DiffEqBaseSparseArraysExt = "SparseArrays" + DiffEqBaseTrackerExt = "Tracker" + DiffEqBaseUnitfulExt = "Unitful" + + [deps.DiffEqBase.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8" + GeneralizedGenerated = "6b9d7cbe-bcb9-11e9-073f-15a7a543e2eb" + MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.DiffResults]] +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.1.0" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.15.1" + +[[deps.DifferentiationInterface]] +deps = ["ADTypes", "LinearAlgebra"] +git-tree-sha1 = "e41b6696c84291c4ad15f5f6eaf071b4dfbfda06" +uuid = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" +version = "0.6.51" + + [deps.DifferentiationInterface.extensions] + DifferentiationInterfaceChainRulesCoreExt = "ChainRulesCore" + DifferentiationInterfaceDiffractorExt = "Diffractor" + DifferentiationInterfaceEnzymeExt = ["EnzymeCore", "Enzyme"] + DifferentiationInterfaceFastDifferentiationExt = "FastDifferentiation" + DifferentiationInterfaceFiniteDiffExt = "FiniteDiff" + DifferentiationInterfaceFiniteDifferencesExt = "FiniteDifferences" + DifferentiationInterfaceForwardDiffExt = ["ForwardDiff", "DiffResults"] + DifferentiationInterfaceGTPSAExt = "GTPSA" + DifferentiationInterfaceMooncakeExt = "Mooncake" + DifferentiationInterfacePolyesterForwardDiffExt = ["PolyesterForwardDiff", "ForwardDiff", "DiffResults"] + DifferentiationInterfaceReverseDiffExt = ["ReverseDiff", "DiffResults"] + DifferentiationInterfaceSparseArraysExt = "SparseArrays" + DifferentiationInterfaceSparseConnectivityTracerExt = "SparseConnectivityTracer" + DifferentiationInterfaceSparseMatrixColoringsExt = "SparseMatrixColorings" + DifferentiationInterfaceStaticArraysExt = "StaticArrays" + DifferentiationInterfaceSymbolicsExt = "Symbolics" + DifferentiationInterfaceTrackerExt = "Tracker" + DifferentiationInterfaceZygoteExt = ["Zygote", "ForwardDiff"] + + [deps.DifferentiationInterface.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DiffResults = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" + Diffractor = "9f5e2b26-1114-432f-b630-d3fe2085c51c" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FastDifferentiation = "eb9bf01b-bf85-4b60-bf87-ee5de06c00be" + FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" + FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" + SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.DiskArrays]] +deps = ["LRUCache", "Mmap", "OffsetArrays"] +git-tree-sha1 = "8308c389782803ebdba2c04b293d99234e65c5eb" +uuid = "3c3547ce-8d99-4f5e-a174-61eb10b00ae3" +version = "0.4.12" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +version = "1.11.0" + +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "0b4190661e8a4e51a842070e7dd4fae440ddb7f4" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.118" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.DocStringExtensions]] +git-tree-sha1 = "e7b7e6f178525d17c720ab9c081e4ef04429f860" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.4" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EarCut_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053" +uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" +version = "2.2.4+0" + +[[deps.EnsembleKalmanProcesses]] +deps = ["Convex", "Distributions", "DocStringExtensions", "FFMPEG", "GaussianRandomFields", "Interpolations", "LinearAlgebra", "MathOptInterface", "Optim", "QuadGK", "Random", "RecipesBase", "SCS", "SparseArrays", "Statistics", "StatsBase", "TOML", "TSVD"] +git-tree-sha1 = "2374c19f8adcc4df91d269512f593f9a2a07fd71" +uuid = "aa8a2aa5-91d8-4396-bcef-d4f2ec43552d" +version = "2.3.1" + +[[deps.EnumX]] +git-tree-sha1 = "bddad79635af6aec424f53ed8aad5d7555dc6f00" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.5" + +[[deps.EnzymeCore]] +git-tree-sha1 = "0cdb7af5c39e92d78a0ee8d0a447d32f7593137e" +uuid = "f151be2c-9106-41f4-ab19-57ee4f262869" +version = "0.8.8" +weakdeps = ["Adapt"] + + [deps.EnzymeCore.extensions] + AdaptExt = "Adapt" + +[[deps.EpollShim_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a4be429317c42cfae6a7fc03c31bad1970c310d" +uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" +version = "0.0.20230411+1" + +[[deps.ErrorfreeArithmetic]] +git-tree-sha1 = "d6863c556f1142a061532e79f611aa46be201686" +uuid = "90fa49ef-747e-5e6f-a989-263ba693cf1a" +version = "0.5.2" + +[[deps.ExactPredicates]] +deps = ["IntervalArithmetic", "Random", "StaticArraysCore", "Test"] +git-tree-sha1 = "276e83bc8b21589b79303b9985c321024ffdf59c" +uuid = "429591f6-91af-11e9-00e2-59fbe8cec110" +version = "2.2.5" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.11" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d55dffd9ae73ff72f1c0482454dcf2ec6c6c4a63" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.6.5+0" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.ExproniconLite]] +git-tree-sha1 = "c13f0b150373771b0fdc1713c97860f8df12e6c2" +uuid = "55351af7-c7e9-48d6-89ff-24e801d99491" +version = "0.10.14" + +[[deps.Extents]] +git-tree-sha1 = "063512a13dbe9c40d999c439268539aa552d1ae6" +uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" +version = "0.1.5" + +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "53ebe7511fa11d33bec688a9178fac4e49eeee00" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.2" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.4+1" + +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "7de7c78d681078f027389e067864a8d53bd7c3c9" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.8.1" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6d6219a004b8cf1e0b4dbe27a2860b8e04eba0be" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.11+0" + +[[deps.FastBroadcast]] +deps = ["ArrayInterface", "LinearAlgebra", "Polyester", "Static", "StaticArrayInterface", "StrideArraysCore"] +git-tree-sha1 = "ab1b34570bcdf272899062e1a56285a53ecaae08" +uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" +version = "0.3.5" + +[[deps.FastClosures]] +git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" +uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" +version = "0.3.2" + +[[deps.FastGaussQuadrature]] +deps = ["LinearAlgebra", "SpecialFunctions", "StaticArrays"] +git-tree-sha1 = "fd923962364b645f3719855c88f7074413a6ad92" +uuid = "442a2c76-b920-505d-bb47-c5924d526838" +version = "1.0.2" + +[[deps.FastPower]] +git-tree-sha1 = "df32f07f373f06260cd6af5371385b5ef85dd762" +uuid = "a4df4552-cc26-4903-aec0-212e50a0e84b" +version = "1.1.2" + + [deps.FastPower.extensions] + FastPowerEnzymeExt = "Enzyme" + FastPowerForwardDiffExt = "ForwardDiff" + FastPowerMeasurementsExt = "Measurements" + FastPowerMonteCarloMeasurementsExt = "MonteCarloMeasurements" + FastPowerReverseDiffExt = "ReverseDiff" + FastPowerTrackerExt = "Tracker" + + [deps.FastPower.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.FastRounding]] +deps = ["ErrorfreeArithmetic", "LinearAlgebra"] +git-tree-sha1 = "6344aa18f654196be82e62816935225b3b9abe44" +uuid = "fa42c844-2597-5d31-933b-ebd51ab2693f" +version = "0.3.1" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "b66970a70db13f45b7e57fbda1736e1cf72174ea" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.17.0" +weakdeps = ["HTTP"] + + [deps.FileIO.extensions] + HTTPExt = "HTTP" + +[[deps.FilePaths]] +deps = ["FilePathsBase", "MacroTools", "Reexport", "Requires"] +git-tree-sha1 = "919d9412dbf53a2e6fe74af62a73ceed0bce0629" +uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824" +version = "0.8.3" + +[[deps.FilePathsBase]] +deps = ["Compat", "Dates"] +git-tree-sha1 = "3bab2c5aa25e7840a4b065805c0cdfc01f3068d2" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.24" +weakdeps = ["Mmap", "Test"] + + [deps.FilePathsBase.extensions] + FilePathsBaseMmapExt = "Mmap" + FilePathsBaseTestExt = "Test" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.13.0" +weakdeps = ["PDMats", "SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FiniteDiff]] +deps = ["ArrayInterface", "LinearAlgebra", "Setfield"] +git-tree-sha1 = "f089ab1f834470c525562030c8cfde4025d5e915" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.27.0" + + [deps.FiniteDiff.extensions] + FiniteDiffBandedMatricesExt = "BandedMatrices" + FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices" + FiniteDiffSparseArraysExt = "SparseArrays" + FiniteDiffStaticArraysExt = "StaticArrays" + + [deps.FiniteDiff.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "301b5d5d731a0654825f1f2e906990f7141a106b" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.16.0+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "a2df1b776752e3f344e5116c06d75a10436ab853" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.38" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.FreeType]] +deps = ["CEnum", "FreeType2_jll"] +git-tree-sha1 = "907369da0f8e80728ab49c1c7e09327bf0d6d999" +uuid = "b38be410-82b0-50bf-ab77-7b57e271db43" +version = "4.1.1" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "2c5512e11c791d1baed2049c5652441b28fc6a31" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.4+0" + +[[deps.FreeTypeAbstraction]] +deps = ["ColorVectorSpace", "Colors", "FreeType", "GeometryBasics"] +git-tree-sha1 = "d52e255138ac21be31fa633200b65e4e71d26802" +uuid = "663a7486-cb36-511b-a19d-713bb74d65c9" +version = "0.10.6" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.17+0" + +[[deps.FunctionWrappers]] +git-tree-sha1 = "d62485945ce5ae9c0c48f124a84998d755bae00e" +uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" +version = "1.1.3" + +[[deps.FunctionWrappersWrappers]] +deps = ["FunctionWrappers"] +git-tree-sha1 = "b104d487b34566608f8b4e1c39fb0b10aa279ff8" +uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" +version = "0.1.3" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" +version = "1.11.0" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "libdecor_jll", "xkbcommon_jll"] +git-tree-sha1 = "fcb0584ff34e25155876418979d4c8971243bb89" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.4.0+2" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "83cf05ab16a73219e5f6bd1bdfa9848fa24ac627" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.2.0" + +[[deps.GR]] +deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Qt6Wayland_jll", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"] +git-tree-sha1 = "0ff136326605f8e06e9bcf085a356ab312eef18a" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.73.13" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "9cb62849057df859575fc1dda1e91b82f8609709" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.73.13+0" + +[[deps.GaussQuadrature]] +deps = ["SpecialFunctions"] +git-tree-sha1 = "eb6f1f48aa994f3018cbd029a17863c6535a266d" +uuid = "d54b0c1a-921d-58e0-8e36-89d8069c0969" +version = "0.5.8" + +[[deps.GaussianRandomFields]] +deps = ["Arpack", "FFTW", "FastGaussQuadrature", "LinearAlgebra", "Plots", "Random", "RecipesBase", "SpecialFunctions", "Statistics", "StatsBase"] +git-tree-sha1 = "aaf37fbddc7bca5391677fb5f5082dd29442ca8f" +uuid = "e4b2fa32-6e09-5554-b718-106ed5adafe9" +version = "2.2.5" + +[[deps.GeoFormatTypes]] +git-tree-sha1 = "8e233d5167e63d708d41f87597433f59a0f213fe" +uuid = "68eda718-8dee-11e9-39e7-89f7f65f511f" +version = "0.4.4" + +[[deps.GeoInterface]] +deps = ["DataAPI", "Extents", "GeoFormatTypes"] +git-tree-sha1 = "294e99f19869d0b0cb71aef92f19d03649d028d5" +uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" +version = "1.4.1" + +[[deps.GeometryBasics]] +deps = ["EarCut_jll", "Extents", "GeoInterface", "IterTools", "LinearAlgebra", "PrecompileTools", "Random", "StaticArrays"] +git-tree-sha1 = "65e3f5c519c3ec6a4c59f4c3ba21b6ff3add95b0" +uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" +version = "0.5.7" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Giflib_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6570366d757b50fabae9f4315ad74d2e40c0560a" +uuid = "59f7168a-df46-5410-90c8-f2779963d0ec" +version = "5.2.3+0" + +[[deps.GilbertCurves]] +git-tree-sha1 = "3e076ca96e34a47e98a46657b2bec2655a366d80" +uuid = "88fa7841-ef32-4516-bb70-c6ec135699d9" +version = "0.1.0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "b0036b392358c80d2d2124746c2bf3d48d457938" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.82.4+0" + +[[deps.Glob]] +git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" +uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" +version = "1.3.1" + +[[deps.Graphics]] +deps = ["Colors", "LinearAlgebra", "NaNMath"] +git-tree-sha1 = "a641238db938fff9b2f60d08ed9030387daf428c" +uuid = "a2bd30eb-e257-5431-a919-1863eab51364" +version = "1.1.3" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a6dbda1fd736d60cc477d99f2e7a042acfa46e8" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.15+0" + +[[deps.GridLayoutBase]] +deps = ["GeometryBasics", "InteractiveUtils", "Observables"] +git-tree-sha1 = "dc6bed05c15523624909b3953686c5f5ffa10adc" +uuid = "3955a311-db13-416c-9275-1d80ed98e5e9" +version = "0.11.1" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HCubature]] +deps = ["Combinatorics", "DataStructures", "LinearAlgebra", "QuadGK", "StaticArrays"] +git-tree-sha1 = "19ef9f0cb324eed957b7fe7257ac84e8ed8a48ec" +uuid = "19dc6840-f33b-545b-b366-655c7e3ffd49" +version = "1.7.0" + +[[deps.HDF5]] +deps = ["Compat", "HDF5_jll", "Libdl", "MPIPreferences", "Mmap", "Preferences", "Printf", "Random", "Requires", "UUIDs"] +git-tree-sha1 = "e856eef26cf5bf2b0f95f8f4fc37553c72c8641c" +uuid = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" +version = "0.17.2" +weakdeps = ["MPI"] + + [deps.HDF5.extensions] + MPIExt = "MPI" + +[[deps.HDF5_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"] +git-tree-sha1 = "e94f84da9af7ce9c6be049e9067e511e17ff89ec" +uuid = "0234f1f7-429e-5d53-9886-15a909be8d59" +version = "1.14.6+0" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "f93655dc73d7a0b4a368e3c0bce296ae035ad76e" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.16" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] +git-tree-sha1 = "55c53be97790242c29031e5cd45e8ac296dadda3" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "8.5.0+0" + +[[deps.Hwloc_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f93a9ce66cd89c9ba7a4695a47fd93b4c6bc59fa" +uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" +version = "2.12.0+0" + +[[deps.HypergeometricFunctions]] +deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "68c173f4f449de5b438ee67ed0c9c748dc31a2ec" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.28" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.ImageAxes]] +deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] +git-tree-sha1 = "e12629406c6c4442539436581041d372d69c55ba" +uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" +version = "0.6.12" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.7" + +[[deps.ImageCore]] +deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] +git-tree-sha1 = "8c193230235bbcee22c8066b0374f63b5683c2d3" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.10.5" + +[[deps.ImageIO]] +deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs", "WebP"] +git-tree-sha1 = "696144904b76e1ca433b886b4e7edd067d76cbf7" +uuid = "82e4d734-157c-48bb-816b-45c225c6df19" +version = "0.6.9" + +[[deps.ImageMetadata]] +deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] +git-tree-sha1 = "2a81c3897be6fbcde0802a0ebe6796d0562f63ec" +uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" +version = "0.9.10" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "0936ba688c6d201805a83da835b55c61a180db52" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.1.11+0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.5" + +[[deps.InlineStrings]] +git-tree-sha1 = "6a9fde685a7ac1eb3495f8e812c5a7c3711c2d5e" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.4.3" + + [deps.InlineStrings.extensions] + ArrowTypesExt = "ArrowTypes" + ParsersExt = "Parsers" + + [deps.InlineStrings.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + Parsers = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" + +[[deps.Insolation]] +deps = ["Artifacts", "Dates", "DelimitedFiles", "Interpolations"] +git-tree-sha1 = "29e10cf6320739afe5a2b17e9c854a386fef7acc" +uuid = "e98cc03f-d57e-4e3c-b70c-8d51efe9e0d8" +version = "0.9.4" +weakdeps = ["ClimaParams"] + + [deps.Insolation.extensions] + CreateParametersExt = "ClimaParams" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "0f14a5456bdc6b9731a5682f439a672750a09e48" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2025.0.4+0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" + +[[deps.Interpolations]] +deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.15.1" +weakdeps = ["Unitful"] + + [deps.Interpolations.extensions] + InterpolationsUnitfulExt = "Unitful" + +[[deps.IntervalArithmetic]] +deps = ["CRlibm", "FastRounding", "LinearAlgebra", "Markdown", "Random", "RecipesBase", "RoundingEmulator", "SetRounding", "StaticArrays"] +git-tree-sha1 = "5ab7744289be503d76a944784bac3f2df7b809af" +uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" +version = "0.20.9" + +[[deps.IntervalSets]] +git-tree-sha1 = "dba9ddf07f77f60450fe5d2e2beb9854d9a49bd0" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.10" +weakdeps = ["Random", "RecipesBase", "Statistics"] + + [deps.IntervalSets.extensions] + IntervalSetsRandomExt = "Random" + IntervalSetsRecipesBaseExt = "RecipesBase" + IntervalSetsStatisticsExt = "Statistics" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" +weakdeps = ["Dates", "Test"] + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + +[[deps.InvertedIndices]] +git-tree-sha1 = "6da3c4316095de0f5ee2ebd875df8721e7e0bdbe" +uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" +version = "1.3.1" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "e2222959fbc6c19554dc15174c81bf7bf3aa691c" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.4" + +[[deps.Isoband]] +deps = ["isoband_jll"] +git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137" +uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4" +version = "0.1.1" + +[[deps.IterTools]] +git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.10.0" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLD2]] +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "PrecompileTools", "Requires", "TranscodingStreams"] +git-tree-sha1 = "1059c071429b4753c0c869b75c859c44ba09a526" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.5.12" + +[[deps.JLFzf]] +deps = ["REPL", "Random", "fzf_jll"] +git-tree-sha1 = "1d4015b1eb6dc3be7e6c400fbd8042fe825a6bac" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.10" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.7.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JSON3]] +deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] +git-tree-sha1 = "196b41e5a854b387d99e5ede2de3fcb4d0422aae" +uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" +version = "1.14.2" + + [deps.JSON3.extensions] + JSON3ArrowExt = ["ArrowTypes"] + + [deps.JSON3.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + +[[deps.Jieko]] +deps = ["ExproniconLite"] +git-tree-sha1 = "2f05ed29618da60c06a87e9c033982d4f71d0b6c" +uuid = "ae98c720-c025-4a4a-838c-29b094483192" +version = "0.2.1" + +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "9496de8fb52c224a2e3f9ff403947674517317d9" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.6" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "eac1206917768cb54957c65a615460d87b455fc1" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.1.1+0" + +[[deps.JuliaNVTXCallbacks_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "af433a10f3942e882d3c671aacb203e006a5808f" +uuid = "9c1d0b0a-7046-5b2e-a33f-ea22f176ac7e" +version = "0.2.1+0" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs"] +git-tree-sha1 = "80d268b2f4e396edc5ea004d1e0f569231c71e9e" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.9.34" +weakdeps = ["EnzymeCore", "LinearAlgebra", "SparseArrays"] + + [deps.KernelAbstractions.extensions] + EnzymeExt = "EnzymeCore" + LinearAlgebraExt = "LinearAlgebra" + SparseArraysExt = "SparseArrays" + +[[deps.KernelDensity]] +deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] +git-tree-sha1 = "7d703202e65efa1369de1279c162b915e245eed1" +uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" +version = "0.6.9" + +[[deps.Krylov]] +deps = ["LinearAlgebra", "Printf", "SparseArrays"] +git-tree-sha1 = "b29d37ce30fa401a4563b18880ab91f979a29734" +uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" +version = "0.9.10" + +[[deps.KrylovKit]] +deps = ["LinearAlgebra", "PackageExtensionCompat", "Printf", "Random", "VectorInterface"] +git-tree-sha1 = "d7ed24a88732689f26d3f12a817d181d4024bf44" +uuid = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" +version = "0.8.3" +weakdeps = ["ChainRulesCore"] + + [deps.KrylovKit.extensions] + KrylovKitChainRulesCoreExt = "ChainRulesCore" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.2+0" + +[[deps.LDLFactorizations]] +deps = ["AMD", "LinearAlgebra", "SparseArrays", "Test"] +git-tree-sha1 = "70f582b446a1c3ad82cf87e62b878668beef9d13" +uuid = "40e66cde-538c-5869-a4ad-c39174c6795b" +version = "0.10.1" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "4.0.1+0" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "78211fb6cbc872f77cad3fc0b6cf647d923f4929" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "18.1.7+0" + +[[deps.LRUCache]] +git-tree-sha1 = "5519b95a490ff5fe629c4a7aa3b3dfc9160498b3" +uuid = "8ac3fa9e-de4c-5943-b1dc-09c6b5f20637" +version = "1.6.2" +weakdeps = ["Serialization"] + + [deps.LRUCache.extensions] + SerializationExt = ["Serialization"] + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1c602b1127f4751facb671441ca72715cc95938a" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.3+0" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.Latexify]] +deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] +git-tree-sha1 = "cd10d2cc78d34c0e2a3a36420ab607b611debfbb" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.16.7" + + [deps.Latexify.extensions] + DataFramesExt = "DataFrames" + SparseArraysExt = "SparseArrays" + SymEngineExt = "SymEngine" + + [deps.Latexify.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" + +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.17" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" +version = "1.11.0" + +[[deps.LazyBroadcast]] +git-tree-sha1 = "6d2586dfde8b989198181fe21b8b6d0a42787ab8" +uuid = "9dccce8e-a116-406d-9fcc-a88ed4f510c8" +version = "1.0.0" + +[[deps.LazyModules]] +git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.6.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +version = "1.11.0" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.7.2+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "27ecae93dd25ee0909666e6835051dd684cc035e" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+2" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "ff3b4b9d35de638936a525ecd36e86a8bb919d11" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.7.0+0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.18.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a31572773ac1b745e0343fe5e2c8ddda7a37e997" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.41.0+0" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "4ab7581296671007fc33f07a721631b8855f4b1d" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.7.1+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "321ccef73a96ba828cd51f2ab5b9f917fa73945a" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.41.0+0" + +[[deps.LineSearches]] +deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] +git-tree-sha1 = "e4c3be53733db1051cc15ecf573b1042b3a712a1" +uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" +version = "7.3.0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.11.0" + +[[deps.LinearOperators]] +deps = ["FastClosures", "LinearAlgebra", "Printf", "Requires", "SparseArrays", "TimerOutputs"] +git-tree-sha1 = "1894a798ed8887895c5ae70f1fe8331c0c1d8480" +uuid = "5c8ed15e-5a4c-59e4-a42b-c7e8811fb125" +version = "2.10.0" + + [deps.LinearOperators.extensions] + LinearOperatorsAMDGPUExt = "AMDGPU" + LinearOperatorsCUDAExt = "CUDA" + LinearOperatorsChainRulesCoreExt = "ChainRulesCore" + LinearOperatorsJLArraysExt = "JLArrays" + LinearOperatorsLDLFactorizationsExt = "LDLFactorizations" + LinearOperatorsMetalExt = "Metal" + + [deps.LinearOperators.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + JLArrays = "27aeb0d3-9eb9-45fb-866b-73c2ecf80fcb" + LDLFactorizations = "40e66cde-538c-5869-a4ad-c39174c6795b" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.29" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +version = "1.11.0" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "f02b56007b064fbfddb4c9cd60161b6dd0f40df3" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.1.0" + +[[deps.Lz4_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "191686b1ac1ea9c89fc52e996ad15d1d241d1e33" +uuid = "5ced341a-0733-55b8-9ab6-a4889d929147" +version = "1.10.1+0" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] +git-tree-sha1 = "5de60bc6cb3899cd318d80d627560fae2e2d99ae" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2025.0.1+1" + +[[deps.MPI]] +deps = ["Distributed", "DocStringExtensions", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "PkgVersion", "PrecompileTools", "Requires", "Serialization", "Sockets"] +git-tree-sha1 = "892676019c58f34e38743bc989b0eca5bce5edc5" +uuid = "da04e1cc-30fd-572f-bb4f-1f8673147195" +version = "0.20.22" + + [deps.MPI.extensions] + AMDGPUExt = "AMDGPU" + CUDAExt = "CUDA" + + [deps.MPI.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + +[[deps.MPICH_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "3aa3210044138a1749dbd350a9ba8680869eb503" +uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" +version = "4.3.0+1" + +[[deps.MPIPreferences]] +deps = ["Libdl", "Preferences"] +git-tree-sha1 = "c105fe467859e7f6e9a852cb15cb4301126fac07" +uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" +version = "0.1.11" + +[[deps.MPItrampoline_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "ff91ca13c7c472cef700f301c8d752bc2aaff1a8" +uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748" +version = "5.5.3+0" + +[[deps.MacroTools]] +git-tree-sha1 = "72aebe0b5051e5143a079a4685a46da330a40472" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.15" + +[[deps.Makie]] +deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "InverseFunctions", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "PNGFiles", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"] +git-tree-sha1 = "0318d174aa9ec593ddf6dc340b434657a8f1e068" +uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" +version = "0.22.4" + +[[deps.MakieCore]] +deps = ["ColorTypes", "GeometryBasics", "IntervalSets", "Observables"] +git-tree-sha1 = "903ef1d9d326ebc4a9e6cf24f22194d8da022b50" +uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b" +version = "0.9.2" + +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.MappedArrays]] +git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.2" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" + +[[deps.MathOptInterface]] +deps = ["BenchmarkTools", "CodecBzip2", "CodecZlib", "DataStructures", "ForwardDiff", "JSON3", "LinearAlgebra", "MutableArithmetics", "NaNMath", "OrderedCollections", "PrecompileTools", "Printf", "SparseArrays", "SpecialFunctions", "Test"] +git-tree-sha1 = "c2514ede436071529470010540bc3a1441e8140c" +uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" +version = "1.39.0" + +[[deps.MathTeXEngine]] +deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"] +git-tree-sha1 = "f5a6805fb46c0285991009b526ec6fae43c6dec2" +uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" +version = "0.6.3" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.6+0" + +[[deps.Measures]] +git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.2" + +[[deps.MicrosoftMPI_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bc95bf4149bf535c09602e3acdf950d9b4376227" +uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf" +version = "10.1.4+3" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" +version = "1.11.0" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.4" + +[[deps.Moshi]] +deps = ["ExproniconLite", "Jieko"] +git-tree-sha1 = "453de0fc2be3d11b9b93ca4d0fddd91196dcf1ed" +uuid = "2e0e35c7-a2e4-4343-998d-7ef72827ed2d" +version = "0.3.5" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.12.12" + +[[deps.MuladdMacro]] +git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.4" + +[[deps.MultiBroadcastFusion]] +git-tree-sha1 = "4157ffb36526a275f644a3fbe378850e5eb1b470" +uuid = "c3c07f87-98de-43f2-a76f-835b330b2cbb" +version = "0.3.3" + + [deps.MultiBroadcastFusion.extensions] + MultiBroadcastFusionCUDAExt = ["CUDA", "Adapt"] + + [deps.MultiBroadcastFusion.weakdeps] + Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + +[[deps.MutableArithmetics]] +deps = ["LinearAlgebra", "SparseArrays", "Test"] +git-tree-sha1 = "491bdcdc943fcbc4c005900d7463c9f216aabf4c" +uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" +version = "1.6.4" + +[[deps.NCDatasets]] +deps = ["CFTime", "CommonDataModel", "DataStructures", "Dates", "DiskArrays", "NetCDF_jll", "NetworkOptions", "Printf"] +git-tree-sha1 = "777b93739ca8804011ee1decad7b070f0e201bbc" +uuid = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" +version = "0.14.7" + +[[deps.NLSolversBase]] +deps = ["ADTypes", "DifferentiationInterface", "Distributed", "FiniteDiff", "ForwardDiff"] +git-tree-sha1 = "b14c7be6046e7d48e9063a0053f95ee0fc954176" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.9.1" + +[[deps.NVTX]] +deps = ["Colors", "JuliaNVTXCallbacks_jll", "Libdl", "NVTX_jll"] +git-tree-sha1 = "1a24c3430fa2ef3317c4c97fa7e431ef45793bd2" +uuid = "5da4648a-3479-48b8-97b9-01cb529c0a1f" +version = "1.0.0" + +[[deps.NVTX_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "2c7b791c1eba364e4a70aabdea4ddc1f5ca53911" +uuid = "e98f9f5b-d649-5603-91fd-7774390e6439" +version = "3.1.1+0" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.1.3" + +[[deps.NaNStatistics]] +deps = ["PrecompileTools", "Static", "StaticArrayInterface"] +git-tree-sha1 = "3774db3e6da72b0112a3aea73e89f3a30411fa9e" +uuid = "b946abbf-3ea7-4610-9019-9858bfdeaf2d" +version = "0.6.50" + + [deps.NaNStatistics.extensions] + NaNStatisticsDimensionalDataExt = "DimensionalData" + NaNStatisticsUnitfulExt = "Unitful" + + [deps.NaNStatistics.weakdeps] + DimensionalData = "0703355e-b756-11e9-17c0-8b28908087d0" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.NetCDF_jll]] +deps = ["Artifacts", "Blosc_jll", "Bzip2_jll", "HDF5_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "TOML", "XML2_jll", "Zlib_jll", "Zstd_jll", "libaec_jll", "libzip_jll"] +git-tree-sha1 = "d574803b6055116af212434460adf654ce98e345" +uuid = "7243133f-43d8-5620-bbf4-c2c921802cf3" +version = "401.900.300+0" + +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore", "ImageMetadata"] +git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.1.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.NullBroadcasts]] +git-tree-sha1 = "343c7bb67d0a29ea5d7d2b3e945afe81e2862337" +uuid = "0d71be07-595a-4f89-9529-4065a4ab43a6" +version = "0.1.0" + +[[deps.Observables]] +git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" +uuid = "510215fc-4207-5dde-b226-833fc4488ee2" +version = "0.5.5" + +[[deps.OffsetArrays]] +git-tree-sha1 = "a414039192a155fb38c4599a60110f0018c6ec82" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.16.0" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS32_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ece4587683695fe4c5f20e990da0ed7e83c351e7" +uuid = "656ef2d0-ae68-5445-9ca0-591084a874a2" +version = "0.3.29+0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.27+1" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "97db9e07fe2091882c765380ef58ec553074e9c7" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.3" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "8292dd5c8a38257111ada2174000a33745b06d4e" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.2.4+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+2" + +[[deps.OpenMPI_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML", "Zlib_jll"] +git-tree-sha1 = "047b66eb62f3cae59ed260ebb9075a32a04350f1" +uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" +version = "5.0.7+2" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.4.3" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a9697f1d06cc3eb3fb3ad49cc67f2cfabaac31ea" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.0.16+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.6+0" + +[[deps.Optim]] +deps = ["Compat", "EnumX", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"] +git-tree-sha1 = "31b3b1b8e83ef9f1d50d74f1dd5f19a37a304a1f" +uuid = "429524aa-4258-5aef-a3af-852621145aeb" +version = "1.12.0" +weakdeps = ["MathOptInterface"] + + [deps.Optim.extensions] + OptimMOIExt = "MathOptInterface" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.3+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "cc4054e898b852042d7b503313f7ad03de99c3dd" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.8.0" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "0e1340b5d98971513bddaa6bbed470670cebbbfe" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.34" + +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "cf181f0b1e6a18dfeb0ee8acc4a9d1672499626c" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.4.4" + +[[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 = "bc5bf2ea3d5351edf285a06b0016788a121ce92c" +uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566" +version = "0.5.1" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.12" + +[[deps.Pango_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "3b31172c032a1def20c98dae3f2cdc9d10e3b561" +uuid = "36c8627f-9965-5494-a995-c6b170f724f3" +version = "1.56.1+0" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.1" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "db76b1ecd5e9715f3d043cec13b2ec93ce015d53" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.44.2+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.11.0" +weakdeps = ["REPL"] + + [deps.Pkg.extensions] + REPLExt = "REPL" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.3" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "41031ef3a1be6f5bbbf3e8073f210556daeae5ca" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.3.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] +git-tree-sha1 = "3ca9a356cd2e113c420f2c13bea19f8d3fb1cb18" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.3" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "TOML", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] +git-tree-sha1 = "41c9a70abc1ff7296873adc5d768bff33a481652" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.40.12" + + [deps.Plots.extensions] + FileIOExt = "FileIO" + GeometryBasicsExt = "GeometryBasics" + IJuliaExt = "IJulia" + ImageInTerminalExt = "ImageInTerminal" + UnitfulExt = "Unitful" + + [deps.Plots.weakdeps] + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Polyester]] +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "6d38fea02d983051776a856b7df75b30cf9a3c1f" +uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" +version = "0.7.16" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.2.2" + +[[deps.PolygonOps]] +git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" +uuid = "647866c9-e3ac-4575-94e7-e3d426903924" +version = "0.1.2" + +[[deps.PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.3" + +[[deps.PositiveFactorizations]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" +uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" +version = "0.2.4" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "1101cd475833706e4d0e7b122218257178f48f34" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "2.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" + +[[deps.Profile]] +uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" +version = "1.11.0" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "13c5103482a8ed1536a54c08d0e742ae3dca2d42" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.10.4" + +[[deps.PtrArrays]] +git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.3.0" + +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "8b3fc30bc0390abdce15f8822c889f669baed73d" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.1" + +[[deps.Qt6Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] +git-tree-sha1 = "492601870742dcd38f233b23c3ec629628c1d724" +uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" +version = "6.7.1+1" + +[[deps.Qt6Declarative_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6ShaderTools_jll"] +git-tree-sha1 = "e5dd466bf2569fe08c91a2cc29c1003f4797ac3b" +uuid = "629bc702-f1f5-5709-abd5-49b8460ea067" +version = "6.7.1+2" + +[[deps.Qt6ShaderTools_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll"] +git-tree-sha1 = "1a180aeced866700d4bebc3120ea1451201f16bc" +uuid = "ce943373-25bb-56aa-8eca-768745ed7b5a" +version = "6.7.1+1" + +[[deps.Qt6Wayland_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6Declarative_jll"] +git-tree-sha1 = "729927532d48cf79f49070341e1d918a65aba6b0" +uuid = "e99dba38-086e-5de3-a5b1-6e4c66e897c3" +version = "6.7.1+1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.11.2" + + [deps.QuadGK.extensions] + QuadGKEnzymeExt = "Enzyme" + + [deps.QuadGK.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "StyledStrings", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +version = "1.11.0" + +[[deps.RRTMGP]] +deps = ["Adapt", "Artifacts", "ClimaComms", "DocStringExtensions", "Random"] +git-tree-sha1 = "9fa1aacd914957eb1fdaa6594d7e03bfb5d619c7" +uuid = "a01a1ee8-cea4-48fc-987c-fc7878d79da1" +version = "0.21.1" + + [deps.RRTMGP.extensions] + CreateParametersExt = "ClimaParams" + RRTMGPCUDAExt = "CUDA" + + [deps.RRTMGP.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + ClimaParams = "5c42b081-d73a-476f-9059-fd94b934656c" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" + +[[deps.RangeArrays]] +git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" +uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" +version = "0.3.2" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.5" +weakdeps = ["FixedPointNumbers"] + + [deps.Ratios.extensions] + RatiosFixedPointNumbersExt = "FixedPointNumbers" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] +git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.12" + +[[deps.RecursiveArrayTools]] +deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"] +git-tree-sha1 = "112c876cee36a5784df19098b55db2b238afc36a" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "3.31.2" + + [deps.RecursiveArrayTools.extensions] + RecursiveArrayToolsFastBroadcastExt = "FastBroadcast" + RecursiveArrayToolsForwardDiffExt = "ForwardDiff" + RecursiveArrayToolsMeasurementsExt = "Measurements" + RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements" + RecursiveArrayToolsReverseDiffExt = ["ReverseDiff", "Zygote"] + RecursiveArrayToolsSparseArraysExt = ["SparseArrays"] + RecursiveArrayToolsStructArraysExt = "StructArrays" + RecursiveArrayToolsTrackerExt = "Tracker" + RecursiveArrayToolsZygoteExt = "Zygote" + + [deps.RecursiveArrayTools.weakdeps] + FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.1" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "852bd0f55565a9e973fcfee83a84413270224dc4" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.8.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.5.1+0" + +[[deps.RootSolvers]] +deps = ["ForwardDiff", "Printf"] +git-tree-sha1 = "892b77767827af30868111d257930f567d5d78f8" +uuid = "7181ea78-2dcb-4de3-ab41-2b8ab5a31e74" +version = "0.4.4" + +[[deps.RoundingEmulator]] +git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b" +uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705" +version = "0.2.1" + +[[deps.RuntimeGeneratedFunctions]] +deps = ["ExprTools", "SHA", "Serialization"] +git-tree-sha1 = "04c968137612c4a5629fa531334bb81ad5680f00" +uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" +version = "0.5.13" + +[[deps.SCS]] +deps = ["MathOptInterface", "PrecompileTools", "SCS_jll", "SparseArrays"] +git-tree-sha1 = "4aed85dec0209d638c241c34160999eaaf07965a" +uuid = "c946c3f1-0d1f-5ce8-9dea-7daa1f7e2d13" +version = "2.1.0" + + [deps.SCS.extensions] + SCSSCS_GPU_jllExt = ["SCS_GPU_jll"] + SCSSCS_MKL_jllExt = ["SCS_MKL_jll"] + + [deps.SCS.weakdeps] + SCS_GPU_jll = "af6e375f-46ec-5fa0-b791-491b0dfa44a4" + SCS_MKL_jll = "3f2553a9-4106-52be-b7dd-865123654657" + +[[deps.SCS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl", "OpenBLAS32_jll"] +git-tree-sha1 = "902cc4e42ecca21bbd74babf899b2a5b12add323" +uuid = "f4f2fc5b-1d94-523c-97ea-2ab488bedf4b" +version = "3.2.7+0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMD]] +deps = ["PrecompileTools"] +git-tree-sha1 = "fea870727142270bdf7624ad675901a1ee3b4c87" +uuid = "fdea26ae-647d-5447-a871-4b548cad5224" +version = "3.7.1" + +[[deps.SIMDTypes]] +git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" +uuid = "94e857df-77ce-4151-89e5-788b33177be4" +version = "0.1.0" + +[[deps.SciMLBase]] +deps = ["ADTypes", "Accessors", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "Moshi", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"] +git-tree-sha1 = "f2db9ab9d33130df3be35be9438da51a3416d528" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "2.84.0" + + [deps.SciMLBase.extensions] + SciMLBaseChainRulesCoreExt = "ChainRulesCore" + SciMLBaseMLStyleExt = "MLStyle" + SciMLBaseMakieExt = "Makie" + SciMLBasePartialFunctionsExt = "PartialFunctions" + SciMLBasePyCallExt = "PyCall" + SciMLBasePythonCallExt = "PythonCall" + SciMLBaseRCallExt = "RCall" + SciMLBaseZygoteExt = ["Zygote", "ChainRulesCore"] + + [deps.SciMLBase.weakdeps] + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + MLStyle = "d8e11817-5142-5d16-987a-aa16d5891078" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + PartialFunctions = "570af359-4316-4cb7-8c74-252c00c2016b" + PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" + PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" + RCall = "6f49c342-dc21-5d91-9882-a32aef131414" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.SciMLOperators]] +deps = ["Accessors", "ArrayInterface", "DocStringExtensions", "LinearAlgebra", "MacroTools"] +git-tree-sha1 = "1c4b7f6c3e14e6de0af66e66b86d525cae10ecb4" +uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" +version = "0.3.13" +weakdeps = ["SparseArrays", "StaticArraysCore"] + + [deps.SciMLOperators.extensions] + SciMLOperatorsSparseArraysExt = "SparseArrays" + SciMLOperatorsStaticArraysCoreExt = "StaticArraysCore" + +[[deps.SciMLStructures]] +deps = ["ArrayInterface"] +git-tree-sha1 = "566c4ed301ccb2a44cbd5a27da5f885e0ed1d5df" +uuid = "53ae85a6-f571-4167-b2af-e1d143709226" +version = "1.7.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.2.1" + +[[deps.SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "712fb0231ee6f9120e005ccd56297abbc053e7e0" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.4.8" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" + +[[deps.SetRounding]] +git-tree-sha1 = "d7a25e439d07a17b7cdf97eecee504c50fedf5f6" +uuid = "3cc68bcd-71a2-5612-b932-767ffbe40ab0" +version = "0.2.1" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "c5391c6ace3bc430ca630251d02ea9687169ca68" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.2" + +[[deps.ShaderAbstractions]] +deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays"] +git-tree-sha1 = "818554664a2e01fc3784becb2eb3a82326a604b6" +uuid = "65257c39-d410-5151-9873-9b3e5be5013e" +version = "0.5.0" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" +version = "1.11.0" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SignedDistanceFields]] +deps = ["Random", "Statistics", "Test"] +git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9" +uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" +version = "0.4.0" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.2.0" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.3" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.11.0" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "64cca0c26b4f31ba18f13f6c12af7c85f478cfde" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.5.0" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.StableRNGs]] +deps = ["Random"] +git-tree-sha1 = "83e6cce8324d49dfaf9ef059227f91ed4441a8e5" +uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" +version = "1.0.2" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + +[[deps.Static]] +deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools"] +git-tree-sha1 = "f737d444cb0ad07e61b3c1bef8eb91203c321eff" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "1.2.0" + +[[deps.StaticArrayInterface]] +deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Static"] +git-tree-sha1 = "96381d50f1ce85f2663584c8e886a6ca97e60554" +uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" +version = "1.8.0" +weakdeps = ["OffsetArrays", "StaticArrays"] + + [deps.StaticArrayInterface.extensions] + StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" + StaticArrayInterfaceStaticArraysExt = "StaticArrays" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "0feb6b9031bd5c51f9072393eb5ab3efd31bf9e4" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.13" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.3" + +[[deps.Statistics]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.0" + +[[deps.StatsBase]] +deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "29321314c920c26684834965ec2ce0dacc9cf8e5" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.4" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "35b09e80be285516e52c9054792c884b9216ae3c" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.4.0" +weakdeps = ["ChainRulesCore", "InverseFunctions"] + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + +[[deps.StrideArraysCore]] +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] +git-tree-sha1 = "f35f6ab602df8413a50c4a25ca14de821e8605fb" +uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" +version = "0.5.7" + +[[deps.StringEncodings]] +deps = ["Libiconv_jll"] +git-tree-sha1 = "b765e46ba27ecf6b44faf70df40c57aa3a547dcb" +uuid = "69024149-9ee7-55f6-a4c4-859efe599b68" +version = "0.3.7" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "725421ae8e530ec29bcbdddbe91ff8053421d023" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.4.1" + +[[deps.StructArrays]] +deps = ["ConstructionBase", "DataAPI", "Tables"] +git-tree-sha1 = "8ad2e38cbb812e29348719cc63580ec1dfeb9de4" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.7.1" +weakdeps = ["Adapt", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "SparseArrays", "StaticArrays"] + + [deps.StructArrays.extensions] + StructArraysAdaptExt = "Adapt" + StructArraysGPUArraysCoreExt = ["GPUArraysCore", "KernelAbstractions"] + StructArraysLinearAlgebraExt = "LinearAlgebra" + StructArraysSparseArraysExt = "SparseArrays" + StructArraysStaticArraysExt = "StaticArrays" + +[[deps.StructTypes]] +deps = ["Dates", "UUIDs"] +git-tree-sha1 = "159331b30e94d7b11379037feeb9b690950cace8" +uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4" +version = "1.11.0" + +[[deps.StyledStrings]] +uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" +version = "1.11.0" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.7.0+0" + +[[deps.SurfaceFluxes]] +deps = ["DocStringExtensions", "RootSolvers", "Thermodynamics"] +git-tree-sha1 = "aee530bde85cd41374273568cb649e72d82921e7" +uuid = "49b00bb7-8bd4-4f2b-b78c-51cd0450215f" +version = "0.12.0" +weakdeps = ["ClimaParams"] + + [deps.SurfaceFluxes.extensions] + CreateParametersExt = "ClimaParams" + +[[deps.SymbolicIndexingInterface]] +deps = ["Accessors", "ArrayInterface", "PrettyTables", "RuntimeGeneratedFunctions", "StaticArraysCore"] +git-tree-sha1 = "7530e17b6ac652b009966f8ad53371a4ffd273f2" +uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5" +version = "0.3.39" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TSVD]] +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "c39caef6bae501e5607a6caf68dd9ac6e8addbcb" +uuid = "9449cd9e-2762-5aa3-a617-5413e99d722e" +version = "0.4.4" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "598cd7c1f68d1e205689b1c2fe65a9f85846f297" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.12.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TaylorSeries]] +deps = ["LinearAlgebra", "Markdown", "SparseArrays"] +git-tree-sha1 = "f80d024c30771a57bc173d08b566379d04af8055" +uuid = "6aa5eb33-94cf-58f4-a9d0-e4b2c4fc25ea" +version = "0.18.5" +weakdeps = ["IntervalArithmetic", "JLD2", "RecursiveArrayTools", "StaticArrays"] + + [deps.TaylorSeries.extensions] + TaylorSeriesIAExt = "IntervalArithmetic" + TaylorSeriesJLD2Ext = "JLD2" + TaylorSeriesRATExt = "RecursiveArrayTools" + TaylorSeriesSAExt = "StaticArrays" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +version = "1.11.0" + +[[deps.TextWrap]] +git-tree-sha1 = "43044b737fa70bc12f6105061d3da38f881a3e3c" +uuid = "b718987f-49a8-5099-9789-dcd902bef87d" +version = "1.0.2" + +[[deps.Thermodynamics]] +deps = ["DocStringExtensions", "KernelAbstractions", "Random", "RootSolvers"] +git-tree-sha1 = "15e1993b0df750ac35772d70a00cb8469fd10501" +uuid = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c" +version = "0.12.10" +weakdeps = ["ClimaParams"] + + [deps.Thermodynamics.extensions] + CreateParametersExt = "ClimaParams" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "18ad3613e129312fe67789a71720c3747e598a61" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.3" + +[[deps.TiffImages]] +deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "SIMD", "UUIDs"] +git-tree-sha1 = "f21231b166166bebc73b99cea236071eb047525b" +uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" +version = "0.11.3" + +[[deps.TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "f57facfd1be61c42321765d3551b3df50f7e09f6" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.28" + + [deps.TimerOutputs.extensions] + FlameGraphsExt = "FlameGraphs" + + [deps.TimerOutputs.weakdeps] + FlameGraphs = "08572546-2f56-4bcf-ba4e-bab62c3a3f89" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.TriplotBase]] +git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" +uuid = "981d1d27-644d-49a2-9326-4793e63143c3" +version = "0.1.0" + +[[deps.TruncatedStacktraces]] +deps = ["InteractiveUtils", "MacroTools", "Preferences"] +git-tree-sha1 = "ea3e54c2bdde39062abf5a9758a23735558705e1" +uuid = "781d530d-4396-4725-bb49-402e4bee1e77" +version = "1.4.0" + +[[deps.URIs]] +git-tree-sha1 = "cbbebadbcc76c5ca1cc4b4f3b0614b3e603b5000" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.2" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "c0667a8e676c53d390a09dc6870b3d8d6650e2bf" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.22.0" +weakdeps = ["ConstructionBase", "InverseFunctions"] + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + InverseFunctionsUnitfulExt = "InverseFunctions" + +[[deps.UnitfulLatexify]] +deps = ["LaTeXStrings", "Latexify", "Unitful"] +git-tree-sha1 = "975c354fcd5f7e1ddcc1f1a23e6e091d99e99bc8" +uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" +version = "1.6.4" + +[[deps.UnrolledUtilities]] +git-tree-sha1 = "a9ebeb4308eaacfe49f71594c0fe38c0c655734f" +uuid = "0fe1646c-419e-43be-ac14-22321958931b" +version = "0.1.9" +weakdeps = ["StaticArrays"] + + [deps.UnrolledUtilities.extensions] + UnrolledUtilitiesStaticArraysExt = "StaticArrays" + +[[deps.UnsafeAtomics]] +git-tree-sha1 = "b13c4edda90890e5b04ba24e20a310fbe6f249ff" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.3.0" + + [deps.UnsafeAtomics.extensions] + UnsafeAtomicsLLVM = ["LLVM"] + + [deps.UnsafeAtomics.weakdeps] + LLVM = "929cbde3-209d-540e-8aea-75f648917ca0" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.VectorInterface]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "cea8abaa6e43f72f97a09cf95b80c9eb53ff75cf" +uuid = "409d34a3-91d5-4945-b6ec-7529ddf182d8" +version = "0.4.9" + +[[deps.Vulkan_Loader_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] +git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" +uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" +version = "1.3.243+0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "85c7811eddec9e7f22615371c3cc81a504c508ee" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.21.0+2" + +[[deps.Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "5db3e9d307d32baba7067b13fc7b5aa6edd4a19a" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.36.0+0" + +[[deps.WeakRefStrings]] +deps = ["DataAPI", "InlineStrings", "Parsers"] +git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23" +uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" +version = "1.4.2" + +[[deps.WebP]] +deps = ["CEnum", "ColorTypes", "FileIO", "FixedPointNumbers", "ImageCore", "libwebp_jll"] +git-tree-sha1 = "aa1ca3c47f119fbdae8770c29820e5e6119b83f2" +uuid = "e3aaa7dc-3e4b-44e0-be63-ffb868ccd7c1" +version = "0.1.3" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "1.0.0" + +[[deps.WorkerUtilities]] +git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7" +uuid = "76eceee3-57b5-4d4a-8e66-0e911cebbf60" +version = "1.6.1" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "b8b243e47228b4a3877f1dd6aee0c5d56db7fcf4" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.13.6+1" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fee71455b0aaa3440dfdd54a9a36ccef829be7d4" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.8.1+0" + +[[deps.Xorg_libICE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a3ea76ee3f4facd7a64684f9af25310825ee3668" +uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" +version = "1.1.2+0" + +[[deps.Xorg_libSM_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] +git-tree-sha1 = "9c7ad99c629a44f81e7799eb05ec2746abb5d588" +uuid = "c834827a-8449-5923-a945-d239c165b7dd" +version = "1.2.6+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "9dafcee1d24c4f024e7edc92603cedba72118283" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.6+3" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "aa1261ebbac3ccc8d16558ae6799524c450ed16b" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.13+0" + +[[deps.Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "807c226eaf3651e7b2c468f687ac788291f9a89b" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.3+0" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "52858d64353db33a56e13c341d7bf44cd0d7b309" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.6+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "d7155fea91a4123ef59f42c4afb5ab3b4ca95058" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.6+3" + +[[deps.Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "6fcc21d5aea1a0b7cce6cab3e62246abd1949b86" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "6.0.0+0" + +[[deps.Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "984b313b049c89739075b8e2a94407076de17449" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.8.2+0" + +[[deps.Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll"] +git-tree-sha1 = "a1a7eaf6c3b5b05cb903e35e8372049b107ac729" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.5+0" + +[[deps.Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "b6f664b7b2f6a39689d822a6300b14df4668f0f4" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.4+0" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "a490c6212a0e90d2d55111ac956f7c4fa9c277a6" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.11+1" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXau_jll", "Xorg_libXdmcp_jll"] +git-tree-sha1 = "bfcaf7ec088eaba362093393fe11aa141fa15422" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.17.1+0" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "dbc53e4cf7701c6c7047c51e17d6e64df55dca94" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.2+1" + +[[deps.Xorg_xcb_util_cursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] +git-tree-sha1 = "04341cb870f29dcd5e39055f895c39d016e18ccd" +uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" +version = "0.1.4+0" + +[[deps.Xorg_xcb_util_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] +git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.0+1" + +[[deps.Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.9+1" + +[[deps.Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.1+1" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "ab2221d309eda71020cdda67a973aa582aa85d69" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.6+1" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "691634e5453ad362044e2ad653e79f3ee3bb98c3" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.39.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.6.0+0" + +[[deps.YAML]] +deps = ["Base64", "Dates", "Printf", "StringEncodings"] +git-tree-sha1 = "b46894beba6c05cd185d174654479aaec09ea6b1" +uuid = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" +version = "0.4.13" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.7+1" + +[[deps.eudev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "gperf_jll"] +git-tree-sha1 = "431b678a28ebb559d224c0b6b6d01afce87c51ba" +uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" +version = "3.2.9+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6e50f145003024df4f5cb96c7fce79466741d601" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.56.3+0" + +[[deps.gperf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0ba42241cb6809f1a278d0bcb976e0483c3f1f2d" +uuid = "1a1c6b14-54f6-533d-8383-74cd7377aa70" +version = "3.1.1+1" + +[[deps.isoband_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c" +uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4" +version = "0.2.3+0" + +[[deps.libaec_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f5733a5a9047722470b95a81e1b172383971105c" +uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0" +version = "1.1.3+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "522c1df09d05a71785765d19c9524661234738e9" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.11.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.2+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.11.0+0" + +[[deps.libdecor_jll]] +deps = ["Artifacts", "Dbus_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pango_jll", "Wayland_jll", "xkbcommon_jll"] +git-tree-sha1 = "9bf7903af251d2050b467f76bdbe57ce541f7f4f" +uuid = "1183f4f0-6f2a-5f1a-908b-139f9cdfea6f" +version = "0.2.2+0" + +[[deps.libevdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "141fe65dc3efabb0b1d5ba74e91f6ad26f84cc22" +uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" +version = "1.11.0+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.3+0" + +[[deps.libinput_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "eudev_jll", "libevdev_jll", "mtdev_jll"] +git-tree-sha1 = "ad50e5b90f222cfe78aa3d5183a20a12de1322ce" +uuid = "36db933b-70db-51c0-b978-0f229ee0e533" +version = "1.18.0+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "068dfe202b0a05b8332f1e8e6b4080684b9c7700" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.47+0" + +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "libpng_jll"] +git-tree-sha1 = "c1733e347283df07689d71d61e14be986e49e47a" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.10.5+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+2" + +[[deps.libwebp_jll]] +deps = ["Artifacts", "Giflib_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libglvnd_jll", "Libtiff_jll", "libpng_jll"] +git-tree-sha1 = "d2408cac540942921e7bd77272c32e58c33d8a77" +uuid = "c5f90fcd-3b7e-5836-afba-fc50a0988cb2" +version = "1.5.0+0" + +[[deps.libzip_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "OpenSSL_jll", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "86addc139bca85fdf9e7741e10977c45785727b7" +uuid = "337d8026-41b4-5cde-a456-74a10e5b31d1" +version = "1.11.3+0" + +[[deps.mtdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "814e154bdb7be91d78b6802843f76b6ece642f11" +uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" +version = "1.1.6+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.59.0+0" + +[[deps.oneTBB_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d5a767a3bb77135a99e433afe0eb14cd7f6914c3" +uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" +version = "2022.0.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "63406453ed9b33a0df95d570816d5366c92b7809" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.4.1+2" diff --git a/config/default_configs/default_config.yml b/config/default_configs/default_config.yml index 472dd8543c..6edbe8fc65 100644 --- a/config/default_configs/default_config.yml +++ b/config/default_configs/default_config.yml @@ -62,9 +62,6 @@ newton_rtol: surface_thermo_state_type: help: "Surface thermo state type [`GCMSurfaceThermoState` (default), `PrescribedThermoState`]" value: "GCMSurfaceThermoState" -split_ode: - help: "Use split of ODE problem. Examples: [`true` (implicit, default), `false` (explicit)]" - value: true use_krylov_method: help: "Whether to use a Krylov method to solve the linear system in Newton's method (only for ClimaTimeSteppers.jl)" value: false @@ -86,6 +83,24 @@ eisenstat_walker_forcing_alpha: jvp_step_adjustment: help: "Amount by which the step size of the forward difference approximation of the Jacobian-vector product in the Krylov method should be scaled (only used if `use_krylov_method` is `true`)" value: 1.0 +use_exact_jacobian: + help: "Whether to solve the linear system using the exact Jacobian, which is computed with forward-mode automatic differentiation once per `dt_update_exact_jacobian` (default is `false`)" + value: false +debug_approximate_jacobian: + help: "Whether to compare the approximate Jacobian against the exact Jacobian once per `dt_update_exact_jacobian` (default is `false`)" + value: true # TODO: Change this to false +only_debug_first_column_jacobian: + help: "Whether to debug only the Jacobian in the first column when `debug_approximate_jacobian` is `true` and `use_exact_jacobian` is `false` (default is `true` on GPUs and `n_cols > 10000` on CPUs)" + value: ~ +plot_jacobian: + help: "Whether to save and plot the Jacobian, and also the difference between the approximate Jacobian and exact Jacobian when `debug_approximate_jacobian` is `true` (default is equal to `debug_approximate_jacobian`)" + value: ~ +dt_save_jacobian: + help: "Time between snapshots of the Jacobian when `plot_jacobian` is `true` (default is equal to `t_span / 5`)" + value: ~ +dt_update_exact_jacobian: + help: "Time between updates to the exact Jacobian (when either `use_exact_jacobian` or `debug_approximate_jacobian` is `true`), with any value smaller than `dt` corresponding to an update before each linear solve (default is equal to `use_exact_jacobian ? 0 : dt_save_jacobian`)" + value: ~ # Radiation rad: help: "Radiation model [`nothing` (default), `gray`, `clearsky`, `allsky`, `allskywithclear`]" @@ -202,6 +217,9 @@ precip_model: cloud_model: help: "Cloud model [`grid_scale`, `quadrature` (default), `quadrature_sgs`]" value: "quadrature" +implicit_noneq_moist: + help: "Whether to treat the nonequilibrium cloud condensate tendency implicitly [`true`, `false`]" + value: false perf_summary: help: "Flag for collecting performance summary information" value: false diff --git a/config/longrun_configs/amip_target_diagedmf.yml b/config/longrun_configs/amip_target_diagedmf.yml index 7c43344dbb..e25373675a 100644 --- a/config/longrun_configs/amip_target_diagedmf.yml +++ b/config/longrun_configs/amip_target_diagedmf.yml @@ -31,4 +31,4 @@ edmfx_sgs_diffusive_flux: true dt: "120secs" t_end: "120days" toml: [toml/longrun_aquaplanet_diagedmf.toml] -netcdf_output_at_levels: true +netcdf_output_at_levels: true \ No newline at end of file diff --git a/config/longrun_configs/amip_target_edonly_nonequil_200_explicit_fast.yml b/config/longrun_configs/amip_target_edonly_nonequil_200_explicit_fast.yml new file mode 100644 index 0000000000..ad6df0345e --- /dev/null +++ b/config/longrun_configs/amip_target_edonly_nonequil_200_explicit_fast.yml @@ -0,0 +1,32 @@ +h_elem: 9 +z_elem: 39 +z_max: 60000.0 +dz_bottom: 100.0 +deep_atmosphere: false +rayleigh_sponge: true +viscous_sponge: true +dt_save_state_to_disk: "30days" +cloud_model: "grid_scale" +moist: "nonequil" +implicit_noneq_moist: false +precip_model: "1M" +rad: "allskywithclear" +dt_rad: "1hours" +dt_cloud_fraction: "1hours" +insolation: "timevarying" +co2_model: maunaloa +prescribe_ozone: true +aerosol_radiation: true +edmfx_sgs_diffusive_flux: true +prescribed_aerosols: ["CB1", "CB2", "DST01", "DST02", "DST03", "DST04", "DST05", "OC1", "OC2", "SO4", "SSLT01", "SSLT02", "SSLT03", "SSLT04", "SSLT05"] +surface_setup: "DefaultMoninObukhov" +turbconv: "edonly_edmfx" +implicit_diffusion: true +approximate_linear_solve_iters: 2 +dt: "200secs" +t_end: "20days" +toml: [toml/aquaplanet_nonequil_12_120.toml] +diagnostics: + - short_name: [ta, ua, wa, va, rhoa, hur, hus, hussn, husra, clw, cli] + period: 5days +netcdf_output_at_levels: true diff --git a/config/longrun_configs/amip_target_edonly_nonequil_200_explicit_slow.yml b/config/longrun_configs/amip_target_edonly_nonequil_200_explicit_slow.yml new file mode 100644 index 0000000000..ad6df0345e --- /dev/null +++ b/config/longrun_configs/amip_target_edonly_nonequil_200_explicit_slow.yml @@ -0,0 +1,32 @@ +h_elem: 9 +z_elem: 39 +z_max: 60000.0 +dz_bottom: 100.0 +deep_atmosphere: false +rayleigh_sponge: true +viscous_sponge: true +dt_save_state_to_disk: "30days" +cloud_model: "grid_scale" +moist: "nonequil" +implicit_noneq_moist: false +precip_model: "1M" +rad: "allskywithclear" +dt_rad: "1hours" +dt_cloud_fraction: "1hours" +insolation: "timevarying" +co2_model: maunaloa +prescribe_ozone: true +aerosol_radiation: true +edmfx_sgs_diffusive_flux: true +prescribed_aerosols: ["CB1", "CB2", "DST01", "DST02", "DST03", "DST04", "DST05", "OC1", "OC2", "SO4", "SSLT01", "SSLT02", "SSLT03", "SSLT04", "SSLT05"] +surface_setup: "DefaultMoninObukhov" +turbconv: "edonly_edmfx" +implicit_diffusion: true +approximate_linear_solve_iters: 2 +dt: "200secs" +t_end: "20days" +toml: [toml/aquaplanet_nonequil_12_120.toml] +diagnostics: + - short_name: [ta, ua, wa, va, rhoa, hur, hus, hussn, husra, clw, cli] + period: 5days +netcdf_output_at_levels: true diff --git a/config/longrun_configs/amip_target_edonly_nonequil_200_fast.yml b/config/longrun_configs/amip_target_edonly_nonequil_200_fast.yml new file mode 100644 index 0000000000..158cacbc81 --- /dev/null +++ b/config/longrun_configs/amip_target_edonly_nonequil_200_fast.yml @@ -0,0 +1,32 @@ +h_elem: 9 +z_elem: 39 +z_max: 60000.0 +dz_bottom: 100.0 +deep_atmosphere: false +rayleigh_sponge: true +viscous_sponge: true +dt_save_state_to_disk: "30days" +cloud_model: "grid_scale" +moist: "nonequil" +implicit_noneq_moist: true +precip_model: "1M" +rad: "allskywithclear" +dt_rad: "1hours" +dt_cloud_fraction: "1hours" +insolation: "timevarying" +co2_model: maunaloa +prescribe_ozone: true +aerosol_radiation: true +edmfx_sgs_diffusive_flux: true +prescribed_aerosols: ["CB1", "CB2", "DST01", "DST02", "DST03", "DST04", "DST05", "OC1", "OC2", "SO4", "SSLT01", "SSLT02", "SSLT03", "SSLT04", "SSLT05"] +surface_setup: "DefaultMoninObukhov" +turbconv: "edonly_edmfx" +implicit_diffusion: true +approximate_linear_solve_iters: 2 +dt: "200secs" +t_end: "20days" +toml: [toml/aquaplanet_nonequil_12_120.toml] +diagnostics: + - short_name: [ta, ua, wa, va, rhoa, hur, hus, hussn, husra, clw, cli] + period: 5days +netcdf_output_at_levels: true diff --git a/config/longrun_configs/amip_target_edonly_nonequil_200_slow.yml b/config/longrun_configs/amip_target_edonly_nonequil_200_slow.yml new file mode 100644 index 0000000000..277090a809 --- /dev/null +++ b/config/longrun_configs/amip_target_edonly_nonequil_200_slow.yml @@ -0,0 +1,32 @@ +h_elem: 9 +z_elem: 39 +z_max: 60000.0 +dz_bottom: 100.0 +deep_atmosphere: false +rayleigh_sponge: true +viscous_sponge: true +dt_save_state_to_disk: "30days" +cloud_model: "grid_scale" +moist: "nonequil" +implicit_noneq_moist: true +precip_model: "1M" +rad: "allskywithclear" +dt_rad: "1hours" +dt_cloud_fraction: "1hours" +insolation: "timevarying" +co2_model: maunaloa +prescribe_ozone: true +aerosol_radiation: true +edmfx_sgs_diffusive_flux: true +prescribed_aerosols: ["CB1", "CB2", "DST01", "DST02", "DST03", "DST04", "DST05", "OC1", "OC2", "SO4", "SSLT01", "SSLT02", "SSLT03", "SSLT04", "SSLT05"] +surface_setup: "DefaultMoninObukhov" +turbconv: "edonly_edmfx" +implicit_diffusion: true +approximate_linear_solve_iters: 2 +dt: "200secs" +t_end: "20days" +toml: [toml/aquaplanet_nonequil_12_120.toml] +diagnostics: + - short_name: [ta, ua, wa, va, rhoa, hur, hus, hussn, husra, clw, cli] + period: 5days +netcdf_output_at_levels: true diff --git a/config/longrun_configs/amip_target_edonly_nonequil_50_fast.yml b/config/longrun_configs/amip_target_edonly_nonequil_50_fast.yml new file mode 100644 index 0000000000..d34622b6b7 --- /dev/null +++ b/config/longrun_configs/amip_target_edonly_nonequil_50_fast.yml @@ -0,0 +1,32 @@ +h_elem: 9 +z_elem: 39 +z_max: 60000.0 +dz_bottom: 100.0 +deep_atmosphere: false +rayleigh_sponge: true +viscous_sponge: true +dt_save_state_to_disk: "30days" +cloud_model: "grid_scale" +moist: "nonequil" +implicit_noneq_moist: true +precip_model: "1M" +rad: "allskywithclear" +dt_rad: "1hours" +dt_cloud_fraction: "1hours" +insolation: "timevarying" +co2_model: maunaloa +prescribe_ozone: true +aerosol_radiation: true +edmfx_sgs_diffusive_flux: true +prescribed_aerosols: ["CB1", "CB2", "DST01", "DST02", "DST03", "DST04", "DST05", "OC1", "OC2", "SO4", "SSLT01", "SSLT02", "SSLT03", "SSLT04", "SSLT05"] +surface_setup: "DefaultMoninObukhov" +turbconv: "edonly_edmfx" +implicit_diffusion: true +approximate_linear_solve_iters: 2 +dt: "50secs" +t_end: "20days" +toml: [toml/aquaplanet_nonequil_12_120.toml] +diagnostics: + - short_name: [ta, ua, wa, va, rhoa, hur, hus, hussn, husra, clw, cli] + period: 5days +netcdf_output_at_levels: true diff --git a/config/longrun_configs/amip_target_edonly_nonequil_50_fast_explicit.yml b/config/longrun_configs/amip_target_edonly_nonequil_50_fast_explicit.yml new file mode 100644 index 0000000000..7ee4069615 --- /dev/null +++ b/config/longrun_configs/amip_target_edonly_nonequil_50_fast_explicit.yml @@ -0,0 +1,32 @@ +h_elem: 9 +z_elem: 39 +z_max: 60000.0 +dz_bottom: 100.0 +deep_atmosphere: false +rayleigh_sponge: true +viscous_sponge: true +dt_save_state_to_disk: "30days" +cloud_model: "grid_scale" +moist: "nonequil" +implicit_noneq_moist: false +precip_model: "1M" +rad: "allskywithclear" +dt_rad: "1hours" +dt_cloud_fraction: "1hours" +insolation: "timevarying" +co2_model: maunaloa +prescribe_ozone: true +aerosol_radiation: true +edmfx_sgs_diffusive_flux: true +prescribed_aerosols: ["CB1", "CB2", "DST01", "DST02", "DST03", "DST04", "DST05", "OC1", "OC2", "SO4", "SSLT01", "SSLT02", "SSLT03", "SSLT04", "SSLT05"] +surface_setup: "DefaultMoninObukhov" +turbconv: "edonly_edmfx" +implicit_diffusion: true +approximate_linear_solve_iters: 2 +dt: "50secs" +t_end: "20days" +toml: [toml/aquaplanet_nonequil_12_120.toml] +diagnostics: + - short_name: [ta, ua, wa, va, rhoa, hur, hus, hussn, husra, clw, cli] + period: 5days +netcdf_output_at_levels: true diff --git a/config/longrun_configs/amip_target_edonly_nonequil_50_slow.yml b/config/longrun_configs/amip_target_edonly_nonequil_50_slow.yml new file mode 100644 index 0000000000..117a708a03 --- /dev/null +++ b/config/longrun_configs/amip_target_edonly_nonequil_50_slow.yml @@ -0,0 +1,32 @@ +h_elem: 9 +z_elem: 39 +z_max: 60000.0 +dz_bottom: 100.0 +deep_atmosphere: false +rayleigh_sponge: true +viscous_sponge: true +dt_save_state_to_disk: "30days" +cloud_model: "grid_scale" +moist: "nonequil" +implicit_noneq_moist: true +precip_model: "1M" +rad: "allskywithclear" +dt_rad: "1hours" +dt_cloud_fraction: "1hours" +insolation: "timevarying" +co2_model: maunaloa +prescribe_ozone: true +aerosol_radiation: true +edmfx_sgs_diffusive_flux: true +prescribed_aerosols: ["CB1", "CB2", "DST01", "DST02", "DST03", "DST04", "DST05", "OC1", "OC2", "SO4", "SSLT01", "SSLT02", "SSLT03", "SSLT04", "SSLT05"] +surface_setup: "DefaultMoninObukhov" +turbconv: "edonly_edmfx" +implicit_diffusion: true +approximate_linear_solve_iters: 2 +dt: "50secs" +t_end: "20days" +toml: [toml/aquaplanet_nonequil_120_1200.toml] +diagnostics: + - short_name: [ta, ua, wa, va, rhoa, hur, hus, hussn, husra, clw, cli] + period: 5days +netcdf_output_at_levels: true diff --git a/config/longrun_configs/amip_target_edonly_nonequil_50_slow_explicit.yml b/config/longrun_configs/amip_target_edonly_nonequil_50_slow_explicit.yml new file mode 100644 index 0000000000..bc525bcb5c --- /dev/null +++ b/config/longrun_configs/amip_target_edonly_nonequil_50_slow_explicit.yml @@ -0,0 +1,32 @@ +h_elem: 9 +z_elem: 39 +z_max: 60000.0 +dz_bottom: 100.0 +deep_atmosphere: false +rayleigh_sponge: true +viscous_sponge: true +dt_save_state_to_disk: "30days" +cloud_model: "grid_scale" +moist: "nonequil" +implicit_noneq_moist: false +precip_model: "1M" +rad: "allskywithclear" +dt_rad: "1hours" +dt_cloud_fraction: "1hours" +insolation: "timevarying" +co2_model: maunaloa +prescribe_ozone: true +aerosol_radiation: true +edmfx_sgs_diffusive_flux: true +prescribed_aerosols: ["CB1", "CB2", "DST01", "DST02", "DST03", "DST04", "DST05", "OC1", "OC2", "SO4", "SSLT01", "SSLT02", "SSLT03", "SSLT04", "SSLT05"] +surface_setup: "DefaultMoninObukhov" +turbconv: "edonly_edmfx" +implicit_diffusion: true +approximate_linear_solve_iters: 2 +dt: "50secs" +t_end: "20days" +toml: [toml/aquaplanet_nonequil_120_1200.toml] +diagnostics: + - short_name: [ta, ua, wa, va, rhoa, hur, hus, hussn, husra, clw, cli] + period: 5days +netcdf_output_at_levels: true diff --git a/config/longrun_configs/amip_target_edonly_nonequil_600_explicit_fast.yml b/config/longrun_configs/amip_target_edonly_nonequil_600_explicit_fast.yml new file mode 100644 index 0000000000..ad6df0345e --- /dev/null +++ b/config/longrun_configs/amip_target_edonly_nonequil_600_explicit_fast.yml @@ -0,0 +1,32 @@ +h_elem: 9 +z_elem: 39 +z_max: 60000.0 +dz_bottom: 100.0 +deep_atmosphere: false +rayleigh_sponge: true +viscous_sponge: true +dt_save_state_to_disk: "30days" +cloud_model: "grid_scale" +moist: "nonequil" +implicit_noneq_moist: false +precip_model: "1M" +rad: "allskywithclear" +dt_rad: "1hours" +dt_cloud_fraction: "1hours" +insolation: "timevarying" +co2_model: maunaloa +prescribe_ozone: true +aerosol_radiation: true +edmfx_sgs_diffusive_flux: true +prescribed_aerosols: ["CB1", "CB2", "DST01", "DST02", "DST03", "DST04", "DST05", "OC1", "OC2", "SO4", "SSLT01", "SSLT02", "SSLT03", "SSLT04", "SSLT05"] +surface_setup: "DefaultMoninObukhov" +turbconv: "edonly_edmfx" +implicit_diffusion: true +approximate_linear_solve_iters: 2 +dt: "200secs" +t_end: "20days" +toml: [toml/aquaplanet_nonequil_12_120.toml] +diagnostics: + - short_name: [ta, ua, wa, va, rhoa, hur, hus, hussn, husra, clw, cli] + period: 5days +netcdf_output_at_levels: true diff --git a/config/longrun_configs/amip_target_edonly_nonequil_600_explicit_slow.yml b/config/longrun_configs/amip_target_edonly_nonequil_600_explicit_slow.yml new file mode 100644 index 0000000000..98b6f6c527 --- /dev/null +++ b/config/longrun_configs/amip_target_edonly_nonequil_600_explicit_slow.yml @@ -0,0 +1,32 @@ +h_elem: 9 +z_elem: 39 +z_max: 60000.0 +dz_bottom: 100.0 +deep_atmosphere: false +rayleigh_sponge: true +viscous_sponge: true +dt_save_state_to_disk: "30days" +cloud_model: "grid_scale" +moist: "nonequil" +implicit_noneq_moist: false +precip_model: "1M" +rad: "allskywithclear" +dt_rad: "1hours" +dt_cloud_fraction: "1hours" +insolation: "timevarying" +co2_model: maunaloa +prescribe_ozone: true +aerosol_radiation: true +edmfx_sgs_diffusive_flux: true +prescribed_aerosols: ["CB1", "CB2", "DST01", "DST02", "DST03", "DST04", "DST05", "OC1", "OC2", "SO4", "SSLT01", "SSLT02", "SSLT03", "SSLT04", "SSLT05"] +surface_setup: "DefaultMoninObukhov" +turbconv: "edonly_edmfx" +implicit_diffusion: true +approximate_linear_solve_iters: 2 +dt: "200secs" +t_end: "20days" +toml: [toml/aquaplanet_nonequil_120_1200.toml] +diagnostics: + - short_name: [ta, ua, wa, va, rhoa, hur, hus, hussn, husra, clw, cli] + period: 5days +netcdf_output_at_levels: true diff --git a/config/longrun_configs/amip_target_edonly_nonequil_600_fast.yml b/config/longrun_configs/amip_target_edonly_nonequil_600_fast.yml new file mode 100644 index 0000000000..277090a809 --- /dev/null +++ b/config/longrun_configs/amip_target_edonly_nonequil_600_fast.yml @@ -0,0 +1,32 @@ +h_elem: 9 +z_elem: 39 +z_max: 60000.0 +dz_bottom: 100.0 +deep_atmosphere: false +rayleigh_sponge: true +viscous_sponge: true +dt_save_state_to_disk: "30days" +cloud_model: "grid_scale" +moist: "nonequil" +implicit_noneq_moist: true +precip_model: "1M" +rad: "allskywithclear" +dt_rad: "1hours" +dt_cloud_fraction: "1hours" +insolation: "timevarying" +co2_model: maunaloa +prescribe_ozone: true +aerosol_radiation: true +edmfx_sgs_diffusive_flux: true +prescribed_aerosols: ["CB1", "CB2", "DST01", "DST02", "DST03", "DST04", "DST05", "OC1", "OC2", "SO4", "SSLT01", "SSLT02", "SSLT03", "SSLT04", "SSLT05"] +surface_setup: "DefaultMoninObukhov" +turbconv: "edonly_edmfx" +implicit_diffusion: true +approximate_linear_solve_iters: 2 +dt: "200secs" +t_end: "20days" +toml: [toml/aquaplanet_nonequil_12_120.toml] +diagnostics: + - short_name: [ta, ua, wa, va, rhoa, hur, hus, hussn, husra, clw, cli] + period: 5days +netcdf_output_at_levels: true diff --git a/config/longrun_configs/amip_target_edonly_nonequil_600_slow.yml b/config/longrun_configs/amip_target_edonly_nonequil_600_slow.yml new file mode 100644 index 0000000000..9c88e075ca --- /dev/null +++ b/config/longrun_configs/amip_target_edonly_nonequil_600_slow.yml @@ -0,0 +1,32 @@ +h_elem: 9 +z_elem: 39 +z_max: 60000.0 +dz_bottom: 100.0 +deep_atmosphere: false +rayleigh_sponge: true +viscous_sponge: true +dt_save_state_to_disk: "30days" +cloud_model: "grid_scale" +moist: "nonequil" +implicit_noneq_moist: true +precip_model: "1M" +rad: "allskywithclear" +dt_rad: "1hours" +dt_cloud_fraction: "1hours" +insolation: "timevarying" +co2_model: maunaloa +prescribe_ozone: true +aerosol_radiation: true +edmfx_sgs_diffusive_flux: true +prescribed_aerosols: ["CB1", "CB2", "DST01", "DST02", "DST03", "DST04", "DST05", "OC1", "OC2", "SO4", "SSLT01", "SSLT02", "SSLT03", "SSLT04", "SSLT05"] +surface_setup: "DefaultMoninObukhov" +turbconv: "edonly_edmfx" +implicit_diffusion: true +approximate_linear_solve_iters: 2 +dt: "200secs" +t_end: "20days" +toml: [toml/aquaplanet_nonequil_120_1200.toml] +diagnostics: + - short_name: [ta, ua, wa, va, rhoa, hur, hus, hussn, husra, clw, cli] + period: 5days +netcdf_output_at_levels: true diff --git a/config/model_configs/amip_target_edonly_nonequil.yml b/config/model_configs/amip_target_edonly_nonequil.yml index c2f7e4bd8d..8ac084fb9b 100644 --- a/config/model_configs/amip_target_edonly_nonequil.yml +++ b/config/model_configs/amip_target_edonly_nonequil.yml @@ -1,7 +1,7 @@ -h_elem: 16 +h_elem: 9 +z_elem: 39 z_max: 60000.0 -z_elem: 63 -dz_bottom: 30.0 +dz_bottom: 100.0 deep_atmosphere: false rayleigh_sponge: true viscous_sponge: true @@ -22,10 +22,10 @@ surface_setup: "DefaultMoninObukhov" turbconv: "edonly_edmfx" implicit_diffusion: true approximate_linear_solve_iters: 2 -dt: "120secs" -t_end: "30mins" +dt: "240secs" +t_end: "10days" toml: [toml/short_aquaplanet_nonequil.toml] diagnostics: - short_name: [ta, ua, wa, va, rhoa, hur, hus, hussn, husra, clw, cli] - period: 1hours + period: 1days netcdf_output_at_levels: true diff --git a/docs/src/api.md b/docs/src/api.md index cff24a866f..28f678d47f 100644 --- a/docs/src/api.md +++ b/docs/src/api.md @@ -46,6 +46,10 @@ ClimaAtmos.InitialConditions.Soares ### Implicit Solver ```@docs +ClimaAtmos.JacobianAlgorithm +ClimaAtmos.ApproxJacobian +ClimaAtmos.ExactJacobian +ClimaAtmos.DebugJacobian ClimaAtmos.ImplicitEquationJacobian ``` diff --git a/examples/Manifest.toml b/examples/Manifest.toml new file mode 100644 index 0000000000..2b757e4473 --- /dev/null +++ b/examples/Manifest.toml @@ -0,0 +1,2791 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.11.2" +manifest_format = "2.0" +project_hash = "24002e8dc6f8a8c5db6cfb0857be38051c779373" + +[[deps.ADTypes]] +git-tree-sha1 = "fb97701c117c8162e84dfcf80215caa904aef44f" +uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" +version = "1.13.0" +weakdeps = ["ChainRulesCore", "ConstructionBase", "EnzymeCore"] + + [deps.ADTypes.extensions] + ADTypesChainRulesCoreExt = "ChainRulesCore" + ADTypesConstructionBaseExt = "ConstructionBase" + ADTypesEnzymeCoreExt = "EnzymeCore" + +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "Test"] + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + +[[deps.AbstractTrees]] +git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.5" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] +git-tree-sha1 = "0ba8f4c1f06707985ffb4804fdad1bf97b233897" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.41" + + [deps.Accessors.extensions] + AxisKeysExt = "AxisKeys" + IntervalSetsExt = "IntervalSets" + LinearAlgebraExt = "LinearAlgebra" + StaticArraysExt = "StaticArrays" + StructArraysExt = "StructArrays" + TestExt = "Test" + UnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + Requires = "ae029012-a4dd-5104-9daa-d747884805df" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "cd8b948862abee8f3d3e9b73a102a9ca924debb0" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.2.0" +weakdeps = ["SparseArrays", "StaticArrays"] + + [deps.Adapt.extensions] + AdaptSparseArraysExt = "SparseArrays" + AdaptStaticArraysExt = "StaticArrays" + +[[deps.AdaptivePredicates]] +git-tree-sha1 = "7e651ea8d262d2d74ce75fdf47c4d63c07dba7a6" +uuid = "35492f91-a3bd-45ad-95db-fcad7dcfedb7" +version = "1.2.0" + +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[deps.Animations]] +deps = ["Colors"] +git-tree-sha1 = "e092fa223bf66a3c41f9c022bd074d916dc303e7" +uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340" +version = "0.4.2" + +[[deps.ArgParse]] +deps = ["Logging", "TextWrap"] +git-tree-sha1 = "22cf435ac22956a7b45b0168abbc871176e7eecc" +uuid = "c7e460c6-2fb9-53a9-8c5b-16f535851c63" +version = "1.2.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.2" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "017fcb757f8e921fb44ee063a7aafe5f89b86dd1" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.18.0" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" + ArrayInterfaceChainRulesCoreExt = "ChainRulesCore" + ArrayInterfaceChainRulesExt = "ChainRules" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceSparseArraysExt = "SparseArrays" + ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" + ArrayInterfaceTrackerExt = "Tracker" + + [deps.ArrayInterface.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.ArrayLayouts]] +deps = ["FillArrays", "LinearAlgebra"] +git-tree-sha1 = "4e25216b8fea1908a0ce0f5d87368587899f75be" +uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.ArrayLayouts.extensions] + ArrayLayoutsSparseArraysExt = "SparseArrays" + +[[deps.ArtifactWrappers]] +deps = ["Downloads", "Pkg"] +git-tree-sha1 = "760f4c06375735829b8c1b67560b608b9dba4c6a" +uuid = "a14bc488-3040-4b00-9dc1-f6467924858a" +version = "0.2.0" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" + +[[deps.AtmosphericProfilesLibrary]] +deps = ["Interpolations", "LinearAlgebra"] +git-tree-sha1 = "4f5654bb77c179b6021c21c25ad336fe886258f6" +uuid = "86bc3604-9858-485a-bdbe-831ec50de11d" +version = "0.1.7" + +[[deps.Atomix]] +deps = ["UnsafeAtomics"] +git-tree-sha1 = "93da6c8228993b0052e358ad592ee7c1eccaa639" +uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" +version = "1.1.0" + + [deps.Atomix.extensions] + AtomixCUDAExt = "CUDA" + AtomixMetalExt = "Metal" + AtomixOpenCLExt = "OpenCL" + AtomixoneAPIExt = "oneAPI" + + [deps.Atomix.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + OpenCL = "08131aa3-fb12-5dee-8b74-c09406e224a2" + oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" + +[[deps.Automa]] +deps = ["PrecompileTools", "SIMD", "TranscodingStreams"] +git-tree-sha1 = "a8f503e8e1a5f583fbef15a8440c8c7e32185df2" +uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b" +version = "1.1.0" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.1.0" + +[[deps.AxisArrays]] +deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] +git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" +uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" +version = "0.4.7" + +[[deps.BFloat16s]] +deps = ["LinearAlgebra", "Printf", "Random", "Test"] +git-tree-sha1 = "2c7cc21e8678eff479978a0a2ef5ce2f51b63dff" +uuid = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" +version = "0.5.0" + +[[deps.BandedMatrices]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "PrecompileTools"] +git-tree-sha1 = "bbc6688495b031d84610e227d46c35e17fdde5f5" +uuid = "aae01518-5342-5314-be14-df237901396f" +version = "1.9.1" +weakdeps = ["SparseArrays"] + + [deps.BandedMatrices.extensions] + BandedMatricesSparseArraysExt = "SparseArrays" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "f21cfd4950cb9f0587d5067e69405ad2acd27b87" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.6" + +[[deps.BlockArrays]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra"] +git-tree-sha1 = "1ded9033f6067573314b27cd4b9ff01a1ba92cff" +uuid = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" +version = "1.4.0" +weakdeps = ["BandedMatrices"] + + [deps.BlockArrays.extensions] + BlockArraysBandedMatricesExt = "BandedMatrices" + +[[deps.Blosc_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Lz4_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "ef12cdd1c7fb7e1dfd6fa8fd60d4db6bc61d2f23" +uuid = "0b7ba130-8d10-5ba8-a3d6-c5182647fed9" +version = "1.21.6+2" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.9+0" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CFTime]] +deps = ["Dates", "Printf"] +git-tree-sha1 = "937628bf8b377208ac359f57314fd85d3e0165d9" +uuid = "179af706-886a-5703-950a-314cd64e0468" +version = "0.1.4" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] +git-tree-sha1 = "5a97e67919535d6841172016c9530fd69494e5ec" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.2.6" + +[[deps.CRC32c]] +uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" +version = "1.11.0" + +[[deps.CRlibm]] +deps = ["CRlibm_jll"] +git-tree-sha1 = "32abd86e3c2025db5172aa182b982debed519834" +uuid = "96374032-68de-5a5b-8d9e-752f78720389" +version = "1.0.1" + +[[deps.CRlibm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc" +uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0" +version = "1.0.1+0" + +[[deps.CUDA]] +deps = ["AbstractFFTs", "Adapt", "BFloat16s", "CEnum", "CUDA_Driver_jll", "CUDA_Runtime_Discovery", "CUDA_Runtime_jll", "Crayons", "DataFrames", "ExprTools", "GPUArrays", "GPUCompiler", "KernelAbstractions", "LLVM", "LLVMLoopInfo", "LazyArtifacts", "Libdl", "LinearAlgebra", "Logging", "NVTX", "Preferences", "PrettyTables", "Printf", "Random", "Random123", "RandomNumbers", "Reexport", "Requires", "SparseArrays", "StaticArrays", "Statistics", "demumble_jll"] +git-tree-sha1 = "7be665c420b5d16059b1ba00b1dbb4e85012fa65" +uuid = "052768ef-5323-5732-b1bb-66c8b64840ba" +version = "5.6.1" +weakdeps = ["ChainRulesCore", "EnzymeCore", "SpecialFunctions"] + + [deps.CUDA.extensions] + ChainRulesCoreExt = "ChainRulesCore" + EnzymeCoreExt = "EnzymeCore" + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.CUDA_Driver_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "14996d716a2eaaeccfc8d7bc854dd87fde720ac1" +uuid = "4ee394cb-3365-5eb0-8335-949819d2adfc" +version = "0.10.4+0" + +[[deps.CUDA_Runtime_Discovery]] +deps = ["Libdl"] +git-tree-sha1 = "33576c7c1b2500f8e7e6baa082e04563203b3a45" +uuid = "1af6417a-86b4-443c-805f-a4643ffb695f" +version = "0.3.5" + +[[deps.CUDA_Runtime_jll]] +deps = ["Artifacts", "CUDA_Driver_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "17f1536c600133f7c4113bae0a2d98dbf27c7ebc" +uuid = "76a88914-d11a-5bdc-97e0-2f5a05c973a2" +version = "0.15.5+0" + +[[deps.Cairo]] +deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"] +git-tree-sha1 = "71aa551c5c33f1a4415867fe06b7844faadb0ae9" +uuid = "159f3aea-2a34-519c-b102-8c37f9878175" +version = "1.1.1" + +[[deps.CairoMakie]] +deps = ["CRC32c", "Cairo", "Cairo_jll", "Colors", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools"] +git-tree-sha1 = "0afa2b4ac444b9412130d68493941e1af462e26a" +uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" +version = "0.12.18" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "009060c9a6168704143100f36ab08f06c2af4642" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.2+1" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "1713c74e00545bfe14605d2a2be1712de8fbcb58" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.25.1" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.ClimaAnalysis]] +deps = ["Artifacts", "Dates", "Interpolations", "NCDatasets", "NaNStatistics", "OrderedCollections", "Reexport", "Statistics", "Unitful"] +git-tree-sha1 = "b67f8f5f754fde6132bae1a2add06e51cf26227b" +uuid = "29b5916a-a76c-4e73-9657-3c8fd22e65e6" +version = "0.5.12" + + [deps.ClimaAnalysis.extensions] + ClimaAnalysisGeoMakieExt = "GeoMakie" + ClimaAnalysisMakieExt = "Makie" + + [deps.ClimaAnalysis.weakdeps] + GeoMakie = "db073c08-6b98-4ee5-b6a4-5efafb3259c6" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + +[[deps.ClimaAtmos]] +deps = ["ArgParse", "Artifacts", "AtmosphericProfilesLibrary", "ClimaComms", "ClimaCore", "ClimaDiagnostics", "ClimaParams", "ClimaTimeSteppers", "ClimaUtilities", "CloudMicrophysics", "Dates", "DiffEqBase", "FastGaussQuadrature", "Insolation", "Interpolations", "LazyArtifacts", "LazyBroadcast", "LinearAlgebra", "Logging", "NCDatasets", "NVTX", "NullBroadcasts", "RRTMGP", "Random", "SciMLBase", "StaticArrays", "Statistics", "SurfaceFluxes", "Thermodynamics", "UnrolledUtilities", "YAML"] +git-tree-sha1 = "b00ba399f8dd6a188cc53c601db7188879059f5c" +uuid = "b2c96348-7fb7-4fe0-8da9-78d88439e717" +version = "0.28.5" + +[[deps.ClimaComms]] +deps = ["Adapt", "Logging", "LoggingExtras"] +git-tree-sha1 = "40ad44466dfe0092e18c04bc02c849fe8e095d30" +uuid = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d" +version = "0.6.6" +weakdeps = ["CUDA", "MPI"] + + [deps.ClimaComms.extensions] + ClimaCommsCUDAExt = "CUDA" + ClimaCommsMPIExt = "MPI" + +[[deps.ClimaCore]] +deps = ["Adapt", "BandedMatrices", "BlockArrays", "ClimaComms", "CubedSphere", "DataStructures", "ForwardDiff", "GaussQuadrature", "GilbertCurves", "HDF5", "InteractiveUtils", "IntervalSets", "KrylovKit", "LinearAlgebra", "MultiBroadcastFusion", "NVTX", "PkgVersion", "RecursiveArrayTools", "RootSolvers", "SparseArrays", "StaticArrays", "Statistics", "Unrolled"] +git-tree-sha1 = "5ab63b77f54c2a2f79cb43a1fd37e086427a8cf1" +uuid = "d414da3d-4745-48bb-8d80-42e94e092884" +version = "0.14.26" +weakdeps = ["CUDA", "Krylov"] + + [deps.ClimaCore.extensions] + ClimaCoreCUDAExt = "CUDA" + KrylovExt = "Krylov" + +[[deps.ClimaCoreMakie]] +deps = ["ClimaCore", "Makie"] +git-tree-sha1 = "e1e82d32ba993a18fc760d5cbd7db3bcabd1f3c8" +uuid = "908f55d8-4145-4867-9c14-5dad1a479e4d" +version = "0.4.6" + +[[deps.ClimaCorePlots]] +deps = ["ClimaComms", "ClimaCore", "RecipesBase", "StaticArrays", "TriplotBase"] +git-tree-sha1 = "6430644d60158055458075bf32e5ac24741b1ab9" +uuid = "cf7c7e5a-b407-4c48-9047-11a94a308626" +version = "0.2.11" + +[[deps.ClimaCoreSpectra]] +deps = ["ClimaCore", "FFTW"] +git-tree-sha1 = "724f28676f25b5371a29a0cd8ea00187891f0b10" +uuid = "c2caaa1d-32ae-4754-ba0d-80e7561362e9" +version = "0.1.4" + +[[deps.ClimaCoreTempestRemap]] +deps = ["ClimaComms", "ClimaCore", "CommonDataModel", "Dates", "LinearAlgebra", "NCDatasets", "PkgVersion", "TempestRemap_jll"] +git-tree-sha1 = "99845c1da7e9f687180c49cf4d53140f21fc8683" +uuid = "d934ef94-cdd4-4710-83d6-720549644b70" +version = "0.3.18" + +[[deps.ClimaCoreVTK]] +deps = ["ClimaCore", "WriteVTK"] +git-tree-sha1 = "f23034033a0cca56f151d841a8945a75fcf4be46" +uuid = "c8b6d40d-e815-466f-95ae-c48aefa668fa" +version = "0.7.6" + +[[deps.ClimaDiagnostics]] +deps = ["Accessors", "ClimaComms", "ClimaCore", "ClimaUtilities", "Dates", "NCDatasets", "OrderedCollections", "SciMLBase"] +git-tree-sha1 = "a67549b46bd3629a1af5739f161bc953914f9c5e" +uuid = "1ecacbb8-0713-4841-9a07-eb5aa8a2d53f" +version = "0.2.12" + +[[deps.ClimaParams]] +deps = ["TOML"] +git-tree-sha1 = "e8f4589e684b5053660ee3981bb2236221d5ad27" +uuid = "5c42b081-d73a-476f-9059-fd94b934656c" +version = "0.10.19" + +[[deps.ClimaReproducibilityTests]] +deps = ["OrderedCollections", "PrettyTables"] +git-tree-sha1 = "122ee2d27e225684221b18b5dbb609c7ac59e077" +uuid = "e0c89595-00ba-42a9-9f9b-061ef3dc23a1" +version = "0.1.1" + +[[deps.ClimaTimeSteppers]] +deps = ["ClimaComms", "Colors", "DataStructures", "DiffEqBase", "KernelAbstractions", "Krylov", "LinearAlgebra", "LinearOperators", "NVTX", "SciMLBase", "StaticArrays"] +git-tree-sha1 = "b452132022416ad3511143230f51660a62d583b2" +uuid = "595c0a79-7f3d-439a-bc5a-b232dc3bde79" +version = "0.8.2" + + [deps.ClimaTimeSteppers.extensions] + ClimaTimeSteppersBenchmarkToolsExt = ["CUDA", "BenchmarkTools", "OrderedCollections", "StatsBase", "PrettyTables"] + + [deps.ClimaTimeSteppers.weakdeps] + BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" + PrettyTables = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" + StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" + +[[deps.ClimaUtilities]] +deps = ["Artifacts", "ClimaComms", "Dates"] +git-tree-sha1 = "c798f5876a457e6a3c9aa6e484299b138515cb41" +uuid = "b3f4f4ca-9299-4f7f-bd9b-81e1242a7513" +version = "0.1.22" +weakdeps = ["Adapt", "CUDA", "ClimaCore", "ClimaCoreTempestRemap", "Interpolations", "NCDatasets"] + + [deps.ClimaUtilities.extensions] + ClimaUtilitiesClimaCoreExt = "ClimaCore" + ClimaUtilitiesClimaCoreInterpolationsExt = ["ClimaCore", "Interpolations"] + ClimaUtilitiesClimaCoreNCDatasetsExt = ["ClimaCore", "NCDatasets"] + ClimaUtilitiesClimaCoreTempestRemapExt = "ClimaCoreTempestRemap" + ClimaUtilitiesNCDatasetsExt = "NCDatasets" + +[[deps.CloseOpenIntervals]] +deps = ["Static", "StaticArrayInterface"] +git-tree-sha1 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.13" + +[[deps.CloudMicrophysics]] +deps = ["ClimaParams", "DocStringExtensions", "ForwardDiff", "HCubature", "LazyArtifacts", "QuadGK", "RootSolvers", "SpecialFunctions", "Thermodynamics"] +git-tree-sha1 = "98c77aaefaedaa185a7bb676af16ab19aede7ff3" +uuid = "6a9e3e04-43cd-43ba-94b9-e8782df3c71b" +version = "0.22.8" + + [deps.CloudMicrophysics.extensions] + EmulatorModelsExt = ["DataFrames", "MLJ"] + + [deps.CloudMicrophysics.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + MLJ = "add582a8-e3ab-11e8-2d5e-e98b27df1bc7" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "7eee164f122511d3e4e1ebadb7956939ea7e1c77" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.3.6" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.8" + +[[deps.ColorBrewer]] +deps = ["Colors", "JSON"] +git-tree-sha1 = "e771a63cc8b539eca78c85b0cabd9233d6c8f06f" +uuid = "a2cac450-b92f-5266-8821-25eda20663c8" +version = "0.4.1" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "403f2d8e209681fcbd9468a8514efff3ea08452e" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.29.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.5" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.10.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "64e15186f0aa277e174aa81798f7eb8598e0157e" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.13.0" + +[[deps.Combinatorics]] +git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.0.2" + +[[deps.CommonDataModel]] +deps = ["CFTime", "DataStructures", "Dates", "Preferences", "Printf", "Statistics"] +git-tree-sha1 = "98d64d5b9e5263884276656a43c45424b3a645c2" +uuid = "1fbeeb36-5f17-413c-809b-666fb144f157" +version = "0.3.7" + +[[deps.CommonSolve]] +git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.4" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.1" + +[[deps.CommonWorldInvalidations]] +git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0" +uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8" +version = "1.0.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.16.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+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]] +git-tree-sha1 = "76219f1ed5771adbb096743bff43fb5fdd4c1157" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.5.8" +weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"] + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.CubedSphere]] +deps = ["TaylorSeries"] +git-tree-sha1 = "10874d1500159336863decaef665ab54805be29c" +uuid = "7445602f-e544-4518-8976-18f8e8ae6cdb" +version = "0.3.1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataFrames]] +deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] +git-tree-sha1 = "fb61b4812c49343d7ef0b533ba982c46021938a6" +uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +version = "1.7.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.20" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" +version = "1.11.0" + +[[deps.DelaunayTriangulation]] +deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"] +git-tree-sha1 = "5620ff4ee0084a6ab7097a27ba0c19290200b037" +uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" +version = "1.6.4" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.DiffEqBase]] +deps = ["ArrayInterface", "ConcreteStructs", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "FastClosures", "FastPower", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "Setfield", "Static", "StaticArraysCore", "Statistics", "TruncatedStacktraces"] +git-tree-sha1 = "df4954f297a09f05e1f84a049566ae93d5304477" +uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" +version = "6.164.1" + + [deps.DiffEqBase.extensions] + DiffEqBaseCUDAExt = "CUDA" + DiffEqBaseChainRulesCoreExt = "ChainRulesCore" + DiffEqBaseDistributionsExt = "Distributions" + DiffEqBaseEnzymeExt = ["ChainRulesCore", "Enzyme"] + DiffEqBaseForwardDiffExt = ["ForwardDiff"] + DiffEqBaseGTPSAExt = "GTPSA" + DiffEqBaseGeneralizedGeneratedExt = "GeneralizedGenerated" + DiffEqBaseMPIExt = "MPI" + DiffEqBaseMeasurementsExt = "Measurements" + DiffEqBaseMonteCarloMeasurementsExt = "MonteCarloMeasurements" + DiffEqBaseReverseDiffExt = "ReverseDiff" + DiffEqBaseSparseArraysExt = "SparseArrays" + DiffEqBaseTrackerExt = "Tracker" + DiffEqBaseUnitfulExt = "Unitful" + + [deps.DiffEqBase.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8" + GeneralizedGenerated = "6b9d7cbe-bcb9-11e9-073f-15a7a543e2eb" + MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.DiffResults]] +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.1.0" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.15.1" + +[[deps.DiskArrays]] +deps = ["LRUCache", "Mmap", "OffsetArrays"] +git-tree-sha1 = "5109a9314f8904f96a14b80d40dce5c9972c584f" +uuid = "3c3547ce-8d99-4f5e-a174-61eb10b00ae3" +version = "0.4.10" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +version = "1.11.0" + +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "03aa5d44647eaec98e1920635cdfed5d5560a8b9" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.117" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.3" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EarCut_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053" +uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" +version = "2.2.4+0" + +[[deps.EnumX]] +git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.4" + +[[deps.EnzymeCore]] +git-tree-sha1 = "0cdb7af5c39e92d78a0ee8d0a447d32f7593137e" +uuid = "f151be2c-9106-41f4-ab19-57ee4f262869" +version = "0.8.8" +weakdeps = ["Adapt"] + + [deps.EnzymeCore.extensions] + AdaptExt = "Adapt" + +[[deps.ErrorfreeArithmetic]] +git-tree-sha1 = "d6863c556f1142a061532e79f611aa46be201686" +uuid = "90fa49ef-747e-5e6f-a989-263ba693cf1a" +version = "0.5.2" + +[[deps.ExactPredicates]] +deps = ["IntervalArithmetic", "Random", "StaticArraysCore", "Test"] +git-tree-sha1 = "276e83bc8b21589b79303b9985c321024ffdf59c" +uuid = "429591f6-91af-11e9-00e2-59fbe8cec110" +version = "2.2.5" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d55dffd9ae73ff72f1c0482454dcf2ec6c6c4a63" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.6.5+0" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.Expronicon]] +deps = ["MLStyle", "Pkg", "TOML"] +git-tree-sha1 = "fc3951d4d398b5515f91d7fe5d45fc31dccb3c9b" +uuid = "6b7a57c9-7cc1-4fdf-b7f5-e857abae3636" +version = "0.8.5" + +[[deps.Extents]] +git-tree-sha1 = "063512a13dbe9c40d999c439268539aa552d1ae6" +uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" +version = "0.1.5" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "8cc47f299902e13f90405ddb5bf87e5d474c0d38" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "6.1.2+0" + +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "7de7c78d681078f027389e067864a8d53bd7c3c9" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.8.1" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4d81ed14783ec49ce9f2e168208a12ce1815aa25" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.10+3" + +[[deps.FastBroadcast]] +deps = ["ArrayInterface", "LinearAlgebra", "Polyester", "Static", "StaticArrayInterface", "StrideArraysCore"] +git-tree-sha1 = "ab1b34570bcdf272899062e1a56285a53ecaae08" +uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" +version = "0.3.5" + +[[deps.FastClosures]] +git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" +uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" +version = "0.3.2" + +[[deps.FastGaussQuadrature]] +deps = ["LinearAlgebra", "SpecialFunctions", "StaticArrays"] +git-tree-sha1 = "fd923962364b645f3719855c88f7074413a6ad92" +uuid = "442a2c76-b920-505d-bb47-c5924d526838" +version = "1.0.2" + +[[deps.FastPower]] +git-tree-sha1 = "58c3431137131577a7c379d00fea00be524338fb" +uuid = "a4df4552-cc26-4903-aec0-212e50a0e84b" +version = "1.1.1" + + [deps.FastPower.extensions] + FastPowerEnzymeExt = "Enzyme" + FastPowerForwardDiffExt = "ForwardDiff" + FastPowerMeasurementsExt = "Measurements" + FastPowerMonteCarloMeasurementsExt = "MonteCarloMeasurements" + FastPowerReverseDiffExt = "ReverseDiff" + FastPowerTrackerExt = "Tracker" + + [deps.FastPower.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.FastRounding]] +deps = ["ErrorfreeArithmetic", "LinearAlgebra"] +git-tree-sha1 = "6344aa18f654196be82e62816935225b3b9abe44" +uuid = "fa42c844-2597-5d31-933b-ebd51ab2693f" +version = "0.3.1" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "2dd20384bf8c6d411b5c7370865b1e9b26cb2ea3" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.16.6" + + [deps.FileIO.extensions] + HTTPExt = "HTTP" + + [deps.FileIO.weakdeps] + HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" + +[[deps.FilePaths]] +deps = ["FilePathsBase", "MacroTools", "Reexport", "Requires"] +git-tree-sha1 = "919d9412dbf53a2e6fe74af62a73ceed0bce0629" +uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824" +version = "0.8.3" + +[[deps.FilePathsBase]] +deps = ["Compat", "Dates"] +git-tree-sha1 = "2ec417fc319faa2d768621085cc1feebbdee686b" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.23" +weakdeps = ["Mmap", "Test"] + + [deps.FilePathsBase.extensions] + FilePathsBaseMmapExt = "Mmap" + FilePathsBaseTestExt = "Test" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.13.0" +weakdeps = ["PDMats", "SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "21fac3c77d7b5a9fc03b0ec503aa1a6392c34d2b" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.15.0+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "a2df1b776752e3f344e5116c06d75a10436ab853" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.38" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.FreeType]] +deps = ["CEnum", "FreeType2_jll"] +git-tree-sha1 = "907369da0f8e80728ab49c1c7e09327bf0d6d999" +uuid = "b38be410-82b0-50bf-ab77-7b57e271db43" +version = "4.1.1" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "786e968a8d2fb167f2e4880baba62e0e26bd8e4e" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.3+1" + +[[deps.FreeTypeAbstraction]] +deps = ["ColorVectorSpace", "Colors", "FreeType", "GeometryBasics"] +git-tree-sha1 = "d52e255138ac21be31fa633200b65e4e71d26802" +uuid = "663a7486-cb36-511b-a19d-713bb74d65c9" +version = "0.10.6" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "846f7026a9decf3679419122b49f8a1fdb48d2d5" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.16+0" + +[[deps.FunctionWrappers]] +git-tree-sha1 = "d62485945ce5ae9c0c48f124a84998d755bae00e" +uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" +version = "1.1.3" + +[[deps.FunctionWrappersWrappers]] +deps = ["FunctionWrappers"] +git-tree-sha1 = "b104d487b34566608f8b4e1c39fb0b10aa279ff8" +uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" +version = "0.1.3" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" +version = "1.11.0" + +[[deps.GPUArrays]] +deps = ["Adapt", "GPUArraysCore", "KernelAbstractions", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "ScopedValues", "Serialization", "Statistics"] +git-tree-sha1 = "eea7b3a1964b4de269bb380462a9da604be7fcdb" +uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" +version = "11.2.2" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "83cf05ab16a73219e5f6bd1bdfa9848fa24ac627" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.2.0" + +[[deps.GPUCompiler]] +deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "PrecompileTools", "Preferences", "Scratch", "Serialization", "TOML", "TimerOutputs", "UUIDs"] +git-tree-sha1 = "199f213e40a7982e9138bc9edc3299419d510390" +uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" +version = "1.2.0" + +[[deps.GaussQuadrature]] +deps = ["SpecialFunctions"] +git-tree-sha1 = "eb6f1f48aa994f3018cbd029a17863c6535a266d" +uuid = "d54b0c1a-921d-58e0-8e36-89d8069c0969" +version = "0.5.8" + +[[deps.GeoFormatTypes]] +git-tree-sha1 = "8e233d5167e63d708d41f87597433f59a0f213fe" +uuid = "68eda718-8dee-11e9-39e7-89f7f65f511f" +version = "0.4.4" + +[[deps.GeoInterface]] +deps = ["DataAPI", "Extents", "GeoFormatTypes"] +git-tree-sha1 = "294e99f19869d0b0cb71aef92f19d03649d028d5" +uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" +version = "1.4.1" + +[[deps.GeometryBasics]] +deps = ["EarCut_jll", "Extents", "GeoInterface", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] +git-tree-sha1 = "b62f2b2d76cee0d61a2ef2b3118cd2a3215d3134" +uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" +version = "0.4.11" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Giflib_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6570366d757b50fabae9f4315ad74d2e40c0560a" +uuid = "59f7168a-df46-5410-90c8-f2779963d0ec" +version = "5.2.3+0" + +[[deps.GilbertCurves]] +git-tree-sha1 = "3e076ca96e34a47e98a46657b2bec2655a366d80" +uuid = "88fa7841-ef32-4516-bb70-c6ec135699d9" +version = "0.1.0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "b0036b392358c80d2d2124746c2bf3d48d457938" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.82.4+0" + +[[deps.Glob]] +git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" +uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" +version = "1.3.1" + +[[deps.Graphics]] +deps = ["Colors", "LinearAlgebra", "NaNMath"] +git-tree-sha1 = "a641238db938fff9b2f60d08ed9030387daf428c" +uuid = "a2bd30eb-e257-5431-a919-1863eab51364" +version = "1.1.3" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "01979f9b37367603e2848ea225918a3b3861b606" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+1" + +[[deps.GridLayoutBase]] +deps = ["GeometryBasics", "InteractiveUtils", "Observables"] +git-tree-sha1 = "dc6bed05c15523624909b3953686c5f5ffa10adc" +uuid = "3955a311-db13-416c-9275-1d80ed98e5e9" +version = "0.11.1" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HCubature]] +deps = ["Combinatorics", "DataStructures", "LinearAlgebra", "QuadGK", "StaticArrays"] +git-tree-sha1 = "19ef9f0cb324eed957b7fe7257ac84e8ed8a48ec" +uuid = "19dc6840-f33b-545b-b366-655c7e3ffd49" +version = "1.7.0" + +[[deps.HDF5]] +deps = ["Compat", "HDF5_jll", "Libdl", "MPIPreferences", "Mmap", "Preferences", "Printf", "Random", "Requires", "UUIDs"] +git-tree-sha1 = "e856eef26cf5bf2b0f95f8f4fc37553c72c8641c" +uuid = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" +version = "0.17.2" +weakdeps = ["MPI"] + + [deps.HDF5.extensions] + MPIExt = "MPI" + +[[deps.HDF5_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"] +git-tree-sha1 = "38c8874692d48d5440d5752d6c74b0c6b0b60739" +uuid = "0234f1f7-429e-5d53-9886-15a909be8d59" +version = "1.14.2+1" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] +git-tree-sha1 = "55c53be97790242c29031e5cd45e8ac296dadda3" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "8.5.0+0" + +[[deps.HashArrayMappedTries]] +git-tree-sha1 = "2eaa69a7cab70a52b9687c8bf950a5a93ec895ae" +uuid = "076d061b-32b6-4027-95e0-9a2c6f6d7e74" +version = "0.2.0" + +[[deps.Hwloc_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f93a9ce66cd89c9ba7a4695a47fd93b4c6bc59fa" +uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" +version = "2.12.0+0" + +[[deps.HypergeometricFunctions]] +deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "2bd56245074fab4015b9174f24ceba8293209053" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.27" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.ImageAxes]] +deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] +git-tree-sha1 = "e12629406c6c4442539436581041d372d69c55ba" +uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" +version = "0.6.12" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.7" + +[[deps.ImageCore]] +deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] +git-tree-sha1 = "8c193230235bbcee22c8066b0374f63b5683c2d3" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.10.5" + +[[deps.ImageIO]] +deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs", "WebP"] +git-tree-sha1 = "696144904b76e1ca433b886b4e7edd067d76cbf7" +uuid = "82e4d734-157c-48bb-816b-45c225c6df19" +version = "0.6.9" + +[[deps.ImageMetadata]] +deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] +git-tree-sha1 = "2a81c3897be6fbcde0802a0ebe6796d0562f63ec" +uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" +version = "0.9.10" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "0936ba688c6d201805a83da835b55c61a180db52" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.1.11+0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.5" + +[[deps.InlineStrings]] +git-tree-sha1 = "6a9fde685a7ac1eb3495f8e812c5a7c3711c2d5e" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.4.3" + + [deps.InlineStrings.extensions] + ArrowTypesExt = "ArrowTypes" + ParsersExt = "Parsers" + + [deps.InlineStrings.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + Parsers = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" + +[[deps.Insolation]] +deps = ["Artifacts", "Dates", "DelimitedFiles", "Interpolations"] +git-tree-sha1 = "29e10cf6320739afe5a2b17e9c854a386fef7acc" +uuid = "e98cc03f-d57e-4e3c-b70c-8d51efe9e0d8" +version = "0.9.4" +weakdeps = ["ClimaParams"] + + [deps.Insolation.extensions] + CreateParametersExt = "ClimaParams" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "0f14a5456bdc6b9731a5682f439a672750a09e48" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2025.0.4+0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" + +[[deps.Interpolations]] +deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.15.1" +weakdeps = ["Unitful"] + + [deps.Interpolations.extensions] + InterpolationsUnitfulExt = "Unitful" + +[[deps.IntervalArithmetic]] +deps = ["CRlibm", "FastRounding", "LinearAlgebra", "Markdown", "Random", "RecipesBase", "RoundingEmulator", "SetRounding", "StaticArrays"] +git-tree-sha1 = "5ab7744289be503d76a944784bac3f2df7b809af" +uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" +version = "0.20.9" + +[[deps.IntervalSets]] +git-tree-sha1 = "dba9ddf07f77f60450fe5d2e2beb9854d9a49bd0" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.10" +weakdeps = ["Random", "RecipesBase", "Statistics"] + + [deps.IntervalSets.extensions] + IntervalSetsRandomExt = "Random" + IntervalSetsRecipesBaseExt = "RecipesBase" + IntervalSetsStatisticsExt = "Statistics" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" +weakdeps = ["Dates", "Test"] + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + +[[deps.InvertedIndices]] +git-tree-sha1 = "6da3c4316095de0f5ee2ebd875df8721e7e0bdbe" +uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" +version = "1.3.1" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "e2222959fbc6c19554dc15174c81bf7bf3aa691c" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.4" + +[[deps.Isoband]] +deps = ["isoband_jll"] +git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137" +uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4" +version = "0.1.1" + +[[deps.IterTools]] +git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.10.0" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JET]] +deps = ["CodeTracking", "InteractiveUtils", "JuliaInterpreter", "JuliaSyntax", "LoweredCodeUtils", "MacroTools", "Pkg", "PrecompileTools", "Preferences", "Test"] +git-tree-sha1 = "a453c9b3320dd73f5b05e8882446b6051cb254c4" +uuid = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" +version = "0.9.18" + + [deps.JET.extensions] + JETCthulhuExt = "Cthulhu" + JETReviseExt = "Revise" + + [deps.JET.weakdeps] + Cthulhu = "f68482b8-f384-11e8-15f7-abe071a5a75f" + Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" + +[[deps.JLD2]] +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "PrecompileTools", "Requires", "TranscodingStreams"] +git-tree-sha1 = "91d501cb908df6f134352ad73cde5efc50138279" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.5.11" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.7.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "fa6d0bcff8583bac20f1ffa708c3913ca605c611" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.5" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "eac1206917768cb54957c65a615460d87b455fc1" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.1.1+0" + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "4bf4b400a8234cff0f177da4a160a90296159ce9" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.9.41" + +[[deps.JuliaNVTXCallbacks_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "af433a10f3942e882d3c671aacb203e006a5808f" +uuid = "9c1d0b0a-7046-5b2e-a33f-ea22f176ac7e" +version = "0.2.1+0" + +[[deps.JuliaSyntax]] +git-tree-sha1 = "937da4713526b96ac9a178e2035019d3b78ead4a" +uuid = "70703baa-626e-46a2-a12c-08ffd08c73b4" +version = "0.4.10" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs"] +git-tree-sha1 = "80d268b2f4e396edc5ea004d1e0f569231c71e9e" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.9.34" +weakdeps = ["EnzymeCore", "LinearAlgebra", "SparseArrays"] + + [deps.KernelAbstractions.extensions] + EnzymeExt = "EnzymeCore" + LinearAlgebraExt = "LinearAlgebra" + SparseArraysExt = "SparseArrays" + +[[deps.KernelDensity]] +deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] +git-tree-sha1 = "7d703202e65efa1369de1279c162b915e245eed1" +uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" +version = "0.6.9" + +[[deps.Krylov]] +deps = ["LinearAlgebra", "Printf", "SparseArrays"] +git-tree-sha1 = "b29d37ce30fa401a4563b18880ab91f979a29734" +uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" +version = "0.9.10" + +[[deps.KrylovKit]] +deps = ["LinearAlgebra", "PackageExtensionCompat", "Printf", "Random", "VectorInterface"] +git-tree-sha1 = "d7ed24a88732689f26d3f12a817d181d4024bf44" +uuid = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" +version = "0.8.3" +weakdeps = ["ChainRulesCore"] + + [deps.KrylovKit.extensions] + KrylovKitChainRulesCoreExt = "ChainRulesCore" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.2+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "4.0.1+0" + +[[deps.LLVM]] +deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Unicode"] +git-tree-sha1 = "5fcfea6df2ff3e4da708a40c969c3812162346df" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "9.2.0" +weakdeps = ["BFloat16s"] + + [deps.LLVM.extensions] + BFloat16sExt = "BFloat16s" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "4b5ad6a4ffa91a00050a964492bc4f86bb48cea0" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.35+0" + +[[deps.LLVMLoopInfo]] +git-tree-sha1 = "2e5c102cfc41f48ae4740c7eca7743cc7e7b75ea" +uuid = "8b046642-f1f6-4319-8d3c-209ddc03c586" +version = "1.0.0" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "78211fb6cbc872f77cad3fc0b6cf647d923f4929" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "18.1.7+0" + +[[deps.LRUCache]] +git-tree-sha1 = "b3cc6698599b10e652832c2f23db3cab99d51b59" +uuid = "8ac3fa9e-de4c-5943-b1dc-09c6b5f20637" +version = "1.6.1" +weakdeps = ["Serialization"] + + [deps.LRUCache.extensions] + SerializationExt = ["Serialization"] + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1c602b1127f4751facb671441ca72715cc95938a" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.3+0" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.17" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" +version = "1.11.0" + +[[deps.LazyBroadcast]] +git-tree-sha1 = "6d2586dfde8b989198181fe21b8b6d0a42787ab8" +uuid = "9dccce8e-a116-406d-9fcc-a88ed4f510c8" +version = "1.0.0" + +[[deps.LazyModules]] +git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.6.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +version = "1.11.0" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.7.2+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "27ecae93dd25ee0909666e6835051dd684cc035e" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+2" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"] +git-tree-sha1 = "8be878062e0ffa2c3f67bb58a595375eda5de80b" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.11.0+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "ff3b4b9d35de638936a525ecd36e86a8bb919d11" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.7.0+0" + +[[deps.Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "df37206100d39f79b3376afb6b9cee4970041c61" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.51.1+0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.18.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "89211ea35d9df5831fca5d33552c02bd33878419" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.40.3+0" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "4ab7581296671007fc33f07a721631b8855f4b1d" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.7.1+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e888ad02ce716b319e6bdb985d2ef300e7089889" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.40.3+0" + +[[deps.LightXML]] +deps = ["Libdl", "XML2_jll"] +git-tree-sha1 = "3a994404d3f6709610701c7dabfc03fed87a81f8" +uuid = "9c8b4983-aa76-5018-a973-4c85ecc9e179" +version = "0.9.1" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.11.0" + +[[deps.LinearOperators]] +deps = ["FastClosures", "LinearAlgebra", "Printf", "Requires", "SparseArrays", "TimerOutputs"] +git-tree-sha1 = "f55281226cdae8edea2c850fda88d8f5a03485b6" +uuid = "5c8ed15e-5a4c-59e4-a42b-c7e8811fb125" +version = "2.9.0" + + [deps.LinearOperators.extensions] + LinearOperatorsCUDAExt = "CUDA" + LinearOperatorsChainRulesCoreExt = "ChainRulesCore" + LinearOperatorsLDLFactorizationsExt = "LDLFactorizations" + + [deps.LinearOperators.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + LDLFactorizations = "40e66cde-538c-5869-a4ad-c39174c6795b" + +[[deps.LittleCMS_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll"] +git-tree-sha1 = "fa7fd067dca76cadd880f1ca937b4f387975a9f5" +uuid = "d3a379c0-f9a3-5b72-a4c0-6bf4d2e8af0f" +version = "2.16.0+0" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.29" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +version = "1.11.0" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "f02b56007b064fbfddb4c9cd60161b6dd0f40df3" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.1.0" + +[[deps.LoweredCodeUtils]] +deps = ["JuliaInterpreter"] +git-tree-sha1 = "688d6d9e098109051ae33d126fcfc88c4ce4a021" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "3.1.0" + +[[deps.Lz4_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "191686b1ac1ea9c89fc52e996ad15d1d241d1e33" +uuid = "5ced341a-0733-55b8-9ab6-a4889d929147" +version = "1.10.1+0" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] +git-tree-sha1 = "5de60bc6cb3899cd318d80d627560fae2e2d99ae" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2025.0.1+1" + +[[deps.MLStyle]] +git-tree-sha1 = "bc38dff0548128765760c79eb7388a4b37fae2c8" +uuid = "d8e11817-5142-5d16-987a-aa16d5891078" +version = "0.4.17" + +[[deps.MPI]] +deps = ["Distributed", "DocStringExtensions", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "PkgVersion", "PrecompileTools", "Requires", "Serialization", "Sockets"] +git-tree-sha1 = "892676019c58f34e38743bc989b0eca5bce5edc5" +uuid = "da04e1cc-30fd-572f-bb4f-1f8673147195" +version = "0.20.22" + + [deps.MPI.extensions] + AMDGPUExt = "AMDGPU" + CUDAExt = "CUDA" + + [deps.MPI.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + +[[deps.MPICH_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "e7159031670cee777cc2840aef7a521c3603e36c" +uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" +version = "4.3.0+0" + +[[deps.MPIPreferences]] +deps = ["Libdl", "Preferences"] +git-tree-sha1 = "c105fe467859e7f6e9a852cb15cb4301126fac07" +uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" +version = "0.1.11" + +[[deps.MPItrampoline_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "97aac4a518b6f01851f8821272780e1ba56fe90d" +uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748" +version = "5.5.2+0" + +[[deps.MacroTools]] +git-tree-sha1 = "72aebe0b5051e5143a079a4685a46da330a40472" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.15" + +[[deps.Makie]] +deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "InverseFunctions", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"] +git-tree-sha1 = "be3051d08b78206fb5e688e8d70c9e84d0264117" +uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" +version = "0.21.18" + +[[deps.MakieCore]] +deps = ["ColorTypes", "GeometryBasics", "IntervalSets", "Observables"] +git-tree-sha1 = "9019b391d7d086e841cbeadc13511224bd029ab3" +uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b" +version = "0.8.12" + +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.MappedArrays]] +git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.2" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" + +[[deps.MathTeXEngine]] +deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"] +git-tree-sha1 = "f45c8916e8385976e1ccd055c9874560c257ab13" +uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" +version = "0.6.2" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.6+0" + +[[deps.MicrosoftMPI_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bc95bf4149bf535c09602e3acdf950d9b4376227" +uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf" +version = "10.1.4+3" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" +version = "1.11.0" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.4" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.12.12" + +[[deps.MuladdMacro]] +git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.4" + +[[deps.MultiBroadcastFusion]] +git-tree-sha1 = "4157ffb36526a275f644a3fbe378850e5eb1b470" +uuid = "c3c07f87-98de-43f2-a76f-835b330b2cbb" +version = "0.3.3" +weakdeps = ["Adapt", "CUDA"] + + [deps.MultiBroadcastFusion.extensions] + MultiBroadcastFusionCUDAExt = ["CUDA", "Adapt"] + +[[deps.NCDatasets]] +deps = ["CFTime", "CommonDataModel", "DataStructures", "Dates", "DiskArrays", "NetCDF_jll", "NetworkOptions", "Printf"] +git-tree-sha1 = "2c9dc92001ac06d432f363f37ff5552954d9947c" +uuid = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" +version = "0.14.6" + +[[deps.NVTX]] +deps = ["Colors", "JuliaNVTXCallbacks_jll", "Libdl", "NVTX_jll"] +git-tree-sha1 = "6a6f8bfaa91bb2e40ff562ab9f30dc827741daef" +uuid = "5da4648a-3479-48b8-97b9-01cb529c0a1f" +version = "0.3.5" + +[[deps.NVTX_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "2c7b791c1eba364e4a70aabdea4ddc1f5ca53911" +uuid = "e98f9f5b-d649-5603-91fd-7774390e6439" +version = "3.1.1+0" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "cc0a5deefdb12ab3a096f00a6d42133af4560d71" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.1.2" + +[[deps.NaNStatistics]] +deps = ["PrecompileTools", "Static", "StaticArrayInterface"] +git-tree-sha1 = "c1a9def67b8a871b51ccf84512f173e7979c186b" +uuid = "b946abbf-3ea7-4610-9019-9858bfdeaf2d" +version = "0.6.47" + +[[deps.NetCDF_jll]] +deps = ["Artifacts", "Blosc_jll", "Bzip2_jll", "HDF5_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "OpenMPI_jll", "XML2_jll", "Zlib_jll", "Zstd_jll", "libzip_jll"] +git-tree-sha1 = "a8af1798e4eb9ff768ce7fdefc0e957097793f15" +uuid = "7243133f-43d8-5620-bbf4-c2c921802cf3" +version = "400.902.209+0" + +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore", "ImageMetadata"] +git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.1.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.NullBroadcasts]] +git-tree-sha1 = "343c7bb67d0a29ea5d7d2b3e945afe81e2862337" +uuid = "0d71be07-595a-4f89-9529-4065a4ab43a6" +version = "0.1.0" + +[[deps.Observables]] +git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" +uuid = "510215fc-4207-5dde-b226-833fc4488ee2" +version = "0.5.5" + +[[deps.OffsetArrays]] +git-tree-sha1 = "5e1897147d1ff8d98883cda2be2187dcf57d8f0c" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.15.0" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[deps.OpenBLAS32_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ece4587683695fe4c5f20e990da0ed7e83c351e7" +uuid = "656ef2d0-ae68-5445-9ca0-591084a874a2" +version = "0.3.29+0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.27+1" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "97db9e07fe2091882c765380ef58ec553074e9c7" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.3" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "8292dd5c8a38257111ada2174000a33745b06d4e" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.2.4+0" + +[[deps.OpenJpeg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libtiff_jll", "LittleCMS_jll", "libpng_jll"] +git-tree-sha1 = "7dc7028a10d1408e9103c0a77da19fdedce4de6c" +uuid = "643b3616-a352-519d-856d-80112ee9badc" +version = "2.5.4+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+2" + +[[deps.OpenMPI_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML", "Zlib_jll"] +git-tree-sha1 = "6c1cf6181ffe0aa33eb33250ca2a60e54a15ea66" +uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" +version = "5.0.7+0" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a9697f1d06cc3eb3fb3ad49cc67f2cfabaac31ea" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.0.16+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.6+0" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.3+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "cc4054e898b852042d7b503313f7ad03de99c3dd" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.8.0" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "966b85253e959ea89c53a9abebbf2e964fbf593b" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.32" + +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "cf181f0b1e6a18dfeb0ee8acc4a9d1672499626c" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.4.4" + +[[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 = "bc5bf2ea3d5351edf285a06b0016788a121ce92c" +uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566" +version = "0.5.1" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.12" + +[[deps.Pango_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "3b31172c032a1def20c98dae3f2cdc9d10e3b561" +uuid = "36c8627f-9965-5494-a995-c6b170f724f3" +version = "1.56.1+0" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.1" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "35621f10a7531bc8fa58f74610b1bfb70a3cfc6b" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.43.4+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.11.0" +weakdeps = ["REPL"] + + [deps.Pkg.extensions] + REPLExt = "REPL" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.3" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] +git-tree-sha1 = "3ca9a356cd2e113c420f2c13bea19f8d3fb1cb18" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.3" + +[[deps.PoissonRandom]] +deps = ["Random"] +git-tree-sha1 = "a0f1159c33f846aa77c3f30ebbc69795e5327152" +uuid = "e409e4f3-bfea-5376-8464-e040bb5c01ab" +version = "0.4.4" + +[[deps.Polyester]] +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "6d38fea02d983051776a856b7df75b30cf9a3c1f" +uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" +version = "0.7.16" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.2.2" + +[[deps.PolygonOps]] +git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" +uuid = "647866c9-e3ac-4575-94e7-e3d426903924" +version = "0.1.2" + +[[deps.PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.3" + +[[deps.Poppler_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "JpegTurbo_jll", "LibCURL_jll", "Libdl", "Libtiff_jll", "OpenJpeg_jll", "libpng_jll"] +git-tree-sha1 = "7dbfb7f61c3aa5def7b7dad3fa344c1c2858a83b" +uuid = "9c32591e-4766-534b-9725-b71a8799265b" +version = "24.6.0+0" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "1101cd475833706e4d0e7b122218257178f48f34" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "2.4.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" + +[[deps.Profile]] +uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" +version = "1.11.0" + +[[deps.ProgressLogging]] +deps = ["Logging", "SHA", "UUIDs"] +git-tree-sha1 = "80d919dee55b9c50e8d9e2da5eeafff3fe58b539" +uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c" +version = "0.1.4" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "8f6bc219586aef8baf0ff9a5fe16ee9c70cb65e4" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.10.2" + +[[deps.PtrArrays]] +git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.3.0" + +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "8b3fc30bc0390abdce15f8822c889f669baed73d" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.11.2" + + [deps.QuadGK.extensions] + QuadGKEnzymeExt = "Enzyme" + + [deps.QuadGK.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "StyledStrings", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +version = "1.11.0" + +[[deps.RRTMGP]] +deps = ["Adapt", "Artifacts", "ClimaComms", "DocStringExtensions", "Random"] +git-tree-sha1 = "d258e9495bb6a1b7ad2b28683c9382c0053dafc1" +uuid = "a01a1ee8-cea4-48fc-987c-fc7878d79da1" +version = "0.20.1" +weakdeps = ["CUDA", "ClimaParams"] + + [deps.RRTMGP.extensions] + CreateParametersExt = "ClimaParams" + RRTMGPCUDAExt = "CUDA" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" + +[[deps.Random123]] +deps = ["Random", "RandomNumbers"] +git-tree-sha1 = "4743b43e5a9c4a2ede372de7061eed81795b12e7" +uuid = "74087812-796a-5b5d-8853-05524746bad3" +version = "1.7.0" + +[[deps.RandomNumbers]] +deps = ["Random"] +git-tree-sha1 = "c6ec94d2aaba1ab2ff983052cf6a606ca5985902" +uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" +version = "1.6.0" + +[[deps.RangeArrays]] +git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" +uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" +version = "0.3.2" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.5" +weakdeps = ["FixedPointNumbers"] + + [deps.Ratios.extensions] + RatiosFixedPointNumbersExt = "FixedPointNumbers" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecursiveArrayTools]] +deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"] +git-tree-sha1 = "fe9d37a17ab4d41a98951332ee8067f8dca8c4c2" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "3.29.0" + + [deps.RecursiveArrayTools.extensions] + RecursiveArrayToolsFastBroadcastExt = "FastBroadcast" + RecursiveArrayToolsForwardDiffExt = "ForwardDiff" + RecursiveArrayToolsMeasurementsExt = "Measurements" + RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements" + RecursiveArrayToolsReverseDiffExt = ["ReverseDiff", "Zygote"] + RecursiveArrayToolsSparseArraysExt = ["SparseArrays"] + RecursiveArrayToolsStructArraysExt = "StructArrays" + RecursiveArrayToolsTrackerExt = "Tracker" + RecursiveArrayToolsZygoteExt = "Zygote" + + [deps.RecursiveArrayTools.weakdeps] + FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "852bd0f55565a9e973fcfee83a84413270224dc4" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.8.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.5.1+0" + +[[deps.RootSolvers]] +deps = ["ForwardDiff", "Printf"] +git-tree-sha1 = "c30edf81d7c22e90a5f9f5489eded5984e4ddcf0" +uuid = "7181ea78-2dcb-4de3-ab41-2b8ab5a31e74" +version = "0.4.3" + +[[deps.RoundingEmulator]] +git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b" +uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705" +version = "0.2.1" + +[[deps.RuntimeGeneratedFunctions]] +deps = ["ExprTools", "SHA", "Serialization"] +git-tree-sha1 = "04c968137612c4a5629fa531334bb81ad5680f00" +uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" +version = "0.5.13" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMD]] +deps = ["PrecompileTools"] +git-tree-sha1 = "fea870727142270bdf7624ad675901a1ee3b4c87" +uuid = "fdea26ae-647d-5447-a871-4b548cad5224" +version = "3.7.1" + +[[deps.SIMDTypes]] +git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" +uuid = "94e857df-77ce-4151-89e5-788b33177be4" +version = "0.1.0" + +[[deps.SciMLBase]] +deps = ["ADTypes", "Accessors", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "Expronicon", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"] +git-tree-sha1 = "ffed2507209da5b42c6881944ef41a340ab5449b" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "2.74.1" + + [deps.SciMLBase.extensions] + SciMLBaseChainRulesCoreExt = "ChainRulesCore" + SciMLBaseMakieExt = "Makie" + SciMLBasePartialFunctionsExt = "PartialFunctions" + SciMLBasePyCallExt = "PyCall" + SciMLBasePythonCallExt = "PythonCall" + SciMLBaseRCallExt = "RCall" + SciMLBaseZygoteExt = "Zygote" + + [deps.SciMLBase.weakdeps] + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + PartialFunctions = "570af359-4316-4cb7-8c74-252c00c2016b" + PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" + PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" + RCall = "6f49c342-dc21-5d91-9882-a32aef131414" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.SciMLOperators]] +deps = ["Accessors", "ArrayInterface", "DocStringExtensions", "LinearAlgebra", "MacroTools"] +git-tree-sha1 = "6149620767866d4b0f0f7028639b6e661b6a1e44" +uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" +version = "0.3.12" +weakdeps = ["SparseArrays", "StaticArraysCore"] + + [deps.SciMLOperators.extensions] + SciMLOperatorsSparseArraysExt = "SparseArrays" + SciMLOperatorsStaticArraysCoreExt = "StaticArraysCore" + +[[deps.SciMLStructures]] +deps = ["ArrayInterface"] +git-tree-sha1 = "0444a37a25fab98adbd90baa806ee492a3af133a" +uuid = "53ae85a6-f571-4167-b2af-e1d143709226" +version = "1.6.1" + +[[deps.ScopedValues]] +deps = ["HashArrayMappedTries", "Logging"] +git-tree-sha1 = "1147f140b4c8ddab224c94efa9569fc23d63ab44" +uuid = "7e506255-f358-4e82-b7e4-beb19740aa63" +version = "1.3.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.2.1" + +[[deps.SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "712fb0231ee6f9120e005ccd56297abbc053e7e0" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.4.8" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" + +[[deps.SetRounding]] +git-tree-sha1 = "d7a25e439d07a17b7cdf97eecee504c50fedf5f6" +uuid = "3cc68bcd-71a2-5612-b932-767ffbe40ab0" +version = "0.2.1" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.1" + +[[deps.ShaderAbstractions]] +deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays", "StructArrays", "Tables"] +git-tree-sha1 = "79123bc60c5507f035e6d1d9e563bb2971954ec8" +uuid = "65257c39-d410-5151-9873-9b3e5be5013e" +version = "0.4.1" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" +version = "1.11.0" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SignedDistanceFields]] +deps = ["Random", "Statistics", "Test"] +git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9" +uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" +version = "0.4.0" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.3" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.11.0" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "64cca0c26b4f31ba18f13f6c12af7c85f478cfde" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.5.0" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.StableRNGs]] +deps = ["Random"] +git-tree-sha1 = "83e6cce8324d49dfaf9ef059227f91ed4441a8e5" +uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" +version = "1.0.2" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + +[[deps.Static]] +deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools"] +git-tree-sha1 = "87d51a3ee9a4b0d2fe054bdd3fc2436258db2603" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "1.1.1" + +[[deps.StaticArrayInterface]] +deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Static"] +git-tree-sha1 = "96381d50f1ce85f2663584c8e886a6ca97e60554" +uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" +version = "1.8.0" +weakdeps = ["OffsetArrays", "StaticArrays"] + + [deps.StaticArrayInterface.extensions] + StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" + StaticArrayInterfaceStaticArraysExt = "StaticArrays" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "e3be13f448a43610f978d29b7adf78c76022467a" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.12" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.3" + +[[deps.Statistics]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.0" + +[[deps.StatsBase]] +deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "29321314c920c26684834965ec2ce0dacc9cf8e5" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.4" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "b423576adc27097764a90e163157bcfc9acf0f46" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.3.2" +weakdeps = ["ChainRulesCore", "InverseFunctions"] + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + +[[deps.StrideArraysCore]] +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] +git-tree-sha1 = "f35f6ab602df8413a50c4a25ca14de821e8605fb" +uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" +version = "0.5.7" + +[[deps.StringEncodings]] +deps = ["Libiconv_jll"] +git-tree-sha1 = "b765e46ba27ecf6b44faf70df40c57aa3a547dcb" +uuid = "69024149-9ee7-55f6-a4c4-859efe599b68" +version = "0.3.7" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "725421ae8e530ec29bcbdddbe91ff8053421d023" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.4.1" + +[[deps.StructArrays]] +deps = ["ConstructionBase", "DataAPI", "Tables"] +git-tree-sha1 = "9537ef82c42cdd8c5d443cbc359110cbb36bae10" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.6.21" +weakdeps = ["Adapt", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "SparseArrays", "StaticArrays"] + + [deps.StructArrays.extensions] + StructArraysAdaptExt = "Adapt" + StructArraysGPUArraysCoreExt = ["GPUArraysCore", "KernelAbstractions"] + StructArraysLinearAlgebraExt = "LinearAlgebra" + StructArraysSparseArraysExt = "SparseArrays" + StructArraysStaticArraysExt = "StaticArrays" + +[[deps.StyledStrings]] +uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" +version = "1.11.0" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.7.0+0" + +[[deps.SurfaceFluxes]] +deps = ["DocStringExtensions", "RootSolvers", "Thermodynamics"] +git-tree-sha1 = "aee530bde85cd41374273568cb649e72d82921e7" +uuid = "49b00bb7-8bd4-4f2b-b78c-51cd0450215f" +version = "0.12.0" +weakdeps = ["ClimaParams"] + + [deps.SurfaceFluxes.extensions] + CreateParametersExt = "ClimaParams" + +[[deps.SymbolicIndexingInterface]] +deps = ["Accessors", "ArrayInterface", "RuntimeGeneratedFunctions", "StaticArraysCore"] +git-tree-sha1 = "fd2d4f0499f6bb4a0d9f5030f5c7d61eed385e03" +uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5" +version = "0.3.37" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "598cd7c1f68d1e205689b1c2fe65a9f85846f297" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.12.0" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TaylorSeries]] +deps = ["LinearAlgebra", "Markdown", "Requires", "SparseArrays"] +git-tree-sha1 = "ae73e40c647c0061697fa9708ee12cce385653e3" +uuid = "6aa5eb33-94cf-58f4-a9d0-e4b2c4fc25ea" +version = "0.18.3" +weakdeps = ["IntervalArithmetic", "JLD2", "RecursiveArrayTools", "StaticArrays"] + + [deps.TaylorSeries.extensions] + TaylorSeriesIAExt = "IntervalArithmetic" + TaylorSeriesJLD2Ext = "JLD2" + TaylorSeriesRATExt = "RecursiveArrayTools" + TaylorSeriesSAExt = "StaticArrays" + +[[deps.TempestRemap_jll]] +deps = ["Artifacts", "HDF5_jll", "JLLWrappers", "Libdl", "NetCDF_jll", "OpenBLAS32_jll"] +git-tree-sha1 = "723112218783928a20e0d865932694acfb7a7571" +uuid = "8573a8c5-1df0-515e-a024-abad257ee284" +version = "2.2.0+0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +version = "1.11.0" + +[[deps.TextWrap]] +git-tree-sha1 = "43044b737fa70bc12f6105061d3da38f881a3e3c" +uuid = "b718987f-49a8-5099-9789-dcd902bef87d" +version = "1.0.2" + +[[deps.Thermodynamics]] +deps = ["DocStringExtensions", "KernelAbstractions", "Random", "RootSolvers"] +git-tree-sha1 = "5de9f9f6019165cedb04e365a9f277a518ac5aaf" +uuid = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c" +version = "0.12.9" +weakdeps = ["ClimaParams"] + + [deps.Thermodynamics.extensions] + CreateParametersExt = "ClimaParams" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "eda08f7e9818eb53661b3deb74e3159460dfbc27" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.2" + +[[deps.TiffImages]] +deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "SIMD", "UUIDs"] +git-tree-sha1 = "f21231b166166bebc73b99cea236071eb047525b" +uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" +version = "0.11.3" + +[[deps.TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "3832505b94c1868baea47764127e6d36b5c9f29e" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.27" + + [deps.TimerOutputs.extensions] + FlameGraphsExt = "FlameGraphs" + + [deps.TimerOutputs.weakdeps] + FlameGraphs = "08572546-2f56-4bcf-ba4e-bab62c3a3f89" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.TriplotBase]] +git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" +uuid = "981d1d27-644d-49a2-9326-4793e63143c3" +version = "0.1.0" + +[[deps.TruncatedStacktraces]] +deps = ["InteractiveUtils", "MacroTools", "Preferences"] +git-tree-sha1 = "ea3e54c2bdde39062abf5a9758a23735558705e1" +uuid = "781d530d-4396-4725-bb49-402e4bee1e77" +version = "1.4.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "c0667a8e676c53d390a09dc6870b3d8d6650e2bf" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.22.0" +weakdeps = ["ConstructionBase", "InverseFunctions"] + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + InverseFunctionsUnitfulExt = "InverseFunctions" + +[[deps.Unrolled]] +deps = ["MacroTools"] +git-tree-sha1 = "6cc9d682755680e0f0be87c56392b7651efc2c7b" +uuid = "9602ed7d-8fef-5bc8-8597-8f21381861e8" +version = "0.1.5" + +[[deps.UnrolledUtilities]] +git-tree-sha1 = "5caf11dfadeee25daafa7caabb3f252a977ffe72" +uuid = "0fe1646c-419e-43be-ac14-22321958931b" +version = "0.1.6" +weakdeps = ["StaticArrays"] + + [deps.UnrolledUtilities.extensions] + UnrolledUtilitiesStaticArraysExt = "StaticArrays" + +[[deps.UnsafeAtomics]] +git-tree-sha1 = "b13c4edda90890e5b04ba24e20a310fbe6f249ff" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.3.0" +weakdeps = ["LLVM"] + + [deps.UnsafeAtomics.extensions] + UnsafeAtomicsLLVM = ["LLVM"] + +[[deps.VTKBase]] +git-tree-sha1 = "c2d0db3ef09f1942d08ea455a9e252594be5f3b6" +uuid = "4004b06d-e244-455f-a6ce-a5f9919cc534" +version = "1.0.1" + +[[deps.VectorInterface]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "cea8abaa6e43f72f97a09cf95b80c9eb53ff75cf" +uuid = "409d34a3-91d5-4945-b6ec-7529ddf182d8" +version = "0.4.9" + +[[deps.WebP]] +deps = ["CEnum", "ColorTypes", "FileIO", "FixedPointNumbers", "ImageCore", "libwebp_jll"] +git-tree-sha1 = "aa1ca3c47f119fbdae8770c29820e5e6119b83f2" +uuid = "e3aaa7dc-3e4b-44e0-be63-ffb868ccd7c1" +version = "0.1.3" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "1.0.0" + +[[deps.WriteVTK]] +deps = ["Base64", "CodecZlib", "FillArrays", "LightXML", "TranscodingStreams", "VTKBase"] +git-tree-sha1 = "1d8042d58334ab7947ce505709df7009da6f3375" +uuid = "64499a7a-5c06-52f2-abe2-ccb03c286192" +version = "1.21.1" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "ee6f41aac16f6c9a8cab34e2f7a200418b1cc1e3" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.13.6+0" + +[[deps.XSLT_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "XML2_jll", "Zlib_jll"] +git-tree-sha1 = "7d1671acbe47ac88e981868a078bd6b4e27c5191" +uuid = "aed1982a-8fda-507f-9586-7b0439959a61" +version = "1.1.42+0" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "56c6604ec8b2d82cc4cfe01aa03b00426aac7e1f" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.6.4+1" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "9dafcee1d24c4f024e7edc92603cedba72118283" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.6+3" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e9216fdcd8514b7072b43653874fd688e4c6c003" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.12+0" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "89799ae67c17caa5b3b5a19b8469eeee474377db" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.5+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "d7155fea91a4123ef59f42c4afb5ab3b4ca95058" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.6+3" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "a490c6212a0e90d2d55111ac956f7c4fa9c277a6" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.11+1" + +[[deps.Xorg_libpthread_stubs_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c57201109a9e4c0585b208bb408bc41d205ac4e9" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.2+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "1a74296303b6524a0472a8cb12d3d87a78eb3612" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.17.0+3" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6dba04dbfb72ae3ebe5418ba33d087ba8aa8cb00" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.5.1+0" + +[[deps.YAML]] +deps = ["Base64", "Dates", "Printf", "StringEncodings"] +git-tree-sha1 = "dea63ff72079443240fbd013ba006bcbc8a9ac00" +uuid = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" +version = "0.4.12" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "622cf78670d067c738667aaa96c553430b65e269" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.7+0" + +[[deps.demumble_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6498e3581023f8e530f34760d18f75a69e3a4ea8" +uuid = "1e29f10c-031c-5a83-9565-69cddfc27673" +version = "1.3.0+0" + +[[deps.isoband_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c" +uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4" +version = "0.2.3+0" + +[[deps.libaec_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f5733a5a9047722470b95a81e1b172383971105c" +uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0" +version = "1.1.3+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "522c1df09d05a71785765d19c9524661234738e9" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.11.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.2+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.11.0+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.3+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "055a96774f383318750a1a5e10fd4151f04c29c5" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.46+0" + +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "libpng_jll"] +git-tree-sha1 = "c1733e347283df07689d71d61e14be986e49e47a" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.10.5+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+2" + +[[deps.libwebp_jll]] +deps = ["Artifacts", "Giflib_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libglvnd_jll", "Libtiff_jll", "libpng_jll"] +git-tree-sha1 = "d2408cac540942921e7bd77272c32e58c33d8a77" +uuid = "c5f90fcd-3b7e-5836-afba-fc50a0988cb2" +version = "1.5.0+0" + +[[deps.libzip_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "OpenSSL_jll", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "86addc139bca85fdf9e7741e10977c45785727b7" +uuid = "337d8026-41b4-5cde-a456-74a10e5b31d1" +version = "1.11.3+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.59.0+0" + +[[deps.oneTBB_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d5a767a3bb77135a99e433afe0eb14cd7f6914c3" +uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" +version = "2022.0.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "14cc7083fc6dff3cc44f2bc435ee96d06ed79aa7" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "10164.0.1+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "dcc541bb19ed5b0ede95581fb2e41ecf179527d2" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.6.0+0" diff --git a/post_processing/jacobian_plots.jl b/post_processing/jacobian_plots.jl new file mode 100644 index 0000000000..7aed4c4588 --- /dev/null +++ b/post_processing/jacobian_plots.jl @@ -0,0 +1,374 @@ +import ClimaComms +import ClimaCore.InputOutput: HDF5Reader +import LinearAlgebra: diag + +function make_jacobian_plots(output_path, Yₜ_end, dt) + context = ClimaComms.context(Yₜ_end.c) + file_paths = filter(endswith(".hdf5"), readdir(output_path; join = true)) + for file_path in file_paths + file_name = split(basename(file_path), '.')[1] + contains(file_name, "jacobian") || continue + time_series = read_time_series(file_path, context) + plot_jacobian(output_path, time_series, file_name, Yₜ_end, dt) + if startswith(file_name, "approx_jacobian") + exact_file_path = joinpath( + output_path, + replace(basename(file_path), "approx" => "exact"), + ) + if exact_file_path in file_paths + exact_time_series = read_time_series(exact_file_path, context) + error_time_series = map( + time_series, + exact_time_series, + ) do approx_data, exact_data + (t, approx_title, approx_∂Yₜ_∂Y, approx_rescaled_∂Yₜ_∂Y, Yₜ) = approx_data + (_, _, exact_∂Yₜ_∂Y, exact_rescaled_∂Yₜ_∂Y, _) = + exact_data + @assert exact_data[1] == t + @assert exact_data[5] == Yₜ + error_title = "Error of $approx_title" + error_∂Yₜ_∂Y = approx_∂Yₜ_∂Y .- exact_∂Yₜ_∂Y + error_rescaled_∂Yₜ_∂Y = + approx_rescaled_∂Yₜ_∂Y .- exact_rescaled_∂Yₜ_∂Y + (t, error_title, error_∂Yₜ_∂Y, error_rescaled_∂Yₜ_∂Y, Yₜ) + end + error_file_name = + replace(file_name, "jacobian" => "jacobian_error") + plot_jacobian( + output_path, + error_time_series, + error_file_name, + Yₜ_end, + dt, + ) + end + end + end +end + +function read_time_series(file_path, context) + time_series = nothing + HDF5Reader(file_path, context) do reader + t_strings = + sort(keys(reader.file); by = t_string -> parse(Float64, t_string)) + time_series = map(t_strings) do t_string + data_at_t = reader.file[t_string] + title = data_at_t["title"][] + ∂Yₜ_∂Y = data_at_t["∂Yₜ_∂Y"][] + Yₜ = data_at_t["Yₜ"][] + + safe_inv(x) = iszero(x) || issubnormal(x) ? zero(x) : inv(x) + rescaled_∂Yₜ_∂Y = safe_inv.(Yₜ) .* ∂Yₜ_∂Y .* Yₜ' + + # Take the transpose of each matrix so that its rows are plotted + # along the y-axis and its columns are plotted along the x-axis. + (parse(Float64, t_string), title, ∂Yₜ_∂Y', rescaled_∂Yₜ_∂Y', Yₜ) + end + end + return time_series +end + +function plot_jacobian(output_path, time_series, file_name, Yₜ_end, dt) + times = getindex.(time_series, 1) + titles = getindex.(time_series, 2) + ∂Yₜ_∂Ys = getindex.(time_series, 3) + rescaled_∂Yₜ_∂Ys = getindex.(time_series, 4) + Yₜs = getindex.(time_series, 5) + FT = eltype(Yₜ_end) + + field_names = collect(CA.scalar_field_names(Yₜ_end)) + tick_labels = map(field_names) do field_name + replace( + string(field_name), + "@name(" => "", + ".components.data" => "", + ":(" => "", + ')' => "", + ) + end + + index_ranges = collect(CA.scalar_field_index_ranges(Yₜ_end)) + first_tick_positions = first.(index_ranges) + last_tick_positions = last.(index_ranges) + center_tick_positions = (first_tick_positions .+ last_tick_positions) ./ 2 + boundary_tick_positions = [FT(0.5), (last_tick_positions .+ FT(0.5))...] + limit_padding = length(index_ranges[1]) / 20 + limit_positions = + extrema(boundary_tick_positions) .+ (-limit_padding, limit_padding) + + sign_or_nan(x) = iszero(x) ? FT(NaN) : sign(x) + logabs_or_nan(x) = iszero(x) ? FT(NaN) : log10(abs(x)) + function block_bandwidth(block) + band_indices = (1 - size(block, 1)):(size(block, 2) - 1) + nonempty_band_indices = filter(band_indices) do band_index + any(!iszero, diag(block, band_index)) + end + main_diagonal_index = (band_indices[1] + band_indices[end]) / 2 + return maximum(nonempty_band_indices; init = 0) do band_index + 2 * abs(band_index - main_diagonal_index) + 1 + end + end + + entry_sign_transform(matrix) = sign_or_nan.(matrix) + entry_logabs_transform(matrix) = logabs_or_nan.(matrix) + function block_logabs_transform(matrix) + block_max_matrix = similar(matrix) + for row_index_range in index_ranges, col_index_range in index_ranges + block_max_matrix[row_index_range, col_index_range] .= + CA.smooth_maximum(matrix[row_index_range, col_index_range]) + end + return entry_logabs_transform(block_max_matrix) + end + function block_row_logabs_transform(matrix) + row_max_matrix = similar(matrix) + for row_index_range in index_ranges, col in axes(matrix, 1) + row_max_matrix[row_index_range, col] .= + CA.smooth_maximum(matrix[row_index_range, col]) + end + return entry_logabs_transform(row_max_matrix) + end + function block_bandwidth_transform(matrix) + block_bandwidth_matrix = similar(matrix, Int) + for row_index_range in index_ranges, col_index_range in index_ranges + block_bandwidth_matrix[row_index_range, col_index_range] .= + block_bandwidth(matrix[row_index_range, col_index_range]) + end + return block_bandwidth_matrix + end + + bandwidth_matrices = map(block_bandwidth_transform, ∂Yₜ_∂Ys) + max_bandwidth = maximum(maximum, bandwidth_matrices) + sign_matrices = map(entry_sign_transform, ∂Yₜ_∂Ys) + + categorical(colormap, n) = CairoMakie.cgrad(colormap, n; categorical = true) + main_colormap = categorical(:tol_iridescent, 21) + bandwidth_colors = [CairoMakie.RGB(1, 1, 1), main_colormap[1:(end - 1)]...] + bandwidth_colormap = + categorical(bandwidth_colors, min(max_bandwidth, 9) + 1) + sign_colormap = categorical(:RdBu_5, 2) + rescaling_colors = + setindex!(CairoMakie.to_colormap(:RdBu_11), CairoMakie.RGB(1, 1, 1), 6) + rescaling_colormap = categorical(rescaling_colors, 21) + + value_for_min(x) = isnan(x) ? FT(Inf) : x + value_for_max(x) = isnan(x) ? FT(-Inf) : x + + abs_Yₜs = map(Yₜs) do Yₜ + @. ifelse(iszero(Yₜ) || issubnormal(Yₜ), FT(NaN), abs(Yₜ)) + end + if all(abs_Yₜ -> all(isnan, abs_Yₜ), abs_Yₜs) + min_abs_Yₜ = FT(1e-9) + max_abs_Yₜ = FT(1) + else + min_abs_Yₜ = minimum(abs_Yₜ -> minimum(value_for_min, abs_Yₜ), abs_Yₜs) + max_abs_Yₜ = maximum(abs_Yₜ -> maximum(value_for_max, abs_Yₜ), abs_Yₜs) + end + + figure_kwargs = (; + size = (2.2, cld(length(times), 2)) .* 5000, + figure_padding = 300, + fontsize = 150, + ) + colorbar_kwargs = (; + size = 150, + labelpadding = 60, + ticklabelpad = 50, + ticksize = 50, + tickwidth = 10, + spinewidth = 10, + ) + axis_kwargs = (; + titlegap = 100, + xlabelpadding = 60, + ylabelpadding = 60, + xticks = (center_tick_positions, tick_labels), + xticksvisible = false, + xticklabelrotation = pi / 4, + xticklabelpad = 50, + yticklabelpad = 80, + xminorticks = boundary_tick_positions, + xminorticksvisible = true, + xminorticksize = 50, + yminorticksize = 50, + xminortickwidth = 10, + yminortickwidth = 10, + xgridvisible = false, + xminorgridvisible = true, + xminorgridwidth = 10, + yminorgridwidth = 10, + spinewidth = 10, + ) + ∂Yₜ_∂Y_axis_kwargs = (; + axis_kwargs..., + limits = (limit_positions, limit_positions), + xlabel = "Y index", + ylabel = "Yₜ index", + yreversed = true, + yticks = (center_tick_positions, tick_labels), + yticksvisible = false, + yminorticks = boundary_tick_positions, + yminorticksvisible = true, + ygridvisible = false, + yminorgridvisible = true, + ) # Flip the y-axis so that the diagonal runs from top-left to bottom-right. + Yₜ_axis_kwargs = (; + axis_kwargs..., + limits = (limit_positions, (min_abs_Yₜ / 2, max_abs_Yₜ * 2)), + xlabel = "Yₜ index", + ylabel = "Yₜ magnitude", + yscale = log10, + yticksize = 50, + ) + + page_file_paths = map(n -> joinpath(output_path, "$file_name $n.pdf"), 1:6) + full_file_path = joinpath(output_path, "$file_name.pdf") + + figure = CairoMakie.Figure(; figure_kwargs...) + for (t_index, (t, title, bandwidth_matrix, sign_matrix)) in + enumerate(zip(times, titles, bandwidth_matrices, sign_matrices)) + grid_position = figure[cld(t_index, 2), (t_index - 1) % 2 + 1] + grid_layout = CairoMakie.GridLayout(grid_position) + axis = CairoMakie.Axis(grid_layout[1, 1]; title, ∂Yₜ_∂Y_axis_kwargs...) + bandwidth_plot = CairoMakie.heatmap!( + axis, + boundary_tick_positions, + boundary_tick_positions, + bandwidth_matrix[first_tick_positions, first_tick_positions]; + colormap = bandwidth_colormap, + colorrange = (-0.5, min(max_bandwidth, 9) + 0.5), + (max_bandwidth > 9 ? (; highclip = :black) : (;))..., + ) + CairoMakie.translate!(bandwidth_plot, 0, 0, -100) # Put plot under grid. + sign_plot = CairoMakie.heatmap!( + axis, + sign_matrix; + colormap = sign_colormap, + colorrange = (-1, 1), + ) + grid_sublayout = CairoMakie.GridLayout(grid_layout[1, 2]) + CairoMakie.Colorbar( + grid_sublayout[1, 1], + bandwidth_plot; + label = "Bandwidth of matrix block", + colorbar_kwargs..., + (max_bandwidth < 4 ? (; ticks = [(0:max_bandwidth)...]) : (;))..., + ) + CairoMakie.Colorbar( + grid_sublayout[2, 1], + sign_plot; + label = "Sign of matrix entry", + ticks = ([-0.5, 0.5], Makie.latexstring.(["-", "+"])), + colorbar_kwargs..., + labelpadding = 27, + ) + CairoMakie.colgap!(grid_layout, CairoMakie.Relative(0.05)) + CairoMakie.rowgap!(grid_sublayout, CairoMakie.Relative(0.05)) + end + CairoMakie.colsize!(figure.layout, 1, CairoMakie.Aspect(1, 1)) + CairoMakie.colsize!(figure.layout, 2, CairoMakie.Aspect(1, 1)) + CairoMakie.colgap!(figure.layout, CairoMakie.Relative(0.08)) + CairoMakie.rowgap!(figure.layout, CairoMakie.Relative(0.05)) + CairoMakie.save(page_file_paths[1], figure) + + for (page_index, (is_rescaled, transform, transform_string)) in enumerate(( + (true, block_logabs_transform, "block"), + (true, block_row_logabs_transform, "block row"), + (true, entry_logabs_transform, "entry"), + (false, entry_logabs_transform, "entry"), + )) + matrices = map(transform, is_rescaled ? rescaled_∂Yₜ_∂Ys : ∂Yₜ_∂Ys) + max_logabs = + all(matrix -> all(isnan, matrix), matrices) ? FT(0) : + maximum(matrix -> maximum(value_for_max, matrix), matrices) + if is_rescaled + dt_tick_value = log10(1 / dt) + min_logabs = min(max_logabs - 9, dt_tick_value - FT(0.5)) + else + min_logabs = max_logabs - 19 + end + colorbar_range = (min_logabs, max_logabs) + wilkinson_kwargs = (; k_min = 4, k_max = 6, niceness_weight = 1) + colorbar_ticks = Makie.WilkinsonTicks(5; wilkinson_kwargs...) + colorbar_tick_values = + Makie.get_tickvalues(colorbar_ticks, colorbar_range...) + colorbar_tick_labels = map(colorbar_tick_values) do tick_value + Makie.latexstring("10^{$(round(Int, tick_value))}") + end + if is_rescaled + dt_tick_label = Makie.latexstring("\\mathbf{Δt^{-1}}") + min_tick_value_distance, colorbar_tick_index = + findmin(colorbar_tick_values) do colorbar_tick_value + abs(colorbar_tick_value - dt_tick_value) + end + if min_tick_value_distance < 0.5 + colorbar_tick_values[colorbar_tick_index] = dt_tick_value + colorbar_tick_labels[colorbar_tick_index] = dt_tick_label + else + push!(colorbar_tick_values, dt_tick_value) + push!(colorbar_tick_labels, dt_tick_label) + end + end + figure = CairoMakie.Figure(; figure_kwargs...) + for (t_index, (t, title, matrix)) in + enumerate(zip(times, titles, matrices)) + grid_position = figure[cld(t_index, 2), (t_index - 1) % 2 + 1] + grid_layout = CairoMakie.GridLayout(grid_position) + axis = + CairoMakie.Axis(grid_layout[1, 1]; title, ∂Yₜ_∂Y_axis_kwargs...) + plot_args = if transform == block_logabs_transform + submatrix = matrix[first_tick_positions, first_tick_positions] + (boundary_tick_positions, boundary_tick_positions, submatrix) + elseif transform == block_row_logabs_transform + submatrix = matrix[first_tick_positions, :] + (boundary_tick_positions, 1:last_tick_positions[end], submatrix) + else + (matrix,) + end + plot = CairoMakie.heatmap!( + axis, + plot_args...; + colormap = main_colormap, + colorrange = colorbar_range, + lowclip = main_colormap[1], + ) # Only color in the top 9 orders of magnitude. + CairoMakie.translate!(plot, 0, 0, -100) # Put plot under grid. + label = "Magnitude of$(is_rescaled ? " rescaled" : "") \ + $(transform_string != "entry" ? "max of " : "")matrix \ + $transform_string$(is_rescaled ? " [s⁻¹]" : "")" + CairoMakie.Colorbar( + grid_layout[1, 2], + plot; + label, + ticks = (colorbar_tick_values, colorbar_tick_labels), + colorbar_kwargs..., + ) + CairoMakie.colgap!(grid_layout, CairoMakie.Relative(0.05)) + end + CairoMakie.colsize!(figure.layout, 1, CairoMakie.Aspect(1, 1)) + CairoMakie.colsize!(figure.layout, 2, CairoMakie.Aspect(1, 1)) + CairoMakie.colgap!(figure.layout, CairoMakie.Relative(0.08)) + CairoMakie.rowgap!(figure.layout, CairoMakie.Relative(0.05)) + CairoMakie.save(page_file_paths[page_index + 1], figure) + end + + figure = CairoMakie.Figure(; figure_kwargs...) + for (t_index, (t, title, abs_Yₜ)) in enumerate(zip(times, titles, abs_Yₜs)) + grid_position = figure[cld(t_index, 2), (t_index - 1) % 2 + 1] + Yₜ_title = "Yₜ, avg over all columns," * split(title, ',')[end] + axis = + CairoMakie.Axis(grid_position; title = Yₜ_title, Yₜ_axis_kwargs...) + CairoMakie.lines!(axis, axes(abs_Yₜ, 1), abs_Yₜ; linewidth = 10) + end + CairoMakie.colsize!(figure.layout, 1, CairoMakie.Aspect(1, 1)) + CairoMakie.colsize!(figure.layout, 2, CairoMakie.Aspect(1, 1)) + CairoMakie.colgap!(figure.layout, CairoMakie.Relative(0.12)) + CairoMakie.rowgap!(figure.layout, CairoMakie.Relative(0.05)) + CairoMakie.save(page_file_paths[end], figure) + + pdfunite() do unite + run(Cmd([unite, page_file_paths..., full_file_path])) + end + for page_file_path in page_file_paths + Filesystem.rm(page_file_path; force = true) + end +end diff --git a/src/ClimaAtmos.jl b/src/ClimaAtmos.jl index 749be06168..b7653264a0 100644 --- a/src/ClimaAtmos.jl +++ b/src/ClimaAtmos.jl @@ -2,6 +2,7 @@ module ClimaAtmos using NVTX import Adapt +import LinearAlgebra import NullBroadcasts: NullBroadcasted import LazyBroadcast import LazyBroadcast: lazy @@ -56,6 +57,10 @@ include(joinpath("prognostic_equations", "zero_velocity.jl")) include(joinpath("prognostic_equations", "implicit", "implicit_tendency.jl")) include(joinpath("prognostic_equations", "implicit", "implicit_solver.jl")) +include(joinpath("prognostic_equations", "implicit", "approx_jacobian.jl")) +include(joinpath("prognostic_equations", "implicit", "exact_jacobian.jl")) +include(joinpath("prognostic_equations", "implicit", "debug_jacobian.jl")) +include(joinpath("prognostic_equations", "implicit", "dual_fixes.jl")) include(joinpath("prognostic_equations", "water_advection.jl")) include(joinpath("prognostic_equations", "remaining_tendency.jl")) diff --git a/src/callbacks/callbacks.jl b/src/callbacks/callbacks.jl index 8109aee2a9..30a335c475 100644 --- a/src/callbacks/callbacks.jl +++ b/src/callbacks/callbacks.jl @@ -554,6 +554,56 @@ function gc_func(integrator) return nothing end +# TODO: Move these functions to ClimaTimeSteppers.jl +is_implicit_timestepper(integrator) = + integrator.alg isa CTS.RosenbrockAlgorithm || ( + integrator.alg.name isa CTS.IMEXARKAlgorithmName && + !isnothing(integrator.cache.newtons_method_cache) + ) +jacobian(integrator) = + if integrator.alg isa CTS.RosenbrockAlgorithm + integrator.cache.W + elseif ( + integrator.alg.name isa CTS.IMEXARKAlgorithmName && + !isnothing(integrator.cache.newtons_method_cache) + ) + integrator.cache.newtons_method_cache.j + else + error("Jacobian is not available") + end +function dtγ(integrator) + is_implicit_timestepper(integrator) || error("dtγ is not available") + (; dt, alg) = integrator + tableau_coefficients = + alg isa CTS.RosenbrockAlgorithm ? alg.tableau.Γ : alg.tableau.a_imp + γs = unique(filter(!iszero, LinearAlgebra.diag(tableau_coefficients))) + length(γs) == 1 || error( + "The exact Jacobian must be updated on every Newton iteration, rather \ + than on every timestep (or every N steps), because the specified IMEX \ + algorithm has implicit stages with distinct tableau coefficients \ + (i.e., it is not an SDIRK algorithm).", + ) + return float(dt) * γs[1] +end + +function update_jacobian!(integrator) + is_implicit_timestepper(integrator) || return # TODO: Remove this check. + (; u, p, t) = integrator + update_jacobian!(jacobian(integrator), u, p, dtγ(integrator), t) +end + +function update_and_check_jacobian!(integrator) + is_implicit_timestepper(integrator) || return # TODO: Remove this check. + (; u, p, t) = integrator + update_and_check_jacobian!(jacobian(integrator), u, p, dtγ(integrator), t) +end + +function save_jacobian!(integrator) + is_implicit_timestepper(integrator) || return # TODO: Remove this check. + (; u, p, t) = integrator + save_jacobian!(jacobian(integrator), u, p, dtγ(integrator), t) +end + """ maybe_graceful_exit(integrator) diff --git a/src/callbacks/get_callbacks.jl b/src/callbacks/get_callbacks.jl index e389b8e2cd..1a5a411e37 100644 --- a/src/callbacks/get_callbacks.jl +++ b/src/callbacks/get_callbacks.jl @@ -188,7 +188,6 @@ function get_diagnostics(parsed_args, atmos_model, Y, p, sim_info, output_dir) diagnostics..., ] end - diagnostics = collect(diagnostics) periods_reductions = Set() for diag in diagnostics @@ -381,5 +380,48 @@ function get_callbacks(config, sim_info, atmos, params, Y, p) callbacks = (callbacks..., call_every_dt(nogw_model_callback!, dt_nogw)) end + use_exact_jacobian = parsed_args["use_exact_jacobian"] + debug_approximate_jacobian = parsed_args["debug_approximate_jacobian"] + need_to_update_exact_jacobian_in_callback = + ( + (debug_approximate_jacobian && !use_exact_jacobian) && + isnothing(parsed_args["dt_update_exact_jacobian"]) + ) || ( + (debug_approximate_jacobian || use_exact_jacobian) && + !isnothing(parsed_args["dt_update_exact_jacobian"]) && + time_to_seconds(parsed_args["dt_update_exact_jacobian"]) >= + time_to_seconds(parsed_args["dt"]) + ) + need_to_save_jacobian = + isnothing(parsed_args["plot_jacobian"]) ? debug_approximate_jacobian : + parsed_args["plot_jacobian"] + dt_save_jacobian = if isnothing(parsed_args["dt_save_jacobian"]) + (t_end - t_start) ÷ 5 + else + dt isa ITime ? + ITime(time_to_seconds(parsed_args["dt_save_jacobian"])) : + FT(time_to_seconds(parsed_args["dt_save_jacobian"])) + end + dt_update_jacobian = if isnothing(parsed_args["dt_update_exact_jacobian"]) + dt_save_jacobian + else + dt isa ITime ? + ITime(time_to_seconds(parsed_args["dt_update_exact_jacobian"])) : + FT(time_to_seconds(parsed_args["dt_update_exact_jacobian"])) + end + if need_to_update_exact_jacobian_in_callback + update_jacobian_in_callback! = + debug_approximate_jacobian ? update_and_check_jacobian! : + update_jacobian! + callbacks = ( + callbacks..., + call_every_dt(update_jacobian_in_callback!, dt_update_jacobian), + ) + end + if need_to_save_jacobian + callbacks = + (callbacks..., call_every_dt(save_jacobian!, dt_save_jacobian)) + end + return callbacks end diff --git a/src/prognostic_equations/edmfx_closures.jl b/src/prognostic_equations/edmfx_closures.jl index 6b4c1421f3..5ef1212358 100644 --- a/src/prognostic_equations/edmfx_closures.jl +++ b/src/prognostic_equations/edmfx_closures.jl @@ -225,7 +225,7 @@ function mixing_length( l_smin = lamb_smooth_minimum(l, smin_ub, smin_rm) l_limited = max(l_smag, min(l_smin, l_z)) - return MixingLength{FT}(l_limited, l_W, l_TKE, l_N) + return MixingLength(l_limited, l_W, l_TKE, l_N) end """ diff --git a/src/prognostic_equations/gm_sgs_closures.jl b/src/prognostic_equations/gm_sgs_closures.jl index d1cecfcf74..30105cf122 100644 --- a/src/prognostic_equations/gm_sgs_closures.jl +++ b/src/prognostic_equations/gm_sgs_closures.jl @@ -19,7 +19,7 @@ function smagorinsky_lilly_length(c_smag, N_eff, dz, Pr, ϵ_st) return N_eff > FT(0) ? c_smag * dz * - max(0, 1 - N_eff^2 / Pr / 2 / max(ϵ_st, eps(FT)))^(1 / 4) : + max(0, 1 - N_eff^2 / Pr / 2 / max(ϵ_st, eps(FT)))^(1 / FT(4)) : c_smag * dz end diff --git a/src/prognostic_equations/implicit/approx_jacobian.jl b/src/prognostic_equations/implicit/approx_jacobian.jl new file mode 100644 index 0000000000..a92785af8c --- /dev/null +++ b/src/prognostic_equations/implicit/approx_jacobian.jl @@ -0,0 +1,1422 @@ +using ClimaCore.MatrixFields +import LinearAlgebra: I, Adjoint + +abstract type DerivativeFlag end +struct UseDerivative <: DerivativeFlag end +struct IgnoreDerivative <: DerivativeFlag end + +DerivativeFlag(value) = value ? UseDerivative() : IgnoreDerivative() +DerivativeFlag(mode::AbstractTimesteppingMode) = + DerivativeFlag(mode == Implicit()) + +use_derivative(::UseDerivative) = true +use_derivative(::IgnoreDerivative) = false + +""" + ApproxJacobian( + topography_flag, + diffusion_flag, + sgs_advection_flag, + sgs_entr_detr_flag, + sgs_mass_flux_flag, + sgs_nh_pressure_flag, + approximate_solve_iters, + ) + +A `JacobianAlgorithm` that approximates the `ImplicitEquationJacobian` using +analytically derived tendency derivatives and inverts it using a specialized +nested linear solver. Certain groups of derivatives can be toggled on or off by +setting their `DerivativeFlag`s to either `UseDerivative` or `IgnoreDerivative`. + +# Arguments + +- `topography_flag::DerivativeFlag`: whether the derivative of vertical + contravariant velocity with respect to horizontal covariant velocity should be + computed +- `diffusion_flag::DerivativeFlag`: whether the derivatives of the grid-scale + diffusion tendency should be computed +- `sgs_advection_flag::DerivativeFlag`: whether the derivatives of the + subgrid-scale advection tendency should be computed +- `sgs_entr_detr_flag::DerivativeFlag`: whether the derivatives of the + subgrid-scale entrainment and detrainment tendencies should be computed +- `sgs_mass_flux_flag::DerivativeFlag`: whether the derivatives of the + subgrid-scale mass flux tendency should be computed +- `sgs_nh_pressure_flag::DerivativeFlag`: whether the derivatives of the + subgrid-scale non-hydrostatic pressure drag tendency should be computed +- `approximate_solve_iters::Int`: number of iterations to take for the + approximate linear solve required when the `diffusion_flag` is `UseDerivative` +""" +struct ApproxJacobian{F0, F1, F2, F3, F4, F5, F6} <: JacobianAlgorithm + noneq_flag::F0 + topography_flag::F1 + diffusion_flag::F2 + sgs_advection_flag::F3 + sgs_entr_detr_flag::F4 + sgs_mass_flux_flag::F5 + sgs_nh_pressure_flag::F6 + approximate_solve_iters::Int +end + +function jacobian_cache(alg::ApproxJacobian, Y, atmos) + (; + noneq_flag, + topography_flag, + diffusion_flag, + sgs_advection_flag, + sgs_mass_flux_flag, + ) = alg + FT = Spaces.undertype(axes(Y.c)) + CTh = CTh_vector_type(axes(Y.c)) + + DiagonalRow = DiagonalMatrixRow{FT} + TridiagonalRow = TridiagonalMatrixRow{FT} + BidiagonalRow_C3 = BidiagonalMatrixRow{C3{FT}} + TridiagonalRow_ACTh = TridiagonalMatrixRow{Adjoint{FT, CTh{FT}}} + BidiagonalRow_ACT3 = BidiagonalMatrixRow{Adjoint{FT, CT3{FT}}} + BidiagonalRow_C3xACTh = + BidiagonalMatrixRow{typeof(zero(C3{FT}) * zero(CTh{FT})')} + DiagonalRow_C3xACT3 = + DiagonalMatrixRow{typeof(zero(C3{FT}) * zero(CT3{FT})')} + TridiagonalRow_C3xACT3 = + TridiagonalMatrixRow{typeof(zero(C3{FT}) * zero(CT3{FT})')} + + is_in_Y(name) = MatrixFields.has_field(Y, name) + + ρq_tot_if_available = is_in_Y(@name(c.ρq_tot)) ? (@name(c.ρq_tot),) : () + ρatke_if_available = + is_in_Y(@name(c.sgs⁰.ρatke)) ? (@name(c.sgs⁰.ρatke),) : () + sfc_if_available = is_in_Y(@name(sfc)) ? (@name(sfc),) : () + + condensate_names = + (@name(c.ρq_liq), @name(c.ρq_ice), @name(c.ρq_rai), @name(c.ρq_sno)) + available_condensate_names = + MatrixFields.unrolled_filter(is_in_Y, condensate_names) + available_tracer_names = + (ρq_tot_if_available..., available_condensate_names...) + + sgs_tracer_names = ( + @name(c.sgsʲs.:(1).q_tot), + @name(c.sgsʲs.:(1).q_liq), + @name(c.sgsʲs.:(1).q_ice), + @name(c.sgsʲs.:(1).q_rai), + @name(c.sgsʲs.:(1).q_sno), + ) + available_sgs_tracer_names = + MatrixFields.unrolled_filter(is_in_Y, sgs_tracer_names) + + sgs_scalar_names = + (sgs_tracer_names..., @name(c.sgsʲs.:(1).mse), @name(c.sgsʲs.:(1).ρa)) + available_sgs_scalar_names = + MatrixFields.unrolled_filter(is_in_Y, sgs_scalar_names) + + sgs_u³_if_available = + is_in_Y(@name(f.sgsʲs.:(1).u₃)) ? (@name(f.sgsʲs.:(1).u₃),) : () + + # Note: We have to use FT(-1) * I instead of -I because inv(-1) == -1.0, + # which means that multiplying inv(-1) by a Float32 will yield a Float64. + identity_blocks = MatrixFields.unrolled_map( + name -> (name, name) => FT(-1) * I, + (@name(c.ρ), sfc_if_available...), + ) + + active_scalar_names = (@name(c.ρ), @name(c.ρe_tot), ρq_tot_if_available...) + advection_blocks = ( + ( + use_derivative(topography_flag) ? + MatrixFields.unrolled_map( + name -> + (name, @name(c.uₕ)) => + similar(Y.c, TridiagonalRow_ACTh), + active_scalar_names, + ) : () + )..., + MatrixFields.unrolled_map( + name -> (name, @name(f.u₃)) => similar(Y.c, BidiagonalRow_ACT3), + active_scalar_names, + )..., + MatrixFields.unrolled_map( + name -> (@name(f.u₃), name) => similar(Y.f, BidiagonalRow_C3), + active_scalar_names, + )..., + (@name(f.u₃), @name(c.uₕ)) => similar(Y.f, BidiagonalRow_C3xACTh), + (@name(f.u₃), @name(f.u₃)) => similar(Y.f, TridiagonalRow_C3xACT3), + ) + + condensate_blocks = + if atmos.moisture_model isa NonEquilMoistModel && + use_derivative(noneq_flag) + ( + (@name(c.ρq_liq), @name(c.ρq_tot)) => similar(Y.c, DiagonalRow), + (@name(c.ρq_ice), @name(c.ρq_tot)) => similar(Y.c, DiagonalRow), + ) + else + () + end + + diffused_scalar_names = (@name(c.ρe_tot), available_tracer_names...) + diffusion_blocks = if use_derivative(diffusion_flag) + ( + MatrixFields.unrolled_map( + name -> (name, @name(c.ρ)) => similar(Y.c, TridiagonalRow), + (diffused_scalar_names..., ρatke_if_available...), + )..., + MatrixFields.unrolled_map( + name -> (name, name) => similar(Y.c, TridiagonalRow), + (diffused_scalar_names..., ρatke_if_available...), + )..., + ( + is_in_Y(@name(c.ρq_tot)) ? + ( + (@name(c.ρe_tot), @name(c.ρq_tot)) => + similar(Y.c, TridiagonalRow), + ) : () + )..., + (@name(c.uₕ), @name(c.uₕ)) => + !isnothing(atmos.turbconv_model) || + !disable_momentum_vertical_diffusion(atmos.vert_diff) ? + similar(Y.c, TridiagonalRow) : FT(-1) * I, + ) + elseif atmos.moisture_model isa DryModel + MatrixFields.unrolled_map( + name -> (name, name) => FT(-1) * I, + (diffused_scalar_names..., ρatke_if_available..., @name(c.uₕ)), + ) + else + ( + MatrixFields.unrolled_map( + name -> (name, name) => similar(Y.c, TridiagonalRow), + diffused_scalar_names, + )..., + (@name(c.ρe_tot), @name(c.ρq_tot)) => + similar(Y.c, TridiagonalRow), + MatrixFields.unrolled_map( + name -> (name, name) => FT(-1) * I, + (ρatke_if_available..., @name(c.uₕ)), + )..., + ) + + end + + sgs_advection_blocks = if atmos.turbconv_model isa PrognosticEDMFX + @assert n_prognostic_mass_flux_subdomains(atmos.turbconv_model) == 1 + if use_derivative(sgs_advection_flag) + ( + MatrixFields.unrolled_map( + name -> (name, name) => similar(Y.c, TridiagonalRow), + available_sgs_scalar_names, + )..., + (@name(c.sgsʲs.:(1).mse), @name(c.sgsʲs.:(1).q_tot)) => + similar(Y.c, DiagonalRow), + (@name(c.sgsʲs.:(1).ρa), @name(c.sgsʲs.:(1).q_tot)) => + similar(Y.c, TridiagonalRow), + (@name(c.sgsʲs.:(1).ρa), @name(c.sgsʲs.:(1).mse)) => + similar(Y.c, TridiagonalRow), + (@name(c.sgsʲs.:(1).ρa), @name(f.sgsʲs.:(1).u₃)) => + similar(Y.c, BidiagonalRow_ACT3), + (@name(c.sgsʲs.:(1).mse), @name(f.sgsʲs.:(1).u₃)) => + similar(Y.c, BidiagonalRow_ACT3), + (@name(c.sgsʲs.:(1).q_tot), @name(f.sgsʲs.:(1).u₃)) => + similar(Y.c, BidiagonalRow_ACT3), + (@name(f.sgsʲs.:(1).u₃), @name(c.sgsʲs.:(1).q_tot)) => + similar(Y.f, BidiagonalRow_C3), + (@name(f.sgsʲs.:(1).u₃), @name(c.sgsʲs.:(1).mse)) => + similar(Y.f, BidiagonalRow_C3), + (@name(f.sgsʲs.:(1).u₃), @name(f.sgsʲs.:(1).u₃)) => + similar(Y.f, TridiagonalRow_C3xACT3), + ) + else + ( + MatrixFields.unrolled_map( + name -> (name, name) => FT(-1) * I, + available_sgs_scalar_names, + )..., + (@name(f.sgsʲs.:(1).u₃), @name(f.sgsʲs.:(1).u₃)) => + !isnothing(atmos.rayleigh_sponge) ? + similar(Y.f, DiagonalRow_C3xACT3) : FT(-1) * I, + ) + end + else + () + end + + sgs_massflux_blocks = if atmos.turbconv_model isa PrognosticEDMFX + @assert n_prognostic_mass_flux_subdomains(atmos.turbconv_model) == 1 + if use_derivative(sgs_mass_flux_flag) + ( + (@name(c.ρe_tot), @name(c.sgsʲs.:(1).mse)) => + similar(Y.c, TridiagonalRow), + (@name(c.ρq_tot), @name(c.sgsʲs.:(1).q_tot)) => + similar(Y.c, TridiagonalRow), + (@name(c.ρe_tot), @name(f.sgsʲs.:(1).u₃)) => + similar(Y.c, BidiagonalRow_ACT3), + (@name(c.ρq_tot), @name(f.sgsʲs.:(1).u₃)) => + similar(Y.c, BidiagonalRow_ACT3), + (@name(c.ρe_tot), @name(c.sgsʲs.:(1).ρa)) => + similar(Y.c, TridiagonalRow), + (@name(c.ρq_tot), @name(c.sgsʲs.:(1).ρa)) => + similar(Y.c, TridiagonalRow), + ) + else + () + end + else + () + end + + matrix = MatrixFields.FieldMatrix( + identity_blocks..., + sgs_advection_blocks..., + advection_blocks..., + condensate_blocks..., + diffusion_blocks..., + sgs_massflux_blocks..., + ) + + mass_and_surface_names = (@name(c.ρ), sfc_if_available...) + available_scalar_names = ( + mass_and_surface_names..., + ρq_tot_if_available..., + @name(c.ρe_tot), + available_condensate_names..., + ρatke_if_available..., + available_sgs_scalar_names..., + ) + + velocity_alg = MatrixFields.BlockLowerTriangularSolve( + @name(c.uₕ), + sgs_u³_if_available..., + ) + full_alg = + if use_derivative(diffusion_flag) || + use_derivative(sgs_advection_flag) || + !(atmos.moisture_model isa DryModel) + gs_scalar_subalg = if !(atmos.moisture_model isa DryModel) + MatrixFields.BlockLowerTriangularSolve(@name(c.ρq_tot)) + else + MatrixFields.BlockDiagonalSolve() + end + scalar_subalg = + if atmos.turbconv_model isa PrognosticEDMFX && + use_derivative(sgs_advection_flag) + MatrixFields.BlockLowerTriangularSolve( + available_sgs_tracer_names...; + alg₂ = MatrixFields.BlockLowerTriangularSolve( + @name(c.sgsʲs.:(1).mse); + alg₂ = MatrixFields.BlockLowerTriangularSolve( + @name(c.sgsʲs.:(1).ρa); + alg₂ = gs_scalar_subalg, + ), + ), + ) + else + gs_scalar_subalg + end + scalar_alg = MatrixFields.BlockLowerTriangularSolve( + mass_and_surface_names...; + alg₂ = scalar_subalg, + ) + MatrixFields.ApproximateBlockArrowheadIterativeSolve( + available_scalar_names...; + alg₁ = scalar_alg, + alg₂ = velocity_alg, + P_alg₁ = MatrixFields.MainDiagonalPreconditioner(), + n_iters = alg.approximate_solve_iters, + ) + else + MatrixFields.BlockArrowheadSolve( + available_scalar_names...; + alg₂ = velocity_alg, + ) + end + + temp_matrix = (matrix .+ identity_matrix(matrix, Y)) ./ FT(1) + temp_matrix_column = similar(first_column(temp_matrix)) + + return (; + matrix = MatrixFields.FieldMatrixWithSolver(matrix, Y, full_alg), + temp_matrix, + temp_matrix_column, + ) +end + +# TODO: Replace some scalar matrix entries with tensor entries so that we can +# use MatrixFields.identity_field_matrix(Y) instead of identity_matrix(Y). +function identity_matrix(matrix, Y) + I_matrix = MatrixFields.identity_field_matrix(Y) + new_pairs = MatrixFields.unrolled_map(pairs(I_matrix)) do (key, value) + replace_tensor_value_with_scalar_value = + key == (@name(c.uₕ), @name(c.uₕ)) || ( + key == (@name(f.sgsʲs.:(1).u₃), @name(f.sgsʲs.:(1).u₃)) && + matrix[key] isa LinearAlgebra.UniformScaling + ) + key => (replace_tensor_value_with_scalar_value ? I : value) + end + return MatrixFields.replace_name_tree( + MatrixFields.FieldMatrix(new_pairs...), + MatrixFields.FieldNameTree(Y), + ) +end + +function update_jacobian!(alg::ApproxJacobian, cache, Y, p, dtγ, t) + (; + noneq_flag, + topography_flag, + diffusion_flag, + sgs_advection_flag, + sgs_entr_detr_flag, + sgs_nh_pressure_flag, + sgs_mass_flux_flag, + ) = alg + (; matrix) = cache + (; params, dt) = p + (; ᶜΦ, ᶠgradᵥ_ᶜΦ) = p.core + (; ᶜspecific, ᶠu³, ᶜK, ᶜts, ᶜp, ᶜh_tot) = p.precomputed + (; + ∂ᶜK_∂ᶜuₕ, + ∂ᶜK_∂ᶠu₃, + ᶠp_grad_matrix, + ᶜadvection_matrix, + ᶜdiffusion_h_matrix, + ᶜdiffusion_h_matrix_scaled, + ᶜdiffusion_u_matrix, + ᶠbidiagonal_matrix_ct3, + ᶠbidiagonal_matrix_ct3_2, + ᶠtridiagonal_matrix_c3, + ) = p.scratch + rs = p.atmos.rayleigh_sponge + + FT = Spaces.undertype(axes(Y.c)) + CTh = CTh_vector_type(axes(Y.c)) + one_C3xACT3 = C3(FT(1)) * CT3(FT(1))' + + cv_d = FT(CAP.cv_d(params)) + Δcv_v = FT(CAP.cv_v(params)) - cv_d + T_0 = FT(CAP.T_0(params)) + R_d = FT(CAP.R_d(params)) + ΔR_v = FT(CAP.R_v(params)) - R_d + cp_d = FT(CAP.cp_d(params)) + Δcp_v = FT(CAP.cp_v(params)) - cp_d + # This term appears a few times in the Jacobian, and is technically + # minus ∂e_int_∂q_tot + ∂e_int_∂q_tot = T_0 * (Δcv_v - R_d) - FT(CAP.e_int_v0(params)) + thermo_params = CAP.thermodynamics_params(params) + + ᶜρ = Y.c.ρ + ᶜuₕ = Y.c.uₕ + ᶠu₃ = Y.f.u₃ + ᶜJ = Fields.local_geometry_field(Y.c).J + ᶠJ = Fields.local_geometry_field(Y.f).J + ᶜgⁱʲ = Fields.local_geometry_field(Y.c).gⁱʲ + ᶠgⁱʲ = Fields.local_geometry_field(Y.f).gⁱʲ + ᶠz = Fields.coordinate_field(Y.f).z + zmax = z_max(axes(Y.f)) + + ᶜkappa_m = p.scratch.ᶜtemp_scalar + @. ᶜkappa_m = + TD.gas_constant_air(thermo_params, ᶜts) / TD.cv_m(thermo_params, ᶜts) + + ᶜ∂kappa_m∂q_tot = p.scratch.ᶜtemp_scalar_2 + # Using abs2 because ^2 results in allocation + @. ᶜ∂kappa_m∂q_tot = + ( + ΔR_v * TD.cv_m(thermo_params, ᶜts) - + Δcv_v * TD.gas_constant_air(thermo_params, ᶜts) + ) / abs2(TD.cv_m(thermo_params, ᶜts)) + + if use_derivative(topography_flag) + @. ∂ᶜK_∂ᶜuₕ = DiagonalMatrixRow( + adjoint(CTh(ᶜuₕ)) + adjoint(ᶜinterp(ᶠu₃)) * g³ʰ(ᶜgⁱʲ), + ) + else + @. ∂ᶜK_∂ᶜuₕ = DiagonalMatrixRow(adjoint(CTh(ᶜuₕ))) + end + @. ∂ᶜK_∂ᶠu₃ = + ᶜinterp_matrix() ⋅ DiagonalMatrixRow(adjoint(CT3(ᶠu₃))) + + DiagonalMatrixRow(adjoint(CT3(ᶜuₕ))) ⋅ ᶜinterp_matrix() + + @. ᶠp_grad_matrix = DiagonalMatrixRow(-1 / ᶠinterp(ᶜρ)) ⋅ ᶠgradᵥ_matrix() + + @. ᶜadvection_matrix = + -(ᶜadvdivᵥ_matrix()) ⋅ DiagonalMatrixRow(ᶠinterp(ᶜρ * ᶜJ) / ᶠJ) + + if use_derivative(topography_flag) + ∂ᶜρ_err_∂ᶜuₕ = matrix[@name(c.ρ), @name(c.uₕ)] + @. ∂ᶜρ_err_∂ᶜuₕ = + dtγ * ᶜadvection_matrix ⋅ ᶠwinterp_matrix(ᶜJ * ᶜρ) ⋅ + DiagonalMatrixRow(g³ʰ(ᶜgⁱʲ)) + end + ∂ᶜρ_err_∂ᶠu₃ = matrix[@name(c.ρ), @name(f.u₃)] + @. ∂ᶜρ_err_∂ᶠu₃ = dtγ * ᶜadvection_matrix ⋅ DiagonalMatrixRow(g³³(ᶠgⁱʲ)) + + tracer_info = ( + (@name(c.ρe_tot), @name(ᶜh_tot)), + (@name(c.ρq_tot), @name(ᶜspecific.q_tot)), + ) + MatrixFields.unrolled_foreach(tracer_info) do (ρχ_name, χ_name) + MatrixFields.has_field(Y, ρχ_name) || return + ᶜχ = MatrixFields.get_field(p.precomputed, χ_name) + if use_derivative(topography_flag) + ∂ᶜρχ_err_∂ᶜuₕ = matrix[ρχ_name, @name(c.uₕ)] + end + ∂ᶜρχ_err_∂ᶠu₃ = matrix[ρχ_name, @name(f.u₃)] + use_derivative(topography_flag) && @. ∂ᶜρχ_err_∂ᶜuₕ = + dtγ * ᶜadvection_matrix ⋅ DiagonalMatrixRow(ᶠinterp(ᶜχ)) ⋅ + ᶠwinterp_matrix(ᶜJ * ᶜρ) ⋅ DiagonalMatrixRow(g³ʰ(ᶜgⁱʲ)) + @. ∂ᶜρχ_err_∂ᶠu₃ = + dtγ * ᶜadvection_matrix ⋅ DiagonalMatrixRow(ᶠinterp(ᶜχ) * g³³(ᶠgⁱʲ)) + end + + ∂ᶠu₃_err_∂ᶜρ = matrix[@name(f.u₃), @name(c.ρ)] + ∂ᶠu₃_err_∂ᶜρe_tot = matrix[@name(f.u₃), @name(c.ρe_tot)] + @. ∂ᶠu₃_err_∂ᶜρ = + dtγ * ( + ᶠp_grad_matrix ⋅ + DiagonalMatrixRow(ᶜkappa_m * (T_0 * cp_d - ᶜK - ᶜΦ)) + + DiagonalMatrixRow(ᶠgradᵥ(ᶜp) / abs2(ᶠinterp(ᶜρ))) ⋅ + ᶠinterp_matrix() + ) + @. ∂ᶠu₃_err_∂ᶜρe_tot = dtγ * ᶠp_grad_matrix ⋅ DiagonalMatrixRow(ᶜkappa_m) + if MatrixFields.has_field(Y, @name(c.ρq_tot)) + ∂ᶠu₃_err_∂ᶜρq_tot = matrix[@name(f.u₃), @name(c.ρq_tot)] + @. ∂ᶠu₃_err_∂ᶜρq_tot = + dtγ * ᶠp_grad_matrix ⋅ DiagonalMatrixRow(( + ᶜkappa_m * ∂e_int_∂q_tot + + ᶜ∂kappa_m∂q_tot * ( + cp_d * T_0 + ᶜspecific.e_tot - ᶜK - ᶜΦ + + ∂e_int_∂q_tot * ᶜspecific.q_tot + ) + )) + end + + ∂ᶠu₃_err_∂ᶜuₕ = matrix[@name(f.u₃), @name(c.uₕ)] + ∂ᶠu₃_err_∂ᶠu₃ = matrix[@name(f.u₃), @name(f.u₃)] + I_u₃ = DiagonalMatrixRow(one_C3xACT3) + @. ∂ᶠu₃_err_∂ᶜuₕ = + dtγ * ᶠp_grad_matrix ⋅ DiagonalMatrixRow(-(ᶜkappa_m) * ᶜρ) ⋅ ∂ᶜK_∂ᶜuₕ + if rs isa RayleighSponge + @. ∂ᶠu₃_err_∂ᶠu₃ = + dtγ * ( + ᶠp_grad_matrix ⋅ DiagonalMatrixRow(-(ᶜkappa_m) * ᶜρ) ⋅ + ∂ᶜK_∂ᶠu₃ + + DiagonalMatrixRow(-β_rayleigh_w(rs, ᶠz, zmax) * (one_C3xACT3,)) + ) - (I_u₃,) + else + @. ∂ᶠu₃_err_∂ᶠu₃ = + dtγ * ᶠp_grad_matrix ⋅ DiagonalMatrixRow(-(ᶜkappa_m) * ᶜρ) ⋅ + ∂ᶜK_∂ᶠu₃ - (I_u₃,) + end + + tracer_info = ( + (@name(c.ρq_liq), @name(q_liq), @name(ᶜwₗ)), + (@name(c.ρq_ice), @name(q_ice), @name(ᶜwᵢ)), + (@name(c.ρq_rai), @name(q_rai), @name(ᶜwᵣ)), + (@name(c.ρq_sno), @name(q_sno), @name(ᶜwₛ)), + ) + if !(p.atmos.moisture_model isa DryModel) || use_derivative(diffusion_flag) + ∂ᶜρe_tot_err_∂ᶜρe_tot = matrix[@name(c.ρe_tot), @name(c.ρe_tot)] + @. ∂ᶜρe_tot_err_∂ᶜρe_tot = zero(typeof(∂ᶜρe_tot_err_∂ᶜρe_tot)) - (I,) + end + + if !(p.atmos.moisture_model isa DryModel) + #TODO: tetsing explicit vs implicit + #@. ∂ᶜρe_tot_err_∂ᶜρe_tot += + # dtγ * -(ᶜprecipdivᵥ_matrix()) ⋅ + # DiagonalMatrixRow(ᶠinterp(ᶜρ * ᶜJ) / ᶠJ) ⋅ ᶠright_bias_matrix() ⋅ + # DiagonalMatrixRow( + # -(1 + ᶜkappa_m) / ᶜρ * ifelse( + # ᶜh_tot == 0, + # (Geometry.WVector(FT(0)),), + # p.precomputed.ᶜwₕhₜ / ᶜh_tot, + # ), + # ) + + ∂ᶜρe_tot_err_∂ᶜρq_tot = matrix[@name(c.ρe_tot), @name(c.ρq_tot)] + @. ∂ᶜρe_tot_err_∂ᶜρq_tot = zero(typeof(∂ᶜρe_tot_err_∂ᶜρq_tot)) + #TODO: tetsing explicit vs implicit + #@. ∂ᶜρe_tot_err_∂ᶜρq_tot = + # dtγ * -(ᶜprecipdivᵥ_matrix()) ⋅ + # DiagonalMatrixRow(ᶠinterp(ᶜρ * ᶜJ) / ᶠJ) ⋅ ᶠright_bias_matrix() ⋅ + # DiagonalMatrixRow( + # -(ᶜkappa_m) * ∂e_int_∂q_tot / ᶜρ * ifelse( + # ᶜh_tot == 0, + # (Geometry.WVector(FT(0)),), + # p.precomputed.ᶜwₕhₜ / ᶜh_tot, + # ), + # ) + + ∂ᶜρq_tot_err_∂ᶜρq_tot = matrix[@name(c.ρq_tot), @name(c.ρq_tot)] + @. ∂ᶜρq_tot_err_∂ᶜρq_tot = zero(typeof(∂ᶜρq_tot_err_∂ᶜρq_tot)) - (I,) + #TODO: tetsing explicit vs implicit + #@. ∂ᶜρq_tot_err_∂ᶜρq_tot = + # dtγ * -(ᶜprecipdivᵥ_matrix()) ⋅ + # DiagonalMatrixRow(ᶠinterp(ᶜρ * ᶜJ) / ᶠJ) ⋅ ᶠright_bias_matrix() ⋅ + # DiagonalMatrixRow( + # -1 / ᶜρ * ifelse( + # ᶜspecific.q_tot == 0, + # (Geometry.WVector(FT(0)),), + # p.precomputed.ᶜwₜqₜ / ᶜspecific.q_tot, + # ), + # ) - (I,) + + MatrixFields.unrolled_foreach(tracer_info) do (ρqₚ_name, _, wₚ_name) + MatrixFields.has_field(Y, ρqₚ_name) || return + ∂ᶜρqₚ_err_∂ᶜρqₚ = matrix[ρqₚ_name, ρqₚ_name] + ᶜwₚ = MatrixFields.get_field(p.precomputed, wₚ_name) + @. ∂ᶜρqₚ_err_∂ᶜρqₚ = + dtγ * -(ᶜprecipdivᵥ_matrix()) ⋅ + DiagonalMatrixRow(ᶠinterp(ᶜρ * ᶜJ) / ᶠJ) ⋅ + ᶠright_bias_matrix() ⋅ + DiagonalMatrixRow(-Geometry.WVector(ᶜwₚ) / ᶜρ) - (I,) + end + end + + if p.atmos.moisture_model isa NonEquilMoistModel && + use_derivative(noneq_flag) + p_vapₛₗ(tps, ts) = TD.saturation_vapor_pressure(tps, ts, TD.Liquid()) + p_vapₛᵢ(tps, ts) = TD.saturation_vapor_pressure(tps, ts, TD.Ice()) + + function ∂p_vapₛₗ_∂T(tps, ts) + T = TD.air_temperature(tps, ts) + Rᵥ = TD.Parameters.R_v(tps) + Lᵥ = TD.latent_heat_vapor(tps, ts) + return p_vapₛₗ(tps, ts) * Lᵥ / (Rᵥ * T^2) + end + function ∂p_vapₛᵢ_∂T(tps, ts) + T = TD.air_temperature(tps, ts) + Rᵥ = TD.Parameters.R_v(tps) + Lₛ = TD.latent_heat_sublim(tps, ts) + return p_vapₛᵢ(tps, ts) * Lₛ / (Rᵥ * T^2) + end + + function ∂qₛₗ_∂T(tps, ts) + T = TD.air_temperature(tps, ts) + Rᵥ = TD.Parameters.R_v(tps) + Lᵥ = TD.latent_heat_vapor(tps, ts) + qᵥ_sat_liq = TD.q_vap_saturation_liquid(tps, ts) + return qᵥ_sat_liq * (Lᵥ / (Rᵥ * T^2) - 1 / T) + end + function ∂qₛᵢ_∂T(tps, ts) + T = TD.air_temperature(tps, ts) + Rᵥ = TD.Parameters.R_v(tps) + Lₛ = TD.latent_heat_sublim(tps, ts) + qᵥ_sat_ice = TD.q_vap_saturation_ice(tps, ts) + return qᵥ_sat_ice * (Lₛ / (Rᵥ * T^2) - 1 / T) + end + + function Γₗ(tps, ts) + cₚ_air = TD.cp_m(tps, ts) + Lᵥ = TD.latent_heat_vapor(tps, ts) + return 1 + (Lᵥ / cₚ_air) * ∂qₛₗ_∂T(tps, ts) + end + function Γᵢ(tps, ts) + cₚ_air = TD.cp_m(tps, ts) + Lₛ = TD.latent_heat_sublim(tps, ts) + return 1 + (Lₛ / cₚ_air) * ∂qₛᵢ_∂T(tps, ts) + end + + cmc = CAP.microphysics_cloud_params(params) + τₗ = cmc.liquid.τ_relax + τᵢ = cmc.ice.τ_relax + function limit(q, dt, n::Int) + return q / float(dt) / n + end + + function ∂ρqₗ_err_∂ρqᵪ(tps, ts, cmc, dt, deriv, limit_deriv) + FT_inner = eltype(tps) + q = TD.PhasePartition(tps, ts) + ρ = TD.air_density(tps, ts) + + S = CMNe.conv_q_vap_to_q_liq_ice_MM2015(cmc.liquid, thp, q, ρ, Tₐ(tps, ts)) + + if S > FT_inner(0) + if S <= limit(qᵥ(tps, ts), dt, 2) + if TD.vapor_specific_humidity(q) + TD.liquid_specific_humidity(q) > FT_inner(0) + return deriv + else + return FT_inner(0) + end + else + return limit_deriv + end + else + if abs(S) <= limit(qₗ(tps, ts, qₚ(qᵣ)), dt, 2) + if TD.vapor_specific_humidity(q) + TD.liquid_specific_humidity(q) > FT_inner(0) + return -deriv + else + return FT_inner(0) + end + else + return -limit_deriv + end + end + end + + function ∂ρqᵢ_err_∂ρqᵪ(tps, ts, cmc, dt, deriv, limit_deriv) + FT_inner = eltype(tps) + q = TD.PhasePartition(tps, ts) + ρ = TD.air_density(tps, ts) + + S = CMNe.conv_q_vap_to_q_liq_ice_MM2015(cmc.ice, thp, q, ρ, Tₐ(tps, ts)) + + if S > FT_inner(0) + if S <= limit(qᵥ(tps, ts), dt, 2) + if TD.vapor_specific_humidity(q) + TD.ice_specific_humidity(q) > FT_inner(0) + return deriv + else + return FT_inner(0) + end + else + return limit_deriv + end + else + if abs(S) <= limit(qᵢ(thp, ts, qₚ(qₛ)), dt, 2) + if TD.vapor_specific_humidity(q) + TD.ice_specific_humidity(q) > FT_inner(0) + return -deriv + else + return FT_inner(0) + end + else + return -limit_deriv + end + end + end + + + ∂ᶜρqₗ_err_∂ᶜρqₗ = matrix[@name(c.ρq_liq), @name(c.ρq_liq)] + ∂ᶜρqᵢ_err_∂ᶜρqᵢ = matrix[@name(c.ρq_ice), @name(c.ρq_ice)] + + ∂ᶜρqₗ_err_∂ᶜρqₜ = matrix[@name(c.ρq_liq), @name(c.ρq_tot)] + ∂ᶜρqᵢ_err_∂ᶜρqₜ = matrix[@name(c.ρq_ice), @name(c.ρq_tot)] + + #@. ∂ᶜρqₗ_err_∂ᶜρqₗ -= + # DiagonalMatrixRow(1 / (τₗ * Γₗ(thermo_params, ᶜts))) + @. ∂ᶜρqₗ_err_∂ᶜρqₗ += + DiagonalMatrixRow( + ∂ρqₗ_err_∂ρqᵪ( + thermo_params, ᶜts, cmc, dt, (-1 / (τₗ * Γₗ(thermo_params, ᶜts))), (1/(2*float(dt))), + ) + ) + + #@. ∂ᶜρqᵢ_err_∂ᶜρqᵢ -= + # DiagonalMatrixRow(1 / (τᵢ * Γᵢ(thermo_params, ᶜts))) + + @. ∂ᶜρqᵢ_err_∂ᶜρqᵢ += + DiagonalMatrixRow( + ∂ρqᵢ_err_∂ρqᵪ( + thermo_params, ᶜts, cmc, dt, (-1 / (τᵢ * Γᵢ(thermo_params, ᶜts))), (1/(2*float(dt))), + ) + ) + + ᶜp = @. lazy(TD.air_pressure(thermo_params, ᶜts)) + ᶜ∂T_∂p = @. lazy(1 / (ᶜρ * TD.gas_constant_air(thermo_params, ᶜts))) + + # qₛₗ = p_vapₛₗ / p, qₛᵢ = p_vapₛᵢ / p + ᶜ∂qₛₗ_∂p = @. lazy( + -p_vapₛₗ(thermo_params, ᶜts) / ᶜp^2 + + ∂p_vapₛₗ_∂T(thermo_params, ᶜts) * ᶜ∂T_∂p / ᶜp, + ) + ᶜ∂qₛᵢ_∂p = @. lazy( + -p_vapₛᵢ(thermo_params, ᶜts) / ᶜp^2 + + ∂p_vapₛᵢ_∂T(thermo_params, ᶜts) * ᶜ∂T_∂p / ᶜp, + ) + + ᶜ∂p_∂ρqₜ = @. lazy( + ᶜkappa_m * ∂e_int_∂q_tot + + ᶜ∂kappa_m∂q_tot * ( + cp_d * T_0 + ᶜspecific.e_tot - ᶜK - ᶜΦ + + ∂e_int_∂q_tot * ᶜspecific.q_tot + ), + ) + + #@. ∂ᶜρqₗ_err_∂ᶜρqₜ = DiagonalMatrixRow( + # (1 - ᶜρ * ᶜ∂qₛₗ_∂p * ᶜ∂p_∂ρqₜ) / (τₗ * Γₗ(thermo_params, ᶜts)), + #) + @. ∂ᶜρqₗ_err_∂ᶜρqₜ = DiagonalMatrixRow( + ∂ρqₗ_err_∂ρqᵪ( + thermo_params, ts, cmc, dt, ((1 - ᶜρ * ᶜ∂qₛₗ_∂p * ᶜ∂p_∂ρqₜ) / (τₗ * Γₗ(thermo_params, ᶜts))), FT(0) + ) + ) + + #@. ∂ᶜρqᵢ_err_∂ᶜρqₜ = DiagonalMatrixRow( + # (1 - ᶜρ * ᶜ∂qₛᵢ_∂p * ᶜ∂p_∂ρqₜ) / (τᵢ * Γᵢ(thermo_params, ᶜts)), + #) + @. ∂ᶜρqᵢ_err_∂ᶜρqₜ = DiagonalMatrixRow( + ∂ρqᵢ_err_∂ρqᵪ( + thermo_params, ts, cmc, dt, ((1 - ᶜρ * ᶜ∂qₛᵢ_∂p * ᶜ∂p_∂ρqₜ) / (τᵢ * Γᵢ(thermo_params, ᶜts))), FT(0) + ) + ) + end + + if use_derivative(diffusion_flag) + α_vert_diff_tracer = CAP.α_vert_diff_tracer(params) + (; ᶜK_h, ᶜK_u) = p.precomputed + @. ᶜdiffusion_h_matrix = + ᶜadvdivᵥ_matrix() ⋅ DiagonalMatrixRow(ᶠinterp(ᶜρ) * ᶠinterp(ᶜK_h)) ⋅ + ᶠgradᵥ_matrix() + @. ᶜdiffusion_h_matrix_scaled = + ᶜadvdivᵥ_matrix() ⋅ DiagonalMatrixRow( + ᶠinterp(ᶜρ) * ᶠinterp(α_vert_diff_tracer * ᶜK_h), + ) ⋅ ᶠgradᵥ_matrix() + if ( + MatrixFields.has_field(Y, @name(c.sgs⁰.ρatke)) || + !isnothing(p.atmos.turbconv_model) || + !disable_momentum_vertical_diffusion(p.atmos.vert_diff) + ) + @. ᶜdiffusion_u_matrix = + ᶜadvdivᵥ_matrix() ⋅ + DiagonalMatrixRow(ᶠinterp(ᶜρ) * ᶠinterp(ᶜK_u)) ⋅ ᶠgradᵥ_matrix() + end + + ∂ᶜρe_tot_err_∂ᶜρ = matrix[@name(c.ρe_tot), @name(c.ρ)] + @. ∂ᶜρe_tot_err_∂ᶜρ = + dtγ * ᶜdiffusion_h_matrix ⋅ DiagonalMatrixRow( + ( + -(1 + ᶜkappa_m) * ᶜspecific.e_tot - + ᶜkappa_m * ∂e_int_∂q_tot * ᶜspecific.q_tot + ) / ᶜρ, + ) + @. ∂ᶜρe_tot_err_∂ᶜρe_tot += + dtγ * ᶜdiffusion_h_matrix ⋅ DiagonalMatrixRow((1 + ᶜkappa_m) / ᶜρ) + + if MatrixFields.has_field(Y, @name(c.ρq_tot)) + ∂ᶜρe_tot_err_∂ᶜρq_tot = matrix[@name(c.ρe_tot), @name(c.ρq_tot)] + ∂ᶜρq_tot_err_∂ᶜρ = matrix[@name(c.ρq_tot), @name(c.ρ)] + @. ∂ᶜρe_tot_err_∂ᶜρq_tot += + dtγ * ᶜdiffusion_h_matrix ⋅ DiagonalMatrixRow( + ( + ᶜkappa_m * ∂e_int_∂q_tot + + ᶜ∂kappa_m∂q_tot * ( + cp_d * T_0 + ᶜspecific.e_tot - ᶜK - ᶜΦ + + ∂e_int_∂q_tot * ᶜspecific.q_tot + ) + ) / ᶜρ, + ) # TODO: Open PR with bugfix. + @. ∂ᶜρq_tot_err_∂ᶜρ = + dtγ * ᶜdiffusion_h_matrix ⋅ + DiagonalMatrixRow(-(ᶜspecific.q_tot) / ᶜρ) + @. ∂ᶜρq_tot_err_∂ᶜρq_tot += + dtγ * ᶜdiffusion_h_matrix ⋅ DiagonalMatrixRow(1 / ᶜρ) + end + + MatrixFields.unrolled_foreach(tracer_info) do (ρq_name, q_name, _) + MatrixFields.has_field(Y, ρq_name) || return + ᶜq = MatrixFields.get_field(ᶜspecific, q_name) + ∂ᶜρq_err_∂ᶜρ = matrix[ρq_name, @name(c.ρ)] + ∂ᶜρq_err_∂ᶜρq = matrix[ρq_name, ρq_name] + ᶜtridiagonal_matrix_scalar = ifelse( + q_name in (@name(q_rai), @name(q_sno)), + ᶜdiffusion_h_matrix_scaled, + ᶜdiffusion_h_matrix, + ) + @. ∂ᶜρq_err_∂ᶜρ = + dtγ * ᶜtridiagonal_matrix_scalar ⋅ DiagonalMatrixRow(-(ᶜq) / ᶜρ) + @. ∂ᶜρq_err_∂ᶜρq += + dtγ * ᶜtridiagonal_matrix_scalar ⋅ DiagonalMatrixRow(1 / ᶜρ) + end + + if MatrixFields.has_field(Y, @name(c.sgs⁰.ρatke)) + turbconv_params = CAP.turbconv_params(params) + c_d = CAP.tke_diss_coeff(turbconv_params) + #(; dt) = p + (; ᶜtke⁰, ᶜmixing_length) = p.precomputed + ᶜρa⁰ = + p.atmos.turbconv_model isa PrognosticEDMFX ? + p.precomputed.ᶜρa⁰ : ᶜρ + ᶜρatke⁰ = Y.c.sgs⁰.ρatke + + @inline dissipation_rate(tke⁰, mixing_length) = + tke⁰ >= 0 ? c_d * sqrt(tke⁰) / max(mixing_length, 1) : + 1 / float(dt) + @inline ∂dissipation_rate_∂tke⁰(tke⁰, mixing_length) = + tke⁰ > 0 ? c_d / (2 * max(mixing_length, 1) * sqrt(tke⁰)) : + typeof(tke⁰)(0) + + ᶜdissipation_matrix_diagonal = p.scratch.ᶜtemp_scalar + @. ᶜdissipation_matrix_diagonal = + ᶜρatke⁰ * ∂dissipation_rate_∂tke⁰(ᶜtke⁰, ᶜmixing_length) + + ∂ᶜρatke⁰_err_∂ᶜρ = matrix[@name(c.sgs⁰.ρatke), @name(c.ρ)] + ∂ᶜρatke⁰_err_∂ᶜρatke⁰ = + matrix[@name(c.sgs⁰.ρatke), @name(c.sgs⁰.ρatke)] + @. ∂ᶜρatke⁰_err_∂ᶜρ = + dtγ * ( + ᶜdiffusion_u_matrix - + DiagonalMatrixRow(ᶜdissipation_matrix_diagonal) + ) ⋅ DiagonalMatrixRow(-(ᶜtke⁰) / ᶜρa⁰) + @. ∂ᶜρatke⁰_err_∂ᶜρatke⁰ = + dtγ * ( + ( + ᶜdiffusion_u_matrix - + DiagonalMatrixRow(ᶜdissipation_matrix_diagonal) + ) ⋅ DiagonalMatrixRow(1 / ᶜρa⁰) - + DiagonalMatrixRow(dissipation_rate(ᶜtke⁰, ᶜmixing_length)) + ) - (I,) + end + + if ( + !isnothing(p.atmos.turbconv_model) || + !disable_momentum_vertical_diffusion(p.atmos.vert_diff) + ) + ∂ᶜuₕ_err_∂ᶜuₕ = matrix[@name(c.uₕ), @name(c.uₕ)] + @. ∂ᶜuₕ_err_∂ᶜuₕ = + dtγ * DiagonalMatrixRow(1 / ᶜρ) ⋅ ᶜdiffusion_u_matrix - (I,) + end + + end + + if p.atmos.turbconv_model isa PrognosticEDMFX + if use_derivative(sgs_advection_flag) + (; ᶜgradᵥ_ᶠΦ) = p.core + (; ᶜρʲs, ᶠu³ʲs, ᶜtsʲs, ᶜKʲs, bdmr_l, bdmr_r, bdmr) = p.precomputed + is_third_order = + p.atmos.numerics.edmfx_upwinding == Val(:third_order) + ᶠupwind = is_third_order ? ᶠupwind3 : ᶠupwind1 + ᶠset_upwind_bcs = Operators.SetBoundaryOperator(; + top = Operators.SetValue(zero(CT3{FT})), + bottom = Operators.SetValue(zero(CT3{FT})), + ) # Need to wrap ᶠupwind in this for well-defined boundaries. + UpwindMatrixRowType = + is_third_order ? QuaddiagonalMatrixRow : BidiagonalMatrixRow + ᶠupwind_matrix = is_third_order ? ᶠupwind3_matrix : ᶠupwind1_matrix + ᶠset_upwind_matrix_bcs = Operators.SetBoundaryOperator(; + top = Operators.SetValue(zero(UpwindMatrixRowType{CT3{FT}})), + bottom = Operators.SetValue(zero(UpwindMatrixRowType{CT3{FT}})), + ) # Need to wrap ᶠupwind_matrix in this for well-defined boundaries. + + ᶠu³ʲ_data = ᶠu³ʲs.:(1).components.data.:1 + + ᶜkappa_mʲ = p.scratch.ᶜtemp_scalar + @. ᶜkappa_mʲ = + TD.gas_constant_air(thermo_params, ᶜtsʲs.:(1)) / + TD.cv_m(thermo_params, ᶜtsʲs.:(1)) + + # Note this is the derivative of R_m / cp_m with respect to q_tot + # but we call it ∂kappa_m∂q_totʲ + ᶜ∂kappa_m∂q_totʲ = p.scratch.ᶜtemp_scalar_2 + @. ᶜ∂kappa_m∂q_totʲ = + ( + ΔR_v * TD.cp_m(thermo_params, ᶜtsʲs.:(1)) - + Δcp_v * TD.gas_constant_air(thermo_params, ᶜtsʲs.:(1)) + ) / abs2(TD.cp_m(thermo_params, ᶜtsʲs.:(1))) + + ∂ᶜq_totʲ_err_∂ᶜq_totʲ = + matrix[@name(c.sgsʲs.:(1).q_tot), @name(c.sgsʲs.:(1).q_tot)] + @. ∂ᶜq_totʲ_err_∂ᶜq_totʲ = + dtγ * ( + DiagonalMatrixRow(ᶜadvdivᵥ(ᶠu³ʲs.:(1))) - + ᶜadvdivᵥ_matrix() ⋅ + ᶠset_upwind_matrix_bcs(ᶠupwind_matrix(ᶠu³ʲs.:(1))) + ) - (I,) + ∂ᶜq_totʲ_err_∂ᶠu₃ʲ = + matrix[@name(c.sgsʲs.:(1).q_tot), @name(f.sgsʲs.:(1).u₃)] + @. ∂ᶜq_totʲ_err_∂ᶠu₃ʲ = + dtγ * ( + -(ᶜadvdivᵥ_matrix()) ⋅ DiagonalMatrixRow( + ᶠset_upwind_bcs( + ᶠupwind(CT3(sign(ᶠu³ʲ_data)), Y.c.sgsʲs.:(1).q_tot), + ) * adjoint(C3(sign(ᶠu³ʲ_data))), + ) + + DiagonalMatrixRow(Y.c.sgsʲs.:(1).q_tot) ⋅ ᶜadvdivᵥ_matrix() + ) ⋅ DiagonalMatrixRow(g³³(ᶠgⁱʲ)) + + ∂ᶜmseʲ_err_∂ᶜq_totʲ = + matrix[@name(c.sgsʲs.:(1).mse), @name(c.sgsʲs.:(1).q_tot)] + @. ∂ᶜmseʲ_err_∂ᶜq_totʲ = + dtγ * ( + -DiagonalMatrixRow( + adjoint(ᶜinterp(ᶠu³ʲs.:(1))) * ᶜgradᵥ_ᶠΦ * Y.c.ρ / ᶜp * + ( + (ᶜkappa_mʲ / (ᶜkappa_mʲ + 1) * ∂e_int_∂q_tot) + + ᶜ∂kappa_m∂q_totʲ * ( + Y.c.sgsʲs.:(1).mse - ᶜΦ + + cp_d * T_0 + + ∂e_int_∂q_tot * Y.c.sgsʲs.:(1).q_tot + ) + ), + ) + ) + ∂ᶜmseʲ_err_∂ᶜmseʲ = + matrix[@name(c.sgsʲs.:(1).mse), @name(c.sgsʲs.:(1).mse)] + @. ∂ᶜmseʲ_err_∂ᶜmseʲ = + dtγ * ( + DiagonalMatrixRow(ᶜadvdivᵥ(ᶠu³ʲs.:(1))) - + ᶜadvdivᵥ_matrix() ⋅ + ᶠset_upwind_matrix_bcs(ᶠupwind_matrix(ᶠu³ʲs.:(1))) - + DiagonalMatrixRow( + adjoint(ᶜinterp(ᶠu³ʲs.:(1))) * + ᶜgradᵥ_ᶠΦ * + Y.c.ρ * + ᶜkappa_mʲ / ((ᶜkappa_mʲ + 1) * ᶜp), + ) + ) - (I,) + ∂ᶜmseʲ_err_∂ᶠu₃ʲ = + matrix[@name(c.sgsʲs.:(1).mse), @name(f.sgsʲs.:(1).u₃)] + @. ∂ᶜmseʲ_err_∂ᶠu₃ʲ = + dtγ * ( + -(ᶜadvdivᵥ_matrix()) ⋅ DiagonalMatrixRow( + ᶠset_upwind_bcs( + ᶠupwind(CT3(sign(ᶠu³ʲ_data)), Y.c.sgsʲs.:(1).mse), + ) * adjoint(C3(sign(ᶠu³ʲ_data))), + ) + + DiagonalMatrixRow(Y.c.sgsʲs.:(1).mse) ⋅ ᶜadvdivᵥ_matrix() + ) ⋅ DiagonalMatrixRow(g³³(ᶠgⁱʲ)) + + ∂ᶜρaʲ_err_∂ᶜq_totʲ = + matrix[@name(c.sgsʲs.:(1).ρa), @name(c.sgsʲs.:(1).q_tot)] + @. ᶠbidiagonal_matrix_ct3 = + DiagonalMatrixRow( + ᶠset_upwind_bcs( + ᶠupwind( + ᶠu³ʲs.:(1), + draft_area(Y.c.sgsʲs.:(1).ρa, ᶜρʲs.:(1)), + ), + ) / ᶠJ, + ) ⋅ ᶠinterp_matrix() ⋅ DiagonalMatrixRow( + ᶜJ * (ᶜρʲs.:(1))^2 / ᶜp * ( + ᶜkappa_mʲ / (ᶜkappa_mʲ + 1) * ∂e_int_∂q_tot + + ᶜ∂kappa_m∂q_totʲ * ( + Y.c.sgsʲs.:(1).mse - ᶜΦ + + cp_d * T_0 + + ∂e_int_∂q_tot * Y.c.sgsʲs.:(1).q_tot + ) + ), + ) + @. ᶠbidiagonal_matrix_ct3_2 = + DiagonalMatrixRow(ᶠinterp(ᶜρʲs.:(1) * ᶜJ) / ᶠJ) ⋅ + ᶠset_upwind_matrix_bcs(ᶠupwind_matrix(ᶠu³ʲs.:(1))) ⋅ + DiagonalMatrixRow( + Y.c.sgsʲs.:(1).ρa * ᶜkappa_mʲ / ((ᶜkappa_mʲ + 1) * ᶜp) * + ∂e_int_∂q_tot, + ) + @. ∂ᶜρaʲ_err_∂ᶜq_totʲ = + dtγ * ᶜadvdivᵥ_matrix() ⋅ + (ᶠbidiagonal_matrix_ct3 - ᶠbidiagonal_matrix_ct3_2) + + ∂ᶜρaʲ_err_∂ᶜmseʲ = + matrix[@name(c.sgsʲs.:(1).ρa), @name(c.sgsʲs.:(1).mse)] + @. ᶠbidiagonal_matrix_ct3 = + DiagonalMatrixRow( + ᶠset_upwind_bcs( + ᶠupwind( + ᶠu³ʲs.:(1), + draft_area(Y.c.sgsʲs.:(1).ρa, ᶜρʲs.:(1)), + ), + ) / ᶠJ, + ) ⋅ ᶠinterp_matrix() ⋅ DiagonalMatrixRow( + ᶜJ * ᶜkappa_mʲ * (ᶜρʲs.:(1))^2 / ((ᶜkappa_mʲ + 1) * ᶜp), + ) + @. ᶠbidiagonal_matrix_ct3_2 = + DiagonalMatrixRow(ᶠinterp(ᶜρʲs.:(1) * ᶜJ) / ᶠJ) ⋅ + ᶠset_upwind_matrix_bcs(ᶠupwind_matrix(ᶠu³ʲs.:(1))) ⋅ + DiagonalMatrixRow( + Y.c.sgsʲs.:(1).ρa * ᶜkappa_mʲ / ((ᶜkappa_mʲ + 1) * ᶜp), + ) + @. ∂ᶜρaʲ_err_∂ᶜmseʲ = + dtγ * ᶜadvdivᵥ_matrix() ⋅ + (ᶠbidiagonal_matrix_ct3 - ᶠbidiagonal_matrix_ct3_2) + + ∂ᶜρaʲ_err_∂ᶜρaʲ = + matrix[@name(c.sgsʲs.:(1).ρa), @name(c.sgsʲs.:(1).ρa)] + @. ᶜadvection_matrix = + -(ᶜadvdivᵥ_matrix()) ⋅ + DiagonalMatrixRow(ᶠinterp(ᶜρʲs.:(1) * ᶜJ) / ᶠJ) + @. ∂ᶜρaʲ_err_∂ᶜρaʲ = + dtγ * ᶜadvection_matrix ⋅ + ᶠset_upwind_matrix_bcs(ᶠupwind_matrix(ᶠu³ʲs.:(1))) ⋅ + DiagonalMatrixRow(1 / ᶜρʲs.:(1)) - (I,) + + ∂ᶜρaʲ_err_∂ᶠu₃ʲ = + matrix[@name(c.sgsʲs.:(1).ρa), @name(f.sgsʲs.:(1).u₃)] + @. ∂ᶜρaʲ_err_∂ᶠu₃ʲ = + dtγ * -(ᶜadvdivᵥ_matrix()) ⋅ DiagonalMatrixRow( + ᶠinterp(ᶜρʲs.:(1) * ᶜJ) / ᶠJ * + ᶠset_upwind_bcs( + ᶠupwind( + CT3(sign(ᶠu³ʲ_data)), + draft_area(Y.c.sgsʲs.:(1).ρa, ᶜρʲs.:(1)), + ), + ) * + adjoint(C3(sign(ᶠu³ʲ_data))) * + g³³(ᶠgⁱʲ), + ) + + turbconv_params = CAP.turbconv_params(params) + α_b = CAP.pressure_normalmode_buoy_coeff1(turbconv_params) + ∂ᶠu₃ʲ_err_∂ᶜq_totʲ = + matrix[@name(f.sgsʲs.:(1).u₃), @name(c.sgsʲs.:(1).q_tot)] + @. ∂ᶠu₃ʲ_err_∂ᶜq_totʲ = + dtγ * DiagonalMatrixRow( + (1 - α_b) * ᶠgradᵥ_ᶜΦ * ᶠinterp(Y.c.ρ) / + (ᶠinterp(ᶜρʲs.:(1)))^2, + ) ⋅ ᶠinterp_matrix() ⋅ DiagonalMatrixRow( + (ᶜρʲs.:(1))^2 / ᶜp * ( + ᶜkappa_mʲ / (ᶜkappa_mʲ + 1) * ∂e_int_∂q_tot + + ᶜ∂kappa_m∂q_totʲ * ( + Y.c.sgsʲs.:(1).mse - ᶜΦ + + cp_d * T_0 + + ∂e_int_∂q_tot * Y.c.sgsʲs.:(1).q_tot + ) + ), + ) + ∂ᶠu₃ʲ_err_∂ᶜmseʲ = + matrix[@name(f.sgsʲs.:(1).u₃), @name(c.sgsʲs.:(1).mse)] + @. ∂ᶠu₃ʲ_err_∂ᶜmseʲ = + dtγ * DiagonalMatrixRow( + (1 - α_b) * ᶠgradᵥ_ᶜΦ * ᶠinterp(Y.c.ρ) / + (ᶠinterp(ᶜρʲs.:(1)))^2, + ) ⋅ ᶠinterp_matrix() ⋅ DiagonalMatrixRow( + ᶜkappa_mʲ * (ᶜρʲs.:(1))^2 / ((ᶜkappa_mʲ + 1) * ᶜp), + ) + + ∂ᶠu₃ʲ_err_∂ᶠu₃ʲ = + matrix[@name(f.sgsʲs.:(1).u₃), @name(f.sgsʲs.:(1).u₃)] + ᶜu₃ʲ = p.scratch.ᶜtemp_C3 + @. ᶜu₃ʲ = ᶜinterp(Y.f.sgsʲs.:(1).u₃) + @. bdmr_l = convert(BidiagonalMatrixRow{FT}, ᶜleft_bias_matrix()) + @. bdmr_r = convert(BidiagonalMatrixRow{FT}, ᶜright_bias_matrix()) + @. bdmr = ifelse(ᶜu₃ʲ.components.data.:1 > 0, bdmr_l, bdmr_r) + @. ᶠtridiagonal_matrix_c3 = -(ᶠgradᵥ_matrix()) ⋅ bdmr + if rs isa RayleighSponge + @. ∂ᶠu₃ʲ_err_∂ᶠu₃ʲ = + dtγ * ( + ᶠtridiagonal_matrix_c3 ⋅ + DiagonalMatrixRow(adjoint(CT3(Y.f.sgsʲs.:(1).u₃))) - + DiagonalMatrixRow( + β_rayleigh_w(rs, ᶠz, zmax) * (one_C3xACT3,), + ) + ) - (I_u₃,) + else + @. ∂ᶠu₃ʲ_err_∂ᶠu₃ʲ = + dtγ * ᶠtridiagonal_matrix_c3 ⋅ + DiagonalMatrixRow(adjoint(CT3(Y.f.sgsʲs.:(1).u₃))) - (I_u₃,) + end + + # entrainment and detrainment (rates are treated explicitly) + if use_derivative(sgs_entr_detr_flag) + (; ᶜentrʲs, ᶜdetrʲs, ᶜturb_entrʲs) = p.precomputed + @. ∂ᶜq_totʲ_err_∂ᶜq_totʲ -= + dtγ * DiagonalMatrixRow(ᶜentrʲs.:(1) + ᶜturb_entrʲs.:(1)) + @. ∂ᶜmseʲ_err_∂ᶜmseʲ -= + dtγ * DiagonalMatrixRow(ᶜentrʲs.:(1) + ᶜturb_entrʲs.:(1)) + @. ∂ᶜρaʲ_err_∂ᶜρaʲ += + dtγ * DiagonalMatrixRow(ᶜentrʲs.:(1) - ᶜdetrʲs.:(1)) + @. ∂ᶠu₃ʲ_err_∂ᶠu₃ʲ -= + dtγ * (DiagonalMatrixRow( + (ᶠinterp(ᶜentrʲs.:(1) + ᶜturb_entrʲs.:(1))) * + (one_C3xACT3,), + )) + end + + # non-hydrostatic pressure drag + # (quadratic drag term treated implicitly, buoyancy term explicitly) + if use_derivative(sgs_nh_pressure_flag) + (; ᶠu₃⁰) = p.precomputed + α_d = CAP.pressure_normalmode_drag_coeff(turbconv_params) + scale_height = + CAP.R_d(params) * CAP.T_surf_ref(params) / CAP.grav(params) + H_up_min = CAP.min_updraft_top(turbconv_params) + @. ∂ᶠu₃ʲ_err_∂ᶠu₃ʲ -= + dtγ * (DiagonalMatrixRow( + 2 * α_d * norm(Y.f.sgsʲs.:(1).u₃ - ᶠu₃⁰) / + max(scale_height, H_up_min) * (one_C3xACT3,), + )) + end + + # add updraft mass flux contributions to grid-mean + if use_derivative(sgs_mass_flux_flag) + # Jacobian contributions of updraft massflux to grid-mean + ∂ᶜupdraft_mass_flux_∂ᶜscalar = ᶠbidiagonal_matrix_ct3 + @. ∂ᶜupdraft_mass_flux_∂ᶜscalar = + DiagonalMatrixRow( + (ᶠinterp(ᶜρ * ᶜJ) / ᶠJ) * (ᶠu³ʲs.:(1) - ᶠu³), + ) ⋅ ᶠinterp_matrix() ⋅ + DiagonalMatrixRow(Y.c.sgsʲs.:(1).ρa / ᶜρʲs.:(1)) + + # Derivative of total energy tendency with respect to updraft MSE + ## grid-mean ρe_tot + ᶜkappa_m = p.scratch.ᶜtemp_scalar + @. ᶜkappa_m = + TD.gas_constant_air(thermo_params, ᶜts) / + TD.cv_m(thermo_params, ᶜts) + + ᶜ∂kappa_m∂q_tot = p.scratch.ᶜtemp_scalar_2 + @. ᶜ∂kappa_m∂q_tot = + ( + ΔR_v * TD.cv_m(thermo_params, ᶜts) - + Δcv_v * TD.gas_constant_air(thermo_params, ᶜts) + ) / abs2(TD.cv_m(thermo_params, ᶜts)) + + @. ∂ᶜρe_tot_err_∂ᶜρ += + dtγ * ᶜadvdivᵥ_matrix() ⋅ ∂ᶜupdraft_mass_flux_∂ᶜscalar ⋅ + DiagonalMatrixRow( + ( + -(1 + ᶜkappa_m) * ᶜspecific.e_tot - + ᶜkappa_m * ∂e_int_∂q_tot * ᶜspecific.q_tot + ) / ᶜρ, + ) + + @. ∂ᶜρe_tot_err_∂ᶜρq_tot += + dtγ * ᶜadvdivᵥ_matrix() ⋅ ∂ᶜupdraft_mass_flux_∂ᶜscalar ⋅ + DiagonalMatrixRow(( + ᶜkappa_m * ∂e_int_∂q_tot / ᶜρ + + ᶜ∂kappa_m∂q_tot * ( + cp_d * T_0 + ᶜspecific.e_tot - ᶜK - ᶜΦ + + ∂e_int_∂q_tot * ᶜspecific.q_tot + ) + )) + + @. ∂ᶜρe_tot_err_∂ᶜρe_tot += + dtγ * ᶜadvdivᵥ_matrix() ⋅ ∂ᶜupdraft_mass_flux_∂ᶜscalar ⋅ + DiagonalMatrixRow((1 + ᶜkappa_m) / ᶜρ) + + ∂ᶜρe_tot_err_∂ᶜmseʲ = + matrix[@name(c.ρe_tot), @name(c.sgsʲs.:(1).mse)] + @. ∂ᶜρe_tot_err_∂ᶜmseʲ = + -(dtγ * ᶜadvdivᵥ_matrix() ⋅ ∂ᶜupdraft_mass_flux_∂ᶜscalar) + + ## grid-mean ρq_tot + @. ∂ᶜρq_tot_err_∂ᶜρ += + dtγ * ᶜadvdivᵥ_matrix() ⋅ ∂ᶜupdraft_mass_flux_∂ᶜscalar ⋅ + DiagonalMatrixRow(-(ᶜspecific.q_tot) / ᶜρ) + + @. ∂ᶜρq_tot_err_∂ᶜρq_tot += + dtγ * ᶜadvdivᵥ_matrix() ⋅ ∂ᶜupdraft_mass_flux_∂ᶜscalar ⋅ + DiagonalMatrixRow(1 / ᶜρ) + + ∂ᶜρq_tot_err_∂ᶜq_totʲ = + matrix[@name(c.ρq_tot), @name(c.sgsʲs.:(1).q_tot)] + @. ∂ᶜρq_tot_err_∂ᶜq_totʲ = + -(dtγ * ᶜadvdivᵥ_matrix() ⋅ ∂ᶜupdraft_mass_flux_∂ᶜscalar) + + # grid-mean ∂/∂(u₃ʲ) + ∂ᶜρe_tot_err_∂ᶠu₃ = matrix[@name(c.ρe_tot), @name(f.u₃)] + @. ∂ᶜρe_tot_err_∂ᶠu₃ += + dtγ * ᶜadvdivᵥ_matrix() ⋅ DiagonalMatrixRow( + ᶠinterp( + (Y.c.sgsʲs.:(1).mse + ᶜKʲs.:(1) - ᶜh_tot) * + ᶜρʲs.:(1) * + ᶜJ * + draft_area(Y.c.sgsʲs.:(1).ρa, ᶜρʲs.:(1)), + ) / ᶠJ * (g³³(ᶠgⁱʲ)), + ) + + ∂ᶜρe_tot_err_∂ᶠu₃ʲ = + matrix[@name(c.ρe_tot), @name(f.sgsʲs.:(1).u₃)] + @. ∂ᶜρe_tot_err_∂ᶠu₃ʲ = + dtγ * -(ᶜadvdivᵥ_matrix()) ⋅ DiagonalMatrixRow( + ᶠinterp( + (Y.c.sgsʲs.:(1).mse + ᶜKʲs.:(1) - ᶜh_tot) * + ᶜρʲs.:(1) * + ᶜJ * + draft_area(Y.c.sgsʲs.:(1).ρa, ᶜρʲs.:(1)), + ) / ᶠJ * (g³³(ᶠgⁱʲ)), + ) + + ∂ᶜρq_tot_err_∂ᶠu₃ = matrix[@name(c.ρq_tot), @name(f.u₃)] + @. ∂ᶜρq_tot_err_∂ᶠu₃ += + dtγ * ᶜadvdivᵥ_matrix() ⋅ DiagonalMatrixRow( + ᶠinterp( + (Y.c.sgsʲs.:(1).q_tot - ᶜspecific.q_tot) * + ᶜρʲs.:(1) * + ᶜJ * + draft_area(Y.c.sgsʲs.:(1).ρa, ᶜρʲs.:(1)), + ) / ᶠJ * (g³³(ᶠgⁱʲ)), + ) + + ∂ᶜρq_tot_err_∂ᶠu₃ʲ = + matrix[@name(c.ρq_tot), @name(f.sgsʲs.:(1).u₃)] + @. ∂ᶜρq_tot_err_∂ᶠu₃ʲ = + dtγ * -(ᶜadvdivᵥ_matrix()) ⋅ DiagonalMatrixRow( + ᶠinterp( + (Y.c.sgsʲs.:(1).q_tot - ᶜspecific.q_tot) * + ᶜρʲs.:(1) * + ᶜJ * + draft_area(Y.c.sgsʲs.:(1).ρa, ᶜρʲs.:(1)), + ) / ᶠJ * (g³³(ᶠgⁱʲ)), + ) + + # grid-mean ∂/∂(rho*a) + ∂ᶜρe_tot_err_∂ᶜρa = + matrix[@name(c.ρe_tot), @name(c.sgsʲs.:(1).ρa)] + @. ∂ᶜρe_tot_err_∂ᶜρa = + dtγ * -(ᶜadvdivᵥ_matrix()) ⋅ DiagonalMatrixRow( + (ᶠu³ʲs.:(1) - ᶠu³) * + ᶠinterp((Y.c.sgsʲs.:(1).mse + ᶜKʲs.:(1) - ᶜh_tot)) / ᶠJ, + ) ⋅ ᶠinterp_matrix() ⋅ DiagonalMatrixRow(ᶜJ) + + ∂ᶜρq_tot_err_∂ᶜρa = + matrix[@name(c.ρq_tot), @name(c.sgsʲs.:(1).ρa)] + @. ∂ᶜρq_tot_err_∂ᶜρa = + dtγ * -(ᶜadvdivᵥ_matrix()) ⋅ DiagonalMatrixRow( + (ᶠu³ʲs.:(1) - ᶠu³) * + ᶠinterp((Y.c.sgsʲs.:(1).q_tot - ᶜspecific.q_tot)) / ᶠJ, + ) ⋅ ᶠinterp_matrix() ⋅ DiagonalMatrixRow(ᶜJ) + end + elseif rs isa RayleighSponge + ∂ᶠu₃ʲ_err_∂ᶠu₃ʲ = + matrix[@name(f.sgsʲs.:(1).u₃), @name(f.sgsʲs.:(1).u₃)] + @. ∂ᶠu₃ʲ_err_∂ᶠu₃ʲ = + dtγ * + -DiagonalMatrixRow( + β_rayleigh_w(rs, ᶠz, zmax) * (one_C3xACT3,), + ) - (I_u₃,) + end + end + + # NOTE: All velocity tendency derivatives should be set BEFORE this call. + zero_velocity_jacobian!(matrix, Y, p, t) +end + +invert_jacobian!(::ApproxJacobian, cache, ΔY, R) = + LinearAlgebra.ldiv!(ΔY, cache.matrix, R) + +# TODO: Rewrite the plotting infrastructure to handle `FieldMatrix`, so that we +# can avoid inefficiently converting the approximate Jacobian to a dense matrix. +function save_jacobian!(alg::ApproxJacobian, cache, Y, dtγ, t) + (; matrix, temp_matrix, temp_matrix_column, column_matrix) = cache + n_columns = length(column_iterator(Y)) + + # TODO: Fix bug in ClimaCore's column function, so that we can use + # @. lazy((matrix + I_matrix) / dtγ) instead of caching this FieldMatrix. + temp_matrix .= (matrix .+ identity_matrix(matrix, Y)) ./ dtγ + + field_matrix_to_dense_matrix!(column_matrix, temp_matrix, Y) + file_name = "approx_jacobian_first" + description = + "Approx ∂Yₜ/∂Y" * (n_columns == 1 ? "" : " at $(first_column_str(Y))") + save_cached_column_matrix_and_vector!(cache, file_name, description, t) + + if n_columns > 1 + level_mapreduce_matrix!(abs, max, temp_matrix_column, temp_matrix) + field_matrix_to_dense_matrix!(column_matrix, temp_matrix_column, Y) + file_name = "approx_jacobian_max" + description = "Approx ∂Yₜ/∂Y, max over all columns" + save_cached_column_matrix_and_vector!(cache, file_name, description, t) + + level_mapreduce_matrix!(abs, +, temp_matrix_column, temp_matrix) + field_matrix_to_dense_matrix!(column_matrix, temp_matrix_column, Y) + column_matrix ./= n_columns + file_name = "approx_jacobian_avg" + description = "Approx ∂Yₜ/∂Y, avg over all columns" + save_cached_column_matrix_and_vector!(cache, file_name, description, t) + end +end + +# TODO: Remove all of the following code after extending ClimaCore.MatrixFields. + +function level_mapreduce_field!(f::F, op::O, field_column, field) where {F, O} + (Nv, Nf) = size(parent(field_column)) + parent_dimensions = length(size(parent(field))) + @assert parent_dimensions in (4, 5) + reshaped_size = parent_dimensions == 4 ? (Nv, 1, Nf, 1) : (Nv, 1, 1, Nf, 1) + reshaped_column_parent = reshape(parent(field_column), reshaped_size...) + if op == + + sum!(f, reshaped_column_parent, parent(field)) + elseif op == max + maximum!(f, reshaped_column_parent, parent(field)) + elseif op == min + minimum!(f, reshaped_column_parent, parent(field)) + else + error("level_mapreduce_field! has not been defined for op = $op") + end +end +level_mapreduce_matrix!(f::F, op::O, matrix_column, matrix) where {F, O} = + foreach(keys(matrix)) do key + matrix[key] isa Fields.Field || return + level_mapreduce_field!(f, op, matrix_column[key], matrix[key]) + end + +tensor_axes_tuple(::Type{T}) where {T} = + T <: Geometry.AxisTensor ? + map(axis -> typeof(axis).parameters[1], axes(T)) : () + +primitive_value_at_index(value, (row_axes, col_axes)) = + if isprimitivetype(typeof(value)) # same as a LinearAlgebra.UniformScaling + row_axes == col_axes ? value : zero(value) + elseif value isa Geometry.AxisVector + @assert isprimitivetype(eltype(value)) + @assert length(row_axes) == 1 && length(col_axes) == 0 + value_axes = tensor_axes_tuple(typeof(value)) + row_axis_index = findfirst(==(row_axes[1]), value_axes[1]) + isnothing(row_axis_index) ? zero(eltype(value)) : value[row_axis_index] + elseif value isa Geometry.AxisTensor + @assert isprimitivetype(eltype(value)) + @assert length(row_axes) == 1 && length(col_axes) == 1 + value_axes = tensor_axes_tuple(typeof(value)) + row_axis_index = findfirst(==(row_axes[1]), value_axes[1]) + col_axis_index = findfirst(==(col_axes[1]), value_axes[2]) + isnothing(row_axis_index) || isnothing(col_axis_index) ? + zero(eltype(value)) : value[row_axis_index, col_axis_index] + elseif value isa LinearAlgebra.Adjoint + primitive_value_at_index(parent(value), (col_axes, row_axes)) + else + sub_names = fieldnames(typeof(value)) + sub_values = + MatrixFields.unrolled_map(Base.Fix1(getfield, value), sub_names) + nonempty_sub_values = + MatrixFields.unrolled_filter(x -> sizeof(x) > 0, sub_values) + @assert length(nonempty_sub_values) == 1 + primitive_value_at_index(nonempty_sub_values[1], (row_axes, col_axes)) + end + +@static if hasfield(Method, :recursion_relation) + for method in methods(primitive_value_at_index) + method.recursion_relation = Returns(true) + end +end + +function field_matrix_to_dense_matrix!(out, matrix, Y) + device = ClimaComms.device(Y.c) # ClimaComms.device(Y) + field_names = scalar_field_names(Y) + index_ranges = scalar_field_index_ranges(Y) + out .= 0 + + for ((block_row, block_col), matrix_block) in matrix + is_child_name_of_row = Base.Fix2(MatrixFields.is_child_name, block_row) + is_child_name_of_col = Base.Fix2(MatrixFields.is_child_name, block_col) + subblock_row_indices = findall(is_child_name_of_row, field_names) + subblock_col_indices = findall(is_child_name_of_col, field_names) + block_row_field = MatrixFields.get_field(Y, block_row) + block_col_field = MatrixFields.get_field(Y, block_col) + + for (sub_row, subblock_row_index) in enumerate(subblock_row_indices) + for (sub_col, subblock_col_index) in enumerate(subblock_col_indices) + row_index_range = index_ranges[subblock_row_index] + col_index_range = index_ranges[subblock_col_index] + out_subblock = view(out, row_index_range, col_index_range) + + if matrix_block isa LinearAlgebra.UniformScaling + view(out_subblock, LinearAlgebra.diagind(out_subblock)) .= + sub_row == sub_col ? matrix_block.λ : + zero(matrix_block.λ) + else + subblock_row_axes = map( + Base.Fix2(getindex, sub_row), + tensor_axes_tuple(eltype(block_row_field)), + ) + subblock_col_axes = map( + Base.Fix2(getindex, sub_col), + tensor_axes_tuple(eltype(block_col_field)), + ) + @assert length(subblock_row_axes) in (0, 1) + @assert length(subblock_col_axes) in (0, 1) + value_in_subblock = Base.Fix2( + primitive_value_at_index, + (subblock_row_axes, subblock_col_axes), + ) + + column_block = first(column_iterator(matrix_block)) + column_subblock = map.(value_in_subblock, column_block) + # TODO: Get rid of this allocation. + + ClimaComms.allowscalar( + copyto!, + device, + out_subblock, + MatrixFields.column_field2array_view(column_subblock), + ) # BandedMatrices.jl does not properly support CuArrays. + end + end + end + end +end diff --git a/src/prognostic_equations/implicit/debug_jacobian.jl b/src/prognostic_equations/implicit/debug_jacobian.jl new file mode 100644 index 0000000000..a7d6dc2ade --- /dev/null +++ b/src/prognostic_equations/implicit/debug_jacobian.jl @@ -0,0 +1,71 @@ +""" + DebugJacobian( + approx_jacobian_algorithm, + use_exact_jacobian, + only_debug_first_column_jacobian, + ) + +A `JacobianAlgorithm` that simultaneously computes an `ExactJacobian` and an +`ApproxJacobian`, so that the quality of the approximation can be assessed. The +`use_exact_jacobian` flag controls whether the exact Jacobian is used in the +implicit solver instead of the approximation, and, when `use_exact_jacobian` is +`false`, the `only_debug_first_column_jacobian` flag controls whether the exact +Jacobian is only evaluated in the first column. +""" +struct DebugJacobian{A <: ApproxJacobian} <: JacobianAlgorithm + approx_jacobian_algorithm::A + use_exact_jacobian::Bool + only_debug_first_column_jacobian::Bool +end + +contains_any_fields(::Union{Fields.Field, Fields.FieldVector}) = true +contains_any_fields(x::T) where {T} = + fieldcount(T) == 0 ? false : unrolled_any(StaticOneTo(fieldcount(T))) do i + contains_any_fields(getfield(x, i)) + end + +first_column(x::Union{Fields.Field, Fields.FieldVector}) = + Fields.column(x, 1, 1, 1) +first_column(x::Union{Tuple, NamedTuple}) = unrolled_map(first_column, x) +first_column(x::T) where {T} = + fieldcount(T) == 0 || !contains_any_fields(x) ? x : + T.name.wrapper( + ntuple(i -> first_column(getfield(x, i)), Val(fieldcount(T)))..., + ) + +required_columns_for_exact_jacobian(alg, x) = + alg.use_exact_jacobian || !alg.only_debug_first_column_jacobian ? x : + first_column(x) + +function jacobian_cache(alg::DebugJacobian, Y, atmos) + Y_or_column = required_columns_for_exact_jacobian(alg, Y) + exact_cache = jacobian_cache(ExactJacobian(), Y_or_column, atmos) + approx_cache = jacobian_cache(alg.approx_jacobian_algorithm, Y, atmos) + return (; exact_cache..., approx_cache...) +end + +update_jacobian!(alg::DebugJacobian, cache, Y, p, dtγ, t) = + alg.use_exact_jacobian ? + update_jacobian!(ExactJacobian(), cache, Y, p, dtγ, t) : + update_jacobian!(alg.approx_jacobian_algorithm, cache, Y, p, dtγ, t) + +function update_and_check_jacobian!(alg::DebugJacobian, cache, Y, p, dtγ, t) + Y_or_column = required_columns_for_exact_jacobian(alg, Y) + p_or_column = required_columns_for_exact_jacobian(alg, p) + update_jacobian!(ExactJacobian(), cache, Y_or_column, p_or_column, dtγ, t) + update_jacobian!(alg.approx_jacobian_algorithm, cache, Y, p, dtγ, t) + # TODO: Add a quantitative check of the Jacobian approximation. +end + +invert_jacobian!(alg::DebugJacobian, cache, ΔY, R) = + alg.use_exact_jacobian ? invert_jacobian!(ExactJacobian(), cache, ΔY, R) : + invert_jacobian!(alg.approx_jacobian_algorithm, cache, ΔY, R) + +function save_jacobian!(alg::DebugJacobian, cache, Y, dtγ, t) + Y_or_column = required_columns_for_exact_jacobian(alg, Y) + save_jacobian!(ExactJacobian(), cache, Y_or_column, dtγ, t) + save_jacobian!(alg.approx_jacobian_algorithm, cache, Y, dtγ, t) + # TODO: Save the average/maximum difference between the approximate and + # exact Jacobians, instead of computing the difference between their + # averages/maxima when plotting. +end diff --git a/src/prognostic_equations/implicit/dual_fixes.jl b/src/prognostic_equations/implicit/dual_fixes.jl new file mode 100644 index 0000000000..fef62efcf2 --- /dev/null +++ b/src/prognostic_equations/implicit/dual_fixes.jl @@ -0,0 +1,174 @@ +# TODO: Move all of the following to ClimaCore.jl + +using ClimaCore: Adapt, Grids +Adapt.@adapt_structure Grids.ColumnGrid + +# Fix broadcasting bug. +# column_style(::Type{S}) where {DS, S <: Fields.FieldStyle{DS}} = +# Fields.FieldStyle{column_style(DS)} +# column_style( +# ::Type{S}, +# ) where {Nv, Ni, A, S <: DataLayouts.VIJFHStyle{Nv, Ni, A}} = +# DataLayouts.VFStyle{Nv, A} +# column_style(::Type{S}) where {Ni, A, S <: DataLayouts.IJFHStyle{Ni, A}} = +# DataLayouts.DataFStyle{A} +# Base.@propagate_inbounds function Fields.column( +# bc::Base.Broadcast.Broadcasted{Style}, +# i, +# j, +# h, +# ) where {Style <: Fields.AbstractFieldStyle} +# _args = Fields.column_args(bc.args, i, j, h) +# _axes = Fields.column(axes(bc), i, j, h) +# Base.Broadcast.Broadcasted{column_style(Style)}(bc.f, _args, _axes) +# end +# Base.@propagate_inbounds function Fields.column( +# bc::DataLayouts.NonExtrudedBroadcasted{Style}, +# i, +# j, +# h, +# ) where {Style <: Fields.AbstractFieldStyle} +# _args = Fields.column_args(bc.args, i, j, h) +# _axes = Fields.column(axes(bc), i, j, h) +# DataLayouts.NonExtrudedBroadcasted{column_style(Style)}(bc.f, _args, _axes) +# end + +# Add missing methods. +# ClimaComms.device(fv::Fields.FieldVector) = +# ClimaComms.device(first(Fields._values(fv))) +# ClimaComms.context(fv::Fields.FieldVector) = +# ClimaComms.context(first(Fields._values(fv))) + +import ClimaCore.DataLayouts: parent_array_type, device_dispatch + +parent_array_type( + ::Type{<:Base.ReshapedArray{T, N, P, MI}}, +) where {T, N, P, MI} = parent_array_type(P) +parent_array_type( + ::Type{<:PermutedDimsArray{T, N, P, IP, A}}, +) where {T, N, P, IP, A} = parent_array_type(A) + +device_dispatch(x::PermutedDimsArray) = device_dispatch(parent(x)) + +# TODO: Reshape column_vectors from (Ni * Nj * Nh) × (Nv * Nf) to the transpose. +function column_vectors_to_field_vector(column_vectors, example_field_vector) + example_fields = values(Fields._values(example_field_vector)) + example_column_fields = unrolled_map(first_column, example_fields) + column_lengths = unrolled_map(length ∘ parent, example_column_fields) + column_range_starts = unrolled_cumsum((1, column_lengths[1:(end - 1)]...)) + column_range_ends = column_range_starts .+ column_lengths .- 1 + column_ranges = + unrolled_map(UnitRange, column_range_starts, column_range_ends) + new_fields = unrolled_map( + example_fields, + column_ranges, + ) do example_field, column_range + new_data_layout = column_vectors_to_data_layout( + view(column_vectors, :, column_range), + Fields.field_values(example_field), + ) + Fields.Field(new_data_layout, axes(example_field)) + end + return Fields.FieldVector{eltype(column_vectors)}(new_fields) +end + +import ClimaCore: DataLayouts +import ClimaCore.DataLayouts: replace_basetype, union_all, singleton +import ClimaCore.DataLayouts: type_params, farray_size, universal_size + +# This is no longer needed, but it would still be good to fix. +# function array2data(array::AbstractArray, data::DataLayouts.AbstractData) +# T = replace_basetype(eltype(parent(data)), eltype(array), eltype(data)) +# return union_all(singleton(data)){T, Base.tail(type_params(data))...}( +# reshape(array, farray_size(data)...), +# ) +# end + +function column_vectors_to_data_layout(array, data) + T = replace_basetype(eltype(parent(data)), eltype(array), eltype(data)) + return union_all(singleton(data)){T, Base.tail(type_params(data))...}( + reshaped_column_vectors(array, data), + ) +end + +# TODO: Use TransmuteDims.jl to improve performance. +reshaped_column_vectors(array, data::DataLayouts.VF) = + reshape(array, get_Nv(data), :) +reshaped_column_vectors(array, data::DataLayouts.IHF) = + reshape(array, get_Ni(data), get_Nh(data), :) +reshaped_column_vectors(array, data::DataLayouts.IFH) = + PermutedDimsArray(reshape(array, get_Ni(data), get_Nh(data), :), (1, 3, 2)) +reshaped_column_vectors(array, data::DataLayouts.IJHF) = + reshape(array, get_Ni(data), get_Nj(data), get_Nh(data), :) +reshaped_column_vectors(array, data::DataLayouts.IJFH) = PermutedDimsArray( + reshape(array, get_Ni(data), get_Nj(data), get_Nh(data), :), + (1, 2, 4, 3), +) +reshaped_column_vectors(array, data::DataLayouts.VIHF) = PermutedDimsArray( + reshape(array, get_Ni(data), get_Nh(data), get_Nv(data), :), + (3, 1, 2, 4), +) +reshaped_column_vectors(array, data::DataLayouts.VIFH) = PermutedDimsArray( + reshape(array, get_Ni(data), get_Nh(data), get_Nv(data), :), + (3, 1, 4, 2), +) +reshaped_column_vectors(array, data::DataLayouts.VIJHF) = PermutedDimsArray( + reshape(array, get_Ni(data), get_Nj(data), get_Nh(data), get_Nv(data), :), + (4, 1, 2, 3, 5), +) +reshaped_column_vectors(array, data::DataLayouts.VIJFH) = PermutedDimsArray( + reshape(array, get_Ni(data), get_Nj(data), get_Nh(data), get_Nv(data), :), + (4, 1, 2, 5, 3), +) +get_Ni(data) = universal_size(data)[1] +get_Nj(data) = universal_size(data)[2] +get_Nv(data) = universal_size(data)[4] +get_Nh(data) = universal_size(data)[5] + +scalar_field_names(field_vector) = + MatrixFields.filtered_names(field_vector) do x + x isa Fields.Field && eltype(x) == eltype(field_vector) + end + +function scalar_level_iterator(field_vector) + Iterators.flatmap(scalar_field_names(field_vector)) do name + field = MatrixFields.get_field(field_vector, name) + if field isa Fields.SpectralElementField + (field,) + else + Iterators.map(1:Spaces.nlevels(axes(field))) do v + Fields.level(field, v - 1 + Operators.left_idx(axes(field))) + end + end + end +end + +function scalar_field_index_ranges(field_vector) + field_names = scalar_field_names(field_vector) + last_level_indices = accumulate(field_names; init = 0) do index, name + field = MatrixFields.get_field(field_vector, name) + n_levels = + field isa Fields.SpectralElementField ? 1 : + Spaces.nlevels(axes(field)) + index + n_levels + end + first_level_indices = (1, (last_level_indices[1:(end - 1)] .+ 1)...) + return map(UnitRange, first_level_indices, last_level_indices) +end + +function column_iterator_indices(field) + axes(field) isa Union{Spaces.PointSpace, Spaces.FiniteDifferenceSpace} && + return ((1, 1, 1),) + horz_space = Spaces.horizontal_space(axes(field)) + qs = 1:Quadratures.degrees_of_freedom(Spaces.quadrature_style(horz_space)) + hs = Spaces.eachslabindex(horz_space) + return horz_space isa Spaces.SpectralElementSpace1D ? + Iterators.product(qs, hs) : Iterators.product(qs, qs, hs) +end +column_iterator_indices(field_vector::Fields.FieldVector) = + column_iterator_indices(first(Fields._values(field_vector))) + +column_iterator(iterable) = + Iterators.map(column_iterator_indices(iterable)) do (indices...,) + Fields.column(iterable, indices...) + end diff --git a/src/prognostic_equations/implicit/exact_jacobian.jl b/src/prognostic_equations/implicit/exact_jacobian.jl new file mode 100644 index 0000000000..77b1fe17fb --- /dev/null +++ b/src/prognostic_equations/implicit/exact_jacobian.jl @@ -0,0 +1,190 @@ +""" + ExactJacobian([batch_size]) + +A `JacobianAlgorithm` that computes the `ImplicitEquationJacobian` using +forward-mode automatic differentiation and inverts it using LU factorization. +The `batch_size` specifies how many derivatives are computed simultaneously. +""" +struct ExactJacobian{N} <: JacobianAlgorithm end +ExactJacobian(batch_size = 32) = ExactJacobian{batch_size}() + +batch_size(::ExactJacobian{N}) where {N} = N + +function jacobian_cache(alg::ExactJacobian, Y, atmos) + FT = eltype(Y) + DA = ClimaComms.array_type(Y) + Y_columns = column_iterator(Y) + n_columns = length(Y_columns) + n_εs = length(first(Y_columns)) + dual_type = ForwardDiff.Dual{ExactJacobian, FT, batch_size(alg)} + + similar_with_dual_fields(named_tuple) = + Fields._values(similar(Fields.FieldVector(; named_tuple...), dual_type)) + + Y_dual = similar(Y, dual_type) + Yₜ_dual = similar(Y_dual) + precomputed_dual = + similar_with_dual_fields(implicit_precomputed_quantities(Y, atmos)) + scratch_dual = similar_with_dual_fields(temporary_quantities(Y, atmos)) + + column_matrices = DA{FT}(undef, n_columns, n_εs, n_εs) + column_lu_factors = copy(column_matrices) + column_lu_solve_vectors = DA{FT}(undef, n_columns, n_εs) + lu_cache = DA{FT}(undef, n_columns) + + # LinearAlgebra.I does not support broadcasting, so we need a workaround. + I_matrix = DA{FT}(undef, 1, n_εs, n_εs) + I_matrix .= 0 + view(I_matrix, 1, :, :)[LinearAlgebra.diagind(view(I_matrix, 1, :, :))] .= 1 + + return (; + Y_dual, + Yₜ_dual, + precomputed_dual, + scratch_dual, + column_matrices, + column_lu_factors, + column_lu_solve_vectors, + lu_cache, + I_matrix, + ) +end + +function update_jacobian!(alg::ExactJacobian, cache, Y, p, dtγ, t) + (; Y_dual, Yₜ_dual, precomputed_dual, scratch_dual) = cache + (; column_matrices, column_lu_factors, lu_cache, I_matrix) = cache + + p_dual_args = ntuple(Val(fieldcount(typeof(p)))) do cache_field_index + cache_field_name = fieldname(typeof(p), cache_field_index) + if cache_field_name == :precomputed + (; p.precomputed..., precomputed_dual...) + elseif cache_field_name == :scratch + scratch_dual + else + getfield(p, cache_field_index) + end + end + p_dual = AtmosCache(p_dual_args...) + + Y_dual_scalar_levels = scalar_level_iterator(Y_dual) + level_batches = + Iterators.partition(enumerate(Y_dual_scalar_levels), batch_size(alg)) + + Y_dual .= Y + for level_batch in level_batches + for (partial_index, (_, Y_dual_scalar_level)) in enumerate(level_batch) + partials = + ntuple(i -> i == partial_index ? 1 : 0, Val(batch_size(alg))) + parent(Y_dual_scalar_level) .+= + ForwardDiff.Dual{ExactJacobian}(0, partials...) + end # Add a unique ε to Y_dual for each combination of scalar and level. + set_implicit_precomputed_quantities!(Y_dual, p_dual, t) # Compute ∂p/∂Y. + implicit_tendency!(Yₜ_dual, Y_dual, p_dual, t) # Compute ∂Yₜ/∂Y. + for (partial_index, (ε_index, _)) in enumerate(level_batch) + ε_column_vectors = view(column_matrices, :, :, ε_index) + column_vectors_to_field_vector(ε_column_vectors, Y) .= + getindex.(ForwardDiff.partials.(Yₜ_dual), partial_index) + end # Copy the new values of ∂Yₜ/∂Y into column_matrices. + Y_dual .= ForwardDiff.value.(Y_dual) # Drop this batch's εs from Y_dual. + end + + column_lu_factors .= dtγ .* column_matrices .- I_matrix + parallel_lu_factorize!(column_lu_factors, lu_cache) +end + +function invert_jacobian!(alg::ExactJacobian, cache, ΔY, R) + (; column_lu_solve_vectors, column_lu_factors, lu_cache) = cache + column_vectors_to_field_vector(column_lu_solve_vectors, R) .= R + parallel_lu_solve!(column_lu_solve_vectors, column_lu_factors, lu_cache) + ΔY .= column_vectors_to_field_vector(column_lu_solve_vectors, ΔY) +end + +function save_jacobian!(alg::ExactJacobian, cache, Y, dtγ, t) + (; column_matrices, column_matrix) = cache + (n_columns, n_εs, _) = size(column_matrices) + + column_matrix .= view(column_matrices, 1, :, :) + file_name = "exact_jacobian_first" + title = "Exact ∂Yₜ/∂Y$(n_columns == 1 ? "" : " at $(first_column_str(Y))")" + save_cached_column_matrix_and_vector!(cache, file_name, title, t) + + if n_columns > 1 + maximum!(abs, reshape(column_matrix, 1, n_εs, n_εs), column_matrices) + file_name = "exact_jacobian_max" + title = "Exact ∂Yₜ/∂Y, max over all columns" + save_cached_column_matrix_and_vector!(cache, file_name, title, t) + + sum!(abs, reshape(column_matrix, 1, n_εs, n_εs), column_matrices) + column_matrix ./= n_columns + file_name = "exact_jacobian_avg" + title = "Exact ∂Yₜ/∂Y, avg over all columns" + save_cached_column_matrix_and_vector!(cache, file_name, title, t) + end +end + +# Set the derivative of `sqrt(x)` to `iszero(x) ? zero(x) : inv(2 * sqrt(x))` in +# order to properly handle derivatives of `x * sqrt(x)`. Without this change, +# the derivative of `x * sqrt(x)` is `NaN` when `x` is zero. This method +# specializes on the tag `ExactJacobian` because not specializing on any tag +# overwrites the generic method for `Dual` in `ForwardDiff` and breaks +# precompilation, while specializing on the default tag `Nothing` causes the +# type piracy Aqua test to fail. +@inline function Base.sqrt(d::ForwardDiff.Dual{ExactJacobian}) + tag = Val{ExactJacobian}() + x = ForwardDiff.value(d) + partials = ForwardDiff.partials(d) + val = sqrt(x) + deriv = iszero(x) ? zero(x) : inv(2 * val) + return ForwardDiff.dual_definition_retval(tag, val, deriv, partials) +end + +# TODO: Reshape column_matrices and turn this into a single kernel launch. +function parallel_lu_factorize!(column_matrices, temporary_vector) + @assert ndims(column_matrices) == 3 + n = size(column_matrices, 2) + @assert size(column_matrices, 3) == n + @inbounds for k in 1:n + all(!isnan, view(column_matrices, :, k, k)) || + error("LU error: NaN on diagonal") + all(!iszero, view(column_matrices, :, k, k)) || + error("LU error: 0 on diagonal") + temporary_vector .= inv.(view(column_matrices, :, k, k)) + for i in (k + 1):n + view(column_matrices, :, i, k) .*= temporary_vector + end + for j in (k + 1):n + for i in (k + 1):n + view(column_matrices, :, i, j) .-= + view(column_matrices, :, i, k) .* + view(column_matrices, :, k, j) + end + end + end +end + +# TODO: Reshape column_matrices and turn this into a single kernel launch. +function parallel_lu_solve!(column_vectors, column_matrices, temporary_vector) + @assert ndims(column_vectors) == 2 && ndims(column_matrices) == 3 + n = size(column_matrices, 2) + @assert size(column_vectors, 2) == n && size(column_matrices, 3) == n + @inbounds begin + for i in 2:n + temporary_vector .= zero(eltype(column_vectors)) + for j in 1:(i - 1) + temporary_vector .+= + view(column_matrices, :, i, j) .* view(column_vectors, :, j) + end + view(column_vectors, :, i) .-= temporary_vector + end + view(column_vectors, :, n) ./= view(column_matrices, :, n, n) + for i in (n - 1):-1:1 + temporary_vector .= zero(eltype(column_vectors)) + for j in (i + 1):n + temporary_vector .+= + view(column_matrices, :, i, j) .* view(column_vectors, :, j) + end + view(column_vectors, :, i) .-= temporary_vector + view(column_vectors, :, i) ./= view(column_matrices, :, i, i) + end + end +end diff --git a/src/prognostic_equations/implicit/implicit_solver.jl b/src/prognostic_equations/implicit/implicit_solver.jl index f5c2b61ce5..a0af084a22 100644 --- a/src/prognostic_equations/implicit/implicit_solver.jl +++ b/src/prognostic_equations/implicit/implicit_solver.jl @@ -1,28 +1,26 @@ -import LinearAlgebra: I, Adjoint, ldiv! +import ForwardDiff import ClimaCore.MatrixFields: @name -using ClimaCore.MatrixFields - -abstract type DerivativeFlag end -struct UseDerivative <: DerivativeFlag end -struct IgnoreDerivative <: DerivativeFlag end -use_derivative(::UseDerivative) = true -use_derivative(::IgnoreDerivative) = false +import ClimaCore.InputOutput: HDF5, HDF5Writer """ - 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``. + JacobianAlgorithm + +A description of how to compute the matrix ``∂R/∂Y``, where ``R(Y)`` denotes the +residual of an implicit step with the state ``Y``. Concrete implementations of +this abstract type should define 4 methods: + - `jacobian_cache(alg::JacobianAlgorithm, Y, atmos)` + - `update_jacobian!(alg::JacobianAlgorithm, cache, Y, p, dtγ, t)` + - `invert_jacobian!(alg::JacobianAlgorithm, cache, ΔY, R)` + - `save_jacobian!(alg::JacobianAlgorithm, cache, Y, p, dtγ, t)` +An additional method can also be defined to enable debugging of the Jacobian: + - `update_and_check_jacobian!(alg::JacobianAlgorithm, cache, Y, p, dtγ, t)` # Background When we use an implicit or split implicit-explicit (IMEX) timestepping scheme, -we end up with a nonlinear equation of the form ``E(Y) = 0``, where +we end up with a nonlinear equation of the form ``R(Y) = 0``, where ```math - E(Y) = Y_{imp}(Y) - Y = \\hat{Y} + Δt * T_{imp}(Y) - Y. + R(Y) = Y_{imp}(Y) - Y = \\hat{Y} + Δt * T_{imp}(Y) - Y. ``` In this expression, ``Y_{imp}(Y)`` denotes the state at some time ``t + Δt``. This can be expressed as the sum of ``\\hat{Y}``, the contribution from the @@ -38,1295 +36,166 @@ divided into several sub-steps or "stages", where the duration of stage ``i`` is ``Δt * γ_i`` for some constant ``γ_i`` between 0 and 1. In order to solve this equation using Newton's method, we must specify the -derivative ``∂E/∂Y``. Since ``\\hat{Y}`` does not depend on ``Y`` (it is only a +derivative ``∂R/∂Y``. Since ``\\hat{Y}`` does not depend on ``Y`` (it is only a function of the state at or before time ``t``), this derivative is ```math - E'(Y) = Δt * T_{imp}'(Y) - I. + R'(Y) = Δt * T_{imp}'(Y) - I. ``` -In addition, we must specify how to divide ``E(Y)`` by this derivative, i.e., +In addition, we must specify how to divide ``R(Y)`` by this derivative, i.e., how to solve the linear equation ```math - E'(Y) * ΔY = E(Y). + R'(Y) * ΔY = R(Y). ``` Note: This equation comes from assuming that there is some ``ΔY`` such that -``E(Y - ΔY) = 0`` and making the first-order approximation +``R(Y - ΔY) = 0`` and making the first-order approximation ```math - E(Y - ΔY) \\approx E(Y) - E'(Y) * ΔY. + R(Y - ΔY) \\approx R(Y) - R'(Y) * ΔY. ``` After initializing ``Y`` to ``Y[0] = \\hat{Y}``, Newton's method executes the following steps: -- Compute the derivative ``E'(Y[0])``. -- Compute the implicit tendency ``T_{imp}(Y[0])`` and use it to get ``E(Y[0])``. -- Solve the linear equation ``E'(Y[0]) * ΔY[0] = E(Y[0])`` for ``ΔY[0]``. +- Compute the derivative ``R'(Y[0])``. +- Compute the implicit tendency ``T_{imp}(Y[0])`` and use it to get ``R(Y[0])``. +- Solve the linear equation ``R'(Y[0]) * ΔY[0] = R(Y[0])`` for ``ΔY[0]``. - Update ``Y`` to ``Y[1] = Y[0] - ΔY[0]``. If the number of Newton iterations is limited to 1, this new value of ``Y`` is taken to be the solution of the implicit equation. Otherwise, this sequence of steps is repeated, i.e., ``ΔY[1]`` is computed and used to update ``Y`` to ``Y[2] = Y[1] - ΔY[1]``, then ``ΔY[2]`` is computed and used to update ``Y`` to ``Y[3] = Y[2] - ΔY[2]``, and so on. The iterative process is terminated either -when the error ``E(Y)`` is sufficiently close to 0 (according to the convergence -condition passed to Newton's method), or when the maximum number of iterations -is reached. - -# Arguments - -- `Y::FieldVector`: the state of the simulation -- `atmos::AtmosModel`: the model configuration -- `approximate_solve_iters::Int`: number of iterations to take for the - approximate linear solve required when `diffusion_flag = UseDerivative()` -- `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 - `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 +when the residual ``R(Y)`` is sufficiently close to 0 (according to the +convergence condition passed to Newton's method), or when the maximum number of +iterations is reached. """ -struct ImplicitEquationJacobian{ - M <: MatrixFields.FieldMatrix, - S <: MatrixFields.FieldMatrixSolver, - F1 <: DerivativeFlag, - F2 <: DerivativeFlag, - F3 <: DerivativeFlag, - F4 <: DerivativeFlag, - F5 <: DerivativeFlag, - F6 <: DerivativeFlag, - T <: Fields.FieldVector, - R <: Base.RefValue, -} - # stores the matrix E'(Y) = Δt * T_imp'(Y) - I - matrix::M +abstract type JacobianAlgorithm end - # solves the linear equation E'(Y) * ΔY = E(Y) for ΔY - solver::S - - # flags that determine how E'(Y) is approximated - diffusion_flag::F1 - topography_flag::F2 - sgs_advection_flag::F3 - sgs_entr_detr_flag::F4 - sgs_nh_pressure_flag::F5 - sgs_mass_flux_flag::F6 - - # required by Krylov.jl to evaluate ldiv! with AbstractVector inputs - temp_b::T - temp_x::T +""" + ImplicitEquationJacobian(alg, Y, atmos, output_dir) - # required by OrdinaryDiffEq.jl to run non-Rosenbrock timestepping schemes - transform_flag::Bool - dtγ_ref::R +Wrapper for a `JacobianAlgorithm` and its cache, which it uses to update and +invert the Jacobian. The `output_dir` is the directory used for saving plots. +""" +struct ImplicitEquationJacobian{A <: JacobianAlgorithm, C} + alg::A + cache::C end - -function Base.zero(jac::ImplicitEquationJacobian) - return ImplicitEquationJacobian( - Base.zero(jac.matrix), - jac.solver, - jac.diffusion_flag, - jac.topography_flag, - jac.sgs_advection_flag, - jac.sgs_entr_detr_flag, - jac.sgs_nh_pressure_flag, - jac.sgs_mass_flux_flag, - jac.temp_b, - jac.temp_x, - jac.transform_flag, - jac.dtγ_ref, +function ImplicitEquationJacobian(alg, Y, atmos, output_dir) + FT = eltype(Y) + DA = ClimaComms.array_type(Y) + Yₜ = similar(Y) + + Y_columns = column_iterator(Y) + n_columns = length(Y_columns) + n_εs = length(first(Y_columns)) + column_vectors = DA{FT}(undef, n_columns, n_εs) + column_matrix = DA{FT}(undef, n_εs, n_εs) + column_vector = DA{FT}(undef, n_εs) + + is_cpu = DA <: Array + cpu_column_matrix = is_cpu ? column_matrix : Array(column_matrix) + cpu_column_vector = is_cpu ? column_vector : Array(column_vector) + + plot_cache = (; + Yₜ, + column_vectors, + column_matrix, + column_vector, + cpu_column_matrix, + cpu_column_vector, + output_dir, ) + krylov_cache = (; ΔY_krylov = similar(Y), R_krylov = similar(Y)) + cache = (; jacobian_cache(alg, Y, atmos)..., plot_cache..., krylov_cache...) + return ImplicitEquationJacobian(alg, cache) end -function ImplicitEquationJacobian( - Y, - atmos; - approximate_solve_iters = 1, - diffusion_flag = atmos.diff_mode == Implicit() ? UseDerivative() : - IgnoreDerivative(), - topography_flag = has_topography(axes(Y.c)) ? UseDerivative() : - IgnoreDerivative(), - sgs_advection_flag = atmos.sgs_adv_mode == Implicit() ? UseDerivative() : - IgnoreDerivative(), - sgs_entr_detr_flag = atmos.sgs_entr_detr_mode == Implicit() ? - UseDerivative() : IgnoreDerivative(), - sgs_nh_pressure_flag = atmos.sgs_nh_pressure_mode == Implicit() ? - UseDerivative() : IgnoreDerivative(), - sgs_mass_flux_flag = atmos.sgs_mf_mode == Implicit() ? UseDerivative() : - IgnoreDerivative(), - transform_flag = false, -) - FT = Spaces.undertype(axes(Y.c)) - CTh = CTh_vector_type(axes(Y.c)) - - DiagonalRow = DiagonalMatrixRow{FT} - TridiagonalRow = TridiagonalMatrixRow{FT} - BidiagonalRow_C3 = BidiagonalMatrixRow{C3{FT}} - TridiagonalRow_ACTh = TridiagonalMatrixRow{Adjoint{FT, CTh{FT}}} - BidiagonalRow_ACT3 = BidiagonalMatrixRow{Adjoint{FT, CT3{FT}}} - BidiagonalRow_C3xACTh = - BidiagonalMatrixRow{typeof(zero(C3{FT}) * zero(CTh{FT})')} - DiagonalRow_C3xACT3 = - DiagonalMatrixRow{typeof(zero(C3{FT}) * zero(CT3{FT})')} - TridiagonalRow_C3xACT3 = - TridiagonalMatrixRow{typeof(zero(C3{FT}) * zero(CT3{FT})')} - - is_in_Y(name) = MatrixFields.has_field(Y, name) - - ρq_tot_if_available = is_in_Y(@name(c.ρq_tot)) ? (@name(c.ρq_tot),) : () - ρatke_if_available = - is_in_Y(@name(c.sgs⁰.ρatke)) ? (@name(c.sgs⁰.ρatke),) : () - sfc_if_available = is_in_Y(@name(sfc)) ? (@name(sfc),) : () - - tracer_names = ( - @name(c.ρq_tot), - @name(c.ρq_liq), - @name(c.ρq_ice), - @name(c.ρq_rai), - @name(c.ρq_sno), - ) - available_tracer_names = MatrixFields.unrolled_filter(is_in_Y, tracer_names) - - # Note: We have to use FT(-1) * I instead of -I because inv(-1) == -1.0, - # which means that multiplying inv(-1) by a Float32 will yield a Float64. - identity_blocks = MatrixFields.unrolled_map( - name -> (name, name) => FT(-1) * I, - (@name(c.ρ), sfc_if_available...), - ) - - active_scalar_names = (@name(c.ρ), @name(c.ρe_tot), ρq_tot_if_available...) - advection_blocks = ( - ( - use_derivative(topography_flag) ? - MatrixFields.unrolled_map( - name -> - (name, @name(c.uₕ)) => - similar(Y.c, TridiagonalRow_ACTh), - active_scalar_names, - ) : () - )..., - MatrixFields.unrolled_map( - name -> (name, @name(f.u₃)) => similar(Y.c, BidiagonalRow_ACT3), - active_scalar_names, - )..., - MatrixFields.unrolled_map( - name -> (@name(f.u₃), name) => similar(Y.f, BidiagonalRow_C3), - active_scalar_names, - )..., - (@name(f.u₃), @name(c.uₕ)) => similar(Y.f, BidiagonalRow_C3xACTh), - (@name(f.u₃), @name(f.u₃)) => similar(Y.f, TridiagonalRow_C3xACT3), - ) - - diffused_scalar_names = (@name(c.ρe_tot), available_tracer_names...) - diffusion_blocks = if use_derivative(diffusion_flag) - ( - MatrixFields.unrolled_map( - name -> (name, @name(c.ρ)) => similar(Y.c, TridiagonalRow), - (diffused_scalar_names..., ρatke_if_available...), - )..., - MatrixFields.unrolled_map( - name -> (name, name) => similar(Y.c, TridiagonalRow), - (diffused_scalar_names..., ρatke_if_available...), - )..., - ( - is_in_Y(@name(c.ρq_tot)) ? - ( - (@name(c.ρe_tot), @name(c.ρq_tot)) => - similar(Y.c, TridiagonalRow), - ) : () - )..., - (@name(c.uₕ), @name(c.uₕ)) => - !isnothing(atmos.turbconv_model) || - !disable_momentum_vertical_diffusion(atmos.vert_diff) ? - similar(Y.c, TridiagonalRow) : FT(-1) * I, - ) - elseif atmos.moisture_model isa DryModel - MatrixFields.unrolled_map( - name -> (name, name) => FT(-1) * I, - (diffused_scalar_names..., ρatke_if_available..., @name(c.uₕ)), - ) - else - ( - MatrixFields.unrolled_map( - name -> (name, name) => similar(Y.c, TridiagonalRow), - diffused_scalar_names, - )..., - (@name(c.ρe_tot), @name(c.ρq_tot)) => - similar(Y.c, TridiagonalRow), - MatrixFields.unrolled_map( - name -> (name, name) => FT(-1) * I, - (ρatke_if_available..., @name(c.uₕ)), - )..., - ) - end - - sgs_scalar_names = ( - @name(c.sgsʲs.:(1).q_tot), - @name(c.sgsʲs.:(1).q_liq), - @name(c.sgsʲs.:(1).q_ice), - @name(c.sgsʲs.:(1).q_rai), - @name(c.sgsʲs.:(1).q_sno), - @name(c.sgsʲs.:(1).mse), - @name(c.sgsʲs.:(1).ρa) - ) - available_sgs_scalar_names = - MatrixFields.unrolled_filter(is_in_Y, sgs_scalar_names) - - sgs_advection_blocks = if atmos.turbconv_model isa PrognosticEDMFX - @assert n_prognostic_mass_flux_subdomains(atmos.turbconv_model) == 1 - - if use_derivative(sgs_advection_flag) - ( - MatrixFields.unrolled_map( - name -> (name, name) => similar(Y.c, TridiagonalRow), - available_sgs_scalar_names, - )..., - (@name(c.sgsʲs.:(1).mse), @name(c.sgsʲs.:(1).q_tot)) => - similar(Y.c, DiagonalRow), - (@name(c.sgsʲs.:(1).ρa), @name(c.sgsʲs.:(1).q_tot)) => - similar(Y.c, TridiagonalRow), - (@name(c.sgsʲs.:(1).ρa), @name(c.sgsʲs.:(1).mse)) => - similar(Y.c, TridiagonalRow), - (@name(c.sgsʲs.:(1).ρa), @name(f.sgsʲs.:(1).u₃)) => - similar(Y.c, BidiagonalRow_ACT3), - (@name(c.sgsʲs.:(1).mse), @name(f.sgsʲs.:(1).u₃)) => - similar(Y.c, BidiagonalRow_ACT3), - (@name(c.sgsʲs.:(1).q_tot), @name(f.sgsʲs.:(1).u₃)) => - similar(Y.c, BidiagonalRow_ACT3), - (@name(f.sgsʲs.:(1).u₃), @name(c.sgsʲs.:(1).q_tot)) => - similar(Y.f, BidiagonalRow_C3), - (@name(f.sgsʲs.:(1).u₃), @name(c.sgsʲs.:(1).mse)) => - similar(Y.f, BidiagonalRow_C3), - (@name(f.sgsʲs.:(1).u₃), @name(f.sgsʲs.:(1).u₃)) => - similar(Y.f, TridiagonalRow_C3xACT3), - ) - else - ( - MatrixFields.unrolled_map( - name -> (name, name) => FT(-1) * I, - available_sgs_scalar_names, - )..., - (@name(f.sgsʲs.:(1).u₃), @name(f.sgsʲs.:(1).u₃)) => - !isnothing(atmos.rayleigh_sponge) ? - similar(Y.f, DiagonalRow_C3xACT3) : FT(-1) * I, - ) - end - else - () - end - - sgs_massflux_blocks = if atmos.turbconv_model isa PrognosticEDMFX - @assert n_prognostic_mass_flux_subdomains(atmos.turbconv_model) == 1 - if use_derivative(sgs_mass_flux_flag) - ( - (@name(c.ρe_tot), @name(c.sgsʲs.:(1).mse)) => - similar(Y.c, TridiagonalRow), - (@name(c.ρq_tot), @name(c.sgsʲs.:(1).q_tot)) => - similar(Y.c, TridiagonalRow), - (@name(c.ρe_tot), @name(f.sgsʲs.:(1).u₃)) => - similar(Y.c, BidiagonalRow_ACT3), - (@name(c.ρq_tot), @name(f.sgsʲs.:(1).u₃)) => - similar(Y.c, BidiagonalRow_ACT3), - (@name(c.ρe_tot), @name(c.sgsʲs.:(1).ρa)) => - similar(Y.c, TridiagonalRow), - (@name(c.ρq_tot), @name(c.sgsʲs.:(1).ρa)) => - similar(Y.c, TridiagonalRow), - ) - else - () - end - else - () - end - - matrix = MatrixFields.FieldMatrix( - identity_blocks..., - sgs_advection_blocks..., - advection_blocks..., - diffusion_blocks..., - sgs_massflux_blocks..., +# ClimaTimeSteppers.jl calls zero(jac_prototype) to initialize the Jacobian, but +# we don't need to allocate a second Jacobian for this (in particular, the exact +# Jacobian can be very expensive to allocate). +Base.zero(jacobian::ImplicitEquationJacobian) = jacobian + +# These are either called by ClimaTimeSteppers.jl before each linear solve, or +# by a callback once every dt_update_exact_jacobian. +NVTX.@annotate update_jacobian!(jacobian, Y, p, dtγ, t) = + update_jacobian!(jacobian.alg, jacobian.cache, Y, p, eltype(Y)(dtγ), t) +NVTX.@annotate update_and_check_jacobian!(jacobian, Y, p, dtγ, t) = + update_and_check_jacobian!( + jacobian.alg, + jacobian.cache, + Y, + p, + eltype(Y)(dtγ), + t, ) - sgs_u³_names_if_available = if atmos.turbconv_model isa PrognosticEDMFX - (@name(f.sgsʲs.:(1).u₃),) - else - () - end - - names₁_group₁ = (@name(c.ρ), sfc_if_available...) - names₁_group₂ = (available_tracer_names..., ρatke_if_available...) - names₁_group₃ = (@name(c.ρe_tot),) - names₁ = ( - names₁_group₁..., - available_sgs_scalar_names..., - names₁_group₂..., - names₁_group₃..., - ) - - alg₂ = MatrixFields.BlockLowerTriangularSolve( - @name(c.uₕ), - sgs_u³_names_if_available..., - ) - alg = - if use_derivative(diffusion_flag) || - use_derivative(sgs_advection_flag) || - !(atmos.moisture_model isa DryModel) - 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( - # TODO: What needs to be changed here for 1M? - @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); - 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 - MatrixFields.BlockArrowheadSolve(names₁...; alg₂) - end - - return ImplicitEquationJacobian( - matrix, - MatrixFields.FieldMatrixSolver(alg, matrix, Y), - diffusion_flag, - topography_flag, - sgs_advection_flag, - sgs_entr_detr_flag, - sgs_nh_pressure_flag, - sgs_mass_flux_flag, - similar(Y), - similar(Y), - transform_flag, - Ref{FT}(), - ) -end - -# We only use A, but ClimaTimeSteppers.jl require us to -# pass jac_prototype and then call similar(jac_prototype) to -# obtain A. This is a workaround to avoid unnecessary allocations. -Base.similar(A::ImplicitEquationJacobian) = A - -# This method specifies how to solve the equation E'(Y) * ΔY = E(Y) for ΔY. -NVTX.@annotate function ldiv!( - x::Fields.FieldVector, - A::ImplicitEquationJacobian, - b::Fields.FieldVector, -) - MatrixFields.field_matrix_solve!(A.solver, x, A.matrix, b) - if A.transform_flag - @. x *= -A.dtγ_ref[] - end -end - -# This method for ldiv! is called by Krylov.jl from inside ClimaTimeSteppers.jl. -# See https://github.com/JuliaSmoothOptimizers/Krylov.jl/issues/605 for a -# related issue that requires the same workaround. -NVTX.@annotate function ldiv!( - x::AbstractVector, - A::ImplicitEquationJacobian, - b::AbstractVector, +# This is called by ClimaTimeSteppers.jl before each linear solve. +NVTX.@annotate LinearAlgebra.ldiv!( + ΔY::Fields.FieldVector, + jacobian::ImplicitEquationJacobian, + R::Fields.FieldVector, +) = invert_jacobian!(jacobian.alg, jacobian.cache, ΔY, R) + +# This is called by Krylov.jl from inside ClimaTimeSteppers.jl. See +# https://github.com/JuliaSmoothOptimizers/Krylov.jl/issues/605 for a related +# issue that requires the same workaround. +function LinearAlgebra.ldiv!( + ΔY::AbstractVector, + jacobian::ImplicitEquationJacobian, + R::AbstractVector, ) - A.temp_b .= b - ldiv!(A.temp_x, A, A.temp_b) - x .= A.temp_x + (; ΔY_krylov, R_krylov) = jacobian.cache + R_krylov .= R + LinearAlgebra.ldiv!(ΔY_krylov, jacobian, R_krylov) + ΔY .= ΔY_krylov end -# This function is used by DiffEqBase.jl instead of ldiv!. -linsolve!(::Type{Val{:init}}, f, u0; kwargs...) = _linsolve! -_linsolve!(x, A, b, update_matrix = false; kwargs...) = ldiv!(x, A, b) +# This is called by a callback once every dt_save_jacobian. +NVTX.@annotate function save_jacobian!(jacobian, Y, p, dtγ, t) + (; Yₜ, column_vectors, column_vector) = jacobian.cache -# This method specifies how to compute E'(Y), which is referred to as "Wfact" in -# DiffEqBase.jl. -NVTX.@annotate function Wfact!(A, Y, p, dtγ, t) - # Remove unnecessary values from p to avoid allocations in bycolumn. - p′ = (; - p.precomputed.ᶜspecific, - p.precomputed.ᶜK, - p.precomputed.ᶠu³, - p.precomputed.ᶜts, - p.precomputed.ᶜp, - p.precomputed.ᶜwₜqₜ, - p.precomputed.ᶜwₕhₜ, - ( - p.atmos.moisture_model isa NonEquilMoistModel ? - (; p.precomputed.ᶜwₗ, p.precomputed.ᶜwᵢ) : (;) - )..., - ( - p.atmos.precip_model isa Microphysics1Moment ? - (; p.precomputed.ᶜwᵣ, p.precomputed.ᶜwₛ) : (;) - )..., - p.precomputed.ᶜh_tot, - ( - use_derivative(A.diffusion_flag) ? - (; p.precomputed.ᶜK_u, p.precomputed.ᶜK_h) : (;) - )..., - ( - use_derivative(A.diffusion_flag) && - p.atmos.turbconv_model isa AbstractEDMF ? - (; p.precomputed.ᶜtke⁰, p.precomputed.ᶜmixing_length) : (;) - )..., - ( - 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.ᶜρʲs, - p.precomputed.ᶠu³ʲs, - p.precomputed.ᶜtsʲs, - p.precomputed.bdmr_l, - p.precomputed.bdmr_r, - p.precomputed.bdmr, - ) : (;) - )..., - ( - use_derivative(A.sgs_entr_detr_flag) && - p.atmos.turbconv_model isa PrognosticEDMFX ? - (; - p.precomputed.ᶜentrʲs, - p.precomputed.ᶜdetrʲs, - p.precomputed.ᶜturb_entrʲs, - ) : (;) - )..., - ( - use_derivative(A.sgs_nh_pressure_flag) && - p.atmos.turbconv_model isa PrognosticEDMFX ? - (; p.precomputed.ᶠu₃⁰,) : (;) - )..., - ( - use_derivative(A.sgs_mass_flux_flag) && - p.atmos.turbconv_model isa PrognosticEDMFX ? - (; p.precomputed.ᶜKʲs) : (;) - )..., - p.core.ᶜΦ, - p.core.ᶠgradᵥ_ᶜΦ, - p.scratch.ᶜtemp_scalar, - p.scratch.ᶜtemp_scalar_2, - p.scratch.ᶜtemp_C3, - p.scratch.ᶠtemp_CT3, - p.scratch.∂ᶜK_∂ᶜuₕ, - p.scratch.∂ᶜK_∂ᶠu₃, - p.scratch.ᶠp_grad_matrix, - p.scratch.ᶜadvection_matrix, - p.scratch.ᶜdiffusion_h_matrix, - p.scratch.ᶜdiffusion_h_matrix_scaled, - p.scratch.ᶜdiffusion_u_matrix, - p.scratch.ᶠbidiagonal_matrix_ct3, - p.scratch.ᶠbidiagonal_matrix_ct3_2, - p.scratch.ᶠtridiagonal_matrix_c3, - p.dt, - p.params, - p.atmos, - ) + # TODO: Add support for MPI reductions, instead of only saving from root. + ClimaComms.iamroot(ClimaComms.context(Y.c)) || return - # Convert dtγ from a Float64 to an FT. - FT = Spaces.undertype(axes(Y.c)) - dtγ′ = FT(float(dtγ)) + implicit_tendency!(Yₜ, Y, p, t) + column_vectors_to_field_vector(column_vectors, Yₜ) .= Yₜ + sum!(abs, reshape(column_vector, 1, :), column_vectors) + n_columns = length(column_iterator(Y)) + column_vector ./= n_columns - A.dtγ_ref[] = dtγ′ - update_implicit_equation_jacobian!(A, Y, p′, dtγ′, t) + save_jacobian!(jacobian.alg, jacobian.cache, Y, eltype(Y)(dtγ), t) end -function update_implicit_equation_jacobian!(A, Y, p, dtγ, t) - dtγ = float(dtγ) - (; - matrix, - diffusion_flag, - sgs_advection_flag, - sgs_entr_detr_flag, - sgs_nh_pressure_flag, - topography_flag, - sgs_mass_flux_flag, - ) = A - (; ᶜspecific, ᶜK, ᶜts, ᶜp, ᶜΦ, ᶠgradᵥ_ᶜΦ, ᶜh_tot) = p - (; - ᶜtemp_C3, - ∂ᶜK_∂ᶜuₕ, - ∂ᶜK_∂ᶠu₃, - ᶠp_grad_matrix, - ᶜadvection_matrix, - ᶠbidiagonal_matrix_ct3, - ᶠbidiagonal_matrix_ct3_2, - ᶠtridiagonal_matrix_c3, - ) = p - (; - ᶜdiffusion_h_matrix, - ᶜdiffusion_h_matrix_scaled, - ᶜdiffusion_u_matrix, - params, - ) = p - (; edmfx_upwinding) = p.atmos.numerics - - FT = Spaces.undertype(axes(Y.c)) - CTh = CTh_vector_type(axes(Y.c)) - one_C3xACT3 = C3(FT(1)) * CT3(FT(1))' - - cv_d = FT(CAP.cv_d(params)) - Δcv_v = FT(CAP.cv_v(params)) - cv_d - T_0 = FT(CAP.T_0(params)) - R_d = FT(CAP.R_d(params)) - ΔR_v = FT(CAP.R_v(params)) - R_d - cp_d = FT(CAP.cp_d(params)) - Δcp_v = FT(CAP.cp_v(params)) - cp_d - # This term appears a few times in the Jacobian, and is technically - # minus ∂e_int_∂q_tot - ∂e_int_∂q_tot = T_0 * (Δcv_v - R_d) - FT(CAP.e_int_v0(params)) - thermo_params = CAP.thermodynamics_params(params) - - ᶜρ = Y.c.ρ - ᶜuₕ = Y.c.uₕ - ᶠu₃ = Y.f.u₃ - ᶜJ = Fields.local_geometry_field(Y.c).J - ᶠJ = Fields.local_geometry_field(Y.f).J - ᶜgⁱʲ = Fields.local_geometry_field(Y.c).gⁱʲ - ᶠgⁱʲ = Fields.local_geometry_field(Y.f).gⁱʲ - ᶠlg = Fields.local_geometry_field(Y.f) - - ᶜkappa_m = p.ᶜtemp_scalar - @. ᶜkappa_m = - TD.gas_constant_air(thermo_params, ᶜts) / TD.cv_m(thermo_params, ᶜts) - - ᶜ∂kappa_m∂q_tot = p.ᶜtemp_scalar_2 - # Using abs2 because ^2 results in allocation - @. ᶜ∂kappa_m∂q_tot = - ( - ΔR_v * TD.cv_m(thermo_params, ᶜts) - - Δcv_v * TD.gas_constant_air(thermo_params, ᶜts) - ) / abs2(TD.cv_m(thermo_params, ᶜts)) - - if use_derivative(topography_flag) - @. ∂ᶜK_∂ᶜuₕ = DiagonalMatrixRow( - adjoint(CTh(ᶜuₕ)) + adjoint(ᶜinterp(ᶠu₃)) * g³ʰ(ᶜgⁱʲ), - ) - else - @. ∂ᶜK_∂ᶜuₕ = DiagonalMatrixRow(adjoint(CTh(ᶜuₕ))) - end - @. ∂ᶜK_∂ᶠu₃ = - ᶜinterp_matrix() ⋅ DiagonalMatrixRow(adjoint(CT3(ᶠu₃))) + - DiagonalMatrixRow(adjoint(CT3(ᶜuₕ))) ⋅ ᶜinterp_matrix() - - @. ᶠp_grad_matrix = DiagonalMatrixRow(-1 / ᶠinterp(ᶜρ)) ⋅ ᶠgradᵥ_matrix() - - @. ᶜadvection_matrix = - -(ᶜadvdivᵥ_matrix()) ⋅ DiagonalMatrixRow(ᶠinterp(ᶜρ * ᶜJ) / ᶠJ) - - if use_derivative(topography_flag) - ∂ᶜρ_err_∂ᶜuₕ = matrix[@name(c.ρ), @name(c.uₕ)] - @. ∂ᶜρ_err_∂ᶜuₕ = - dtγ * ᶜadvection_matrix ⋅ ᶠwinterp_matrix(ᶜJ * ᶜρ) ⋅ - DiagonalMatrixRow(g³ʰ(ᶜgⁱʲ)) - end - ∂ᶜρ_err_∂ᶠu₃ = matrix[@name(c.ρ), @name(f.u₃)] - @. ∂ᶜρ_err_∂ᶠu₃ = dtγ * ᶜadvection_matrix ⋅ DiagonalMatrixRow(g³³(ᶠgⁱʲ)) - - tracer_info = ( - (@name(c.ρe_tot), @name(ᶜh_tot)), - (@name(c.ρq_tot), @name(ᶜspecific.q_tot)), - ) - MatrixFields.unrolled_foreach(tracer_info) do (ρχ_name, χ_name) - MatrixFields.has_field(Y, ρχ_name) || return - ᶜχ = MatrixFields.get_field(p, χ_name) - if use_derivative(topography_flag) - ∂ᶜρχ_err_∂ᶜuₕ = matrix[ρχ_name, @name(c.uₕ)] - end - ∂ᶜρχ_err_∂ᶠu₃ = matrix[ρχ_name, @name(f.u₃)] - use_derivative(topography_flag) && @. ∂ᶜρχ_err_∂ᶜuₕ = - dtγ * ᶜadvection_matrix ⋅ DiagonalMatrixRow(ᶠinterp(ᶜχ)) ⋅ - ᶠwinterp_matrix(ᶜJ * ᶜρ) ⋅ DiagonalMatrixRow(g³ʰ(ᶜgⁱʲ)) - @. ∂ᶜρχ_err_∂ᶠu₃ = - dtγ * ᶜadvection_matrix ⋅ DiagonalMatrixRow(ᶠinterp(ᶜχ) * g³³(ᶠgⁱʲ)) - end - - ∂ᶠu₃_err_∂ᶜρ = matrix[@name(f.u₃), @name(c.ρ)] - ∂ᶠu₃_err_∂ᶜρe_tot = matrix[@name(f.u₃), @name(c.ρe_tot)] - @. ∂ᶠu₃_err_∂ᶜρ = - dtγ * ( - ᶠp_grad_matrix ⋅ - DiagonalMatrixRow(ᶜkappa_m * (T_0 * cp_d - ᶜK - ᶜΦ)) + - DiagonalMatrixRow(ᶠgradᵥ(ᶜp) / abs2(ᶠinterp(ᶜρ))) ⋅ - ᶠinterp_matrix() - ) - @. ∂ᶠu₃_err_∂ᶜρe_tot = dtγ * ᶠp_grad_matrix ⋅ DiagonalMatrixRow(ᶜkappa_m) - if MatrixFields.has_field(Y, @name(c.ρq_tot)) - ∂ᶠu₃_err_∂ᶜρq_tot = matrix[@name(f.u₃), @name(c.ρq_tot)] - @. ∂ᶠu₃_err_∂ᶜρq_tot = - dtγ * ᶠp_grad_matrix ⋅ DiagonalMatrixRow(( - ᶜkappa_m * ∂e_int_∂q_tot + - ᶜ∂kappa_m∂q_tot * ( - cp_d * T_0 + ᶜspecific.e_tot - ᶜK - ᶜΦ + - ∂e_int_∂q_tot * ᶜspecific.q_tot - ) - )) - end - - ∂ᶠu₃_err_∂ᶜuₕ = matrix[@name(f.u₃), @name(c.uₕ)] - ∂ᶠu₃_err_∂ᶠu₃ = matrix[@name(f.u₃), @name(f.u₃)] - I_u₃ = DiagonalMatrixRow(one_C3xACT3) - @. ∂ᶠu₃_err_∂ᶜuₕ = - dtγ * ᶠp_grad_matrix ⋅ DiagonalMatrixRow(-(ᶜkappa_m) * ᶜρ) ⋅ ∂ᶜK_∂ᶜuₕ - rs = p.atmos.rayleigh_sponge - ᶠz = Fields.coordinate_field(Y.f).z - zmax = z_max(axes(Y.f)) - if rs isa RayleighSponge - @. ∂ᶠu₃_err_∂ᶠu₃ = - dtγ * ( - ᶠp_grad_matrix ⋅ DiagonalMatrixRow(-(ᶜkappa_m) * ᶜρ) ⋅ - ∂ᶜK_∂ᶠu₃ + - DiagonalMatrixRow(-β_rayleigh_w(rs, ᶠz, zmax) * (one_C3xACT3,)) - ) - (I_u₃,) +# Helper functions used to implement save_jacobian!. +function first_column_str(Y) + coord_field = + Fields.coordinate_field(Fields.level(Fields.column(Y.c, 1, 1, 1), 1)) + coord = + ClimaComms.allowscalar(getindex, ClimaComms.device(Y.c), coord_field) + round_value(value) = round(value; sigdigits = 3) + return if coord isa Geometry.XZPoint + "x = $(round_value(coord.x)) Meters" + elseif coord isa Geometry.XYZPoint + "x = $(round_value(coord.x)) Meters, y = $(round_value(coord.y)) Meters" + elseif coord isa Geometry.LatLongZPoint + "lat = $(round_value(coord.lat))°, long = $(round_value(coord.long))°" else - @. ∂ᶠu₃_err_∂ᶠu₃ = - dtγ * ᶠp_grad_matrix ⋅ DiagonalMatrixRow(-(ᶜkappa_m) * ᶜρ) ⋅ - ∂ᶜK_∂ᶠu₃ - (I_u₃,) - end - - - tracer_info = ( - (@name(c.ρq_liq), @name(q_liq), @name(ᶜwₗ)), - (@name(c.ρq_ice), @name(q_ice), @name(ᶜwᵢ)), - (@name(c.ρq_rai), @name(q_rai), @name(ᶜwᵣ)), - (@name(c.ρq_sno), @name(q_sno), @name(ᶜwₛ)), - ) - if !(p.atmos.moisture_model isa DryModel) || use_derivative(diffusion_flag) - ∂ᶜρe_tot_err_∂ᶜρe_tot = matrix[@name(c.ρe_tot), @name(c.ρe_tot)] - @. ∂ᶜρe_tot_err_∂ᶜρe_tot = zero(typeof(∂ᶜρe_tot_err_∂ᶜρe_tot)) - (I,) + error("Unrecognized coordinate type $(typeof(coord))") end - - if !(p.atmos.moisture_model isa DryModel) - #TODO: tetsing explicit vs implicit - #@. ∂ᶜρe_tot_err_∂ᶜρe_tot += - # dtγ * -(ᶜprecipdivᵥ_matrix()) ⋅ - # DiagonalMatrixRow(ᶠinterp(ᶜρ * ᶜJ) / ᶠJ) ⋅ ᶠright_bias_matrix() ⋅ - # DiagonalMatrixRow( - # -(1 + ᶜkappa_m) / ᶜρ * ifelse( - # ᶜh_tot == 0, - # (Geometry.WVector(FT(0)),), - # p.ᶜwₕhₜ / ᶜh_tot, - # ), - # ) - - ∂ᶜρe_tot_err_∂ᶜρq_tot = matrix[@name(c.ρe_tot), @name(c.ρq_tot)] - @. ∂ᶜρe_tot_err_∂ᶜρq_tot = zero(typeof(∂ᶜρe_tot_err_∂ᶜρq_tot)) - #TODO: tetsing explicit vs implicit - #@. ∂ᶜρe_tot_err_∂ᶜρq_tot = - # dtγ * -(ᶜprecipdivᵥ_matrix()) ⋅ - # DiagonalMatrixRow(ᶠinterp(ᶜρ * ᶜJ) / ᶠJ) ⋅ ᶠright_bias_matrix() ⋅ - # DiagonalMatrixRow( - # -(ᶜkappa_m) * ∂e_int_∂q_tot / ᶜρ * ifelse( - # ᶜh_tot == 0, - # (Geometry.WVector(FT(0)),), - # p.ᶜwₕhₜ / ᶜh_tot, - # ), - # ) - - ∂ᶜρq_tot_err_∂ᶜρq_tot = matrix[@name(c.ρq_tot), @name(c.ρq_tot)] - @. ∂ᶜρq_tot_err_∂ᶜρq_tot = zero(typeof(∂ᶜρq_tot_err_∂ᶜρq_tot)) - (I,) - #TODO: tetsing explicit vs implicit - #@. ∂ᶜρq_tot_err_∂ᶜρq_tot = - # dtγ * -(ᶜprecipdivᵥ_matrix()) ⋅ - # DiagonalMatrixRow(ᶠinterp(ᶜρ * ᶜJ) / ᶠJ) ⋅ ᶠright_bias_matrix() ⋅ - # DiagonalMatrixRow( - # -1 / ᶜρ * ifelse( - # ᶜspecific.q_tot == 0, - # (Geometry.WVector(FT(0)),), - # p.ᶜwₜqₜ / ᶜspecific.q_tot, - # ), - # ) - (I,) - - MatrixFields.unrolled_foreach(tracer_info) do (ρqₚ_name, _, wₚ_name) - MatrixFields.has_field(Y, ρqₚ_name) || return - ∂ᶜρqₚ_err_∂ᶜρqₚ = matrix[ρqₚ_name, ρqₚ_name] - ᶜwₚ = MatrixFields.get_field(p, wₚ_name) - @. ∂ᶜρqₚ_err_∂ᶜρqₚ = - dtγ * -(ᶜprecipdivᵥ_matrix()) ⋅ - DiagonalMatrixRow(ᶠinterp(ᶜρ * ᶜJ) / ᶠJ) ⋅ - ᶠright_bias_matrix() ⋅ - DiagonalMatrixRow(-Geometry.WVector(ᶜwₚ) / ᶜρ) - (I,) - end - - end - - if use_derivative(diffusion_flag) - α_vert_diff_tracer = CAP.α_vert_diff_tracer(params) - (; ᶜK_h, ᶜK_u) = p - @. ᶜdiffusion_h_matrix = - ᶜadvdivᵥ_matrix() ⋅ DiagonalMatrixRow(ᶠinterp(ᶜρ) * ᶠinterp(ᶜK_h)) ⋅ - ᶠgradᵥ_matrix() - @. ᶜdiffusion_h_matrix_scaled = - ᶜadvdivᵥ_matrix() ⋅ DiagonalMatrixRow( - ᶠinterp(ᶜρ) * ᶠinterp(α_vert_diff_tracer * ᶜK_h), - ) ⋅ ᶠgradᵥ_matrix() - if ( - MatrixFields.has_field(Y, @name(c.sgs⁰.ρatke)) || - !isnothing(p.atmos.turbconv_model) || - !disable_momentum_vertical_diffusion(p.atmos.vert_diff) - ) - @. ᶜdiffusion_u_matrix = - ᶜadvdivᵥ_matrix() ⋅ - DiagonalMatrixRow(ᶠinterp(ᶜρ) * ᶠinterp(ᶜK_u)) ⋅ ᶠgradᵥ_matrix() - end - - ∂ᶜρe_tot_err_∂ᶜρ = matrix[@name(c.ρe_tot), @name(c.ρ)] - @. ∂ᶜρe_tot_err_∂ᶜρ = - dtγ * ᶜdiffusion_h_matrix ⋅ DiagonalMatrixRow( - ( - -(1 + ᶜkappa_m) * ᶜspecific.e_tot - - ᶜkappa_m * ∂e_int_∂q_tot * ᶜspecific.q_tot - ) / ᶜρ, - ) - @. ∂ᶜρe_tot_err_∂ᶜρe_tot += - dtγ * ᶜdiffusion_h_matrix ⋅ DiagonalMatrixRow((1 + ᶜkappa_m) / ᶜρ) - - if MatrixFields.has_field(Y, @name(c.ρq_tot)) - ∂ᶜρe_tot_err_∂ᶜρq_tot = matrix[@name(c.ρe_tot), @name(c.ρq_tot)] - ∂ᶜρq_tot_err_∂ᶜρ = matrix[@name(c.ρq_tot), @name(c.ρ)] - @. ∂ᶜρe_tot_err_∂ᶜρq_tot += - dtγ * ᶜdiffusion_h_matrix ⋅ DiagonalMatrixRow(( - ᶜkappa_m * ∂e_int_∂q_tot / ᶜρ + - ᶜ∂kappa_m∂q_tot * ( - cp_d * T_0 + ᶜspecific.e_tot - ᶜK - ᶜΦ + - ∂e_int_∂q_tot * ᶜspecific.q_tot - ) - )) - @. ∂ᶜρq_tot_err_∂ᶜρ = - dtγ * ᶜdiffusion_h_matrix ⋅ - DiagonalMatrixRow(-(ᶜspecific.q_tot) / ᶜρ) - @. ∂ᶜρq_tot_err_∂ᶜρq_tot += - dtγ * ᶜdiffusion_h_matrix ⋅ DiagonalMatrixRow(1 / ᶜρ) - end - - - MatrixFields.unrolled_foreach(tracer_info) do (ρq_name, q_name, _) - MatrixFields.has_field(Y, ρq_name) || return - ᶜq = MatrixFields.get_field(ᶜspecific, q_name) - ∂ᶜρq_err_∂ᶜρ = matrix[ρq_name, @name(c.ρ)] - ∂ᶜρq_err_∂ᶜρq = matrix[ρq_name, ρq_name] - ᶜtridiagonal_matrix_scalar = ifelse( - q_name in (@name(q_rai), @name(q_sno)), - ᶜdiffusion_h_matrix_scaled, - ᶜdiffusion_h_matrix, - ) - @. ∂ᶜρq_err_∂ᶜρ = - dtγ * ᶜtridiagonal_matrix_scalar ⋅ DiagonalMatrixRow(-(ᶜq) / ᶜρ) - @. ∂ᶜρq_err_∂ᶜρq += - dtγ * ᶜtridiagonal_matrix_scalar ⋅ DiagonalMatrixRow(1 / ᶜρ) - end - - if MatrixFields.has_field(Y, @name(c.sgs⁰.ρatke)) - turbconv_params = CAP.turbconv_params(params) - c_d = CAP.tke_diss_coeff(turbconv_params) - (; ᶜtke⁰, ᶜmixing_length, dt) = p - ᶜρa⁰ = p.atmos.turbconv_model isa PrognosticEDMFX ? p.ᶜρa⁰ : ᶜρ - ᶜρatke⁰ = Y.c.sgs⁰.ρatke - - @inline dissipation_rate(tke⁰, mixing_length) = - tke⁰ >= 0 ? c_d * sqrt(tke⁰) / max(mixing_length, 1) : - 1 / float(dt) - @inline ∂dissipation_rate_∂tke⁰(tke⁰, mixing_length) = - tke⁰ > 0 ? c_d / (2 * max(mixing_length, 1) * sqrt(tke⁰)) : - typeof(tke⁰)(0) - - ᶜdissipation_matrix_diagonal = p.ᶜtemp_scalar - @. ᶜdissipation_matrix_diagonal = - ᶜρatke⁰ * ∂dissipation_rate_∂tke⁰(ᶜtke⁰, ᶜmixing_length) - - ∂ᶜρatke⁰_err_∂ᶜρ = matrix[@name(c.sgs⁰.ρatke), @name(c.ρ)] - ∂ᶜρatke⁰_err_∂ᶜρatke⁰ = - matrix[@name(c.sgs⁰.ρatke), @name(c.sgs⁰.ρatke)] - @. ∂ᶜρatke⁰_err_∂ᶜρ = - dtγ * ( - ᶜdiffusion_u_matrix - - DiagonalMatrixRow(ᶜdissipation_matrix_diagonal) - ) ⋅ DiagonalMatrixRow(-(ᶜtke⁰) / ᶜρa⁰) - @. ∂ᶜρatke⁰_err_∂ᶜρatke⁰ = - dtγ * ( - ( - ᶜdiffusion_u_matrix - - DiagonalMatrixRow(ᶜdissipation_matrix_diagonal) - ) ⋅ DiagonalMatrixRow(1 / ᶜρa⁰) - - DiagonalMatrixRow(dissipation_rate(ᶜtke⁰, ᶜmixing_length)) - ) - (I,) - end - - if ( - !isnothing(p.atmos.turbconv_model) || - !disable_momentum_vertical_diffusion(p.atmos.vert_diff) - ) - ∂ᶜuₕ_err_∂ᶜuₕ = matrix[@name(c.uₕ), @name(c.uₕ)] - @. ∂ᶜuₕ_err_∂ᶜuₕ = - dtγ * DiagonalMatrixRow(1 / ᶜρ) ⋅ ᶜdiffusion_u_matrix - (I,) - end - +end +function save_cached_column_matrix_and_vector!(cache, file_name, title, t) + (; Yₜ, column_matrix, column_vector, output_dir) = cache + (; cpu_column_matrix, cpu_column_vector) = cache + if !(column_matrix isa Array) + copyto!(cpu_column_matrix, column_matrix) + copyto!(cpu_column_vector, column_vector) end - - if p.atmos.turbconv_model isa PrognosticEDMFX - - if use_derivative(sgs_advection_flag) - (; ᶜgradᵥ_ᶠΦ, ᶜρʲs, ᶠu³ʲs, ᶜtsʲs) = p - (; bdmr_l, bdmr_r, bdmr) = p - is_third_order = edmfx_upwinding == Val(:third_order) - ᶠupwind = is_third_order ? ᶠupwind3 : ᶠupwind1 - ᶠset_upwind_bcs = Operators.SetBoundaryOperator(; - top = Operators.SetValue(zero(CT3{FT})), - bottom = Operators.SetValue(zero(CT3{FT})), - ) # Need to wrap ᶠupwind in this for well-defined boundaries. - UpwindMatrixRowType = - is_third_order ? QuaddiagonalMatrixRow : BidiagonalMatrixRow - ᶠupwind_matrix = is_third_order ? ᶠupwind3_matrix : ᶠupwind1_matrix - ᶠset_upwind_matrix_bcs = Operators.SetBoundaryOperator(; - top = Operators.SetValue(zero(UpwindMatrixRowType{CT3{FT}})), - bottom = Operators.SetValue(zero(UpwindMatrixRowType{CT3{FT}})), - ) # Need to wrap ᶠupwind_matrix in this for well-defined boundaries. - - ᶠu³ʲ_data = ᶠu³ʲs.:(1).components.data.:1 - ᶜkappa_mʲ = p.ᶜtemp_scalar - @. ᶜkappa_mʲ = - TD.gas_constant_air(thermo_params, ᶜtsʲs.:(1)) / - TD.cv_m(thermo_params, ᶜtsʲs.:(1)) - - # Note this is the derivative of R_m / cp_m with respect to q_tot - # but we call it ∂kappa_m∂q_totʲ - ᶜ∂kappa_m∂q_totʲ = p.ᶜtemp_scalar_2 - @. ᶜ∂kappa_m∂q_totʲ = - ( - ΔR_v * TD.cp_m(thermo_params, ᶜtsʲs.:(1)) - - Δcp_v * TD.gas_constant_air(thermo_params, ᶜtsʲs.:(1)) - ) / abs2(TD.cp_m(thermo_params, ᶜtsʲs.:(1))) - - turbconv_params = CAP.turbconv_params(params) - α_b = CAP.pressure_normalmode_buoy_coeff1(turbconv_params) - - ∂ᶜq_totʲ_err_∂ᶜq_totʲ = - matrix[@name(c.sgsʲs.:(1).q_tot), @name(c.sgsʲs.:(1).q_tot)] - @. ∂ᶜq_totʲ_err_∂ᶜq_totʲ = - dtγ * ( - DiagonalMatrixRow(ᶜadvdivᵥ(ᶠu³ʲs.:(1))) - - ᶜadvdivᵥ_matrix() ⋅ - ᶠset_upwind_matrix_bcs(ᶠupwind_matrix(ᶠu³ʲs.:(1))) - ) - (I,) - - ∂ᶜq_totʲ_err_∂ᶠu₃ʲ = - matrix[@name(c.sgsʲs.:(1).q_tot), @name(f.sgsʲs.:(1).u₃)] - - @. ∂ᶜq_totʲ_err_∂ᶠu₃ʲ = - dtγ * ( - -(ᶜadvdivᵥ_matrix()) ⋅ DiagonalMatrixRow( - ᶠset_upwind_bcs( - ᶠupwind(CT3(sign(ᶠu³ʲ_data)), Y.c.sgsʲs.:(1).q_tot), - ) * adjoint(C3(sign(ᶠu³ʲ_data))), - ) + - DiagonalMatrixRow(Y.c.sgsʲs.:(1).q_tot) ⋅ ᶜadvdivᵥ_matrix() - ) ⋅ DiagonalMatrixRow(g³³(ᶠgⁱʲ)) - - - ∂ᶜmseʲ_err_∂ᶜq_totʲ = - matrix[@name(c.sgsʲs.:(1).mse), @name(c.sgsʲs.:(1).q_tot)] - @. ∂ᶜmseʲ_err_∂ᶜq_totʲ = - dtγ * ( - -DiagonalMatrixRow( - adjoint(ᶜinterp(ᶠu³ʲs.:(1))) * ᶜgradᵥ_ᶠΦ * Y.c.ρ / ᶜp * - ( - (ᶜkappa_mʲ / (ᶜkappa_mʲ + 1) * ∂e_int_∂q_tot) + - ᶜ∂kappa_m∂q_totʲ * ( - Y.c.sgsʲs.:(1).mse - ᶜΦ + - cp_d * T_0 + - ∂e_int_∂q_tot * Y.c.sgsʲs.:(1).q_tot - ) - ), - ) - ) - - ∂ᶜmseʲ_err_∂ᶠu₃ʲ = - matrix[@name(c.sgsʲs.:(1).mse), @name(f.sgsʲs.:(1).u₃)] - @. ∂ᶜmseʲ_err_∂ᶠu₃ʲ = - dtγ * ( - -(ᶜadvdivᵥ_matrix()) ⋅ DiagonalMatrixRow( - ᶠset_upwind_bcs( - ᶠupwind(CT3(sign(ᶠu³ʲ_data)), Y.c.sgsʲs.:(1).mse), - ) * adjoint(C3(sign(ᶠu³ʲ_data))), - ) + - DiagonalMatrixRow(Y.c.sgsʲs.:(1).mse) ⋅ ᶜadvdivᵥ_matrix() - ) ⋅ DiagonalMatrixRow(g³³(ᶠgⁱʲ)) - - ∂ᶜmseʲ_err_∂ᶜmseʲ = - matrix[@name(c.sgsʲs.:(1).mse), @name(c.sgsʲs.:(1).mse)] - @. ∂ᶜmseʲ_err_∂ᶜmseʲ = - dtγ * ( - DiagonalMatrixRow(ᶜadvdivᵥ(ᶠu³ʲs.:(1))) - - ᶜadvdivᵥ_matrix() ⋅ - ᶠset_upwind_matrix_bcs(ᶠupwind_matrix(ᶠu³ʲs.:(1))) - - DiagonalMatrixRow( - adjoint(ᶜinterp(ᶠu³ʲs.:(1))) * - ᶜgradᵥ_ᶠΦ * - Y.c.ρ * - ᶜkappa_mʲ / ((ᶜkappa_mʲ + 1) * ᶜp), - ) - ) - (I,) - - ∂ᶜρaʲ_err_∂ᶜq_totʲ = - matrix[@name(c.sgsʲs.:(1).ρa), @name(c.sgsʲs.:(1).q_tot)] - @. ᶠbidiagonal_matrix_ct3 = - DiagonalMatrixRow( - ᶠset_upwind_bcs( - ᶠupwind( - ᶠu³ʲs.:(1), - draft_area(Y.c.sgsʲs.:(1).ρa, ᶜρʲs.:(1)), - ), - ) / ᶠJ, - ) ⋅ ᶠinterp_matrix() ⋅ DiagonalMatrixRow( - ᶜJ * (ᶜρʲs.:(1))^2 / ᶜp * ( - ᶜkappa_mʲ / (ᶜkappa_mʲ + 1) * ∂e_int_∂q_tot + - ᶜ∂kappa_m∂q_totʲ * ( - Y.c.sgsʲs.:(1).mse - ᶜΦ + - cp_d * T_0 + - ∂e_int_∂q_tot * Y.c.sgsʲs.:(1).q_tot - ) - ), - ) - @. ᶠbidiagonal_matrix_ct3_2 = - DiagonalMatrixRow(ᶠinterp(ᶜρʲs.:(1) * ᶜJ) / ᶠJ) ⋅ - ᶠset_upwind_matrix_bcs(ᶠupwind_matrix(ᶠu³ʲs.:(1))) ⋅ - DiagonalMatrixRow( - Y.c.sgsʲs.:(1).ρa * ᶜkappa_mʲ / ((ᶜkappa_mʲ + 1) * ᶜp) * - ∂e_int_∂q_tot, - ) - - @. ∂ᶜρaʲ_err_∂ᶜq_totʲ = - dtγ * ᶜadvdivᵥ_matrix() ⋅ - (ᶠbidiagonal_matrix_ct3 - ᶠbidiagonal_matrix_ct3_2) - ∂ᶜρaʲ_err_∂ᶜmseʲ = - matrix[@name(c.sgsʲs.:(1).ρa), @name(c.sgsʲs.:(1).mse)] - @. ᶠbidiagonal_matrix_ct3 = - DiagonalMatrixRow( - ᶠset_upwind_bcs( - ᶠupwind( - ᶠu³ʲs.:(1), - draft_area(Y.c.sgsʲs.:(1).ρa, ᶜρʲs.:(1)), - ), - ) / ᶠJ, - ) ⋅ ᶠinterp_matrix() ⋅ DiagonalMatrixRow( - ᶜJ * ᶜkappa_mʲ * (ᶜρʲs.:(1))^2 / ((ᶜkappa_mʲ + 1) * ᶜp), - ) - @. ᶠbidiagonal_matrix_ct3_2 = - DiagonalMatrixRow(ᶠinterp(ᶜρʲs.:(1) * ᶜJ) / ᶠJ) ⋅ - ᶠset_upwind_matrix_bcs(ᶠupwind_matrix(ᶠu³ʲs.:(1))) ⋅ - DiagonalMatrixRow( - Y.c.sgsʲs.:(1).ρa * ᶜkappa_mʲ / ((ᶜkappa_mʲ + 1) * ᶜp), - ) - @. ∂ᶜρaʲ_err_∂ᶜmseʲ = - dtγ * ᶜadvdivᵥ_matrix() ⋅ - (ᶠbidiagonal_matrix_ct3 - ᶠbidiagonal_matrix_ct3_2) - ∂ᶜρaʲ_err_∂ᶜρaʲ = - matrix[@name(c.sgsʲs.:(1).ρa), @name(c.sgsʲs.:(1).ρa)] - @. ᶜadvection_matrix = - -(ᶜadvdivᵥ_matrix()) ⋅ - DiagonalMatrixRow(ᶠinterp(ᶜρʲs.:(1) * ᶜJ) / ᶠJ) - @. ∂ᶜρaʲ_err_∂ᶜρaʲ = - dtγ * ᶜadvection_matrix ⋅ - ᶠset_upwind_matrix_bcs(ᶠupwind_matrix(ᶠu³ʲs.:(1))) ⋅ - DiagonalMatrixRow(1 / ᶜρʲs.:(1)) - (I,) - - - ∂ᶜρaʲ_err_∂ᶠu₃ʲ = - matrix[@name(c.sgsʲs.:(1).ρa), @name(f.sgsʲs.:(1).u₃)] - @. ∂ᶜρaʲ_err_∂ᶠu₃ʲ = - dtγ * -(ᶜadvdivᵥ_matrix()) ⋅ DiagonalMatrixRow( - ᶠinterp(ᶜρʲs.:(1) * ᶜJ) / ᶠJ * - ᶠset_upwind_bcs( - ᶠupwind( - CT3(sign(ᶠu³ʲ_data)), - draft_area(Y.c.sgsʲs.:(1).ρa, ᶜρʲs.:(1)), - ), - ) * - adjoint(C3(sign(ᶠu³ʲ_data))) * - g³³(ᶠgⁱʲ), - ) - - ∂ᶠu₃ʲ_err_∂ᶜq_totʲ = - matrix[@name(f.sgsʲs.:(1).u₃), @name(c.sgsʲs.:(1).q_tot)] - @. ∂ᶠu₃ʲ_err_∂ᶜq_totʲ = - dtγ * DiagonalMatrixRow( - (1 - α_b) * ᶠgradᵥ_ᶜΦ * ᶠinterp(Y.c.ρ) / - (ᶠinterp(ᶜρʲs.:(1)))^2, - ) ⋅ ᶠinterp_matrix() ⋅ DiagonalMatrixRow( - (ᶜρʲs.:(1))^2 / ᶜp * ( - ᶜkappa_mʲ / (ᶜkappa_mʲ + 1) * ∂e_int_∂q_tot + - ᶜ∂kappa_m∂q_totʲ * ( - Y.c.sgsʲs.:(1).mse - ᶜΦ + - cp_d * T_0 + - ∂e_int_∂q_tot * Y.c.sgsʲs.:(1).q_tot - ) - ), - ) - ∂ᶠu₃ʲ_err_∂ᶜmseʲ = - matrix[@name(f.sgsʲs.:(1).u₃), @name(c.sgsʲs.:(1).mse)] - @. ∂ᶠu₃ʲ_err_∂ᶜmseʲ = - dtγ * DiagonalMatrixRow( - (1 - α_b) * ᶠgradᵥ_ᶜΦ * ᶠinterp(Y.c.ρ) / - (ᶠinterp(ᶜρʲs.:(1)))^2, - ) ⋅ ᶠinterp_matrix() ⋅ DiagonalMatrixRow( - ᶜkappa_mʲ * (ᶜρʲs.:(1))^2 / ((ᶜkappa_mʲ + 1) * ᶜp), - ) - ∂ᶠu₃ʲ_err_∂ᶠu₃ʲ = - matrix[@name(f.sgsʲs.:(1).u₃), @name(f.sgsʲs.:(1).u₃)] - ᶜu₃ʲ = ᶜtemp_C3 - @. ᶜu₃ʲ = ᶜinterp(Y.f.sgsʲs.:(1).u₃) - - @. bdmr_l = convert(BidiagonalMatrixRow{FT}, ᶜleft_bias_matrix()) - @. bdmr_r = convert(BidiagonalMatrixRow{FT}, ᶜright_bias_matrix()) - @. bdmr = ifelse(ᶜu₃ʲ.components.data.:1 > 0, bdmr_l, bdmr_r) - - @. ᶠtridiagonal_matrix_c3 = -(ᶠgradᵥ_matrix()) ⋅ bdmr - if rs isa RayleighSponge - @. ∂ᶠu₃ʲ_err_∂ᶠu₃ʲ = - dtγ * ( - ᶠtridiagonal_matrix_c3 ⋅ - DiagonalMatrixRow(adjoint(CT3(Y.f.sgsʲs.:(1).u₃))) - - DiagonalMatrixRow( - β_rayleigh_w(rs, ᶠz, zmax) * (one_C3xACT3,), - ) - ) - (I_u₃,) - else - @. ∂ᶠu₃ʲ_err_∂ᶠu₃ʲ = - dtγ * ᶠtridiagonal_matrix_c3 ⋅ - DiagonalMatrixRow(adjoint(CT3(Y.f.sgsʲs.:(1).u₃))) - (I_u₃,) - end - - # entrainment and detrainment - if use_derivative(sgs_entr_detr_flag) - (; ᶜentrʲs, ᶜdetrʲs, ᶜturb_entrʲs) = p - # This assumes entrainment and detrainment rates are constant in the Jacobian - @. ∂ᶜq_totʲ_err_∂ᶜq_totʲ -= - dtγ * DiagonalMatrixRow(ᶜentrʲs.:(1) + ᶜturb_entrʲs.:(1)) - @. ∂ᶜmseʲ_err_∂ᶜmseʲ -= - dtγ * DiagonalMatrixRow(ᶜentrʲs.:(1) + ᶜturb_entrʲs.:(1)) - @. ∂ᶜρaʲ_err_∂ᶜρaʲ += - dtγ * DiagonalMatrixRow(ᶜentrʲs.:(1) - ᶜdetrʲs.:(1)) - @. ∂ᶠu₃ʲ_err_∂ᶠu₃ʲ -= - dtγ * (DiagonalMatrixRow( - (ᶠinterp(ᶜentrʲs.:(1) + ᶜturb_entrʲs.:(1))) * - (one_C3xACT3,), - )) - end - - # non-hydrostatic pressure drag - # Only the quadratic drag term is considered in the Jacobian, the buoyancy term is ignored - if use_derivative(sgs_nh_pressure_flag) - (; ᶠu₃⁰) = p - turbconv_params = CAP.turbconv_params(params) - α_d = CAP.pressure_normalmode_drag_coeff(turbconv_params) - scale_height = - CAP.R_d(params) * CAP.T_surf_ref(params) / CAP.grav(params) - H_up_min = CAP.min_updraft_top(turbconv_params) - @. ∂ᶠu₃ʲ_err_∂ᶠu₃ʲ -= - dtγ * (DiagonalMatrixRow( - 2 * - α_d * - Geometry._norm((Y.f.sgsʲs.:(1).u₃ - ᶠu₃⁰), ᶠlg) / - max(scale_height, H_up_min) * (one_C3xACT3,), - )) - end - - # add updraft mass flux contributions to grid-mean - if use_derivative(sgs_mass_flux_flag) - - (; ᶜgradᵥ_ᶠΦ, ᶜρʲs, ᶠu³ʲs, ᶜtsʲs, ᶠu³, ᶜKʲs) = p - (; bdmr_l, bdmr_r, bdmr) = p - is_third_order = edmfx_upwinding == Val(:third_order) - ᶠupwind = is_third_order ? ᶠupwind3 : ᶠupwind1 - ᶠset_upwind_bcs = Operators.SetBoundaryOperator(; - top = Operators.SetValue(zero(CT3{FT})), - bottom = Operators.SetValue(zero(CT3{FT})), - ) # Need to wrap ᶠupwind in this for well-defined boundaries. - UpwindMatrixRowType = - is_third_order ? QuaddiagonalMatrixRow : BidiagonalMatrixRow - ᶠupwind_matrix = - is_third_order ? ᶠupwind3_matrix : ᶠupwind1_matrix - - # Jacobian contributions of updraft massflux to grid-mean - - ∂ᶜupdraft_mass_flux_∂ᶜscalar = ᶠbidiagonal_matrix_ct3 - @. ∂ᶜupdraft_mass_flux_∂ᶜscalar = - DiagonalMatrixRow( - (ᶠinterp(ᶜρ * ᶜJ) / ᶠJ) * (ᶠu³ʲs.:(1) - ᶠu³), - ) ⋅ ᶠinterp_matrix() ⋅ - DiagonalMatrixRow(Y.c.sgsʲs.:(1).ρa / ᶜρʲs.:(1)) - - # Derivative of total energy tendency with respect to updraft MSE - ## grid-mean ρe_tot - ᶜkappa_m = p.ᶜtemp_scalar - @. ᶜkappa_m = - TD.gas_constant_air(thermo_params, ᶜts) / - TD.cv_m(thermo_params, ᶜts) - - ᶜ∂kappa_m∂q_tot = p.ᶜtemp_scalar_2 - @. ᶜ∂kappa_m∂q_tot = - ( - ΔR_v * TD.cv_m(thermo_params, ᶜts) - - Δcv_v * TD.gas_constant_air(thermo_params, ᶜts) - ) / abs2(TD.cv_m(thermo_params, ᶜts)) - - @. ∂ᶜρe_tot_err_∂ᶜρ += - dtγ * ᶜadvdivᵥ_matrix() ⋅ ∂ᶜupdraft_mass_flux_∂ᶜscalar ⋅ - DiagonalMatrixRow( - ( - -(1 + ᶜkappa_m) * ᶜspecific.e_tot - - ᶜkappa_m * ∂e_int_∂q_tot * ᶜspecific.q_tot - ) / ᶜρ, - ) - - @. ∂ᶜρe_tot_err_∂ᶜρq_tot += - dtγ * ᶜadvdivᵥ_matrix() ⋅ ∂ᶜupdraft_mass_flux_∂ᶜscalar ⋅ - DiagonalMatrixRow(( - ᶜkappa_m * ∂e_int_∂q_tot / ᶜρ + - ᶜ∂kappa_m∂q_tot * ( - cp_d * T_0 + ᶜspecific.e_tot - ᶜK - ᶜΦ + - ∂e_int_∂q_tot * ᶜspecific.q_tot - ) - )) - - @. ∂ᶜρe_tot_err_∂ᶜρe_tot += - dtγ * ᶜadvdivᵥ_matrix() ⋅ ∂ᶜupdraft_mass_flux_∂ᶜscalar ⋅ - DiagonalMatrixRow((1 + ᶜkappa_m) / ᶜρ) - - ∂ᶜρe_tot_err_∂ᶜmseʲ = - matrix[@name(c.ρe_tot), @name(c.sgsʲs.:(1).mse)] - @. ∂ᶜρe_tot_err_∂ᶜmseʲ = - -(dtγ * ᶜadvdivᵥ_matrix() ⋅ ∂ᶜupdraft_mass_flux_∂ᶜscalar) - - ## grid-mean ρq_tot - @. ∂ᶜρq_tot_err_∂ᶜρ += - dtγ * ᶜadvdivᵥ_matrix() ⋅ ∂ᶜupdraft_mass_flux_∂ᶜscalar ⋅ - DiagonalMatrixRow(-(ᶜspecific.q_tot) / ᶜρ) - - @. ∂ᶜρq_tot_err_∂ᶜρq_tot += - dtγ * ᶜadvdivᵥ_matrix() ⋅ ∂ᶜupdraft_mass_flux_∂ᶜscalar ⋅ - DiagonalMatrixRow(1 / ᶜρ) - - ∂ᶜρq_tot_err_∂ᶜq_totʲ = - matrix[@name(c.ρq_tot), @name(c.sgsʲs.:(1).q_tot)] - @. ∂ᶜρq_tot_err_∂ᶜq_totʲ = - -(dtγ * ᶜadvdivᵥ_matrix() ⋅ ∂ᶜupdraft_mass_flux_∂ᶜscalar) - - # grid-mean ∂/∂(u₃ʲ) - ∂ᶜρe_tot_err_∂ᶠu₃ = matrix[@name(c.ρe_tot), @name(f.u₃)] - @. ∂ᶜρe_tot_err_∂ᶠu₃ += - dtγ * ᶜadvdivᵥ_matrix() ⋅ DiagonalMatrixRow( - ᶠinterp( - (Y.c.sgsʲs.:(1).mse + ᶜKʲs.:(1) - ᶜh_tot) * - ᶜρʲs.:(1) * - ᶜJ * - draft_area(Y.c.sgsʲs.:(1).ρa, ᶜρʲs.:(1)), - ) / ᶠJ * (g³³(ᶠgⁱʲ)), - ) - - ∂ᶜρe_tot_err_∂ᶠu₃ʲ = - matrix[@name(c.ρe_tot), @name(f.sgsʲs.:(1).u₃)] - @. ∂ᶜρe_tot_err_∂ᶠu₃ʲ = - dtγ * -(ᶜadvdivᵥ_matrix()) ⋅ DiagonalMatrixRow( - ᶠinterp( - (Y.c.sgsʲs.:(1).mse + ᶜKʲs.:(1) - ᶜh_tot) * - ᶜρʲs.:(1) * - ᶜJ * - draft_area(Y.c.sgsʲs.:(1).ρa, ᶜρʲs.:(1)), - ) / ᶠJ * (g³³(ᶠgⁱʲ)), - ) - - ∂ᶜρq_tot_err_∂ᶠu₃ = matrix[@name(c.ρq_tot), @name(f.u₃)] - @. ∂ᶜρq_tot_err_∂ᶠu₃ += - dtγ * ᶜadvdivᵥ_matrix() ⋅ DiagonalMatrixRow( - ᶠinterp( - (Y.c.sgsʲs.:(1).q_tot - ᶜspecific.q_tot) * - ᶜρʲs.:(1) * - ᶜJ * - draft_area(Y.c.sgsʲs.:(1).ρa, ᶜρʲs.:(1)), - ) / ᶠJ * (g³³(ᶠgⁱʲ)), - ) - - ∂ᶜρq_tot_err_∂ᶠu₃ʲ = - matrix[@name(c.ρq_tot), @name(f.sgsʲs.:(1).u₃)] - @. ∂ᶜρq_tot_err_∂ᶠu₃ʲ = - dtγ * -(ᶜadvdivᵥ_matrix()) ⋅ DiagonalMatrixRow( - ᶠinterp( - (Y.c.sgsʲs.:(1).q_tot - ᶜspecific.q_tot) * - ᶜρʲs.:(1) * - ᶜJ * - draft_area(Y.c.sgsʲs.:(1).ρa, ᶜρʲs.:(1)), - ) / ᶠJ * (g³³(ᶠgⁱʲ)), - ) - - # grid-mean ∂/∂(rho*a) - ∂ᶜρe_tot_err_∂ᶜρa = - matrix[@name(c.ρe_tot), @name(c.sgsʲs.:(1).ρa)] - @. ∂ᶜρe_tot_err_∂ᶜρa = - dtγ * -(ᶜadvdivᵥ_matrix()) ⋅ DiagonalMatrixRow( - (ᶠu³ʲs.:(1) - ᶠu³) * - ᶠinterp((Y.c.sgsʲs.:(1).mse + ᶜKʲs.:(1) - ᶜh_tot)) / ᶠJ, - ) ⋅ ᶠinterp_matrix() ⋅ DiagonalMatrixRow(ᶜJ) - - ∂ᶜρq_tot_err_∂ᶜρa = - matrix[@name(c.ρq_tot), @name(c.sgsʲs.:(1).ρa)] - @. ∂ᶜρq_tot_err_∂ᶜρa = - dtγ * -(ᶜadvdivᵥ_matrix()) ⋅ DiagonalMatrixRow( - (ᶠu³ʲs.:(1) - ᶠu³) * - ᶠinterp((Y.c.sgsʲs.:(1).q_tot - ᶜspecific.q_tot)) / ᶠJ, - ) ⋅ ᶠinterp_matrix() ⋅ DiagonalMatrixRow(ᶜJ) - - end - - elseif rs isa RayleighSponge - ∂ᶠu₃ʲ_err_∂ᶠu₃ʲ = - matrix[@name(f.sgsʲs.:(1).u₃), @name(f.sgsʲs.:(1).u₃)] - @. ∂ᶠu₃ʲ_err_∂ᶠu₃ʲ = - dtγ * - -DiagonalMatrixRow( - β_rayleigh_w(rs, ᶠz, zmax) * (one_C3xACT3,), - ) - (I_u₃,) - end + file_name = joinpath(output_dir, file_name * ".hdf5") + HDF5Writer(file_name, ClimaComms.context(Yₜ.c); overwrite = false) do writer + key = string(float(t)) + group = HDF5.create_group(writer.file, key) + group["title"] = "$title, t = $(time_and_units_str(float(t)))" + group["∂Yₜ_∂Y"] = cpu_column_matrix + group["Yₜ"] = cpu_column_vector end - - # NOTE: All velocity tendency derivatives should be set BEFORE this call. - zero_velocity_jacobian!(matrix, Y, p, t) end diff --git a/src/prognostic_equations/implicit/implicit_tendency.jl b/src/prognostic_equations/implicit/implicit_tendency.jl index c57bb78875..b120b99304 100644 --- a/src/prognostic_equations/implicit/implicit_tendency.jl +++ b/src/prognostic_equations/implicit/implicit_tendency.jl @@ -9,6 +9,17 @@ NVTX.@annotate function implicit_tendency!(Yₜ, Y, p, t) fill_with_nans!(p) Yₜ .= zero(eltype(Yₜ)) implicit_vertical_advection_tendency!(Yₜ, Y, p, t) + + if p.atmos.noneq_mode == Implicit() + cloud_condensate_tendency!( + Yₜ, + Y, + p, + p.atmos.moisture_model, + p.atmos.precip_model, + ) + end + if p.atmos.sgs_adv_mode == Implicit() edmfx_sgs_vertical_advection_tendency!( Yₜ, diff --git a/src/prognostic_equations/remaining_tendency.jl b/src/prognostic_equations/remaining_tendency.jl index d973b950a8..2cd96e34d0 100644 --- a/src/prognostic_equations/remaining_tendency.jl +++ b/src/prognostic_equations/remaining_tendency.jl @@ -123,14 +123,17 @@ NVTX.@annotate function additional_tendency!(Yₜ, Y, p, t) end edmfx_filter_tendency!(Yₜ, Y, p, t, p.atmos.turbconv_model) edmfx_tke_tendency!(Yₜ, Y, p, t, p.atmos.turbconv_model) - # Non-equilibrium cloud formation - cloud_condensate_tendency!( - Yₜ, - Y, - p, - p.atmos.moisture_model, - p.atmos.precip_model, - ) + + if p.atmos.noneq_mode == Explicit() + cloud_condensate_tendency!( + Yₜ, + Y, + p, + p.atmos.moisture_model, + p.atmos.precip_model, + ) + end + edmfx_precipitation_tendency!( Yₜ, Y, diff --git a/src/solver/type_getters.jl b/src/solver/type_getters.jl index 26dceddd95..e290748837 100644 --- a/src/solver/type_getters.jl +++ b/src/solver/type_getters.jl @@ -6,7 +6,6 @@ import ClimaUtilities.OutputPathGenerator import ClimaCore: InputOutput, Meshes, Spaces, Quadratures import ClimaAtmos.RRTMGPInterface as RRTMGPI import ClimaAtmos as CA -import LinearAlgebra import ClimaCore.Fields import ClimaTimeSteppers as CTS import Logging @@ -23,6 +22,10 @@ function get_atmos(config::AtmosConfig, params) moisture_model = get_moisture_model(parsed_args) precip_model = get_precipitation_model(parsed_args) cloud_model = get_cloud_model(parsed_args) + + implicit_noneq_moist = parsed_args["implicit_noneq_moist"] + @assert implicit_noneq_moist in (true, false) + ozone = get_ozone(parsed_args) radiation_mode = get_radiation_mode(parsed_args, FT) forcing_type = get_forcing_type(parsed_args) @@ -93,6 +96,7 @@ function get_atmos(config::AtmosConfig, params) edmfx_model, precip_model, cloud_model, + noneq_mode = implicit_noneq_moist ? Implicit() : Explicit(), forcing_type, call_cloud_diagnostics_per_stage, turbconv_model = get_turbconv_model(FT, parsed_args, turbconv_params), @@ -408,74 +412,53 @@ function get_surface_setup(parsed_args) return getproperty(SurfaceConditions, Symbol(parsed_args["surface_setup"]))() end -is_explicit_CTS_algo_type(alg_or_tableau) = - alg_or_tableau <: CTS.ERKAlgorithmName - -is_imex_CTS_algo_type(alg_or_tableau) = - alg_or_tableau <: CTS.IMEXARKAlgorithmName - -is_implicit_type(alg_or_tableau) = is_imex_CTS_algo_type(alg_or_tableau) - -is_imex_CTS_algo(::CTS.IMEXAlgorithm) = true -is_imex_CTS_algo(::CTS.RosenbrockAlgorithm) = true -is_imex_CTS_algo(::SciMLBase.AbstractODEAlgorithm) = false - -is_implicit(ode_algo) = is_imex_CTS_algo(ode_algo) - -is_rosenbrock(::SciMLBase.AbstractODEAlgorithm) = false -use_transform(ode_algo) = - !(is_imex_CTS_algo(ode_algo) || is_rosenbrock(ode_algo)) - -additional_integrator_kwargs(::SciMLBase.AbstractODEAlgorithm) = (; - adaptive = false, - progress = isinteractive(), - progress_steps = isinteractive() ? 1 : 1000, -) -additional_integrator_kwargs(::CTS.DistributedODEAlgorithm) = (; - kwargshandle = CTS.DiffEqBase.KeywordArgSilent, # allow custom kwargs - adjustfinal = true, - # TODO: enable progress bars in ClimaTimeSteppers -) - -is_cts_algo(::SciMLBase.AbstractODEAlgorithm) = false -is_cts_algo(::CTS.DistributedODEAlgorithm) = true - -function jac_kwargs(ode_algo, Y, atmos, parsed_args) - if is_implicit(ode_algo) - A = ImplicitEquationJacobian( - Y, - atmos; - approximate_solve_iters = parsed_args["approximate_linear_solve_iters"], - transform_flag = use_transform(ode_algo), +get_jacobian(ode_algo, Y, atmos, parsed_args, output_dir) = + if ode_algo isa Union{CTS.IMEXAlgorithm, CTS.RosenbrockAlgorithm} + approx_jacobian_algorithm = ApproxJacobian( + DerivativeFlag(atmos.noneq_mode), + DerivativeFlag(has_topography(axes(Y.c))), + DerivativeFlag(atmos.diff_mode), + DerivativeFlag(atmos.sgs_adv_mode), + DerivativeFlag(atmos.sgs_entr_detr_mode), + DerivativeFlag(atmos.sgs_mf_mode), + DerivativeFlag(atmos.sgs_nh_pressure_mode), + parsed_args["approximate_linear_solve_iters"], ) - if use_transform(ode_algo) - return (; jac_prototype = A, Wfact_t = Wfact!) + use_exact_jacobian = parsed_args["use_exact_jacobian"] + debug_approximate_jacobian = parsed_args["debug_approximate_jacobian"] + jacobian_algorithm = if debug_approximate_jacobian + # Debug one column when using GPUs or when there are many columns. + only_debug_first_column_jacobian = + isnothing(parsed_args["only_debug_first_column_jacobian"]) ? + ClimaComms.device(Y.c) isa ClimaComms.CUDADevice || + Fields.ncolumns(axes(Y.c)) > 10000 : + parsed_args["only_debug_first_column_jacobian"] + DebugJacobian( + approx_jacobian_algorithm, + use_exact_jacobian, + only_debug_first_column_jacobian, + ) + elseif use_exact_jacobian + ExactJacobian() else - return (; jac_prototype = A, Wfact = Wfact!) + approx_jacobian_algorithm end + @info "Jacobian algorithm: $(summary_string(jacobian_algorithm))" + ImplicitEquationJacobian(jacobian_algorithm, Y, atmos, output_dir) else - return NamedTuple() + nothing end -end - -#= - ode_configuration(Y, parsed_args) -Returns the ode algorithm -=# function ode_configuration(::Type{FT}, parsed_args) where {FT} ode_name = parsed_args["ode_algo"] - alg_or_tableau = getproperty(CTS, Symbol(ode_name)) - @info "Using ODE config: `$alg_or_tableau`" - if ode_name == "SSPKnoth" - return CTS.RosenbrockAlgorithm(CTS.tableau(CTS.SSPKnoth())) - end - - if is_explicit_CTS_algo_type(alg_or_tableau) - return CTS.ExplicitAlgorithm(alg_or_tableau()) - elseif !is_implicit_type(alg_or_tableau) - return alg_or_tableau() - elseif is_imex_CTS_algo_type(alg_or_tableau) + ode_algo_name = getproperty(CTS, Symbol(ode_name)) + @info "Using ODE config: `$ode_algo_name`" + return if ode_algo_name <: CTS.RosenbrockAlgorithmName + CTS.RosenbrockAlgorithm(CTS.tableau(ode_algo_name())) + elseif ode_algo_name <: CTS.ERKAlgorithmName + CTS.ExplicitAlgorithm(ode_algo_name()) + else + @assert ode_algo_name <: CTS.IMEXARKAlgorithmName newtons_method = CTS.NewtonsMethod(; max_iters = parsed_args["max_newton_iters_ode"], krylov_method = if parsed_args["use_krylov_method"] @@ -504,9 +487,7 @@ function ode_configuration(::Type{FT}, parsed_args) where {FT} nothing end, ) - return CTS.IMEXAlgorithm(alg_or_tableau(), newtons_method) - else - return alg_or_tableau(; linsolve = linsolve!) + CTS.IMEXAlgorithm(ode_algo_name(), newtons_method) end end @@ -649,40 +630,64 @@ function get_sim_info(config::AtmosConfig) return sim end -function args_integrator(parsed_args, Y, p, tspan, ode_algo, callback) - (; atmos, dt) = p - - s = @timed_str begin - func = if parsed_args["split_ode"] - implicit_func = SciMLBase.ODEFunction( - implicit_tendency!; - jac_kwargs(ode_algo, Y, atmos, parsed_args)..., - tgrad = (∂Y∂t, Y, p, t) -> (∂Y∂t .= 0), - ) - if is_cts_algo(ode_algo) - CTS.ClimaODEFunction(; - T_exp_T_lim! = remaining_tendency!, - T_imp! = implicit_func, - # Can we just pass implicit_tendency! and jac_prototype etc.? - lim! = limiters_func!, - dss!, - cache! = set_precomputed_quantities!, - cache_imp! = set_implicit_precomputed_quantities!, - ) - else - SciMLBase.SplitFunction(implicit_func, remaining_tendency!) - end +function args_integrator(parsed_args, Y, p, sim_info, ode_algo, callback) + (; dt, atmos) = p + (; t_start, t_end, output_dir) = sim_info + use_exact_jacobian = parsed_args["use_exact_jacobian"] + debug_approximate_jacobian = parsed_args["debug_approximate_jacobian"] + need_to_update_exact_jacobian_before_each_solve = + ( + use_exact_jacobian && + isnothing(parsed_args["dt_update_exact_jacobian"]) + ) || ( + (debug_approximate_jacobian || use_exact_jacobian) && + !isnothing(parsed_args["dt_update_exact_jacobian"]) && + time_to_seconds(parsed_args["dt_update_exact_jacobian"]) < + time_to_seconds(parsed_args["dt"]) + ) + update_jacobian_before_each_solve! = + if need_to_update_exact_jacobian_before_each_solve + debug_approximate_jacobian ? update_and_check_jacobian! : + update_jacobian! + elseif !use_exact_jacobian + update_jacobian! else - remaining_tendency! # should be total_tendency! + Returns(nothing) # Update the exact Jacobian in a separate callback. end + s = @timed_str begin + T_imp! = SciMLBase.ODEFunction( + implicit_tendency!; + jac_prototype = get_jacobian( + ode_algo, + Y, + atmos, + parsed_args, + output_dir, + ), + Wfact = update_jacobian_before_each_solve!, + ) + tendency_function = CTS.ClimaODEFunction(; + T_exp_T_lim! = remaining_tendency!, + T_imp!, + lim! = limiters_func!, + dss!, + cache! = set_precomputed_quantities!, + cache_imp! = set_implicit_precomputed_quantities!, + ) end @info "Define ode function: $s" - problem = SciMLBase.ODEProblem(func, Y, tspan, p) - t_begin, t_end, _ = promote(tspan[1], tspan[2], p.dt) + problem = SciMLBase.ODEProblem(tendency_function, Y, (t_start, t_end), p) + t_start, t_end, _ = promote(t_start, t_end, dt) # Save solution to integrator.sol at the beginning and end - saveat = [t_begin, t_end] + saveat = [t_start, t_end] args = (problem, ode_algo) - kwargs = (; saveat, callback, dt, additional_integrator_kwargs(ode_algo)...) + kwargs = (; + saveat, + callback, + dt, + kwargshandle = CTS.DiffEqBase.KeywordArgSilent, # allow custom kwargs + adjustfinal = true, + ) return (args, kwargs) end @@ -849,13 +854,12 @@ function get_simulation(config::AtmosConfig) @info "n_steps_per_cycle_per_cb (non diagnostics): $steps_cycle_non_diag" @info "n_steps_per_cycle (non diagnostics): $steps_cycle" - tspan = (sim_info.t_start, sim_info.t_end) s = @timed_str begin integrator_args, integrator_kwargs = args_integrator( config.parsed_args, Y, p, - tspan, + sim_info, ode_algo, all_callbacks, ) diff --git a/src/solver/types.jl b/src/solver/types.jl index 7c1f0eacc0..e0227aa609 100644 --- a/src/solver/types.jl +++ b/src/solver/types.jl @@ -344,6 +344,7 @@ struct MixingLength{FT} tke::FT buoy::FT end +MixingLength(args...) = MixingLength(promote(args...)...) abstract type AbstractEDMF end @@ -511,6 +512,7 @@ Base.@kwdef struct AtmosModel{ MM, PM, CM, + NM, CCDPS, F, S, @@ -544,6 +546,7 @@ Base.@kwdef struct AtmosModel{ moisture_model::MM = nothing precip_model::PM = nothing cloud_model::CM = nothing + noneq_mode::NM = nothing call_cloud_diagnostics_per_stage::CCDPS = nothing forcing_type::F = nothing subsidence::S = nothing diff --git a/src/utils/utilities.jl b/src/utils/utilities.jl index d89cfc8797..424b83dae6 100644 --- a/src/utils/utilities.jl +++ b/src/utils/utilities.jl @@ -4,6 +4,7 @@ import ClimaComms import ClimaCore: Spaces, Topologies, Fields, Geometry import LinearAlgebra: norm_sqr +import Statistics: quantile is_energy_var(symbol) = symbol in (:ρe_tot, :ρae_tot) is_momentum_var(symbol) = symbol in (:uₕ, :ρuₕ, :u₃, :ρw) @@ -292,28 +293,39 @@ end import Dates """ - time_and_units_str(x::Real) - -Returns a truncated string of time and units, -given a time `x` in Seconds. -""" -time_and_units_str(x::Real) = - trunc_time(string(compound_period(x, Dates.Second))) + time_and_units_str(seconds) + +Converts the given number of seconds into a string that contains a numerical +value (rounded to the nearest 2 decimal digits) and its corresponding units. +""" +function time_and_units_str(seconds) + # Convert the time to a Float64 in order to avoid round-off errors. + full_period = compound_period(Float64(seconds)) + isempty(Dates.periods(full_period)) && return "0 Seconds" + whole_period = Dates.periods(full_period)[1] + whole_period_value = Dates.value(whole_period) + remaining_period = full_period - whole_period + no_remaining_digits = isempty(Dates.periods(remaining_period)) + period_units = + string(typeof(whole_period).name.name) * + (whole_period_value == 1 && no_remaining_digits ? "" : "s") + no_remaining_digits && return "$whole_period_value $period_units" + remaining_period_value = + Dates.value(convert(Dates.Nanosecond, remaining_period)) / + Dates.value(convert(Dates.Nanosecond, typeof(whole_period)(1))) + remaining_period_value < 0.01 && return "$whole_period_value $period_units" + remaining_digits = lpad(round(Int, remaining_period_value * 100), 2, '0') + return "$whole_period_value.$remaining_digits $period_units" +end """ - compound_period(x::Real, ::Type{T}) where {T <: Dates.Period} + compound_period(seconds) -A canonicalized `Dates.CompoundPeriod` given a real value -`x`, and its units via the period type `T`. +A `Dates.CompoundPeriod` that represents the given number of seconds (rounded to +the nearest nanosecond). """ -function compound_period(x::Real, ::Type{T}) where {T <: Dates.Period} - nf = Dates.value(convert(Dates.Nanosecond, T(1))) - ns = Dates.Nanosecond(ceil(x * nf)) - return Dates.canonicalize(Dates.CompoundPeriod(ns)) -end - -trunc_time(s::String) = count(',', s) > 1 ? join(split(s, ",")[1:2], ",") : s - +compound_period(seconds) = + Dates.canonicalize(Dates.Nanosecond(round(Int, seconds * 10^9))) function prettymemory(b) if b < 1024 @@ -341,6 +353,24 @@ macro timed_str(ex) end end +""" + summary_string(x) + +Returns a string that is similar to the output of `dump(x)`, but without any +type parameters. +""" +summary_string(x) = summary_string(x, 0) +summary_string(x, depth) = + fieldcount(typeof(x)) == 0 ? repr(x) : + (string(nameof(typeof(x))) * '(') * + mapreduce(*, 1:fieldcount(typeof(x))) do i + field = + x isa Tuple ? ':' * string(i) : string(fieldname(typeof(x), i)) + ('\n' * " "^(depth + 1) * field * " = ") * + (summary_string(getfield(x, i), depth + 1) * ',') + end * + ('\n' * " "^depth * ')') + struct AllNothing end const all_nothing = AllNothing() Base.getproperty(::AllNothing, ::Symbol) = nothing @@ -361,6 +391,23 @@ function horizontal_integral_at_boundary(f::Fields.Field) sum(f ./ Fields.Δz_field(axes(f)) .* 2) # TODO: is there a way to ensure this is derived from face z? The 2d topology doesn't contain this info end +""" + smooth_maximum(array, [percentile_rank]) + +Filters out all non-negligible values in the given `array` and computes the +specified percentile of the result. + +Specifically, this assumes that only the top 9 orders of magnitude of nonzero +data are significant, and, by default, it roughly selects the 90th percentile +along each dimension of the filtered data. +""" +function smooth_maximum(array, percentile_rank = 1 - 0.1^ndims(array)) + minimum_filtered_value = maximum(abs, array) / 1e9 + filtered_array_values = filter(>(minimum_filtered_value), map(abs, array)) + isempty(filtered_array_values) && return zero(eltype(array)) + return quantile(filtered_array_values, percentile_rank) +end + """ isdivisible(dt_large::Dates.Period, dt_small::Dates.Period) diff --git a/src/utils/variable_manipulations.jl b/src/utils/variable_manipulations.jl index 485b21599c..f528bfb9a0 100644 --- a/src/utils/variable_manipulations.jl +++ b/src/utils/variable_manipulations.jl @@ -62,9 +62,9 @@ function as (1 + tanh(2 * atanh(1 - 2 * (1 - a)^(-1 / log2(1 - a_half))))) / 2`. """ sgs_weight_function(a, a_half) = - if a < 0 + if a <= 0 # autodiff generates NaNs when a is 0 zero(a) - elseif a > 1 + elseif a > min(1, 42 * a_half) # autodiff generates NaNs when a is large one(a) else (1 + tanh(2 * atanh(1 - 2 * (1 - a)^(-1 / log2(1 - a_half))))) / 2 diff --git a/test/dependencies.jl b/test/dependencies.jl index 69f1f81186..2aca57482a 100644 --- a/test/dependencies.jl +++ b/test/dependencies.jl @@ -44,6 +44,7 @@ known_dependencies = Set([ "ClimaUtilities", "CloudMicrophysics", "Dates", + "ForwardDiff", # for automatic differentiation in the implicit solver "Insolation", "Interpolations", "LazyBroadcast", # for https://github.com/CliMA/ClimaAtmos.jl/issues/3594 diff --git a/toml/aquaplanet_nonequil_120_1200.toml b/toml/aquaplanet_nonequil_120_1200.toml new file mode 100644 index 0000000000..cdf4fce158 --- /dev/null +++ b/toml/aquaplanet_nonequil_120_1200.toml @@ -0,0 +1,23 @@ +[condensation_evaporation_timescale] +value = 120 + +[sublimation_deposition_timescale] +value = 1200 + +[tracer_vertical_diffusion_factor] +value = 0 + +[snow_autoconversion_timescale] +value = 1e4 + +[rain_autoconversion_timescale] +value = 150 + +[zd_rayleigh] +value = 40000.0 + +[zd_viscous] +value = 40000.0 + +[precipitation_timescale] +value = 120 diff --git a/toml/aquaplanet_nonequil_12_120.toml b/toml/aquaplanet_nonequil_12_120.toml new file mode 100644 index 0000000000..25c3880152 --- /dev/null +++ b/toml/aquaplanet_nonequil_12_120.toml @@ -0,0 +1,23 @@ +[condensation_evaporation_timescale] +value = 12 + +[sublimation_deposition_timescale] +value = 120 + +[tracer_vertical_diffusion_factor] +value = 0 + +[snow_autoconversion_timescale] +value = 1e4 + +[rain_autoconversion_timescale] +value = 150 + +[zd_rayleigh] +value = 40000.0 + +[zd_viscous] +value = 40000.0 + +[precipitation_timescale] +value = 120 diff --git a/toml/short_aquaplanet_nonequil.toml b/toml/short_aquaplanet_nonequil.toml index 7069000782..8e45ce263e 100644 --- a/toml/short_aquaplanet_nonequil.toml +++ b/toml/short_aquaplanet_nonequil.toml @@ -1,8 +1,8 @@ [condensation_evaporation_timescale] -value = 1200 +value = 600 [sublimation_deposition_timescale] -value = 1200 +value = 600 [tracer_vertical_diffusion_factor] value = 0